summaryrefslogtreecommitdiff
path: root/tools/perf/scripts/python/stackcollapse.py
blob: 5a605f70ef32268fb92a749c970cba321cba11d1 (plain)
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
# stackcollapse.py - format perf samples with one line per distinct call stack
#
# This script's output has two space-separated fields.  The first is a semicolon
# separated stack including the program name (from the "comm" field) and the
# function names from the call stack.  The second is a count:
#
#  swapper;start_kernel;rest_init;cpu_idle;default_idle;native_safe_halt 2
#
# The file is sorted according to the first field.
#
# Input may be created and processed using:
#
#  perf record -a -g -F 99 sleep 60
#  perf script report stackcollapse > out.stacks-folded
#
# (perf script record stackcollapse works too).
#
# Written by Paolo Bonzini <pbonzini@redhat.com>
# Based on Brendan Gregg's stackcollapse-perf.pl script.

import os
import sys
from collections import defaultdict
from optparse import OptionParser, make_option

sys.path.append(os.environ['PERF_EXEC_PATH'] + \
                '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')

from perf_trace_context import *
from Core import *
from EventClass import *

# command line parsing

option_list = [
    # formatting options for the bottom entry of the stack
    make_option("--include-tid", dest="include_tid",
                 action="store_true", default=False,
                 help="include thread id in stack"),
    make_option("--include-pid", dest="include_pid",
                 action="store_true", default=False,
                 help="include process id in stack"),
    make_option("--no-comm", dest="include_comm",
                 action="store_false", default=True,
                 help="do not separate stacks according to comm"),
    make_option("--tidy-java", dest="tidy_java",
                 action="store_true", default=False,
                 help="beautify Java signatures"),
    make_option("--kernel", dest="annotate_kernel",
                 action="store_true", default=False,
                 help="annotate kernel functions with _[k]")
]

parser = OptionParser(option_list=option_list)
(opts, args) = parser.parse_args()

if len(args) != 0:
    parser.error("unexpected command line argument")
if opts.include_tid and not opts.include_comm:
    parser.error("requesting tid but not comm is invalid")
if opts.include_pid and not opts.include_comm:
    parser.error("requesting pid but not comm is invalid")

# event handlers

lines = defaultdict(lambda: 0)

def process_event(param_dict):
    def tidy_function_name(sym, dso):
        if sym is None:
            sym = '[unknown]'

        sym = sym.replace(';', ':')
        if opts.tidy_java:
            # the original stackcollapse-perf.pl script gives the
            # example of converting this:
            #    Lorg/mozilla/javascript/MemberBox;.<init>(Ljava/lang/reflect/Method;)V
            # to this:
            #    org/mozilla/javascript/MemberBox:.init
            sym = sym.replace('<', '')
            sym = sym.replace('>', '')
            if sym[0] == 'L' and sym.find('/'):
                sym = sym[1:]
            try:
                sym = sym[:sym.index('(')]
            except ValueError:
                pass

        if opts.annotate_kernel and dso == '[kernel.kallsyms]':
            return sym + '_[k]'
        else:
            return sym

    stack = list()
    if 'callchain' in param_dict:
        for entry in param_dict['callchain']:
            entry.setdefault('sym', dict())
            entry['sym'].setdefault('name', None)
            entry.setdefault('dso', None)
            stack.append(tidy_function_name(entry['sym']['name'],
                                            entry['dso']))
    else:
        param_dict.setdefault('symbol', None)
        param_dict.setdefault('dso', None)
        stack.append(tidy_function_name(param_dict['symbol'],
                                        param_dict['dso']))

    if opts.include_comm:
        comm = param_dict["comm"].replace(' ', '_')
        sep = "-"
        if opts.include_pid:
            comm = comm + sep + str(param_dict['sample']['pid'])
            sep = "/"
        if opts.include_tid:
            comm = comm + sep + str(param_dict['sample']['tid'])
        stack.append(comm)

    stack_string = ';'.join(reversed(stack))
    lines[stack_string] = lines[stack_string] + 1

def trace_end():
    list = lines.keys()
    list.sort()
    for stack in list:
        print "%s %d" % (stack, lines[stack])
©MElt*ɜЋ Z9SX+~&rZ"j. 'l66qI$I$pü髉ͬkm6ЈCH?Nm0#vZgŌ4F)ܬ,YY$K'Փ[i怛A>&& 8ޱ~͕t :zf7F]`.UUeU7̫CTlnK\+!~ucW0IcS֡x] :%h,M.:U׮lX]Uש}S}>/걧gjY>w : F+b+'Y\:7 m--15JoJ[~兙iwHFކA\wgg.\/}PkOjӗk]Mz_#`j1j&!ߦ1FHx_~/ a@ޢ~z2 .cX9Q*BHq >j>7`VPm3&k` ?~#2_,: #Q`Dsp~X ◹z_t ίVsJeS9̎!GyicmJk}C@|Ӻg^j)LF<+;߯S1w>s5/M5>}5DBy~ 2ɪ_vc՗v~1ouD?g0`û/+x@D/ƅIY67"a3|Xvᢣ$PƸE"1*$7#UnK>8YygKo tYewz=;boHR+8T tUXy*>^/WN%2B l!haBIAYjO;eJ}Xa5  d&`AT -ᶑ&¬E G\C5)jJmHO=[/ʹASc^ xfB4Vg1 W]gToOzG8Y&z q]Þ:LYe91H8A;B;GLóX(Ő܂D /}o&43ѼAi z{v_lB I9.lz]aJ\! u~XCpm|z`*N%.#n߮<ځFҺ^vn}}-1~ 㧮ڰX&]S(R"j`>\<>X 6FTM#NN*몇y1_կ`u\&av 0?@qHTAmnP -'tf7Fu|n}qSwy60rzg"_$`t>hm3KbwZPzu5kC /l%0NrB\{6VVGF:w|`wrG}/VTG yx3C޾f"N (nf3)Ԭl0ӫxXi[Azd,_1zG٫_{C0s>#B&h:4HQx{ąHu&ؾ?ݘRھh=cgV Ⱥ .82HDz>~;uCD1.3\7os@Ɏhi@ª̺2= 6r} ;ЛCJPAj$.-9A*߫pt*`X}͢XNzmLGs;vɬsypgA{ΎKIQAI%M+c=2 tqgLeӧ]O6,džkbЬ5ϣpݟ7+]/Fu[ [u߫oA!4Z2Akgw`IDV9O-:/df _#9b.96ǹ>hxՐ%7#;frM@-TϜ:-9m#~9# ,:aJvڈYѯ:Phx]vu tsz-b Z* 7-/›ղa;v~7 Ǥy7 n+ ỳy  >^dko8[:] 05 KnvXgw͙cJ8ݿ7eRݑ%pfF:u$6r6GwۯuA[l&ؽ}XC1^g8 sZaE+m6ٹm]C3T xkv-:BY:P<-HW{g|N?X~:ZBJċv,s3v'!˄m Я'1Qa:41ŲOa\'e޴Nsm\~~ǦßHn؃ַw bWVTz9h%Ap'_j$.򵒂 !5n5K)X+%ځud؉oƯRݾ F)89jX}@O2}) >^Oh:c';G,@p#ny / d1N&J&o1%A[LM|^^'G.9K⑻íN؂Mo|[)r[G=u|wj 9:XQm=OWK{=ѐb#,@E4%n@juۤ#2<)ћșUꎓx8Ɍ>ҟ,7R8/ 9+}'M. &٨Eu@9s!i$3c1MF,FPkc0LcC<@e؇i|N% quLXHapc=n5!e6h,)Cpy!v >eoClv&d͕5aUY,6CXL 5:NFr2+aI/њu<}Y 5y3M-@K^gn=ʫ#h#om_YT.V v[ IR?ҒWռ0_z )3L?FWϫZdWkZսA|Q6x?Q~.gafP=}=/蚗}jT*]Q_`mTUB޷mdswd@660>8 9h ;$NNkyNYD˻)Nm~R#\ ̩' {-5Dqt{j"- hϒ|̏WDSU,YJa^V(;{zCC>9b/(ogBE8 'ﺽ+1*f}8է.vek [uCJ7ʤ~ܿ_&"[@[bT ?U:3s^=S)׫bKͮ* +iITڏ (?\07:LJi ѫV ?J . ="cһ5BaB)=ϝ%noW^\9(=%lef oEBmqs(V2C9oߎR͖l˟=SC6|AZj핼b뻁o'A=}x[ց~K)kxa]6RgLjMa Ѻ d iYR^b|_=؁dP~maV9R >Rȷq0-꜏VQU&{#QfMl9_I(Ņ0Z^CJ8At!srwֺv%qB o~坂F_=. ׏7p<@N rc͎˖Cí{9z [4UmT &!n';|K[UN< 6c9BxN>fP>8PPLʍ1KUd 9K5)oaդ$P'n9rx*cw)@&`6٢X>y˹qSkC((/c>{4GuDI߬iPQ 9%1NS(˷ 98r2뺚F'Tt)ggp  #Lf2ر9&W*qGy9k͆YgK*Mm8 +ƞiV s=a׶hHqPr-jط7>'ς̡',5FZ*Yϰ Nze]-xLH4XvVgߠGAp[(lM*[cTtmۯ5qw7`s<$wOez{\ Qtt7xjAQe" ycaDϲebJu]Xmڬx~\'9 9$p#9D=~}~v Q>.6x4 %΀=g?fF|\ɂ@|//<1 q7*pcx_W+lB݋axbu=Az l֩WJ.#5a\yrTq?=J>z6SNmٶ{:)Q&Ք^]<S>O4tSrS\N"w?<>tQ;#?su[4g?Ǻt, 5Ƀ`T1woWee9d\,)}4ߝsنRW xP# ߺ)E=+= Ȗ4 5rofJr}gĪ÷o,X>ュ).yU=vO}l"NQfn@qwh_|>4jvu;;Ŗ-1MofK韒2?6ӓ[>3hhn׷rNifփ&Y[a ߇Gu9Ֆގ;K|mT5!ϣ{._G= c ؤUk{=KXaB FϤ FzsܢiP߸Z&ǜH_ip2nwXߪu[F:5>־Ə'sgfW m×*k_I.%IE^ޜ~+?G*th0uCGx`EWh9ag5hcar'ŷ٧Ġ!A򬟒+[iPBã}Aܩwf).1ߌ:ZcTՌ#Qmݼ+} PℴRMEU Dkgxaur?͠'(]Wge 'KD/6#eS"\9$GXue|*K M\籢G9vuxQ:}_7ac%p3!C({í_d;s%-+a.+f!07)#: -Φ;>WlۂuT=擵d޹>S<;Z=.ygB.&vOf\:#wCdzdT_;a]EEU^ۋ{Pe~{}S ct@y7k0w׵1_1uEwDOt='CdƔ_9Ә$wa$W"x)[n00Gi$S9"|]UzH&Ό2h1۵PK|:$x@<qA ~)4-._/nUP͊U[?| qhvN 1<'h=m}ߞc÷}@rIlx Kv7+ 6\aJP Y%HvAg҉}mj>|۶B*p ֟8"!7^( 9'ӣeYWU0TmCճ/T FvL4Ug- ێ̽b5Fn"Y l-iz:yGxe +ByN#m l eMc m^M&X@,O'(`ۦM'H{| gLa$-ۭ;ۼ?drwZ֬=7_.^6/ =i Մ\SՈ?_lq{K~W-[ר/zY4BhQ_]7W mzcE17A ȃ9X_B; J=S~ Q (H\7N!]Z 9JND_s ]3-zCzmȢF_Zވ:SvP7S{iVv⍑]D}+^[e~< u}@#C ^GeF19~Wey|״ ãR6+ 5KtCM=>5F˙>dž`ǹAb|9N `G= Y#сD(d>:,*9$6DJ .fk=A@ҫߓbR{EE.Lj;ڥx$}gEU]ժ,IdCdAB9{d8e=[NSW96 l#(zLHz]aQے , 䵙α@+R)-$@ZR}feponޮ N6ҍllluyĵȤ%a2njx= 5ʏ<feMѩNC-h4 ae`+G,{3mŃX0&eT#M 4L ǘތMNF:PJ~Gs.~ "Yrcv׶_4W;nYp*A6dD>'rESȞzsY-v!LYk(2K-v$ 5HX%̌y>#|eꔙ^Tjv%.HH:"&teAl<&Z=m074(eCTj Lj1y\I80ӣNI0ZMcEx QRӥEeqB-&Rn5Ⴗ(ֆC#фXOf#s0y{e}ńmCї?0ziן]scݮK}pl,Zt9Ǘpo#I(߈!6` (;T d]u,}R2*O6l$ch$D4EX,~vRD5P$58YS6a #@Y(96V4F/QP6pᄑ}鳚P\(/䀡 ~U0~=u}f yHT9v99 (܀xȬF],NVڬ&q:Uˉ =tMB;$6K>_$`->no+GOf5[. ;pyjk3r<\A\'$|rHup Gx w< ~ VHU5rvqD`|8]nJ0Q:jV|tg|k`B 4!*q i4D7.+~|{KZl3?4Ϩ \S~k0alOP1-Hemx-{pֈ-eޡ[cX5>gVYYBl1C+Yރ X7K2/P8\77ݦ]*v)Bb$k(fMT'ądSh+ l{3Zքr#Bщ ,_Y$}jD;n'Y@fmX' QjQW<>U+3-0ۮHǗYYmmZ/Drr=ssf/Pk|KDW5*5ǚY\jp62cu,w֫vɟP"s?F L~0T)ț r0aq3—k^.3rD'j|=8QL^ūTp lȨ& \ԅ%fQX xx)7LWb\s'D.?_??E)<: F[,ѩ1?͇9֔HI(Oώ؟/ob˱xa+X3;͔xepAmHIThخ-|^鍁B@ǹ-qjoNr>]gEz2ZNv)89}2$8cTdWNr7L*e yd\;8OFnTᩤkWGo-oz50t-yV$[i_7Z+_`}Wh 3P,$*c70d'(OVKL8^~.ݷyBoRLFFO:̤3@\/4̢)%E,0~UuB( lp~bRZǻE_f9Ue;Rk PD<VOGnp018aP%G#aE΄L/e}rتҵdT.:d;&f!φ[6BkcwٞgR! E Eˤz7U=ʥ{ܮK?X@X-q~D DC}c?dԿWS@b,5+e~Xt8N!G98> ]&1Ƒ*~Ss\<+5?@g (t#΍zvK6!z$ ,$6ـdHFFllUy[]O^"#d`9qA3` ^|yqZf9o} $YZ!LƂѶiܰ3,U4va7A wo˛,tCypxaj[#IE0|ЛI ҧ+̴ФPtMp@AZJ18vffP*nrMW)LTeL7p.hjɑKQfBŢ Yxhd2M E5C#qY#F /eie iIuܩ5cT4x^(f@+_OLe,*Q$W8))OZ#&ѝe@m!ɖ ^'2ZZ XB>9 گ@ꥱ>;ӧ0H'""/@/-̷VХ@"䫕 0aUKV'sb̹},/TXnW!Tz Q%r.F1)tT6ٶr9;8~&x|w G{Rt%sp>(%%1{ipNfY])9dtfs&~?zɉG2dC5n5&oe(7C@ʫZ5˯bˤP"shK3:agJA3$mh P9@ `zw龱P.ׯP-iSp#R |>v9VyneqۧʑQKpV;#A)AB#}b𴅎{#"V6FB"Hg Z 4zg)#(AhU(8)wgkhrRe{Ld#;/Rܼ9pe'/1]u-G]b;A(^MSހ / hlx.uP$)P+My@> XVcCWݒX֪b5!.39l,Xg\Opz40nxo?*邥(qF0Vs8y+f//7\˫6tiMN_mz9z|2 P1*Sֳ?hB6M* 4ca rk!5f\#lm/ɭkIֈ؊4v>O.Ezlj{Tj|O Kg1 ,|Gl)Ynl;boHo*21d=ĉ8o 6˝ ^DOLRTVES[aQ;re2dP}iBыDn+{L6 ꑡcO"p| )!%FVFT cF==z۾/}nLjk2Ӕ~͇3e*l(imq-4OcanctF r9g^~&r?ZK7 lQ o^)ώ^gAXk U1iikuu(Q^S=Wծ j2.+V HCy~2|DGx;+FzgHn6 Ӡ,=w$_1Klqqϰ;mp F Qg7C2JT)&uzA߅bG3 ȺT,]oJ+ E Mbczb>PSHÓ`^gd&nM:vzKs.-M#CڑҜZ+:4u׆`chE8Dz"tî+"(E뽯-seC/e:ӳlϪCn^@#z_NVA~]La\䅻xxX㴅-fpNbfYf׿QGXMzl[ ѻhp/Z 6GAAlTax;V;G יne\p~ux$ % 4w:2 mô^Fj]HbںsuӤCI؈fȞ01nQBz20dJ@ ax'x]d!$5@Гc~r[k]L- Z>/n ^߆ƝOr=EѵwŅL8&4efV&0q@CcdRZ1 ``C? ր\ңc1K#y~dD'cZTg};#Ym?h=Ν1W$ n"ѵã܂U`[0DHP3#/s%0KFG,K>d~lb~ TR\|yx%j"p@t+9ڠ˒G l}{0).U8?hcBŢ?jrg~e)V߷iOt"Nn(i#R EE?S1\p"G ǔaf;]=Z CZ4nt+}AI253 @0BamZCbsW\l~~V ZeSY| f%DзѣBQ2|msny~s*zH3mWs_[Q2pxM ֎_@kAOî>kh5_86+s,Q b$!0⭺ f\H FkVWWl 8.ꤠ9H&FբAfss+l܂F$$>KG/m?*U3͜x,Z4BTm }J;Jq鄘Z' $yLO蔘ƆEl8:ہdпăÀ 7' PPM`p:7>gv~xq6۲с걮n᥆;hԁY> J]{ri 3^F  my=-@W#czO.(K%8GkF"S__uy=x3`x|s3=Dfik $g}*B &^4J."O0#-KS]ϊkݝ Yj4E~+&B) ^2K|e|GCW.-4]b$86GpeaQ$ ]g)F{ZuJ]z ,[GN#7(G=R5q`=qSs2./b3ӳO!S;thǵ"|Z|did~ R1Qv$Mu-a/^ 4;mF(:rt1p%DIs!u72$<ӳ`xAbQ7̯+JY7Dr`-Re떬O5rsĔ٦E8FGSR4. Fmk7? >x wt_O[!mx< \S }{H6۬{uhLhHH7,b yU` z8c4;;ˎBWOk`.`G"Ⴄ6,ZTdVfQk*2/PFgت [g[$O[8M~>`|7"c$wљ>?;1Y?̵K;=]w" ֫j+Ƀ iT\Р\JcAG28gX3sEXw߅AI_N Ɠg/j5DJYi #8uvhem%[$:=4+cbmp !YgI{[3k~m `[KWCNsXx@R4dtU/rU-m˨݁6#ǿw$LɃ?£=A"0s$,sTA(J69-R 0j.-٫“_#xT:.Ԃ>U2"&Bw$kI#Izl.]n_$H .VaҐiq;q*-KŁ4̀3Vcz= <芭;CQUb֕nU׃ 5 ƙL[JAa6ArE\ 揖i~qL[k$3D!vq7 h/Zrr\T> hW(qI. =ءd! :Z}\[y Y.lU|Q]Cc㲛*ә CUhֶ-gr(ͨMT1wƘKAzqa16P< sͯ搯KLIHIwE.,}ߡzD[U` [$r4cOl+fj\단ùJ8 B [[ais|+:ɮW09mTh={cEp|XsP$W_u\܋u"2G씖-0Gm bj`I~Z1 (zB+<+5yo]>XІ_+Y80.,m6E2[M=Ko1_OM39JHL3=Bff*?ܯz " 74lV"Cxh0pK|Dlw%w|duҧax&ni)nz̡?yEC%H=Mk݃#^Az;dѩr( $$}"\eΐ+0Mzyysb*WdEe% ُRNL|n[0Ջ`*quqdfηxroio3$Kɓ9sfn;گݡG4U|xY:RjE!j +_qTZo޽篖&X[<>ÁS?W^LKe0Hu5kGϛMzKmF~Vmr+86|;EWEWN-#{K.$KB\V\i5 ?~b]pX6Wfʁe6A>5-P7D5 Bε,2sE=J%.g=J2jy9mpG ElZ嵛"^ٍJ±꫚RBdw2#46 -o/7=gFjP9d@M>޿28]Jz&˽!@^ۼM|CA9ñy1E2HN?|^!j 2bQh^P;-za*~uu?'n,pxJc  2% 2cp,Zov{(}pLvs[Ĝ/CW]\>ѐh4naB!S?ϔ6bS̝'Y-Vh˴@/6fբ4s6]Ş{ g[dy촘|&d(7yٷCPu^[/ɑ9t Tneg*݌ʵ ]U.p rcޅj\H<'qF[ Oe"#>JC~ \Bd%mAJ-^ŌY 5`/|;V6Vѧ6C*Yxrd!I\bicZςF}f}R#Mb"[6 zhgɏ N[gu~Ǣ- rw%SJBZ:/?<X0A"^od_83|d)v6r^ ]NޑI@`&`Q2Gc\-{>x<}Yvڱ}t2/vU?Qeh^Y:W?#2mD`u$wacmYL bDg.i|'E+s e9㩘#Xk'0$c_zW)}_2(W#F.qpMϤԷNSJg;S bao25DoL0c4MaU>S2&΋}OgXq'9=_`}H yS?Ķ8?k.-~3rh"`?ᥣ4HWT;w>qٝrnԮ+6dB, #BaEpwmr}{͉plG,ص>hz䁢J\_ͭ4Fħ)pA쩷@N,G1wqqLlvspkY O]7ag7ӡy+^2`<~@ΫPJ,)8y zaY<ŒׅÖmAƿ4LN>}s{3Vf(j0F&~@ o2R*G,IVYdhZ%w&[eOܔdrJz-DS#i 'y 7<ώ(Y:@"J 7PG@JsO_&+ H0kqc-:j]4Dy{nLSdPOcX9ۖ{EO^i?k]P@gm@ |Um;\A9U;=mD9pb4>-z_XJGyKz 3 [~ȧ=_׏O;%~nY?\8XXO;Ԙ$0LR̙g>T"Xa!'*Q`+x&bnI8o#|7ˈrWׯv>x݆wHD9qL$ȦkZc仾Ӛ9d c?&J՛LٴE+0ji7i̬TOoթ!" mE g4864c_dqdٌWh~`0GOy( 6]F5<(}T>SV6*fՠ}.46Xnk^d^1vL?F=X600ܟ`3kVD5V`W($,oϷxt܇;5֬Ւb/M1I̷?(L T@AFTo E IgtCazo!Y$8neiWT]qTt{U8; 5gAoXl.q!Z7Getaa,kINgB_ 坷Ͼ̷ X\'s1zN"X$VҬc+}9r.siιZ:rmv7  R}\X:Af ցQN6¤|Ԯ+6dt;4Tj>ms q {+̞mCkz8J.R?qrlP^9y`P>d)@ҧ* 4{צՠ}gѐC)_H7:}eV&_:lVA'4l]mLJs A9/F3:ùMчa;ȶ_nv"|je{S6ݽGc/S-S)^I NH\"$p2Me)'ێs(_>OZ^.a_Q0p׸˃&v 5sLjePdt,!*:^wN^rң!bMߋ+<}DǕ= h}3~=Y?' 6 ~cNn+.޻aٵi5(-^]?]M6 ;HMȋd\"V돿Ov? pB\y OUN sծ,LIpD|ę_^)韷I, ZS41#&9+zq;h"  ,~ ~Z+%ՄKgH @:]fLYZLN@Kl:B(Cw۵5,%h߆Ax=;`K\ٲ^/S8X8gÁC@Mîv0o:cf[]7޳fylQ54L6~@i'ی=Oޗ3x/> 2t"qۻ.8fW5};׌w״{Y ?0:$O \mVP]6%']i@@^*$ʼmakLK5{WE1"7s"iAPkikՈ2Z/ JȋݎEl߂%j,WeWJRȴqR=û5/Ö]Qa0y[us2 dMIwrN40}:MK4ie.dYܼ*^p2YYKBaɚ,Qv$5ѡ qw?NC,#MosDŹ.FpʶX7c=p*D;:@`}fe01\uQ]R6t㱜pBX5tX# mt'k!:P cE=cuATSM$Nt;.߉91 hLqD1~>7íYAtX- *AB8$\CF ܱ`q)ZACEL!w}J-QZ .pmbZDzBʎ\^>1mTp=2vL.,#oIެd"z!(>|IEO;0lP(y\VfԱ󾴨tH(m0>n[$"dEUVK%QB.z͂ɑ 78MKE!cI?eikmo)pY&Rz\g!Q+_LNOɧt@vfUcj`|t;0+t2F Pcl 8FtGy@,5ׯa3Pw$ŷܟD8`mm\uY|$ZmDz> -3WYk8o]j B%UcgFoQ v셫uKOe&%t`Y|n 8;;y;mc"(u&.-iJܪ\;,&G_K;{ ߺbTysؠBZVrgX('^9|_jPi,zIWAߌFC0HsƔZq="@? w?okb[f_i%ZRrFWf8ku* G}GW?㤮ez勼Pw% P?G싟wEgZ5;Z̷s`zuj<<_8ٍȑtQwcgz6R\H~(-6q<+SU(_a"2(Z]p0O^$X8O/̼=K @/*./-AKT?-sm&LM-Y )tȶFM{Ϊ$ITywR]U'g+_Eq4)r>Z',}%)x(dc++8 =ZAtgSmWu{nXl7gk@ ֮ H=(ڷ4bn߯?6GV _nB&~Սǫowϋ51?wO>jmBMIa8Vsk MM-j\~waՍiȝ: 6bNa i{Ȓ mͮ t+iˉ4m jZcVu'#B¦?(a^^vo#v.&C&BK~K/48!>g߯\EKL+SIZDC3;5{C0 #sWztzv960QG"@ňJ|࿋|u<2@yz띳e,JQ^ dDUZPJv:ig&DlAn[-1 ơtŦҭ'( 71g J%X{o^$&'!?4 pYm7zfIF*YoH[psЈ1o8Gyz= ;~FE"(N׽ˀΖ_0O^2pd EnY }X,x*wZ;dعR)ުBC, ~swEsrmˮi,5i|_K iV"KeWn{eFY>:Jo.Fs '& H)Kr$ץfk78ur}QMJ 4 5^FH5{f"8Ml$%;r F>N˫KT~mW|G'N1S 6K8> uK|Wa MFKR|jW-Ԋ{Hm*6(hvٟ:o}h* @߹aVG;| qRZlMǦHR,)6ƥ"mK@T3n1\b6P vKHyQ$[ܻ{|y{yO7c\rTx`9ALz U[SӉ nfH^-55yfWgy5b(oks8c]bk ޳۞3j}4S2dg\MLXEmc3q}u|y|q[:OnKPթ.g&!@_zdw:+3 z}] Q:Y"5[@ڋ(Ïݜҿ'xRppCfwxãW0BOo\iq$D/|ijXpuYfxG3awrgx;Y#Lu')p'w]ZYG--]B.]EDEU4I⥿G9O9wT%MJv:p%f$و7T_|;B_N [xw5M<-y| c4ruŕ':aWNb2Bz>bj1ǥfa2CNjʶ?]xrf蘓i7j,cu3TWu,=1,lfybW(٦uwUy'1ffd"'&"c8~wFg zV/<*łj{[/ޟZA$a0*准3#6Qu(g3(Z1wөļxy20Fa3D5(&ޟ5-&oÏL%MHh6^_V>sM?}ڛ|]jMhs{{oU$/%4eo{Xw&kuX'ʒGYc*1U,0BF4Ck'Y|nBfÚ~"h$5q{s:s.w⇡ \N<8lQjʼq׍pZY=Mz. K?"qŕ<:U>[nI^>?_|YֹxJQ)cC~V3:jWrFz6"3c~d],7CqʃUMs X1|Nb|=K zNab _+ u;rKBb "FAe$ɀUEpN8Z]5nOYϏ(\t9Ükɯz`{q-TiGyFh90X'|y& cG+Jl-"F Ђ{tW@~GdۥϿ>^0텊>DVitBB|~wM]F+1s5!&Z Ϙ~nf}y:d01$N :"}̿LYi2w'm0tr$(Vڛ ~+!pGK_s#1QWEɌ}s_<Ms$X֛3f>b}]2di=s2e"qM3 "\9͔~ݏ %G{[0)VtgZ"M23wּ֒p9s?I԰t`S-?х OB/4kNVf O_kY%N;2 ~z1Yl2b צ]3fij-7&}^B+߼ԥ0Gv4,"   ^Ps(Wr(O|s<Mp )WXfT]&?~3VLU|!``ѷ_ .ov D?8tZ]=8yT(AUl<ؤ߸S2ZDmi3@}.-բe> Bz]D1,jW4 `Czot!pZ;]3ڠPOmI-^FQrh< pxp)fL_1}9=:F{>Xd+;8)k`V.F`-"? po;kvZ)4͡Bi7pnm 0M~NX&UpK¦EEu/pv1^Jfr+xYTc42HͤPRJXk Z^6s:CgBJw,]=Cd5J"Pz0ṶycKy8z!Ќh;,t#H@sUinM){u^nSEtUXO#%'"@`ko,:|snd|[ %~q󫧌;ܲήNFY^ٟر^ORAܲug,#Px-n#x3ݳ/w8kyε-#1LDBcX)!Kɗ/<5Rm@?"Mü `X3:$b $<1R&UT=x8 m+~>1 dr sdtƇ@wM_jSa`ɷm;!Rb9`8Dwz}{uK^) R]zEVvTŢ+I7KGRHA#HNK?V<.9<_uxOspĢ+Kv*˓7dz_z |TUrB?ҞA;2k:"Eue([74+ĨYZ N[LA^fBј\TQB5r툕vSt*M#e^bWcɆWB*-,)סwD}qk7 cDoW Xl0/\E^h$3ٽ>~BHL'Of5NtrT2V\IsAbFt9|KeH^tJ0_x? \ o/+E}gڭ(? &(u>PFv'diV8u/:Ozy2PG"%̶)=ߩ}e2H+)n]*g*qs_i"Y.Q=?wD75P{]iExs(F Vp21U*׻ 3,a MycKSZd?H|uVf5fUs34q駄!c؁ =Gpͦo(`eH7dFUF%$Wz0!Vdn>\\.,]SGp5c,QX'li8v6s.8G# g#bڛ_ ksƳfNcb5Av"ONFX`&]/}cr \c3wty)h֫7zYK#l5Z{c M_n$1z%6 кn099sgˮNޠ>pz~gpȳgf!iyӈT(1 `=?7*8sKi_cT{?0lFR6k1|J}mȶxF/u21 q#PF$!kBJW-ogן^^{>q~A/~9:Qzxq.anpzڴ`9][bU(= t/WЫ9P[&Ϋ +NnC"F1#‘"WhM?@P3_ 2%vq( >Y$/\Ww1yikcG%,$~J3kObU-da:iW}/w^ZG͞oY(P|z݃ Gvx1C1k_+Ƣ>}3.B7C7{y~'9C;9~p^@釭XCM>~:To ]7GD9Bo IJ+?%:{Az|: c'y9;֠)X SqR y(JԎET@b?AdA*lUSF w`=3A8k,nX%ZI m.9;AYs,}ltiK`!"<{/Lo v5eǦ@bsHcռA(;)WZA:k+_+KlgHDW|%!P@J<`W̓dFT C;C ^㶷":9IU/brIpd!IT [>OV~fs SUmj]|@"p kH<i>t?o{K)Gʰ 6Bx8;zev˽,G][4QFھ&_6modْcfK˔c&^˦juXUpf^,P kT{S9b -lSNNa0x|ݼ_+7bKsO,;_nQbiDĿEDh«a60:mKlxp^^MnSIsj/rI\o0PR~(h iVD:xQ5NAA좚G ^~Lgv`1T@y16/ؔ%@X~TV>VMqx^/shuLoHV =!0>Z.0'>vSQ J3TYI Qms"%Y\rN"O|"kp鬿L?ywgJI 2S1oF//7Ǜq Pip>T '+'/7+XrTJ q'` n[a稲(.{4IEeyS!:˚_ Z&O7X3$BZ5oͷ~EO֭Zzu?=#ڪ?gndePY c)864wI7([`3w˓,E{"YϢ~+?Oػ0{mߗO`'<=R9D]sߺ ~lQbWkIxta#d Ұz+P[=Cu8(h@޹T|,s%:O'x]{_'d XKw^okmf**b?ԗd=2x fFkQkyB"/$&4G+mG 8l`NHU- uwZc5tEao}WBt8k-ɲ[AB"GRRTQh;A+v%O<-4^r޾<8Ku8Rfbs Ye(B4cGL^Enp7KW(;b$OPSrs3퓉s.(6Fy[jPz^S GqqW 7%GmK0 ޕȧh7>#hӄQYusAmʽ@m$e7Ua0c4W7@C>S[Yg~ү5Л`8V_XW `'}P WO`BGpe|ލv=h=HȨI/5=TCq4&O J^~Sw.9y+ v F"aEl˰%tK0&pb:|PMXɔuB-BŊ*IB{\X!aOv, T9bebpaE|kPvm$Mӕ=Et*0P=u$CkzEw4[$40[N+$02}.BeCPa]uA*!q[=2Ed[c:W _WD('Kw GZ@\}^7v[ H|'/۹mfKݯpUH`9/"A{[PIiOvV/ý$!RnvZZC%CgUafb$${ReBGCDܝGW_-^2̅g>MqmhWIVZO 6nM_6HE5]㖑PuxvyR=9#; b?vL$`-XOduo͟'Vt(!oO޼:n$-j%Bc(emń8?Or^r!Ay+B@PDQ,PTUHHE"R*@&I ot(Yi}M}F!4MDl(#!sa Jz{Jkr%.Qs2AY#WXPbD$g,4)0΀'(7,_ Oh, sNAEG `XYFɖn4Y՞h}=V8bMS9MdA^?r2,R5|fb-և$3?/~dez^p~; gI$Fmdpj9tҥ ,G >Mq> XvU*Q@ڂňK JfGigWZ_H`U;,{ 0 ~B#}jc(6voG%}hztt&`` ddWi\&h^|Z,C&]X]FkTSVODU`j,5cKXk[B͋BFIJњ Kl-Y3ev65:̋8=F-vbD-EcbeV.wvIn/; I'ai-V p[𫋿rwG׿餓 bIP8tr.quz V]|uRMP$K eL4lbs6b0)r44Ch^wyݣ\]11>= > 5 5R8Ab ǎlX!(-eFP[u w 5&}Lop[ ubHA\]WcBsm;*D/=ۖ'fsS|~l歏$Q;{W;-4QK&u T8ݜir\w*! ngvf1+^YI _ YlSlt}.w}%ncv2rQbv ++Eϵ#;,ŪZ!ƿtI4RW}4Wh>Iy:}&wq>{:t^Am-%1u6IU!E [l[)OȈ$)1 ,;r3Hz |W˸Xc 31ZsgY?6F9o5W[6859;KH*ħ„#P†jDzn ~3u͘G\LPS!Q UiVV['v%PCa9J nCwZ[d&ݙP%v)aٖn].pPiU rVʥH R>FXPV+7 $[:5sCjvR~6Y RN{#QY0X~(pCB:x~2S>Jwǿ(v.OjwM-rDUұHɽ3ю$ri"ā"&K{;yi5yU:Ծ>$'SWxǫP)='Z\#z7^Cs .ws2eb fVk'f~=SXꈵ˅̏mF;,s/Sj AoSJwwҐUl8Q7|hpFjꭧ- k#D %]ڳ{&1 ' |4s )( 6<_8=R2xyB;G|ε_ֲ]םO7uT=~VϣxLe-"%={EY,܋d @,xtf J: <Ⱦ^0jg023y{|N䷓Oo75l݌|#ڠtf7|ucvZ2c,"`"" .appy#mg^*Q$VzŒH ^?냔?\נrJlCYeZ.Y -]K(~ =Ҧ 3ռ`T3hx3O\n&Nz'wHk5f`"~RB:ٳVM;SHDB GlG _a{l`" d(,^b@}+F7EjveDEC%ޘ;k~՜n1ws%G==|N+Ti1Q/I~8-.$~ٸ\g[06 ((F&ͱ A'_ZZS*#RhMfq<6Q Mx|9Oj-m%{#9[80>ƹL(W5u/Rou!BL?o :#2U}MIkP)}vw΢6O^כ~sP.|w ψ!KosuO\N[OOj\cg[=;ɩgBJBwӌFr5d~41NY55t^+n6HA8B&v3jCII͵]:Cc74px(sON '+/_K9.H M[&Lӗ&("aGfnjK.z|{];zq>'cP}f-^/|(W>~;=D<8;ꟋNH Ea,1zبUPc) jQ+α"lSeIna(/.FHEȉ*9xcH4#c&$oyթNޕ2|W!3e/ڈ;!xBi%e5֒jܻq 3!J:XMwbʴpQ~WγxH!z\2]@=G АB];% (Dݥ^L5̊`e}zy5Lɇo h_U# "Iweb59I.U \Qr핻d;^O~;z[[^RDه3J7Tvn妛>͛qFq. o)v4FslvoGpfB 7B-4W,4FX٢p4`̮PnkӾh2%~ьz+J4{!#O-P00gnXgjV9ZfNT@+4r]#,fyL}> -2W^ZByBuYŒ&a mSr Ur bӞ9]\KmXhl8~VtѲ׭xNߪƆ9fƱf*ӰnRz!O|~^'Dz#(.f@c+'V`'HUک)FPV| 8yD!2R# ^ኴR,uQFd9T࡛܊@ [Zru@5tMԜFˆp19o n3P& !5R#"hDS)W~}Lom ΟX+PK@gVWzzOm44I(D6تTC-ƴ1naf*ؒ]^lOF/Hgi!aߔ=?It#nӋsYӌN8N=֧!^RHvPRԏ=RdrDB[8; {qߩQ 7%Y8tԂjܯwڟ\%b dVp-||{ӈzzaIqalmH\^j#x6Zta;\Z',!WKásͷX'fۣ?cdfj[UP<~xE2=_wRIE\ g'{<dR(jQ\ 5ؐUѶ0A܍ b A5=ʋ*ɂ{|DU,7>ҜÒdϪ,]^2"̝rI,MK gîgGLH6@nEZ~Q8 2 H8889$I$8BHD8QOpɳK `~*¤*H淂ZYIKB$l@pq|J߬ܙvFZ6v[eae`3Owψ=]d˔`Obv$}G;+~Z/a9^d >WWfrX.O&I)p`pdj|fQ$*AJ0HH?ehUR 4#H_#5pʮl3hA# |s7|ڪ<gQ ) IRAa$oF=w`oҤpBeڿ ^›PP:&;&'q$]իE#ZUWO6\%4`[km*[L|W08ғ"V ʉfڿau}]7j\ 6" 3ôbuX^8U@U4WLn7'&*UUUUUTmE)| 2I#@g}VO׸S BT D@R;2Y\: <]ӮՎlU'dW3qԭXXeV:|jxS_X/PuvG_{`QvΏR3KPBL$X`u"G >Ի" ;Ph,{+37Yガ+w ڟLB҈`XY3-^Nx`AJRYt&ziFˊKĬ1 I+ޗMU4Wb^m7^zwQTUMRP ]B$$i -suk{mSU 1*SFKiZ *v &Ӧ&qR2G|MZtRnAmof,,}@$ 3%f LV"U=A֘Dz|:))bBHV" js^+HXhI'֬WEH ))KwlH6Vg(ovf*֫@@ <%;鎓Wu6m6,vtf;қ-gCxG}/pc mQ<Ї+8cT۷-x 3Mj]L%K  z9:rS5ٖU|6Hnݓ=lllu paޖUֵ`GGa+aPϻ"Y}0 ,񤎕?”x}?U@ 9JA,U3)#*+UUUUUUUUUUÂg 7PIu;|4l0Xw1ԷH!ICTQ6|{PC`Mu1I&2>"Gd~Gx5q¬y׼]uDZ-xW}jwgHAarX/ /ÉZӌC,/;Me1p@T0-P?UuI6YNd*lFȕQ6ݵu":HYTk*2hd]HFfD#ccVD9IrK1mcBt;Cˎ@*:FcӇckP 8FαK3ySm{,F2?.XH) HBfŚ^}sHBj H@ƣ5XI/o06 -ZBWH9eCۿ2I{ &6|߲dZ f{o~ e&v"vxye)X햀zuՁ]^78Gާ)~' fUUUUUUUUUUUUWc%_%*ORM鰿ĿPeVCB[a̙ ,]<+O3;`H$[m {Jx1 F"IYԾ}TaaKki HF I'QZ]!/+0GTIH,5%lȩ^ϲWh62O+-&G.<;t]HTZToBfrW]! `MjoC, l ڏh!VeQ~!ĚK֐.>W yPQQ1d*;0 i.QEF QݙgAeajʪr>("aZ&^hR9 H:|A03}gJ9㝄^HH+$)$CPVCXڄb#@\ nLO_ E$(ETf Sbꤪ)ߜDWUBO~Fs8V""* L!L%٨Bb>N\dL:eNظP$!#!Ѯ,=rFP@r 1V!RQTu`(@]Iđ3%LL m@mBVL\\`iyYFPB#ԶxѬĵ)4E>$^D?uHnQ,1Rgj=H @!Q~@V6>M%H`:Z`;>\(JLkG]|pt[( _% Y]C3fklzb1݋R(ɕ{^|bq"#vC/ro<ӧzg1uXW^30l"aj`amÝW[_{YfVÅ;bSvSV b*GBQ@k;1z5U^@@b$pE9EhOSU$n{wn`$ (S"bd~ K! PDԙSB*pp#&X y! !VPh͖k{[Ic4[ &  14@[4gRi{kwRHp#$b%T9x%iن?3kHƠioBHm<(ODQHўD,yF?&\{"*v}穮eKVy0C39D2)P$$a02Tڃ c52{C'eg^G>̤sNNJwVz̡O@m^U}dA%Fq"_CAI kI\]Zhn8ybn^O1ߋ#}*g\segA Oș&P?/td a!{j2ٚ9W2X[@1(mQa@Qƣ[& n xh}̕VFkv /-m$-vHr@$*&&ι ϫϩ'jO5kƟΏg;.?o衐mZYC;7slu} b&qxº|F\JF܎w0 "CE*cBL! ODP_v{ׯj` !l!&МMȶ;e-B)/h}Eη.OrT@(A"*7/"WtHIe/$s?FMkY(sIRe[1<RǞzʋuDY?Ź֯wYXi/'š[D58/$r}!ԚW)ѱa?PJA- \k3YP"3&]@Z[7t$3 t|:%?P 1 aq '"&1d~?g`~Q9m4 @yǙcgL_N#R h`ǘ|"&R9YF??e} kb59خ7D.,]Rd -?>lx~4e]:XK?E Ry5@[J+?)B4čt{$ax~ :9Zi,YB5̂d(_y#V‰&?1篝i7Ė.pHQX' c/#tr|\!#@cxne rB  &5g.o**ws¢<&+-+B>}s0z>Cp'tbER0Dbm hLLcI& IQw}Cf%PXᠱmgnBsC[]txmXQ(źyEn;ʹ&~ak9ƕ|B1]ٳWΑ(w