pax_global_header00006660000000000000000000000064151717104750014522gustar00rootroot0000000000000052 comment=5ad2431dc38d2eb2512bf3d90a4b81ff89e57dc1 binwiederhier-ntfy-5ad2431/000077500000000000000000000000001517171047500156455ustar00rootroot00000000000000binwiederhier-ntfy-5ad2431/.dockerignore000066400000000000000000000000401517171047500203130ustar00rootroot00000000000000dist */node_modules Dockerfile* binwiederhier-ntfy-5ad2431/.git-blame-ignore-revs000066400000000000000000000007571517171047500217560ustar00rootroot00000000000000# https://docs.github.com/en/repositories/working-with-files/using-files/viewing-a-file#ignore-commits-in-the-blame-view # Run prettier (https://github.com/binwiederhier/ntfy/pull/746) 6f6a2d1f693070bf72e89d86748080e4825c9164 c87549e71a10bc789eac8036078228f06e515a8e ca5d736a7169eb6b4b0d849e061d5bf9565dcc53 2e27f58963feb9e4d1c573d4745d07770777fa7d # Run eslint (https://github.com/binwiederhier/ntfy/pull/748) f558b4dbe9bb5b9e0e87fada1215de2558353173 8319f1cf26113167fb29fe12edaff5db74caf35f binwiederhier-ntfy-5ad2431/.github/000077500000000000000000000000001517171047500172055ustar00rootroot00000000000000binwiederhier-ntfy-5ad2431/.github/FUNDING.yml000066400000000000000000000000501517171047500210150ustar00rootroot00000000000000github: [binwiederhier] liberapay: ntfy binwiederhier-ntfy-5ad2431/.github/ISSUE_TEMPLATE/000077500000000000000000000000001517171047500213705ustar00rootroot00000000000000binwiederhier-ntfy-5ad2431/.github/ISSUE_TEMPLATE/1_bug_report.md000066400000000000000000000013371517171047500243060ustar00rootroot00000000000000--- name: 🐛 Bug Report about: Report any errors and problems title: '' labels: '🪲 bug' assignees: '' --- :lady_beetle: **Describe the bug** :computer: **Components impacted** :bulb: **Screenshots and/or logs** :crystal_ball: **Additional context** binwiederhier-ntfy-5ad2431/.github/ISSUE_TEMPLATE/2_enhancement_request.md000066400000000000000000000012041517171047500261650ustar00rootroot00000000000000--- name: 💡 Feature/Enhancement Request about: Got a great idea? Let us know! title: '' labels: 'enhancement' assignees: '' --- :bulb: **Idea** :computer: **Target components** binwiederhier-ntfy-5ad2431/.github/ISSUE_TEMPLATE/3_tech_support.md000066400000000000000000000007141517171047500246550ustar00rootroot00000000000000--- name: 🆘 I need help with ... about: Installing ntfy, configuring the app, etc. title: '' labels: 'tech-support' assignees: '' --- binwiederhier-ntfy-5ad2431/.github/ISSUE_TEMPLATE/4_question.md000066400000000000000000000007171517171047500240110ustar00rootroot00000000000000--- name: ❓ Question about: Ask a question about ntfy title: '' labels: 'question' assignees: '' --- :question: **Question** binwiederhier-ntfy-5ad2431/.github/images/000077500000000000000000000000001517171047500204525ustar00rootroot00000000000000binwiederhier-ntfy-5ad2431/.github/images/logo.png000066400000000000000000002415301517171047500221250ustar00rootroot00000000000000PNG  IHDR pHYsPP ѣtEXtSoftwarewww.inkscape.org< IDATxymYUE @À lhmBfiHLMIlSaVfXE(bHMHsךߜk~b=7=޿>4W? eYa~i })tQ3șV~$Եnc+{51TGՃ]pŸ*#kikݞ _/m-, iцØkj}Do:ymȏo__TEh ;$vL@_k@H=EU^HҿC`G%H k Hߢҿʋ?AwHH 6HZG/"{@OF;ҿR_ ҿր-z 닪H-$W@_k@H=EU^HҿC`G7Q@_k@H=EU^HҿC`GR@_k@H=EU^HҿC`G7Tn n5 G~H*/ҿG d! #jp n5 G~H*/ҿG d! #+=kA#?ҿE}Qߣ2ؑk(1kA#?ҿE}Qߣ2ؑ+o n5 G~H*/ҿG d! #@_k@H=EU^HҿC`G@_k@H=EU^HҿC`Gh n5 G~H*/ҿG d! #;h2kA#?ҿE}Qߣ2ؑ}4j$i5 G~H*/ҿG d! #iD_k@H=EU^HҿC`G3:mȏo__TEh ;$vW5N?#[@Uy=Z '#HIUM!H k Hߢҿʋ?AwHH%H˪* ۓ0)J-z 닪H-$節Mf +VJ#mx9!/ҿG d! #i@WFw?*s4&C^HҿC`GwU@WFw?*s4&C^HҿC`Gw @WFw?*s4&C^HҿC`GwU,Z)"UhLH-$,Z)"UhLH-$4@WFw?*s4&C^HҿC`Gw x +VJ#mx9!/ҿG d! #*Ga:E+]D6bIߣ2ؑ]U@ac +VJ#mx9!/ҿG d! #C#ҿh4ҿHцWQl1"{@OF;ҿ? 0Z5k6L3~H*/ҿG d! #JB@K#mx9!/ҿG d! #JHf ۥ]D6bIߣ2ؑ]%`0H."G^E}Ƥȋ?AwHH?hҿ]Ehë(јy=Z '#HIU(@K#mx9!/ҿG d! #JAHvi >Gc?Eh ;$vW?."UhLH-$*5d ۥ]D6bIߣ2ؑ]eAA<H."G^E}Ƥȋ?AwHH2 Hvi >Gc?Eh ;$vW 4ҿHцWQl1"{@OF;ҿL?4ҿHцWQl1"{@OF;ҿ? 4ҿHцWQl1"{@OF;ҿ*4ҿHцWQl1"{@OF;ҿ 4ҿHцWQl1"{@OF;ҿHvi >Gc?Eh ;$vWդHvi >Gc?Eh ;$vWU?H."G^E}Ƥȋ?AwHHOg ۥ]D6bIߣ2ؑ]B;H."G^E}Ƥȋ?AwHHHvi >Gc?Eh ;$vW9Hvi >Gc?Eh ;$vWHvi >Gc?Eh ;$vWaD7L#mx9!/ҿG d! #j@GH."G^E}Ƥȋ?AwHHg #i >Gc?Eh ;$vW͏;$"UhLH-$調h$"UhLH-$y?Fw?*s4&C^HҿC`Gw $"UhLH-$Šˆ􏥑]D6bIߣ2ؑ]0_Z$߼ ߢҿʋ?AwHHZ$9kaR#[@Uy=Z '#HIU F;m%gH=EU^HҿC`Gw5kaR#[@Uy=Z '#HIU I@نIQƏo__TEh ;$vW-*_ ߢҿʋ?AwHHZ`f&EI?ҿE}Qߣ2ؑ],6L3~H*/ҿG d! #j? m%gH=EU^HҿC`Gw2H50)J-z 닪H-$%ºaIҿy&EI?ҿED鿊Hȏo_YTEh ;$vWmҿր-z +jH-$*ҿ @#?ҿEeQߣ2ؑ]E(HZG,"{@OF;ҿHhe_k@H=E^HҿC`Gw_F@#?ҿEeQߣ2ؑ]E׵HZG,"{@OF;ҿH6ҿր-z +jH-$*ҿE5 G~HʢZ/ҿG d! #oFb k Hߢҿ֋?AwHH"۵7ȏo_YTEh ;$vWMۘHZG,"{@OF;ҿHmҿր-z +jH-$*65 G~HʢZ/ҿG d! #_@#?ҿEeQߣ2ؑ]EHaE/6%;_ 'ҿ?߶&zleZ?0" Hߢҿ֋?AwHH"Wnc-: mx9!/ҿG d! #_HŦ+aDw@'$Wo[°';bSҿH0q"YK{ mkAZ֭Uaޙp DІZo[_ 6ֲn $ؔ 6LHnHۚmukU _lJwB&N7kiҿmM6HX˺* ϋC@/6%;_ 'ҿ?߶&zleZH` DІZo[_ 6ֲn HŦ+aDw@'$Wo[°? bSҿH0q"YK{ mkAZ֭Ua~?)A m8ݬ=I5I gc-֪0l ؔ 6LHnHۚmukU_}ؔ 6LHnHۚmukU_(3ؔ 6LHnHۚmukU_4_lJwB&N7kiҿmM6HX˺* / h DІZo[_ 6ֲn Ia2MI"Whĉf-OI?kYVaˆ/0%;_ 'ҿ?߶&zleZC I"G^E}Ƥȋ?AwHH"n4kJҿHцWQl1"{@OF;ҿH@?@w?*s4&C^HҿC`Gwv %Ehë(јy=Z '#HIUm?dҿHцWQl1"{@OF;ҿHPH."G^E}Ƥȋ?AwHH"nÂ@w?*s4&C^HҿC`GwvFREhë(јy=Z '#HIUmH."G^E}Ƥȋ?AwHH"nÔ@w?*s4&C^HҿC`Gwv:Ehë(јy=Z '#HIUmT >Gc?Eh ;$vWkQt mx9!/ҿG d! #_j6ҿHцWQl1"{@OF;ҿHۨI!Ehë(јy=Z '#HIUmT;c >Gc?Eh ;$vWkQo,UhLH-$*6\?tҿHцWQl1"{@OF;ҿHH"G^E}Ƥȋ?AwHH"nÑ@7?*s4&C^HҿC`Gwv6ҿHцWQl1"{@OF;ҿHpˆo-UhLH-$*6Ak@k6#?ҿEeQߣ2ؑ]EƜ?4?]_(јy=Z '#HIUm̏ ~Ql1"{@OF;ҿHۘ+@O!/s4&C^HҿC`GwvH2E}Ƥȋ?AwHH"nc??]_(јy=Z '#HIUm,h ː9!/ҿG d! #_ H2E}Ƥȋ?%E IDATAwHH"nc? ~Ql1"{@OF;ҿHX0.C_hLH-$*6C@O!/s4&C^HҿC`Gwv Il ː9!/ҿG d! #_EP0eHbIߣ2ؑ]E t>Gc?Eh ;$vWk ~Ql1"{@OF;ҿHXx.C_hLH-$*6Cb ː9!/ҿG d! #_%7eHbIߣ2ؑ]EH2E}Ƥȋ?AwHH"nc? ~Ql1"{@OF;ҿHX6@O!/s4&C^HҿC`GwvKHa2eHbIߣ2ؑ]EraD*C_hLH-$*6CK3~HʢZ/ҿG d! #_e@{ [@Wz=Z '#HIUm,9;qҿEeQߣ2ؑ]E(HaHʢZ/ҿG d! #_P4!H=E^HҿC`GwvB!?!H=E^HҿC`Gwv+D!3!H=E^HҿC`GwvEah C=-z +jH-$*6VCr C=-z +jH-$*6VC@{ [@Wz=Z '#HIUm(/@,"{@OF;ҿHX]/@,"{@OF;ҿHXi/@,"{@OF;ҿHXu[_"o_YTEh ;$vWk ?lqҿEeQߣ2ؑ]Eˆ/@,"{@OF;ҿH62 V#G~HʢZ/ҿG d! #_D ߢҿ֋?AwHH"ncм@-z +jH-$*6x gH=E^HҿC`Gwvے63~HʢZ/ҿG d! #_JH?ҿEeQߣ2ؑ]E6 H?ҿEeQߣ2ؑ]Eº.-zXYE6^X O[E=4Eg[0~tˊoWH7†e]!?E0~v]IܛFE !W0lO7oc t gH=,%'Ⱦќ_E\iŵmp}F śjwvB@-zXt,7kiҿmM6p?uFPm'ߢ^'YK{ mk?p* n)33~;Gmԉf-OIJK鿭#[0OO+v=I5IXU|H (93~:~ҿZo[_M7E+-@-z.HۚmlomzHZ֭Ua؞oކ4g gH=x?HnH KADeن) MM_M0FQҿy@xw gH=ԥ)#u<ҿ"z6c?{ A ҿ] ߢZq?R7#;YK{ { nc1D+(8bg;[D\tk gH=ӿqZovC=Q4H ҿ]ڲߢcףnWDz\~x[K{hBmvWOߟ/ҍ082C~a0&_7G'I5?E"oV@-z03l^Qf?A,Z2†+'zp߲ \x(~>لL ۥI?ҿEo$ ρHҿC`]6A^:Dk= b 5.me?} (?#[``y>Wt1nB3eyZkAqOGY7צ1oJ ȏo>?f-O?8\w뵜|OZ鿕jt ۥ@H=H! : \Cw@'v_W˳_z89򧑦݈~qyG􏤭h G~K'YK{ mkM<_(ބOӄEA$m%?LG7xsû6o𥥍-tdӱl KiP!?E/7~֕9.A{:ߊZꠞIb\oH50)1X'H==l|iOsi k6_9m0&6;tn]`7x<9e [MSEIm5 e"G^E}U{SDI] ڿ?ϵKHVEk]id_j T$SN}g!a$no ,J>Dm}AkxX߭ĵ]w)ZncQKsUKz{bDe@w ('V1_ dz ;hЫ+.OC!$*.Ч \wa ֳ]'б;~71gˏYH50)Z\[Ihë(8a+qpJl^/ڻVʠx_t?Y-3~]ȯW_oqݿ?tݿuߠ4.; 7”7>-X)oUVf&E 5D6b,MKzn|`QyOrWLc?t78X_YQ$O| vQmB)a0&?HSeRBۛvnɗ͒Wyh˥_ ҿHm7lՈ"\wR"ڥiz(?=ڶ1Cf義q%⢺}^MdL㵄hI4 Lǀޓl3x+ u9f&EE/ue"G^E}v֑C0ޠQh9N8嬃ǝv{ߵkώ]wX[5MhhnϞ)Zn8pǞ8=c#>~kڗǗcܕoh\{ _ǯ}+_ q|I7UKȠ4 ;ϻN?cߵ(jԄ !F=q4}'}'{*| ~rHMm=B~HVGImތk][6/UgfO9__=K; ?}FREQԆ|}~G}6};=H +8`W#Q4 őQypHцWQli/=\r姞y{PEQ˭G=|>{"KPXy{Ho/+ǀ:_DG]D> >d/hC.G[ן} |ՓO:m]eVEQU~=_=I` ww,0:!.PUgcI_KiXf.4JL!"ҿ@ٕUgc{>{IEo>ǙބBI(ҿ(HцWQlMpS~>bEQ3{>>ݝG H@[^/fWWf,[?V\̖Em?*1v_u+~u)(jpOr&:LIܮz+`ཇ~ k p6HцWQleg_#7~ REQi<??݇{,gwmqB+1oVhj?_kSYx;HblNmOz)%T4yOy;?8yq~/h[ v @h9UgcE;y?REQ#>-2ƭ̼fc@4r=J1_b hë(Ƹ*G{o?̛vN(欿~~^swiP3n歳7^:}Igҿ >c?j7oQEQb}^䫿7?/w|Kǀ'g3EI _k`v'kUh]~ tϽ)htݙ=>>)|B [M6HZKΆUgf_wΝozwWOQEmmr760V@}HZcUgf\/9߸u'qT EQEFϹcohc𭀦> [ @s6J6b̌+kv^]y/(j3[7'x=nl70xк%lnD;?C -_) _b*+HцWQlqM_ʫO0 EQEm|਷tz&cdVVp3ofT:LEl%@hë(̸&ܻ/3+AQEQBkM?C>χً6ڊ\ e%46ҿ[> >Gc8_}k-GQEQ&4Wz֙GO->8ffkGE$@g? MJ/S%@hë(8.|kkEQMu{kꊠ{θiG&O<@p4E(X%?*4Fw]x?EQE cK_{m=H~*`fkiY[GkmxYϺOQEQYt਷{޳w㓾/ B?3@ǷnI4y(_mx9Ck!~Y7ҧQEQvQ奯=f&̬ 5ηM6hqNoe3@K~ /@6b^Pq} HEQ%վ9f[z!+H@HцWQl1*\-/((* ol|28frmus6nsS9/15mx9geMV@6b+^x\@#EQE똽| +zgf+X4 r _bZHmx9ɉs_0Ǔ(VRg[ҿ| ~Ql_-ס;/eq((*M|76㭱`~ P%"3`6_(>EQE=~05|hm6F>H߇C>Gc~REQ?낛/4l~ 8&z`Afk/15U4ҼnJ(Dg={ƓzЭ @MB{`­xҿ'_(8=οsD%)(km4vWa @ ^@!xҿ3FؾW0\__5((>/ztk=3@{ihbHz(o~֗[)(juԞ}S݉;33@: _v!P+g0Hƚҿ(ஸ괳8LEQEQF旄Z3@!S5[x!Wb:'E}EREQUCp3Ͼ ֣/~KzfW$WEOטܐHʢ>A`M^ߌd IDATMG٧((H?[ gf D1A m&ֵ|?ҿ(Ѹ4:Baw\v0EQEQo{skf-FOPHO8o2%;E}N3Auk)(rmOr]e+@W9 '7xk#.9EQEQ4>[#a_!z//V2o. FeQl]1qoy!(ugw!t(~ :?S0^HEmÑoӃ=Kl޸g+N=SEQEQ5?9qZڙi]4@7~+ t 0ߵ~:Q(Z='q2@K=[_ S?%KFq_Vߦ'z5|fEQEԞ;o!D3@?VwG`T"?]Cҗ@k>]o.܍((_=n-굿t@09SںRH6=,f @QEQԣܳ/)ߞo䂡&@\34S/\5})ҿM^89t((jNΧ>sƝdz4p3qFM;?]K3mzXy=\_~3_(Z:=܋'}; :{!DWh?] H6=,g!.7+AQEQڽha+ANd&h#BH=T֧~}#nz|Сo>S nVcΖE7Q{HXHMu7LHo~Piځٳo}d HKW\u?67{+u¸ 7[5o,K@a7G],:<k_>__qC=|f r k?(>ک鿻HNd{YfB=g4) \lU^!O)[{HY//Eab8j8yy+.}@ug_K_|BEks ]}U@혙Jt ҿM~/rsV?ؽ_ >b.Yb@9Cm{(`j?eU1^p; g[I~1O5ꮋKWO>bN{MeoMӻoso5L*Y%s3*.ǿo?!_9\yx/0%s\˼r4nKzP惿#yߏw7J-Gk{R5M|gggKD_"kXH6=,&g4ݷ߬{ϾPt80L8*]\QL,Ec;8~P5?C-Gm/}nQw|ѥ}]0w6ƿ!ukGfoBt } K9fxO]fDZ**#QPT$K,|ݦYKg-n2PU  l.#8fln}С(ĂjXg9cd!"X%eAt50mzS;g_(}kgUlpÅ5|9oB/a+Cɨ& @n#gF+`ngc $ÿW>?y9^~ w]g\2f @a>o4y _xfz~E/L -jz_KaJ.lL$;? )Gᶤ9ee/Oi›>37<ڽc0w X?eiVqHzҿMsS]G-:t6Gv(z~z,4ӿ& >Y4=gĹ$OkG 1Lȍu Tp0 |Gźxnaw;L?a{!%CH6=̍J>BؿkY}󟙹nEed1! ?,\+(+FEŮ0ZпP Y[>{}<uXsC3|OQŌ IEH6=̓M>1380?fnUxTKiBE>] ?i܄ٴ%ۍ>#0cl0Hv6K5OV>oEչǞ|ϛԷѝzYwH␌o?/Ǥ8A\;ȃm8^uk4?a @5_)6B^S{ښ? v+(#ag_6bWRV n_^ӿF0+Lp.?i(8$a?LI|doNMC_B◀k_ kzBlemjr'X4_^JF5ylv53_) h gRj?Sg>Gv΂鸭C_KhfoNy!&xGІS/ݱS\>ѹ-x/m`,K9e8[ő|%Dk&Pv0,TP{Cv;DWŚvIz_bS{BO!j-_ ԑ~x3g[ʎ CO;Yd/:g-M|#@Ew `i,i}mu/s%:2K{s?+ah\xGy=eNeYa^~/~FEK7Sl6#*/^3AG`x2;G__3 5WP"/Xy Whĩ$^k+HC^t[ U1 D(gllZ[)SyX(NQ aHM. /+ n-jݶ_ڌFӾ_ ҔF}Ĉ H_ڱ@Іt>KK}J'1W"\+K\ӿ&Q`Gnao9K5d! c5ƙ B3\HAjB&Ng0Ao]|9ԩ L7G/9Z3|Kw `q-ۥp Qk0.zkcO"aاn2?9Hr*&Fzqj. ,2dV{`J>;LBV%)J6x]H /}zK'L =ƣ _!I8VH0q*yFl^z3v-5Osvbi D@cHGJA3 jCnJ< ex9Lx\IpkAρE/Ph=+a*Oؚ<_o: Rdy+ve)]k`2|hG`ԇ'V5Lȍ1h,:sQNsMԝ&T20H0q>2b'hqe |9ԩ0M0@Ix8'+V(#z/94N@ mOg&EBo ?'qH0qkEoż_*a%j^d׵IAO}餲`x4=,ƅ _ ND 6LPr;ٖg}9o1T4k࣠哯i#n Ο3H5@ S!e7 p['*u E7bW5&0/ 8#(F{? F}xb_$Vђ]_{[$c ce5XiZ -+_ ')qG'ԩ_#`2$`|K) \Hp/%OVPrl3{%%]+6 I96Lψّ}5Eo? қ]bSYE8ѿ=&&2/Ǖ|%> )?e~v a/bL:??S8*6L;aI 0_'~bi D w(@oq)4GR" ))_0F }_GFpI`"բ?@Z|Y]iO m8ʟ2+Z3 E7bW5&0/ 8#(^`C ӿFI$e`x1O>Ǵ=C3 (weLH?#4+a?#>Q\{@"Rn^+Z|WA0%i0PɊJnxf1`֎+w?g(H0q~FdK= 6em]O&>oTVcoV"/Ǖ|%> )?e~]KJ 4!ҿ8D؃p Whʟ-y-MXXDXEJ`?ShT0ERvSja(;ֻ0<$V\bn`6ү/H?;G@Іu+;wSp]?BWV;a m0Aӝd`ԇ'V5)I$z$F8?B ]@L6L}x/R1Җzx?&c$U{mHV˥⬁v1\ X[ȕ0tyP迻`X6+adC?XKeɬ"5֭D^+J6x]  $'ϱGb@*B&Nk+.|u}D(ᰈ  Ha0~Pvwa4yH%QE2DFKsB&N@[~g 7E G;bn,FEgū쏗#AG\ fL `bJ!(  m8׾j#sFN%"x8 w/ ׊U_"Lp/x鿶8paK nZFrW/M m8Kdmy0ʊ|NNe0Fn%\WZG1fld^UO97!.&g*_ 'O? Wav\W@b ,haMRDXE z+˼_tSja(;⻍0 /F=dY0} Gߴ7 ӳ0Ư_7+a(进"#yq78ጠx$($zd?bdf)aK9ٷqt)? i?$H0q?Z3r*7 IDATA\ )`G ]K! WkRRigwl|Hxz0!׳=+a4_  +VzSTVc`{_r AT# ]5SQ(F!t0fld) W@CҢ++M{/ ga@І5+:^WؙͥrR!6(&_՛"c͂rp~YFm3W'pMֶ5+aD7z μظO)58#(^` * fL  v0IIgH@?F3uI6m8 dȩDq5/x a } K[;Of%P3~x:H50q;/׀WZװN;xJe0@>dD5ڪBO? 50`#0O_f$ٯz][,,ǒ+kD7oiӿ )NٛK3Oe7Cm3x_cq_0@Wl}oӆ013~鿆3^1Jmi;|pI^y2#7_& R’uRîn;7m0qZ?Vk@/􏂢"Yg3M`<q 1]K?0ՙͬRK=b)lov^J!J!ߪ šCk@[+v.Yb@"_ڇ,~OkJӿP'~k ?Sw v4, <dum"C=̛C/W+s4&WZlizBʄć"*SRL9MÐrtal"@!q5g RdY0@M H@/[8 [ؙwc8-v*HP)-0@_nZZJ>_"a1?x@/[8QGAQ,ɳXՙ&0/MCcK* \ ?~0=b)^fH{XQ_ׂ k-[upZY 3ƶ=EjXU_62@eFMȊ/HťU 55:U.x^^rŨ׳6 ӿ”I@PLA RGO1aH90F6 8ښ)^Xn!C_* l`gKO8p?ozw_qʙڃ0).(N,V18#(^`[77tP)0מ|ͯ.t6_"a?HEy^Dlǟs/e{^Ԃsu ncJY T@oPy  `W-Fɧ7Lpz$C=,$*(?^.Y,ʼ괳~W^tG!ƶ=Ej2dS[~MDc"I>@eF)M*/BX7/s4&WZ4eJKxFMs/#+<Ȑi(ĜEdB0g ҿdlvp[RTz2?oS^}$"C=,0wHEyy [[C!)Wޗ]k=}  +V3 j x_2ǥ1Z׿ZQP2c?}G`4ƈ 85a l,<&oU!lq0Y63~+Ah  //пfώi}~7ᜋ6H Rۍ>#0@bĄ"L@4͓~9 0kL[_r3psQǼmxm{%ab y? τ3o=dK)eѿ9-HHEyVъSbjN7/|OScz0Qb `dP5%` [WD! [B?rV`,wB<>ѷ_|~ky]ҁ0$iKcFG<h͌WD~p P P@1t# yHos)c`?㷺(o[J pMvk^yInӿ&Qp.,du Fƣ |{'%;"G~ۀ@/^*:g-h/]{57߹+h4NMeh;Yݔ/xN rG'<%TCh~{M'-$G5"L}/7)ҼEw_vzݗ_cmm0_ @= `ԇ'V5CC$/"Cςͦ G.%`4oxJ6;{^rkwccMɝc Gkfon ?.^-n0ܖU\&Z_́jM i6jS v='?p˿핗|z>tPЮ^Ȝ͔juq'[o{9V,g jCnJ7Z*_Z('<+ACh1OCmxݐW<}NUȗοiS|ǿ'8gwh|XtOܐGnaoh6Ʉ` 1gIEYS/ )3_YvyhëT=*[>mt գ`yPWTSٽU =#xcnA `2$`|K) \/7nˊWj{Eyh@oC5M:,n|M[zݗ]sm/Ү\ɓA|U"|)n8WhëhGm>mt 'TaEҨo1T4룖OG>7|_xh>ϜUg/<wVZ!HQ`_U›2Nҟys| ^aJW`KŁx&WIHLcKwL/'p!^[V Ou)g۾ yInNVW|e0:?|U"9I*; *{(GASh/68W?*:-./1o1$ G6&3Я՟}G[2/ݔڏ-snq<$s7|P+aU?*:|,K/3 Z۶xX>ZIW֝kvM)`&6؟QXa^Oh6Ʉ` 1@Oo ?Ճ.~%B."+jHKHt`5A\xh$;^/$p5_\_[gBi!/}ůq_[JHʢZ/Go 6KX;C?Wnκ,cXUo!|NކZro5y3vo,dLkJӿPj>3g-@x' 䫠DsSh1Ģ @Wz! IJI?$gW^񌷼5\x٨i/h6 )RKe-Nx_cK&%)}ABt @Wz͕">҆ElxEC/*X8nK?$ehx?(:'|Ѕ[HцWQx@Wz͕WFR^&,#C:c[-w?Sx D/V[пP_[{K_7WB{[dN:z,9:zSdPWb y,Z _6,]fsƣBa}4K%z٥Z1&*0QT&9 z!i^uWns>:@_R_YTE( ;Wrk᎗ B)?{omWu}uKԁ@wljıW/F'/UJQU5FU٦qpm N0D#Z6}/ګ{{ws~sug~c5Z9j gʎcWsh&FXF /C*J$F ҾF p֩bGؓM:Z2o~ߥ{:_>E) 93{>|W@@. @>?#N;. k R3um|I}v 6O+9l#?]S$ՒVXMM:m嚋/$pk?G[o2m<,IaJ#^?{P(q CYeM{-OZ$I}>SϞ7sV)?lhB Wİ0 |Pj)qƝ?CfHhd*g"76wʮԠ&)/ȅ;̙3 4! HDބ5)|?s8 ``Ɲ?CfO/ @%/n9/}ٹwB*4{8竿8NP| n1r8eOۮOuTQɾù~T x諝;$ِ jzC3/]yޱLb{/8e@ jܣzrK ݰu @KS? *i<_:u=,JCp[; w;+t[9ak]zߟ;+}e}<,MhB Wİ1 QkC"?r30/&] ,y7οK?D8N[˿\ A70!fx g  ?sNfUiVL!VPI38G ?W Y=a0@ = [;[n5v*%I#]w҂Yi>h.dGX`l-@ϸL=?lNv}҈:H=:7*w?bV & W_\-=]$Ȍԯ>v;f-3k\OQ=è+g(2cψW@c^a>0\XA%͠g202oߐ*\VA?/|^yh´p O?竿;))*{! '`1Mb bRKF4ٶ*vU(6DTxv̓e>knLB-ދ\F}>1XN,d+.{ ͪ06`,CT zJ/ @ؓ0%MOl-?#YyomK 0hv}Hiz GX JAO_[(02oU;g/rm9/_tM;wi+/_-J]ƪ42'@ &*%Ku R v舌S? *i=mIO7Ҏ4eU ;-ϿKWlٸglb&&>&>?>뽋 B 7VN YIS mmFb4b`e|I<:;b^]1ػ碻n_bP$u']|3g>&Hп^PC ]3t6Xڰ `j_PI3Yk.02o0@ (1,Lo){v]tM"8Z8k΅֝8R'1y7bNo)[v =R'Rj;@*wp؎ge_PI3Yk:02o Ւ$^Y鿤兝owEӲy ^xϑsJ%-@p%<^!Ef~v؉*i= N%FP_Nnnz3_b5LpO_?7rARx D el1үhB2# : 68ۿET z{12op@v,ݓTzd}eܾ;~%Ν{K??:ϙWh$3)v("$ nJm- @umz~٥RH.с?F4^IK9cE XRoBRG=n[zNg/objtdN嵿p^u{܂B0C] ^fUk[vëe1-3i9[7Re/ *i=Kh7#uTj~4S6aN[wm.讛kV/U[LoTGEe1 &ik1 ^LuQ9qꎌA%͠'{5w ]Pש\b֍u*3 tނ?Zދ9bG 7 _FO'8~EېX 6!pvek _T z)$F^bwC7? CAP`}Wnx7|V:b??zfeR?-ڢ[lAV;umׇ<@Vaa42w``%v1tQ5ԉVzgâHlmff0FShК1: A7d/yjG;[ r3)$F^bwP?.!{ԅڦPgkW?Sm ~tat]l`_S7-1WNķu6BcaPI3AE`F^bwC۾%U©ۤ nves>|SOzauA OSwQaLńWc^0&[> JAO%wK쮹c\‡]'P$ 5vyͥaBaҒ6d7R ZIcb wˆ\Ffгw ?]s`d/%iE`i~;pO$@,UV_(\f<,+#F@#ڏ<&@,%p%ˀ8eh=W{5w N8ԉӿD_\ogysbf0㲣?5e/yvn3Aߕ%F^bwPU $|ZBmC꣐b>srU W?b~axm}'Ȍѿ3/& D!-eCGJeh=Lٽ;h/TXCLjtO}r}wG zrKcnc{)$XLx,ueBH-f3AϚK쮹cH 2QZV?L ԣs'O}ײ aK0Pyz=!XJ#.&U'08\2g4ӿ$F^bw7d}&`C: `];0>wϜC'f ?.;/ ?RB#@0oz%pF3]?]smp.!/cR;dl\-w޿o k ox}'Ȍѿ3o=D!MRdh=cѿ$F^bwѿs;@*qL1 Tam+˾;*NRӿv~h+"`w%Q[~)2Edh=#ҿNٽ;!+Th.4G`bL+.!o}=|_*T^]Fnӻ ={-gD&?~) y- zƥ7{5w CN>;z\0^\^عl;L䷐ˎKOPa򲔿͠gtw΍{5w F "0FH}T.l~W_?|sa, Z@/<+?Ch}aRFfs* ,c0me'8& I4Q:JWrӏw>lS`>Û^z{m x1W~E5T /ӎW zouCMjRac"ݐD ^5:cG Ɖ5\|φB*7UC[i--2V0wË Le-VJPJȫ0lFfг c0\kv~ͥ6\$U_(\f );jW _JCf?l;b`kҨw: `eGXcow`|;vœKxfhyY蓔5JOPaރ'zTFfг1( c0/Q=9Ea]1J֛گ#Ca)05@. Cѿ3.z:h}vLVg4MWG;@D!f\e輎<_xoƟ=rl` UC[i--2VR^L`/ D]lRRD^e;3Aφѿ+Ou? "o ? p|¿O3Xv %iʎW'LvF c`Lu?E$1AՅNPA,<|Uk%vW\֠?v5׮ Xa`'z?$F3Hw?Z1c"ɬ.h8?BQ_@&ǠՓब-jOnn!ޟ0[!YVxlk~mrg["e1r,e0ZGv̷6vxW;5A'40E͡ހGL]*_k㗯sN:lgXP̽ f7C6u)8 .9 ]2bOK5tA;ߤInv0޴[rgO;? 5a ZטLg$ڧ,Jz*1(4Z ¦A^]1I$ϮM;룤H-wwۓV//^:wJWs{lqev92bOSo30EFR!EO 9CfBe~~mc" g~rE?#o/&}WoG#1(~s8 -jwܿ#\KYc!T@bל͞{IgOo FNQ(Bt5Pd_h#p\yNrb읅[iOFcP)ԒwVZ ع`a[L+78ܙ3w̛9 j 11-6O \~B]ET?UW_{ =jZ`_A]xFFkgWK]Q3>x΃ԗc! X.qٻ3g$l4 IDATV 1n⼬M*P*&d=Ş[5!0E͠pzdU*5{_e o$m/ ~ 0L1Cd=ŞBlU`_A.T5K+v<8wc>{k^ bhTZov@Dk#\yNrbl˔ѿ{*&F9e%I">PډoR_xƻO$XLxz1IG^;ѿ{ҿHOxTt Wpy9xμǞc70ŷ?#5,o7{V17<]!<Ě{Uc^0&[<CW[d;ŞjI:Fdi/,"']Z`OYNRr]ݻ+>䧚q.R)qNZLT?`!RK⼌3#p (1(T;r`1J]M]~hќs♿uif|/Lc?=lal-6LctX` ?nP1va2_fQ;te۴?cPVw?JRЦx/K+vt;sև~طzEҝKlxU:<ӛv=mL<_{ =M# }T"vbY8o =۷zEC/=w&?7`N1t612}O?^1yQS5W#7sPcGS0~)%q^V&y(Z8]ѿ{C40G"g5TՏ@@*@suN?gբC9v׍=8 *;/ ?nP1W-@i:1'1(]80GFoo -{YZ+W3sV=!?= ަ1Nob[ (2cWxCh{1_a =ŤH󑆑M}W}x{+/}^qsnS~emϾbj..3lj]&?~) ό54U]!0Gvo?)Vb(X[ࠏW=ɾ+|鹋6mxP$8PeG ݌\I Wa?u >0;tBv]n=xμxo3}`=ƫ_o-G ަ1x}'Ȍѿ3/&u;`؅kTjVA!S]C.#u>\h'If Vzyol=0ޛx` S̝O}%tQn,PU0̣ $,8ހV?u` >R2܊Y9DOc_; NYVڽ5m{bj..35-;Oh?H]L~0}n?3T& 97j_dStntdu'~w-@3)?|˶]ٖ $/Tip*@byYʿv'Kq3?u諭 _o ϥv -`ǯ؍$ܣ:Ⱦ+&>ͷ=B@ik^zs x1W~۷h;kV0:xw.!'F1`5܃W)|/{$ӗlW_5/N;0CxRt^L`/ T hɻe9 b=7t267F10;'k"o7L=֯>?zo!?0 Jv?ծJDҿϭgF26)01A?2qvԷūR[o^<>!?^pH qxʎKOPaR?_ ! O6]u`c NO*B^sޫ7;p8"?Bo_Ȏ; c*Jb[mbʵY*Ch$^5:?G}mƝ:Gt$7aBY /&0y4ݲgŞ`OawlW801FPw3==L z O?vɦ[߹cr8lT}p96&M=!XV6Km9C'a*M~R?J>Zk(r鰌MLc Fkp 0^ƺo鹧/t!0/@q20AAMctX` ?RB#@Hxbѿ㝙 2rm(;`c sʨj^HW^xӭ[)0eJ5`)bk1=%ֲ~^jyû'*_B`ca If 2jt^G:[o^{WC$! k}!Z[MIc uߙC@p 0^zص۷\u=S-9| -n*[*@uu)w !;BvGKs /|3h?|X1֬FBeP:h&Xz[7T _FcxeO/t듯RӡfP.:XsU\@<AsxjI:&kk97jeF yk0&~K6ݺuC~JoyF@FҞPX0@AVQ+0T 3#B:d+?յMJ_o Μg .Q@umdWL^֎nOmw/6dӿDHvZ}7&teBAcƼ`|uX. N1ya2S][I Y"o7pqMnaz?K6mK+/.3Ƥ'T87PPUrJ?JkyUZlCtVhk[!7K"']?bgҦ=W"1@X R\Ʒ?յ&! !פio]oCO|Fʘ6Pd[ڷTڭH@XDwr[V3l]ܨѿ$`O&vnglob]uD \ae3? J5;_.3j^ѿu&-?յS -D75)vм_~{7l{OFʘ6Pum~nˌD[ ETzgȫ,gXZٙu5wh`_Kl:kFkgW;g;^lC~D \ae3?^ȋWp,Xwd%6v[@&L< jGzc[ƃFA쁗 $5FH|iy۵'x1Ѹ{ Lx86˃"迖F;;_Ԟ۾mwW|@_"' V:t:S48Z]ӮLk\oRT\\?#\c7>׶]{&1뽢k̑6uVsFK9_qՖb2]LeFљe'tx)M \ae3% >,7xSƮ?Fi׎ӿ#'F6_GP;?^z{7l{qC~/(c_=)ۄs:LlUgb?l/h$Fn.'ӟ*k 1nT aj~ƫm㖧aOI_ÑMw &*}xT"]!0%vR}4@toގWv}zU8ss';301U]˨t@t+|OnyNDWd/*K ҋ -M<(ri^kQ'_{o?9%w|Np%4r*/=[LC T#]WH0y~"uAՏ7zyίoGrJlbus{0M.HS'²U_mbq~ [/*K -MZ0Wj{lmw;0]J}Lt]ik7"Jk%yPQ_x04;y~"-%ڱiͷgm"WHiOXߕJG|O71bW5[x1'_TW >ZWlD:{Mz/js>G{aDAiGMRA66&yPQ_LQyF-S?4B{{7<ʋA l fB IDATn땽̲#LєmuAd8Ls W6ƞ=V5+{eG)ۄ낄8iOV\:8\#2U?|`/1jN?ˡJ/!L|%6<FL,ȤN%-,e4jUaŒ>ha/*+ L`/1jZ+}W%ƛ鹧/^ ȏVŧJ^F#vd I_86%Mzmѿ+flͷܷtٱ@B팷GQ鈿8C`RN} Sń_e/*kH ?O$tdSn У._^ |T-Q5WslxiGMOۢ}AE} ]D2]M2٧|͏Rxu?ff\v}_ ],+п!0dV_E?{{7<+vX@:^8o'L&d0 "=VjzR&ѿNy~"3$-:cUv/?=>3:4_B c#@M.ubC;^9l#5N?B_ DF %21E/qwbFReGqSAtCeѿKy~"Yퟠ`_n{w_}=)sjh #?\?PR+Pv]s'FҿSJy~"#Vŧ@ wlw|Ŷvpêl蟆R BȄl67I=zr9PG諩4H3@Ң3VQE[]|-~KVQKQz?L yNh47 ڂMC}580d/>k/{WQ/Yv7< /&6WIVjiMND2gKZoyrK+""I,e/aJ7_9hOιK x!0W*~0¾IA 01!@FB7Hq(@)a(dwh`pMcdn>?8/{b%<Ԭ :{6Z ,_m)퉠K'ѿP(*רF?U25Gy8WgwfA0 DgRN_GOCD2*U!$ =EH. _>Z ȧtA0'ɀW?W1HFr1^ LJ,k-Ie&蟆R nb2 lS-/ѿ$F7U`O1Z S2*%8\fߦM`jJ &ٽګb`xA#/{t%<1#(uBK"Foi-x._lmWKC%Fu&F@Pҿ@Fqa55` a <+cb؈Zӿ+ȶL4gJTg1I"*2RLo,z~/F ^cH?qRlKv؅% AL26b/t ͪ0[ƭCHq^ǤT,$Hcv>E/?F1 ѿ?m8HT[c(#S:e]{}eD#udNrʎ;1"n`SAV5w E5{m?bsس #\Ƿ'!L(Y7 ŀ­>  xC):J36HڌtS$FFͥϷ3_F^֕YIfT韪,f< @DCZj#U*8OQi``‹ ekK^`_jd$vDrzA~w2Hb/t ͪ0V]ƭCHq^#gFֵӓ uޙ`hN8k? ^Rs})PÞ{7"`l z0ERFuT"&FJӻhhG nnnx25w k$FFFQV0K)S+ȁP#] ^fU@N;ZSzrn#$Z|<rX[ R\Oo(%P_[ *  )$FFm^>ddYrF§ PSpi ?:?4Xy00Ln|sqAnR_"a_F ȥ':3t6Xx' !l\gJfx2'8]s dpA`_jd?XqwAUN8Jb?`4e 'gг9S/ \ehG nz?N1MKC9T,e{ К\˄^ 44>e?'6B eGc  @(Js?FRQwPFqAԨ;%w$Lx"0!:4l&s&|5?4gJRDZ΃`_a1$D夌t֢OKD^RdGM [jǑ<$Bo,K%J!IجJ`텧?foY-]sǠԨ{@w~!2*F+4m3Jp|?lv.UE RՓ[vQɽgӛ,0^;m'FFF :|7bG=T)"rO{6) >Ě?0w?&ƼaM  WXL9 ѺcPGMK*pK_v`ԇV-Q5Wsl@j`X-1/]8C'a*L\o3#p }G5 Nm;:ߑR#6*\ƒ?lIR Yj Um;0 BrK *jF&d;_P) gL/8]sP迍 ӿCMWS{Ļ` / (Mb)C9WKH TɎW;X{ۤc]E`_j4 -gxĿ@Ŏ`K{:蟆|س?-0Cyc> UF1/`GH\Lple+,&ShusF採Vwe pP ݃Q.ZD_̱Ye`t) ͪ0V`xs}'_ό5eG["8]sP7``_jdRXW:_j3?.;/ ҂韚Ѳ َJ+?F1DOK{m=A0!0q.(Bo_I,eR57j $j{1 rިQJ 9qGjq!;O`_j4T%N;-9(Pg30C)-lQlUJXy00'Hғ›CIe_bӿ'FFF]H>\_]50f}Oԉ XqNfU'2gFJݖ-L`_jd.%g$/^uҿR,;ˎK eOhلlG?%)2GLn:0/52o/P8@ik$2hOϚ[Tc4cg,`ő!StB5jFP\liBUG Z #|\0CTHV0w$LeO*a"k90=7tc{4ޤ3cM#t7ΰ6E܈[U n J/QuŮɊ?bޢmbY,(@\Ci_CyLhPMkр97b_bdOu%jцsA*;/ ?`&Pc?5!b/?(39hlP(>%%kTnJTԤ5:Gmk4 ;ZSs8vOsM!hI @迫Sȴժ7E{UɄ7G,;%FP\5[liOCUG Z #|\Mcz+3wJQlUDŕY9 -0&#V'c !$MXoѿf{_+nɱXuŮ"5 ?3sM~gsR`;p0LYNVYM IDATꮝe%lX+dlZl/K U9/0AclU'88pȐ*a-@ؼ 6CqcN@F ĈZƒI,C6FhD,Lv@+ہ{?szxam>{'Nk_d7Ol00*Ǭ5QvU9/0AcmU'88pȐ*a-@ N~).Wqթ?%ጩ#kO`4Iw?Ԝg?3`rF4`Z*‹]cM[c|* KXf_mZX5Fþc/J)o1L@F%/xXjݢ%H Ү2?+N/}^o9"ؚJ5cF {쀊L0M0?$m ?Q:@,y<@bK.s1?'@#PJěi3f~r)tf]oMFzC(K1ckK`?=>VMg -/ѧaIXx1_0vwrNjNO+'_o ?W9fL:axPUS}pg?Svk獐 LM [%t:X$1@9cῲ[9=?cS(rA ]vpE1r,e0ZGv/Bkh}A{. nTjEtGп0<ύ@MJ1AK;k`Лx;FKaJ^F#>.&ikH1/0q@n fSuCiR&ޤ`M.3ߞ|Μtj{՗74t؛dn+aPu`U9 w &Oy+v8d[7}lD,f< @Deڬ HŖsr?sz/3/Oes擂4^oݍ9Wg3#vE:kUD|$, lD \(3?Z5FG`@M\W1,$'zߋIs1u~;uOȅI,3`MشFH-WCqc*ѿNܮH""Hx @|T_ ?#ovVg:27?7˿0s` y>t3f#5W=(0'5 --0&Easw3:ia#Em{('3xI2D]t`U4K{8S0eoK-92#ꊝf+0dKg) tbƓJ*ӛ Fn Gg=2cYK;l%t~ }?- wS ?W9f*Qutd凯_vV,XTK8d2P?yu?Ex(%mTbe_KoN,d_y!HxUk~1Kh2L5=Wض˖-_Ձ ڿ!F}{=o3VYj홇y9M&4$?[KJMӗ99i\~h_K쉾JUbv&SRc\s֪8b1L&ɔƧwG*"? (E)׸g{5%T__Ձ؇-#'I֯:zGm!|L&ɤ/鍰fŏI wcaq#mu]00Wu Ho_ LV`'OM}Ό㗯\j9kY2w~L&d^"{>L"I<$_κGY20Z:NΟ:h$^?q>FRQ-x窵g:VϚA|d2Ⱥ[&Uؔp*әBw/7 `//p:h&;<~J@s!9yw:Uk[d2L{v}ur;O}=Odm[ѿFL5cZ~З2`֌\j8zh7&d2թs.Xϟ%){2K(w w@mְп$F>[pg:rg\3o,xL&dBko)KF/&*ʪA!dZfM'F>O@$`\]PGL&ɤ+6ݞы!O]qy/۝@ _ՁG|H2rܲW}G>jhd2Tsߞ7h,MRPIẝ%ve_F>%΅zg^{֪gVd2Ll}O<3yORp)t8@-)}?v_3f?n jEZv/[9b|L& s?>97MӛTr'sRNXcZ!͘mYs$IcTQᘑpמ:X2٧WKViMJ6\'%_h4>G۸xV|Mot5W=cё3L&IWc?]hL$_pO˿2/-=J?0G,*xkׯ:jݒCd2L&\{[: h&dj{?7,'s2s4rngR+O_900D {pEFO_{9ؖ#^~>~A-&d2iw<5\LɮNjg?+kR apgB=;d|c_]=cG.nK3L&)gx?!{fE0"O09HFK%FQO_j;EsyQW}GΛ9k2L&IWcگeY3s}%!%R8cTO`a9H4kHȺI N~Vnavd2L]_/f~N>3WO}ٟKa?̥è9[R7Fd}]jC0L&^ݰ}'g9|?] M?v?0&dk{`2L&S_\_잟C_Pyr WFeTè?ϣ,׍d2L&IK߯JzO=TϸxnJGF~z a@@ܪ f2L&IEo_k?Sy?Y߹~M[&4+j??0jgztx&d29W?STz'qNO%?}GwҪ_&I~ aD -=W7d2L&.?|R\>ݚ)pfSBZeO'FsFkhd2LL]e77O}dt,g{ra2g@_^9w!KL&d}9៩_L"O;S?I0|=X_bD$F5o]d2L&n~R.MoFI*;Q? aD>Yznld2Ln~Υ?3}?E=L;:*/Hct7!蜷aНz>z޴U9Xd2L&Sc~׹jtHCʨ>Tn*;Ty~S'F_' IC;d2Lnؾo~rs$ws8 8W?/-f`aO?d2L&r_gC_zx8M{f3 dd"KE:cˉGDJ!)X͝9Kg&d2O_wNyK7>ߏ/.e+GFՂYsFjnd2L~;0]a)I_~2j1yEK# {/M záL&d]o޷.y7s?͝ R ?0j7ͪ?/$B`a҇/[;d2Lm~?=׃?'T'CCo+QU`aZTq4&d2*.u$8@S?I?}b?;zF>=ӞƕFUSAcE?0cu/OЂٳL&dk߁GS+;WKRF9C?Fp+aaX7O_+m#婧DK"PTe* !Y#:H{_+qP ?avჯ?n[C|p?,}?"*;E?Շ^ W}}0a]?;l^|?6'?žSj{%OLh/z WpkS3_Mgɧ?\a]?l6w~WoO>8!fՑs0ձ~?u^%迯蓟0 ðk毾yޣfᒘ!#s?,S/{A+4??faaW6aw~{ݭgs' .xuog;)&z!ޟy H5_J_'?> 0 {x_}/~ϟy_:<|~{j얦C 5Yh.zmF~wRM}ڒz&- 0 ;u;l}[wo͗퟽pg3'aWL;QzMgX]8I Y Wƥ/XũGx7{/1f#0~ GlSwC=w}o~֫oy/]122L//Jo_n=-Aq3?D W1R;2{sĭ_yfcJ. ~5kL)v)cj1gE2a"╴aQGѮT;$\]Mt4[@&'rV{KC>"vvןK{*z1Τ:)3Xo 9_eWfoGI^H*G'rϜwZI?Ma@$'G}пe܀{85Ofǟ(v _ɟⷿo_8/0!ӭ- JzuШ"eӘQпk1poɓ]?+)@пC3e IDATBn9<'y?w?*|yO_|afc+GzпE W')-R}`aUk/s M+'f t6>Jcmټݧoo~ssǮ俓,o 0a=PʽNwfEr`ky+CMlE? )Y).?n*?g 0_@u~G?xt~BjO:{'aY)al'B ;P02*dM)i$]0G8jiu?0v v9  KӿpmO[{_^}o{? K 5Y&u"Ob7_^ovi*ѿ2iA?<}0wwLbпq eo@է.{?L`VO?7ߐwN.vOδ۩C-xR>鿦_a6&_ŏyˍDAB!пCBΒ˧&^p on~w~W_3 W]]lVBeC8zeѿ]o?+ B35T&jgVB Ժ"?볧D~߭q:F HP'4dx&@ZVU*пG^MkFҊW҆1GhMK-W՘|MSoG35_,IHm mwY̷yp}WnH6W%w?gd`p?g:_eWV##Mc'a>P>ת)ױOkFB$LaUZu#п?t5п.[=!ɰȶxWMA+ļ8I_kZѿ_&L@eX) }~\p3]?D}b%O:g9| z׵ 7/lo?ԗK]/z埅Sj7C~|~uX˻?DJQ]1?paw竚k2W?>С ogZN 9 7*c¡NypY77?i2qKȖzMltqk}_9AHڕء4MT~̻D_)ҿx`hmi>M͂ ^L̊᮱m/엟yރ!'5}Ƕ[vBuvuWK4+KYhfhꉦct3 _p_t_o??zUmY_~o[ ot}З:=k:Iep Stכg@VJª|*"\K}4?̀N _C%=hk/)g0:Ueѫ?? IXП8<ϒؿ-7IVh{!=\cG+^IucGBZȊ-ΘxVϔITFY{4e3^?44пގ 'fwܫwu+>sZ915SG=^ wG۵A6eX)|OL!ӣrt^`-k5D5п.7v۾O KvןKO?u@ .6KC~e~L=Z0$sVaQ]D'Ս9 6zy&=o-g)ʀs%BBn~;R$e&AS Nȶpoߝ'ӯmjiy΋2D6a"걋/!nQ ݀츘uSr]0#e?{|e6V_Xߩ+"ϕTI TiҿRmr?gjN>A]J6gH/SܿT\ŦBuzSPh 8;qV}fwor+ 9Ntyv_V=CbQ$w0͏|r'Y[^A?_o~Riy/qv;Ͼzڭ?~)]@}EʟTԦӍzvNGբ;#meP>V~]M?cϔȠCz?ubmg77./!1*WHEg\eƐaB _%PvU2 CrXD*'ۃWQC{=H7пގ SYʥ٣~/e3zŋ|GRk39]m=gkXD(N靝SVn c.T҇w9ǯS~C{\\-8?_oM=v}#a{|7nv?gr/xbNfȢb|NE=źOT(m6|nݠf섏#hLG]$DzW;]5QFU'K­AÃ4+|!kզ\~uTሾKc пE m [Jz"H}Y/YhgG,aGA=?߳-޿+/}'~R.*ed4WfgEƺo_ MnyL-%?҃-jbm)C,~G֋RX ` o@c2Oa)vן3(lKj(36T 9ǥ[p$nt\Wlײj!1WS+LajkQ G/^/Mu$l$VC_Y-w Cm,B {iՇ=zL<6Kts%M _; o=1R|yO_=W,Ag@\*6> Bld B5Dn龈7cNҿFEk?籬3WReInj:P@e'?R*{Ͻz} f{y0G:l/^茀2j8_\=glvBIE(J(运'sf>&Df)9Sg$G:kO|'6zc]%{_x_[_z= a4m/_LaE|П_٧w3ӲeBt$8sT&akAr|Rݘ5^ 9s5,#@ _hYiPأ;oO|߄b"f?.;e\a/UпLċVA`_Z?;D߿i6X{meւD m2ӅWba$vvw=`J _;:3{foz?gW4fS!.@>4[#(QДO5/%&a$;wۊ Bn2~-ܪ:VRwDBhcE@qv _;jfs]l6o{~_~9ħ  җ]IY2tM7@>؟7N&,WAq"{ olT7(|ɇ,5*MJS$\$hRp.w 7YΝW%O|Fu{~מ볏o C]ٟBT@(^ !;/zڎJ_(,pmLҊ-(5ϝ Bn2dK? 9VErkDAh;Wmڑ}!{ ={[\0mVIay*`'2,KϾI~R>iL8csrҗH=Iy[,lCy59IucWGjMSK*,rUI<;(@vdR _;]z<3_7C8WMa\t'zS!>]_5,kktMn9ПXbOTE4lm5_Os/?l7of,Iם]@iV `Ga@eA!<Ŗf;o?3?xei au~BMgvy!VI@\|sxk/-8[H%g΅4\΋T T1%PvU|Rݘ5^-yj_݂z(?,wel .{G}^Q1z&욁dB N ͜葼?6=G-%S_򩽮Xؠh+nQWpJXyokX?D _;}?pg?_~ro!}oA$@!7-]}?SU?I]?b_ϲ*q3Se4A>UlI16 76?ZJsUZs%I/_?Bӿf,alӛFXlBۛz7S|Q7!n7tx3/ D !1)$&caY._ _c Z ?pKпAъWRݘ0Ғ| ੻ImX0րz?p|_M FLf''F`Z; B'Pف0%H~6z%&/Zם]S±b{)J V 9WJM -׎CMпeu;! +񼸚K ' n.p{@qk:_NыC_o[.A(m9T*i)8 76?ZJsUZx^BQɏ?8G9O7,qsngo 6`8cn6 }?PTJ_(:`$`NқrNuX|oviOڥeC z?442li{oi=iүO}̮-Ez$nJ#zkR!)b:2KvпT7( {gO-NCm.2i>j_rE'҆ik Sa%Ud_Tѵ9IucпJ8[\>]|^GwhˁgҨ?R\ReZ_^M{6%=9Fl&h'&dпT7( `WCGњT> 0LW.bJ6`twRUf:x3B1sK߃I6Sz1? +%Yڞ5 @%?^Yi~A.6B%6`i nfg |Wb§+) GRhK7@VJY ;[kWCG9OSN!,.)\ :%\YlsTv:{O'JJVd}+:޹,n2@r/wiM@9?apq⩀C'-,uaZom[EW]_q8eBuayWؠh+nQWiӿii WtXERJf8..ZJZ %V[m?%_NlV4(J0)H X52\|D˻ª]xT iؒc%b?SOj/v*n ku Ԟ1Ga_{'Aa@0+ 0,[`-"f<eBOJlhɓSܥgkzӴ1L:u/'Ս9 C*-ߣ_8]|>i=@1O!N}ͼ5>Nn)'i tH@q֟Ӡ9?>nQWiA%@ 842io΁UB IDAT1u3@X6 x* l?YRM?QN$IuEb~i4_)(9J? ]>٥ߢ?iQ/zm.?~g4vH ض7d>Ns됦2k?jLGTWr}i G+^IucпJ (=NC7eӷ̀tJ^Sl9ۀ},x2+Hc>x L0R̖ olT7( ?$ [=Oe|0[_=?l-b'3/" 32K hv+NA@.G+^IucпJ (=Nôj2`zh6 u^bUR $y>x_P׹ê/=] VQ/z.߲ @io(IQ L 5=B^ !ПfrVZk|-olT7( ? oY|ꛝ=@X=?\pBE+4 nR0Ј~(`26gqC gxSBlykYazy@MA5.oëdbIdnx%Ս9 C*-ߣ_.߲ NPa,R0mC//X7GПY P#Z\k܀-˸DϷ.u PTthCۓ%%XEaHC9ǀۨ^ k*0G- }4S:Szsk _SbT7( *@Ke ۀiu.,I֚2kYɶtX}\=6(`26gfY@@-=@Fg#Wo Ȉd7gMBP?)AբпAʰR}[kۜdMg+A?Sdͳ6%WUV3zWjuEaHC9;bg!WԶ2kP:O[MпAъWRݘ0҂=JEJ@GH[B=^5I+Y٤ږo6h1Zw0@VJпtk ?oril[srw4CYvgEbx~wj{HOڥ{W@GN[B>i+{a)stf.)yh_א@['҂=JE+OAhlmq0%{lRך!&ͿA5@I:H56 6gdeњ̝n䭎)'e2 ] VQ/z\&89߆kz~c %V}~vuR&0Šh+nQWiA%@0olHc/J璺oEl'c{HOڥ{׊C@'M[`J,W6oU/?/пVoviOڥ{׍î oJW _o_˖ XoQߟK (=!n@WS%OL/aBSq^*Kc пE .-ߣ_JonakM z?_ XoQߟK (=-07п6Mħ_[ ;4@e$ zпE .-ߣ_@6겗4Eke$ zпE .-ߣ_F]i0Gt? AOڥ{hhu?Z>&xc2LB=ߢ?iQ/z@V@61a-iYIR迠['҂=JEo o.{6GMo[:wIe*Kc пE .-ߣ_c+5пuủ$Ce$ zпE .-ߣ_mu$i%XkM? AOڥ{QN~j,5aпAъWRݘ0҂=JE?ig! W^Wʐ0I ]ZпG пKju UaпAъWRݘ0҂=JE?cQ_x%Ս9 C*-ߣ_6ou UaпAъWRݘ0҂=JEhQۨ^? ] VQ/z@5ku UaпAъWRݘ0҂=JE@.#=ߢ?iQ/z@v^? ] VQ/z@M&@i UaпAъWRݘ0҂=JE5ȰW^? ] VQ/z@ _yAп* w1?ZJsUZпG пLC0Šh+nQWiA%@o 1Ga_{OPg_x%Ս9 C*-ߣ_;zC0Šh+nQWiA%@n 1Ga_{пIW^? ] VQ/z@VA_yAп* w1?ZJsUZпG п6 UaпAъWRݘ0҂=JE6W^? ] VQ/z@A UbT7( T@+/WA.G+^IucпJ (=AA5 UbT7( Tl 1Ga_{Р|_x%Ս9 C*-ߣ_GeC0Šh+nQWiA%@$5 UaпAъWRݘ0҂=JE!( UbT7( wu_x%Ս9 C*-ߣ_h 1Ga_{пCPlq_x%Ս9 C*-ߣ_o 1Ga_{пCbпAˀ{HOڥ{пCPΠ 1Ga_{пCdWG @oQߟK (=\] ]+GzпE .-ߣ_rw5tA5@Iw*-ՠe@['҂=JE!F,>eIF-_x%Ս9 C*-ߣ_*қ.#=ߢ?iQ/z@ArghG @oQߟK (=&fAˀ{HOڥ{пCPj2^?҃-jviA%@;Y_;*C^7/$)_Ѓ-jviA%@ ?ڠe@['҂=JE!H!w1p6 e]2 yy߼ AOڥ{пCBn?p7tA5@IwR7[X*Z!/a/A5@IwRM X*Z!/a/A5@IwRMq X*Z!/a/A5@IwRȭ? kR2 yy߼ AOڥ{пCB.IaL'ʾyGeCe$ zпE .-ߣ_r X*Z!/a/A5@IwRe?X7bkwTdwdL}'NC!L¦H_8MWG7oMX;nsv).FӰ;M]otci(0,ʭTv8s@9v 7"N+AarK,W5hsό>H/}u.iykfRPPW>$WNj5ComO$f4H0< 1ɥgpZI k:VIA@u%ZP.:\%`m\L/W(n}6gi` g A FT7o;7{X*ST}& efY(r`ɉyod3Z]wJkZ x0ƀU1}Lc`s,@GNG(E݂ x{3Uڕwås+u8z*6N[9.$bEahM3=kml5POrNɿk[ c 3Ν@xhhM]4A4G/%שܡ.l4VA-~dZQ[CT?94`vE8%(XKrFb9Tph{m|@9W۩͍s.u(Y)##^|6<>b1/` 62:A}=g {ihHu1X,ۤ쟅"Hp<| 3Mp{l@awbfusz0Dlfh0 P∱M,kPkk&2 Suk&F-Mkmӑ*QƣUϜBv&lK@q69q颉Q| VӳjFh{0|fELf$]x$E `+la4 Ɯ:,@yyܠ InrgL0:r)|xP5ΫL&z>~i l_7AksRf9[=! woz[eYAtY֘Ł9T⥶+t1 l;7Lap 6PoAemS.n_ϙ!I,MI0IOH^{e;p)k3!}+#)xsĝc8,hӥk_G0=Mn96b_iס91$y+2nk-Z+o#`ښ8S Qt d}M( xp%@a m0]QL57l;m$Nç%\no`2w6J_#k &uVM \ 둙?v6Z}:6WF(kB7/}҈@};+5V/17 ,:紈6"c"PRY^3}Nf)k;NQjUJiz"QT*ʈn9` ʆoES rFZfϕH;TIa.,I N@fCFZzBw)`ǀG`.%0,d93s38VhL)_ʔ&PEk;u;֝B(ѵC8ȁ+Y mh?6-3ȀFԘҧ -)q*#aDOggR} 'i$ KpK!H&y}:@e(f8Tc(~2N !ӽn}JlxqA8vx2ZltkxHY($FH25sGD>D.KrF}ǩK-+;>/>)w\ hjJ!hWskHPZfgh~ځWu^{PNBdFYL{$_3q(0B Jj:`J8Iz捊)kiCR_EaGhkz(B (#/+d,y RTQmz "8Fd̓gnkSL/@uBng$$mN|jdiRJ$yLHrH !AGU V*8HA.P%:Pn@KB_=~hL5E@S|H2gjB҂Q!YXC2ӂ b%݀3,fdw- ͚,= &fJccyPgؗ5wW}Ɋ yzТӓw@(? <&ACP?k`[Lsq5蟾1*ugacnֳZH(},Q:ɢeM!ХNz)ZPnpf9'UA!NkAFJ5:-9FUȤRiӄEZh5tˉQ{ʢ㼬[ &F!S0ͼZk |V3lQUQe$v3FU kTճ'(\TǓ|F_s\=7mNZJD|{K[)dO]G!K`5H训iN03&c1F{FKii;ظ <_N$,Ymϴv4c"\"晵 ۰&~z'޷la dFlz϶`Ȍ`L{Mk=eL46*pȘ%4\s\ct {l\.=fPRH/p\rI 0H樞1ݩ@p`X". Vn)o惕 z^IKP@9[ݾC=a.Yӳ*)^ژkPsͳv}I8a1<#Za*.iEW6PgˤKSZ)f T@}uZ͉_A|r ،ըbzԥbA0 *4~:Ȝ(?O 8pډHđȚܽuOTڰhfDM]T/mγ=0܁kU :ݘT] QΚ YT3rA+E,meڲaA3FC}$ކTnmO"sH"b0FCg I* )Ѳtaw m3Zܩǘ뎺1m=\ؼ=L F#ellcuy)ԟ.LǸfd2NZ.lna`01&X[]; [ +1gI`c[;ocyylv!vvyqSE-cey Zl^]NaK8LX^Zd>dAlv'pexy6N?r<p_Ν}1%_g\y;GG=9@:‚x釰7O= |9-me/smv(;q+C<6n]ۿϟ:~of2$Z Yݼ^Yl[@,K гg(s7CӋ\ц !5F4Rm|kQ2XfBY[kBh(YNbhT#4g(#\߳{NȑA (jwd!vc+guT')+Ihőv֪ϲ JtQk ٨?w*" Ypwz*sBⲶOid?"dڹ0J3%As ; GB]Xh^e*K@"4)C ICUb*LhNjk.f SGV%!5-"Lz|q*C4ʭ!b#z&Yuce4q~j~Ĵpzԋ3Nh PQ 6܊g, ƉAIεf lٲEK{ 3pxx{'Ug@ڕ8vE{q886/na++X_9]<;VqQ?Օ%_d]XX'r9N<_Gu;.r &`}uKmm[;>:U,,L=Yvq9g#gS(_q5{[8' Lw_/q}?ұ+qY?ͣ#ڧg~;٫eg0|ppm\vZi؛7'=Nv^{ok{3S~⇟}GcqaDT.Iq~ >]mH$$e;VbH `7GHx]q\B%&=Ep]}R 2Y 7Ykf(55DDŽlYAyr}}q8>>a=+-S$+VK+(8N)o_Rihhַ8u(o[q ^ِtV/\o-Ԣe/O^cG<_omiIoD(DcAqX,k5ro0O@2+k,2 ˘vYrҳJ!\l%|.8MԮ۬LL!BZǔFw`H>@+ G'ӎ(aעEK iCj-%C !{I\)l2,*x3QR$+\ $)8&cU `!?ڸW_JSܺL|CxO݀ 0cp5ߋW@86cؾg,i|S[xvp0Zf`8z?ngWok^qx=o޾ƮG_MO“7G>G>Vkx㞳߄oӋXڽ KxcLƣ(+ߜ~= ]4CW8p#[ނe7xO~3\\}#>q'xnw]c{6&,߅I0ٓ {<ϻf o֟+ߊs/,}[8vt ˧jƸ?»>\F"fHײfr'рlNY!(2g:MVsTAm"UxŋQ𿪔¾fum@0-u_nR"t3Hݢ _ZiC?8xȧo2Rrn(m2)IK3 HԞ{W-nINp 30&O APb&K%t[(5+@13V[-OqK~m&ns`҈7PLXST,/LNIWeVK#3 }}9e+8+uTUr=2I=υ,_qQF lR\S[իE1JXpl!J 1W9ksW,bFBWuMQ'ik/gE؛˘qzv$8P1kpҋ5bEem~B ߬Uk*n 4> kLW}dCX>4qO?#q:=\c){+U-iw=l=vii!+<Օ%\sY-{߂_|Og^23OO&?KG#_D}ۏ pi!G IDAT߰4hv6x `>,\_; =_#1At1m76>g|w[1x,_=gpᓣq{po)~wz#qeSV>gwX8"UFsif`ڝ߂gcMR81eyGm[׭%Km3zXAiJ1-5N=cuu(άwm%PFw6Ԏ@#0NLRPl[(q20d UDm[w*(`-Opd,v+_Q1E_ -Wi(^j nVNStj6;zVi, 틲1@f R,tw%KX[ҚI܋O('4Pq-j}DXۋ6L5 {(*WvłHhɉK)"Q\tP[eV6\]*řBG_ ȠDݤY]TR[s ],Yݡ6&ޚIݨ[O4 <u^ )@2, 2 paQf=VG h\9T`9+[#U祜7TZȝr?=L9>gq2ƏW=~C8Ow;[cuxO;^pꙸd57_pQXhQ08cue 6=cd |ү`i1 }n [_?d\;_U< xm=6Nayefw<՗~=v+7wUkmD<=o׌X[.{ˋcxe~ 많`"]d2x ;x`|X[,VWc%~|?K8 F#Lƣ|/ñ5ZBԗ.rpUcE mg% zuS8AY׈K(%(׉-uu Vt6G%3NAs6ƖȪ%ZH=CW{ucmk+bFP,ėmEyvn%@}7Vn_3mJ6*3DqXh<)UZ-=)-5T6 zQm]tܫs>lVj D;tzH]^U[Ke6.̲BA鿃J >b-{\B X$)qd"d2{x߄|q OW=IY3B<؟W?e"kҬh?GqS x,*XEMV7z6`z6^/_;8vW{-Fƭ/⊫/ F#iښϝ~~Cl0}f{}e\w$ߵ6/\_K:+w߈pW;+qKpw\\t:Ec-Vݽ|aɸꕯƫbЩ8}~|`ilbY7`|7??? )X[]"vvpur>>} +KD ںŬ5wPJ{-% ^q6p\3/MZAGk;!v '%#.sdԧo>LN6:z sb8Ib\"|MBv@J~2k4ÙL)5+ 3cggz} >߷q[O &f"&g<}IVM+!J,LbwJ=˚"nF͹ 42 Y&7J|=l&AݷN`Sox$ݠ_ &=`eHŎz68gܤ/8#UP.R= -S{8'v9O՚ *[O ϳR G࠴qM(lJouQ,1Lg)A9+-bʨ1D sN )ٖ(!6D0+5^G]uk陬}Иo M^ka 65;>1;`[9gpkso ^zOc^||׽_EӶh{o&[-DžMs2|X"`=xK#t7 ..atwzDX9US`ԳJF"S k?$IjZzSދtaq%MLx,bHT2PAJ6f}xWk}F+&T@g+E { mV408z5svYZJVe}xʳW-λ(3=PY.O2?J[2j"$9aq `U@MDM3U{0.Wec!\f{?4Wfm JZ[NQ ,͐zx3Fv ,sd$l6S!LZ/f|Zk9 ֍MBPOК4-e%8'd%$k 3)(j[6FLojtbgoITE4kRV_Klf| :ۛ &.,ub,ߌ{ikږ$t)x|wvOU,-/ n;s# \ >\O}j ^^ҩ;X[;˶W^,É X]ZBԺGXܹsm͌åx6q6G8%ǣ6sz8#/|^~G~ oz`Ϝw'Y!.L _vCh GW`_u3gp&ObGKOWmnp?T>Wg`?Sxӛ?{,o^-c<U/R0 X&bѼbX: b(ү.  g|(;{3\_= 3yTrg/m GA`Vb?ZYNш09UIOܨ}tD< #N^ HFb*wIXڤ AJ>v^j*Qw$~d|=nm 4͉6FǒѨaB NF糀#u_#!gdW/2\vCD<'oX`$*˂x`끐P-YlS#zG0,^)˜kx:+uC8N: $͍,k&Gld8? AdrR1rZFB|jWh7B䎞LňHFP#j8Ӛޙs&Eҷ$Y{yRD5M3}XǎNiC'Hakz9Wr9C%Īݎxx'/+^z S12q[>Gpߣp^߈xq Zkd2[p_e'pmǛ?m NNL7bѨ1x+G|?ݷ~Cx'|\OE^E/['+̯:kMl,,0#6-I9=bsk9C/=N͟Wg_OhԺE)1/‹jaؿ=!_;+/~1?X,P{=Zoxoʋ 3?o|5r.썱K$Nj\sbp~gf\\d'i,vp1'7ֱ;0V^ޕ$G@c,xlp[;/; ⡛߅>9<| |[|nje-,~Gx'}=듟}GuO`O?Ÿrť@#..9(($I%=k*rp㊧ڋ{we}ZwJu oB̰d}9 eŰʏWR !qۮcNQk$łC]6+%VR6SׂVބ@g~Uf2{(_mtHsਜ਼R{7g8~wݏ|ZֽZd܎212Sm;{xvv021۟bob<`eyGVQg2͔>XtiaaU=Ӧmrq{G7ְ)G}QWׅ}|fSC챤Յy%2ANxzUg0UE@ UT?MGc=/egeYNӚrF8;SOzGbIRك?2QgMflK>LXG cͅ A?u){!-UËתQsZ%2ϧ$!ȩa3ľ9 hl?(ol}ѝID' קsK|/{)9VqgiDk-7G k0C0g! ?tlՐ"ZqV;6DYȋA~N)\y5w?ZI3dAArrMᶞ=^Po=jLbJiLguY($&]4B ¨'x( jC"OM{R;eH Sm/ռMmP8,LbJg- [$Z퍅q$5ֳXʘqF4km'\n>}=-Zf*>Q\վ[+$Qe{f˃tjZPTqZTD 1gUs"K|QeM{ØuВ &9:L3)HTdIЀga;l m+C:QmED.,P[v5lS?b'OS}$fss?\GxC h^Ng5bgww'^!ܹrˋ[V[<1^T;$pp(xjh*ƽEދ hoUb 7̽Ϟ H ֋͑i *-U -G=]_6.Zx/q˳7N'4ª(2ը'K_`V"O%t_&~ ʴrnd,OK7.5N2AoQ%j3W.F3 D牑ėOʼnuׄkmZ>k>Sf`FԚF͔;m$L5Q 'nDH>7sĜY8̋<*{ "}@:5sIw7AiVYvae-KHu[z838C32+HU{;'MZ~Y N89L]a+0' *&]̈;g=Wקu;zHB.PQmY(k,5qHP43Zh T<:@IOd IDATwi[Ur6rLOc;Q.JvڛKC} Um"0uH !!P)PkZJt֪H!3-d85&'f*}Ήuګ68 e5.LQۙ0n=qIe.,)giͥt,Pᝀ6?[ۍo(2`KxZU$WlV9u3zw@ִk@I` YsMYmSU:9R挪آep SaKH?uylEsz:b8"CULBkt(59 ,)S=1)T hn=bPZշ.RʱkӺ6MV*/Ցk5pq(ڪ11Y7 3^K 4d&0͏5:ZC`%=Vd #=NWsPG~ QG':UDT}"[EԩjQ d9D>"+ߦZ7Hd-4 @X?#7#P=}ԯchkW0nUJ;<}sў}QV[xXPRwofLNOd RTҥ(יwʟ\Q3wzMYնؾC>CJ+ i|kv>t{ԓ῔I^Ŗ6RrZ=s:7>*7={^02hd ɵzŪtŢHj2Ze[`**Mm5ɜHec5[βi֫)kzx_P%= -W #8l1er %\1}q}Q},2rԘ=;Gf+Ԍf\ҮV:,Ib2N-SeisAAf1">"6Lu2$ JqM-gjXagR"aDylߦ$JylN l bS1NU>~e!_Ox~IWPNR*akZ{R-CHPZޮK,KS d95ݞ>ݽ4Jp_J3[MYs]+erqge>PCɜu]k{aYݾ f")JV#ݛD;m&&XJ;n=ΒQeBHUu$@)e w ڇ’ٰnW8HSF#5#K7m'b 3ő,c$Ou(VLEwNb @Э9PNaFWK2Y8.rm;R֦r5Ft4%T (sЙ#2ϭ"P1 Nj+nUZ,M" {sԜf6m\0HhCk R:bփ-(uy*H \H!ؑΆQe'^fE6` ^P6sˬJݑ|]8bBQ1 #'(ң@^T/ZbF>l(G*21D cvPc'I@D21') J5QH,+J?Z03eb5k\{OukJNinIɂ[f%I)q(Qq{,VWR~dy70X" CF/(?k~KJ*xA1[ 9\ЋL7nSgZ V{uH/TkјQʨSg4?$N" ɯU虳ց:QRK[2_F~Vr<ʾŇ\/9rV}VM† NbRݻD4bҿ8OK/fgQrb5=QR1Ҕ~ٸب!D1g^sQz[k(˞6RX$ػ2̣%c{eztKT;Q"1K$3'D{PCFלW(m$YfDz@j:ÝSk ]A,MO\2fzЫֱeɣ6e*q,DP(MD iP03ڞ}a,ڗ,UZMI#/42뱩w":EX *'+U)k⳹560n\Onfc`zOEBOT~in/3`E˜L@NT?ke3ZIZWլ`%됖Q֘(J& Ë˾$5 ge\(ŽV@sf)t,L كm͗;%h"|L}!F @28gwѦQ* ޞ! IO4$Xلl;JB+N=l{"өc|\nNom9}Ձg> %~,Qs>'q._kG nzKQ>G uЋ p@ H+Z (Ru6L}'9=${A_b] q/fzȵ * hu(z !fkUFΊ1bQF%P5"2% շ9u_\9mg{hB6ZQo A%oŔDZUF΍41*\$YU%[ֶX[H}Rӥr4:vh+HUg,@g& C}^ze\(C8☻6I|(v*V1*\P}쎲R<^7k$cSޡTӅ2)ځDsэ{HNwV CV ײijMS-Vcqʯ1*SkHRXtERɺz|V*R$V_KB 8ĘE]*4, Y(EZo[O5D #e׻6ߒE-WJb%tInZwh ^wE Rvz% 0ʛAѭ{CeR^zV Dzl}kjUf` όm\u&[h/׬gW;5G] ѨeʲtȈ~K ߪ ઐ,2[y A; sF.*؊LHUAtYU@ǭAks y\V:=α렺e0*dl1sf*̼ƳeruFjY VzvpLt }rȯخRva/r#TޢDpUiy1$V#z|ɾk,0@ۗlڠYɐǙz3h=y-f>cg2pOhs+B!g2xaBڠ9Ӂ|٤_]q=zpYS! =z)Rl(;*iƢtԼV],bek5 H4HGR%gȓEd9m1ѷT{OQZ/ejQHc6bY~xz(XSTٳRj<jʞ5ZNnJ@W:VԼ}@ۏon[ɫ:@,qmdZ{`ַYȹ ڪiձ(Fj`dPݞ﬙N6{,@k[A [UO6t >B[q0FͳjegXiz%\|]f[~rm#5JҕԀ6e`uz*hi/JJЂ澜7Qەu]}ח׽RJKu wYJ}id¡rѧ6^)5ÄR :aqMeNChkOhzBS 4rQ!YA9duJ ,Ko2Iِu,mR`ͨn`dM^QC"YvXd^Zjj4Jo?nzc~̏1?ˋsoD6^L`@NuesSB^-ÑCr.hrt;n^ڼ63fi )SQ-6LZɢ7MI'ht=\(K0ޱt1&* MM׻ YMpU^wMOT3]O)(b^w- .B 1EYeaIe,+8<d!ԍTs_fK, DM.[}2N>7jm[Fya.xf,ƾ|{Wu*yM؀]6w`$b9I6.\Y1 Ru o";VB~'?}7lϭc~̏%z9>uDlP;MZpS&t1`m|c逰'w m̬4LZm_)˨/%vR%bö풸"=@'X% }O$iq7S,WMfU~_{nd78T#[ݿ],-r m!3CEiXK'TPqS.q[ڧR2 w['i{i9hMվb.N2s%達ƕQ/j| ;Grk 7J[ $܈~ai/N?s:9" H mܬ_R#Vu"U~Ic~̏1?v.ڮk[U=S&EU5qBR'RcHJpr-[P4K~};"]WGQ LaAK,~__Kܢ cNVb@/ d S:(%{Pj~)b̌g. IDAT~<f:T^J[bDAɎo wt8e~\5{j+%XNK3o}cS\K$ QXz *|%O1b^/f#st^EP5sWPf~̏1? `+j>Y{Hp( `S8eb, ]9ˆ&j[!w|5Fh:XSGd^ւ ک7v_h`1QVʠ246IA6OH9,ubEji5!sY yG{ckoHO d0ݢ6Rb Sl ("B?bh)_nS2ff-SY;G͐w-CZ;Gq&ۡry1[6k=4 A?.9|E+"b\Ώ1?gh<رhZ@ALygvX#:OZ0cdL8Kd>w8)`81ШcA_1!q /h;'{M ^0"{#1%rKe@gO5o47)QBd'u6J1 w%$S@Ż]R̐sy/i;e2s.5)*#)JU\d;K^ZoUj4{sYQԱiG٢ε^>CxDƫj^yϦt##Փ4\]?]hOb6&xW`gbHr~̏1?r9>'NA ZZ#1 e05.#2 E!M&|zHG8xoaLY_1kԦSΒE}d+`v}D5pbH;8J>rv4jDRCRͲt)8؂װV \!c~̏1? ӏhKwSl:AG46 G?3zMRyF @X"1rvc8DǽoF-4&QG+;qO@p jZ7(z4@T3Et#0F`֯f?o<6d M"eӂ erM f"kВ]#}+Yۇ.ix~2W|wśoymWU&77- B! MP)T(PƧ*gU璘,D)(Di H#]$DҒ77ͽg1s9' JȚwgךk71'` r'~SϹof2e,TQC5A*8dy݄`mĠ$BGE+g`U핑@gQ?r0i}eJ=GI*Hj\߭+m۠,%eLbEՕ18ּ'U@cYlY/[ٶW;\f#z Սky4VQ#Wy/ZV YեTKL#燲f6" RR.'Xw ZHM7(} NqHfGk[S94俻ay^Kr@aoV/n8eqw.)b:tڠ 1E\V*9$JU*b]h.[?[Y6;^4,0 ]bEЄ}դP;l9&wmL=K@M>%AV/ۤp/o.sB8]X%UsvTRwnIv'sȁy66Rj39 ۦNK_9\ rSItw<ñ>/^ۓa8xg gsF-cX28)3gc2ﵗI[RIńgUe(ChXRupKBc:)^#`G&:+ xt uJ^ YΨ gaKV"CMqb{:!sUzܶZ!>tyz"tbSX4Zt/T)9˖{LYcݺqnf4*jQ,2b9Yn@۷ΒdSMc15Ih(oq0~^ַOt^-82jFp"^p`n¾ ?ilx`?.5<w÷޷ |[6~59Ln'm!8i+÷w.xGLJ{O;8X tǺT}Mde=mRV9'M>sPf !ӥPIu=0Khѽt19Co ڥ6 o H:mRf~!$Q뫝N@\#cc`0h,3GIjXxs͏ox$'oe(mxqKވ7Uixs#o[s?q=q?Kx7``~?9#s@߄=}Y->ˎA3`}57Cxϩ '>exq_]Rspߌ&[w =ExOo/ؚGܶsߍwuz/|%^^Z㿀kq}^73|~#+~ozWpp8v]Vl2X2(?# C6ɤJ<ZYϡQDb6ξ5bH=G۫GEb^*12䵀\:jDџ"o'&@1I{JFY6{ Ҟg cW`4 .U˭f3FJS)h$~Ԏc%2)eO܍9YSvAPgPS-xiف0/I&I&pr"/3$Pi{lڇ .(njݔ#'JAje-\Ar.FY89i2C",\Z3s1gn[2( t8w{ 33gkOߊ}?/%(̖qå%ŲxCq!x7o?7'c}8gs./g H0q|~>a᠓Ga]|uXLa/^mȿƹ3 z/kw}:toy/㼷)xIoG?KNg<'Z9]2eܶOB:#e}Fso3@&,IXhJ|!(Q2^5U@np!Ñ[-G$yi, fEԄc͵)asEz*m$#\@6z3WLV\XLi >\w 6F&iYe "-*@9Pi7[Nk Zg )N $"oZ*aÂhATrI)Sm'5Oۜk@I{RPm$+t:*%Y9)TY~1*&#E&ljm'B4 ei-!evsL Ffpv>HY4F L@ęm?g?{.z9.Gއܫs놏xő9!x3pƙkrsޅ?;g>|`syL/{ >p}rg gt7p/K0x{}HLq]v.N9]2e }lhcCC~ }w)y dIVIIp.M>̾:ueiR$#JXN%Y &&t!3d_g#b}&T%Ӿ74ygn%B/V򉅓Nbn_dI彺s|bgeLFaFkR1M)nx$/ByJll)CJ_ϵugʋތ[*k9v3LM>jr*_Ml'C[7c9۞8r!}^%O>Uwu_Y+E6U}s_?ů{>?k:5f})_/_qK(7Κ8|۷vr 8C*ǣ^~U?([KM3].cX2n5,㓩 0zh?+YVN}Fč2ms>Ǵqhc^Bj_,REz?E0d?TQ_āZs؊%g:X*L—yk_v镠`GTEYn`1ZRzga8"p*j^<0\ƠQb Ә:3NXcDiȼ%[D䠥 &dzXnA&Xl ZN,A&7$w䶛-ge6f6o "S`sx{nb>C_kۘNnQۿ`{ߏiO}pc6 Ii  uq8~l ˭e,cX21n"qCދZ&{Qʟ/v+Wµ=n)k(?ߟ֌Q~*kɲEw|/nKUUJ6y0\%Xҭe-v>^mn9vtqM<#@M\/=7 ل` Ue ARREZ/9bͼ37̉unG(R!WjV:zJyu#gʸE: ;9FI Rk#n'2YJ!VD-s3ꁤh<37[ .lg̭kSwEy {>;1؁O/ N{uÞ{K=x E8^[غqfפ/ .îG~7⬫w'/cVػo |xs~߉sn}?.>yse,c0,cQ-34*Q;1Ub9)yn; UiղʳJ@tSmhg d_$Hẃmc!1>12"} }Q,P`>NH7dLH[14KvFpq0)x}5.A0koljֿj/+8a t$ GN$;zH&]M65($賢ُ)\6;%~lK]^l{ c'Ɩ63NڀQo@JͳL R\ܪWխ>9Vyo {MQ)5/<5My5H{['ӭ?o3NxЎx_qijϼֳWzN˿ ?t'}u}{.xC'سva7].|~0~[X|%:pǀ};0\iگHdvnɴlz1MJh}`^&ڡmDKAH[fSlc5.8;o-i)ju'%}ZÓ_x«~"de,c˸]^S&nC Xx( elDZOlk|: 6&Q5[Op]cA9}:O3 :'b@>8@NK)=jjL;yl)k! eA)#WvlNb[N6=.S5VͷK`3u1A;- |<98ɦi`33c7g.{n*",!3 diWic5b>ey L3FL'jZ(%e23O7"T73DF@RzUskI }b^S%mDuTqQfΦsBpj,Eua2ݻ&uUjjaɢ)Tв?džZy%m+ѬTп?9bmv pJnap Ѝ^5:q]B+AI=UbR̄ygN@QUz3g#VsعGZ J z/"$] ,SX*Kp ` E:uA٥Dh+ 䤑IzdQ@օio4SʵSsdO%EnR{:q]7i97>nxWCko;룿8M2cpu q=peSgM] \2;A+RVYj:=mkG "X$j#]Zfck$/}HhYK8yq 0&'0GnJ@Z_2D 0y޴\p}LkBHm2 ='52ɦoU{劻-A?D71IQ4ETKdKԖAT \&"?Y}A=8Tz9LWqx={[)J8줻b8lwt s<ғGye,N>q2F8Y{+v(]0,c )$ 5 FljcVqtLq*I!-Zn6B@.XMYs|/gWq"q0PhCD/k)8SFǨ,dߓwrGAg c1cW < hn]yHK7mJk-Y 8]F zNw=[Je[f*$\#|H(+ 7"/C6sǖm祿{dr>u6 7ƫ•{x^`rxpn|3οƥW=poKᨇ/xrwse,c˸6ؑ" Yjeߛ 㘄nB9$jŗ8(~:>,nK0{JymYK/z.5Z j{N!I㾌C+#:PFZeR}߭)=33#&=se+ Չn'2 *l?`>Sx;rEV#PmưPqt̨M2V* Db,tuQ""T0oF`J rz z 6ΛKłPy7#}yIw^cl<[{3SS^g?(}8hW/^Gr5`k2>a.~Ǧܡ^Ӯ\e,c˸V./,[JȖxO )P Q50f3{K.AIh1TrlGJRV:n#5GїID=8@BCU%WZԨ**Ap [}䤤JjC{v6/٦@(S&2)ڕ()Gp0cD\:^8b~,fk' VXਥ.^Czf}2<& h'v\Ú%[bP  rJ}){{խl,l$ڑC41 ޫ}76pK_br+f\H4y)4`Ze*_+N?{U'>u%p'=}M!x^Sߏ{Wwq5xϵG~Ύc:rp#q#r8ln^}e,8,2hAގ>=)=Ъ:VWT-GU,CytLEܫ?C@A_Qy_Π]!'v~D2ah.eݒ߽8Ykb%1„cQs` ȳg`P: 'i84K_%q]B9ƸSX9_7h,:n +gg- D+DUKFU}/EVhvA!4dbIFI"bTQ}!7)~bF+r\Z;9Iz=R ApL4UxZ%6\BiV"f*gً5 (չ!j\&8䂿}*7x O}g뺫q8p{⸭8y?8a muqk>w8xӞ!\ Y ~@=vx>~qߋ1u2eG)@bRDۙ2EF"fP#$!Xe /9`dl cиT\w&Pf49O@87Ds^Ȑ4W*TQHa a0 :9dQ< XY1tK?5,eտʼn\`M 8Za9=nqJP''VZZvM\y>R}nH +sz5U_d}'q 8s ;n "w#RwGq9a׮5~_}nZe,c˸JJ/ )=Gy^H !83*jUJ<j×Y1bOb,c3c-t{1:_$0w)ZOv )%ō>f<׫d 1yK< pƒ9N YL44J$F1!JZ%&v<{Qu/:7 y=%C+Qb( ʊb]ӵtRv Xʩ;9KtoH&w#;^ٯDRRm^CuQZl ٨fKwɕpkVx{w>;|{f7["m pŕ#n޽DWX2q'֕" "3T@B:"+X!1j}NXF=%#DZ$9F̃ڒf,` 6~=E{5cc:lT&3mH(0OŎ Vο_#nK-X" &m"9z~J5=A{H-1[*EJULzE~U=bSڑv7d͕3?hf ʿM{G8inaăz `h )fw 䶎vyfT$&yv&AkDM4wq[Ч_9(OfuӧӟG=ex)>~͸e뮸/\nϝypt8~G-{}ܰ=B\w?`qaKde,c 8|]+N[8PI) %/ /DQP E62`Ǿ#`"¾Ķy\BY3,-q;Ǘbd4c& "VD&V 3pTe%עQ$kRXP< .@a:Uvv4kgm?zkP]"CPPZ(u{֎WSW V^ h,%\%@f: GڦmkhNBͪƀ<%#Vd*H j ?'S$ Vm(F:nqfItu)q70Lsʝn\w$uxM³|n{Ϻrp>Cma߂7_t5_ܰ x졸ˡ#W~uNjX2ă@hs{T [$_@RI, G.'z8>tȫ,HGXjQīSSYeI!u*5q=b 0eU}M-5 @rec c,r:U1GPyAV~5OUq30clIm_DдB[FשbA%^)ql{x& i'ʭPqHk;mRa/"媛?p*,| Se5Y3[s[7óL!lpcXLne &UobA̭{P&CzŸq.O䯣ˍx w[Ju{o_{?\u-cXƝt\p_~Ij'r~dPd&,h<c* n 5; *,E_YSGxSm8݉kڱZ P>+1HU2ςrh2uNőr*REؾdD3!,z#q;'b-E;g-T2䷴ziUkÕ M{DSve҄&s=5XR LqŨapND-@UYs͓w ׋,ǐN+}Iezn{FHLvr )K _(GT~+3dJHj_?/'x1N>f/vrEg0qU[KZ.cX2LoAU-u=X_sN0V.K'BJrB!j*۶bƲr ,Zޏ87ZR,tVk= ܃xk-'X# j.5%#{Z3grPiycۼDB/Lڈ5,J@ߜ8J^oe1sz8J՛ҊD@dJZ6΁V )`$7-LFg1 6Qr}g)$dU1?8O11{ r35[S2+ԝs;Ku;ˎW:t8h. {}q͇,e,c˨bMIXVۉcG;x`ctN`Dn6^R~K%)eelBʚ ql m;#=y %1v8,QcdưǤނùfb>0+E% "EZbRef`L6u"ց3cJvNmjVI6>RJJ3̴O|1Mw L)e".ʠ$d1fbL{Xg{%%/筽X9? V+9 dI _5D¡ɝR;P+ɖo(d9YPC/wW-se,c˘6/cQEvMGNAj֜Jsib=F[?!¸-Hcf8xA 8-V ΕLا;[1?Uz8hrU T-c¥U,It7`'L;Zf 2F^P"ҩǏiB:V)jl@'֪֬iMl{^Sö4Z;,s {;ϹP7ٻCxn~EPu4X)=dvEv79M`PaJLiYA{1N&[*!׉2Rb,rX2oHpRM#u8_^]׊B(R}DU8N46Ŧ|3؋DPbt0')n'_i梌M< ]ս X6:G2YQ>Vq"(=h|!1e%x_#Ԓ?gǓzK$g9SrekȈj LQuQ)W^:BbNcTlj尹Q J1MS^{Vo ssAX[6,ycJ5+0W}-hDnRߣ2%ɔRx`SZ{VJOA{e,cX7TPP}pbzSG5DWśŻD `b _w VZeITA˷Meq1cdŔǙ~CKׂx\ B|KQ9H% %tόk󪥹e/`#rۨ*ǶXkS "K+ h=+:[*pTyO, B4L&A("=M@}};/'h "HkI⤶z&2 #E{ )1 CJi,.TI(/є-4+#!Y&DL+5hу حzmj 97z͔W7RKrX2o$pYCIOlCA>jlR@wI FGk0ەE)hc+x AehQIXW 0OhSJEI bY*z\cXQ$+$KbZf,sIK^]I4;- [/:FfҶ`] (EZ-2yx.i?Ҷq v@3dV_\ڒg>'Y\rͺQ<~i`blD9p `؇t<(vYr s𞃊,2e,c˸=WUlO9*hFm@ Ð* ¿~,"{.ʪZ <#@qmZ!fhYr z5 *%=#ƌU/:Lso_di7&НxTZmٷ@m=LpRymQVfخ̇"UyO#x3Ÿ9`) x>M,)8v冓;*m].g69^gzIӜ~Bc34Z pGhe?QZt9Kl~^˕mϠy-5.l K8{9L9c~,/9^}|bCB2ŵи53gsIgxɼe,cXtݻO|豕NL ;@}بgh_je5qj3}iخR9&B+!&I}g'2b#+ ` 6o1 >T L˄&22qP~_)cHliٸ>Hv,]=0۵i״},.iN$^ԃVGR'Y xAd1.0+ff Q"AND X +2zꠝ{lT.3\|lzjdI/iB2댅4 0i3"M ruJ'Bq?QW/lML䚫sg?:yX2;ظGtA*0F 5Ae%X-mZ- @!RM ^DcI?QHq^'v0NţDT%'A׃M|#F^}N2d$-4\3c^f;!a%$lc,};sl ukȑi~Skbs*Zoahy5ۚ#lu^ B9^yf :GPO35TwxV}Ʃ98ZkhȗH( IJ&jcL `LcY [=a w9t726ɜ l,19 Vմ/ Ð붴FUSzk*mohT%Dq̖VFˡX`҈zZs̾4 JI.*9x_|(Q9tJa˾$;W끊lQrZQƨ&R+{Gi>: mH ԽI$7^oY0Ҟ2+ělv!co?oA=='TSq4f?2NpXWH"GI+|c^0J2z@A}]9Pdag sTfu8r'dDi=Zi_ U߽We*uDB^oU ʎ@"c}yhk>pQӞҶZtM%\#sUFMi_ gzϸ&bsVsUB;Iv_@[ Ff9E zwES4O-5kM*EMg}V Vޭ[Qp^S%Vmֹ^TYsg-ؚsUImoCǥ XùU"VHcZm4@'IXcFv j`)?/jas~nٞ`}v-HLq:S&'T}sCps-aZj:JDY{ pk/=[v-*retSAV%cpZ S:5(/fk+wǦO?jKAU +Yڠl  1L7=ʭe{ޥ?^̚J9[/>U$$ɢrڦoUcRM>Փ2c3q-׬p0p+PW֠u?iO S԰ev*2-2iST!NT+ ̫A8ńRXAf+HSW7m?7t9v`u<!֎aTN(S9X^&yǮS_ "+ k&.t 60(s%k^s?#B Yu8Sɢsl Z:gBRrmŴði욷-E  h&=uWa YZNSGx"}Hڬab2`[`6$/4$H:W2&6A}#{Uք01|>2oqI&ӵ-s刽lV/"$.AgFsӅϳgd SRq1IÔDiGApT`" 1ܺv0-ߝ*,-G݇y72~ʰJ|̱sd9 a@1jX).$XD!$#RIyêv"^ٯb{lT:tU%㘨(~gSlJNUܽd,TɦOk@*{#m0ܼ'F=1#WdE=pO q lԳ0,~~0HDlZfVϤʠP 6JUIJi9&cljٳsleTz$8`o`kҋwj™ Yo>!+Pl!fȫir3 3hpf [v_c(AT:omVq%fϯꀐ{JXƩ2V 9޻Pay\bIq.'ٳrm[S!ocX@ˎf)n}^Kzˤ^ %0v:.{~垍%zI,/8@L=X"+ٯpǪyaxYrk-\}x gXnReYsY6@u^x,\B鲒&P4LoR֚ANطXϊխ:`DPn@ZR?ٌNU!}{ Iyy]3ϓ jfb/fٍོ|`ZQ9d,kܙ柯F 7/vAW&bB*etI\ |Xm?n&+$dYZ^*"fQ;WГ{ r LͲ}Q(5XlʵF Y[[-;I_yI $TQ=Nz8=gSa@Ϙ,ώ'/rs=c@ʠ\" .Wbp˖VXkS[-FHU%b8A#Vêbc}ZNM.ȱV~sYFJJ볬c(rEylU?so0 aHuhX+e-'E*W}ԉć :qhլxTsZuJcplMD ,e̥@PzoֺĂƱJ~ 8@+@%@֗ՂMC$xv1]ؠwmԘc^P3eAZydM @] `ALlGs h7!g6d&*4ϔ% ]0 `ud/t1^|{+zd vxت^nEֹ+qO"&cY]DRfMdb\Ml PsAyR0(qR+OGisx+Q^Liv(ͩT6R&DdD>2/YSӀ4@eַOmKꯣ~|Y'jg7_ee` ~UmRK HfBjJ5ۋy yK{)i"ͪ V n-׆ȵόFަh*5\Nr!K޾|/P$%i0MooZ#\֖ljؕGfz/&J:%AM&QlM*e yZbX4!4Y,7#D5C {fMlΪ>WeMV[OT|ܖ5)NR[vdzio=9fiCŰ#yb%T6hW1̦S|TAËIt[ Ue} K j%$c[V.5k^`NRm fh@eVfNOSﳵ:(JQS!{N.4uNU0Uf1SBݠ_2U1? \;i*;Zm5̾wŰH M/B*$қ۞I'C(@(t~cW`CN5O٭JBP^7fdMMV2g#xJ$+'+ѼNjiOH@ w,{3LokL6=[,ְlf6XzG,4IRg<Mf)P*Ofp4PNYNv\ڽj|>-s)Q1q 3k]juJˠ]\b0&-LA{Z" H/GD6 c`ɜ+?(Nלeom%ԪN,TbPf7Zg,˖Iz SOEnVq&J:y+m v)aS\U1-ʄNՅ* fj;+3~Jeq9[Lt,㌟QSLhj}DZ8f=2e0i=m*ׄ*e`1CgTjsqn;AZd҈Oj^V@`6<-g',Rq=HؐeB^M9ߦ^$sV>}[.TX'vz [X4/bYIe@*@YX|(\Oϫ5C$Vo~JmTxd63 ZURs*Y0rJSkFz9#UX{O-YR4JD{.nBXIR:mL۔\5F ^)e&˛ܤvZlTlM͖ZN ?Ð3PuH$r;2}l3zd9@)T>,k撲^E۫iO Hqlоf ]S_A asp4RsOyİC,l+ĪZVJ,߫`&[Vۑ)˽þ!rySKt2FUn|琵xԛ y?ǭuOc,̫j1YV)aÍֶrOɯtu*n&y :R2 2RM<([e=:I̗ٲMl dan(k&H{фWRI+G0 ᢧ)IU-SV\Lưu*^`;T" {UxLE.d@ЦYU(A_.1_ĝ(hNS*='sx8+]`xz[%mylT(Kg=m !R6E=Y7+V2a*J 2L5z?=GV"(eTM9InKp"L}0_y$P4ɟn7MTޒOjF*SH+N,(uz߳Ӳ͞EER.&꠽v}zsBЙM MR鼏ʊ`j|Ԟ-GuϞW%G܌Y XE65>Gˍ:Ŵ+5wT`rJh:KH݅zdj;'u8emP{`ճJ> " :7[-U 4./k:ͫU#!- Lv 1~* tMʩ 9,kWULע!J`녯F+@&k.X-|Рj䵔0=c-ESHELqΕ:͗!=qxޠZ_}=:ΓSbBL!֋esN`ͩ*%/TClbC3'L4XP)D]$&i!'@4QNq~lavhĆ\'|6f;v,Zs2UWg$ 2\feIޕGUYΪڠwZNLTYz։.ޖn6N']sa]]4lf{%(O,Vr5υy&S&RҁNaik$sb0ֺRƋŬ$-wNQ8.vM?g"1dIߏc11jH)|֠wԫe:t8R$7PZaϏn.'E*k&ݭx ;sc58ŲҽU}s@)Z|r=1T`Ol_uS/qYÜ41~F4S3o(p^z GY @R+3]FO Ҕ)"] P'ڭW@p(-%U!Ex=Oh&L5 $@>^1 ;: D ɹ(R kI6;{ŅYՐ.!Snbp9T"x֓X#ex7. Q-yrWv% @]BM4c kPS8zŎt+u"X f#f0il:fՂ#ݓ(8AK3L{ce̔~>Q٭cl)[)0!\[dLEt]&}>ΩقN)\_gXlI~]IzВG1# lK۲õ.&&a ,w9 jgu K"HӘ/X-2 X"9NmKG+[\4gfs[)֥ vF̲׶$UtG+ tԾ#alg"SGs8l>DgM(X ґ)Ǫt5+u=^Ʀ@f_κMYLMeLȬuLZ tɪNs"$ᙌ͞D!DrG^eYƃm-1l| 8ъ2icxecر⮃.z`z+`IEgapеfAD&RnWB6nvP j,f͹- %uXuף"WwGCYU6SWNirou,*Qw MbeZk 'e4bWq{Ӗ d=#$.9H''z{uixsJx~[UkUmv3j Ž| Ov5koי$Ao:1M75i) ft5*.2݋-u9aAʨ#kOLK,ffs;=s `*a,#sy95y 4\@ZЈEE}]1*"k{C!jkQHџk?GgL=sGlϜ{C0+b|F)u12k.TJ% A T8@◙c4hdkDBĝ@H '_55*&DH sm~@q'1ymr $lAIe䱞IRC-A'"7?csvna3ªyo)2 >3p% `kXYbo]yHVܔ~GWk! xc#%)5(,r3ƕTk4T23sT* HΤD3RTYw#k+k4M-4{sRg%*nI\ %Kud8eo:+G0$shD^XY, Bؒ_R44VpfX20_ȜC[rw֚3N7DRYrhd5Vܛf93-V$s02 z2EmjM (\gGo_g6̆Vwv@GF=-k7l0®b Sh+l:6K!I8+dFčٳ2z8xhQSђɸw}2&) \d(XN K쭂 Hj&tK3ƟFݎHF`↘D6J N!IJ{"cTCSyt.Fc->}w,䦟,hrF_.9HG׼ lWW,`%،#d"뼋v^*@-# uKˋ^2/ GSI~7]sɩLtޤwʗI|UкivKB>^ t6.DnR7tA%9Nb:U2"jr67o)ZnEed4``YP.чRNB%uJ#$䏝" 9rl#Y;pיvBz` ol،'V;;.`ɑL7M݋)RD\3q/M-K a=qLGg<@IwK#[;j3 @E &f~9 %K隟N\mfK-]w5ovT#v 7S-3)4L RZs4AmĜR6%ܗ nU'/ZaQX;%okmﰹTXJDd54@[/ <'̦yȠ2ހa)͸s )u"!X5auυw: &"ii`9C^gynGD H_`^k[$@\ !Sm2v,LX;#_/]Fi&5XNNtv* /9Ia &dmK8Uv\¨I\UڡvLP㹮$!k7'w(&VnJO^Iϲ4 Uq6ÆIEuחh@t3m],g,C**3ęWd8S4I+d]ØHw#3٨KI:Ë1[5?rig'rlffHh$oRhعΨIlvk'7%dL$&(:+G4D32%=#i6qXxhj[xhǘ:uMlӼJ'ҝ*,8.ϔ|?EK&v꠆d_?j) "Y/q&Kr_1gm0_Q8>y0dž9'E>>;*k؃S\ ()L, 'h_Byh!&GFUU, s(QED~N꺶"F^ZfH^!u561Qҏv0`fuzBZ*q:+FK:05^~}O/"rzhW5֭)K>i`b059&ތK}[RyCw\cՓ}\u:|;A|PĈJ9˺y QKZ# BajuZky '<@)mIc=QB@}Ood Y] 7*>j8x̓b%ԵydeFW8`YW5>'?W\rĶ{}w[5,3W\T݈֮8?Ƀ xRR7Xl߇uۀ;^]05XׁBK_w'Nv,_dxDwW^Z PRھF!B²R, [({fں:Yf$$QG~"a2iM#4*6rj&t6F1GMPS|>'1p@ǽqx)lIn f@D_C !ɌeD1WXh]ڛf6M'[ʕ+x/U8WPʕ!\Fk7#;ɡM!{ԾXh.X|C8/ـ'q1x!B{-î>vbN3B:'VPRPT@5 UPM҆ :NV:hs,1hh3(TX ymY@_f3~YvRk`cSA)c "}Q=Pԟ)`-Pz(Hۑ$G(uM_K,7ӊs8,[Kءn )Sɭ_Up9V m so J^ PDlH+W\#+Wb[ /va;LNN+>Nc}7ߌe˶^ RPJv^L::a2րW <։dšeqH Ku]3]y(s.B'1|K9I-ZYvd`:٪H{t6ƴ*kdg^!LV&LN]xhC G%ۗhj"k$km%W\jl^5jM`fNiτM[aK ȢĢX-3~\bUU!$둘515>{߂FYC; Funjo!/muㇷMKd8'-l`H%*ɦ`kF!%utus}!R.t xtq@~j$: 4]ssvl]90Ecwc@2,Y%({kiU&`]~.y9. 4!w mc.kv]"1h5Yc ݯ2yj&]|6Z+tf.sʕkk Kp_vX -._6ۊ/90klZ W-O} \e٧_n%[f{6W\[&mPU:q ] ۮ;Q\a=ώ$ QNo ufK$c0#%Hތ(3+cVѽxdl}_ aRnm{H#_,Z\Sf@ 1IG3 okt@<"Cp ,*_ݰ-NˑѐnL}bbѶ-6upeJlsʕ+<k`e6q(W>/f0Ox']Pԛj| K>>u5ČcObbSrʵU*,[Uog]2a֯_;txzr3@A=y?޶.(7݁wX`cVX%sWƧp |L+%\_dt,oB<3`E6rWF l ,uC^@cP}7멬_!N29neù4\q+) h-, ',H{5|Hs% ͬmb4Dqa)pdXZ* U²٦?F>Ѐ' \Ȟd@|r5aW~'Nixs}+ /bǦ#팢 _{LJq+} =lq6Z.sʵJkBY^*9""/5in9r @ic*'<jh0'%BeQX&Dh3zF"1&Lo6ļGkmpJo׌B) 5CH#uRB@I۔s0XyuI21lVJq{]ȕw2UZk%l\"s`$ԁ6F0hC e)GyG"ִ뽄ۇ>٣nJq\תWL HbFMֽSr5z.p ^\쵂땍xWO@~/'a+rflqlMSk+WR9]~#_q5*=&%oƣsK޴zӷ@v -$:=Y"%`0`!|Q¾ *}.~F)$]dR+"DRKAR$qr òJɪ9T&gB^mmo*tH)=v@P`Ƙ}D`du0,lԝ sCjځu{mE8Ҥf uAɉQVb c3'q>}e6ɕ+W]_MBר|!J-4ܫqO4-7c˸^+WTR LNNaѢ ?S7JLnYs lX ;tȴuxבC)>֝h:/gmeʢk3@Flh=@Qb?"ijX΃LcQXE5$9fFflg΅6SasNnjq`_#T;4LO;z.m0T P1TNk)EL{7/Je5_ĚnW48!L%ypd.vsPN3s+W\.{R }lw̡ثxܱ #biȻnm(W,FoywbbvX*'{*.&rI\NEkbq?_v^f:VV:l<!*aj4Z@4Y'xcw =6\:@€Y"Pu='"XA%( 60}`jG`hN !jXP';0~: 8*2W@C7H2<늒H),խsS®ht5& -!7lkI0@561t.6ْ=1R#D_< - /{LjVc[ޠبǃGN'm>ʕ+W.+OhBqO.įtX;}7~[]µ⌋GoǽK7aDZhb|ߗ2W\[ \ sϽq6pʕbbxCկ:V5ޅ'l 1wv0ڕ[ϣ=&u@oa .RY@W Q @E Д DFYu1<ԙN id.YiP %j>E\d 4 &Ŀ6 mz2gGشB1!qݗ>yNxHOajBzc>sʕk~~'vyuJRa~5QG5r ֏o[ /[ ;nZgr08}”*H!̥+ FW*kPFUWkٷ9,`{.Bk2$3Zf9 }HeO IdA=@3,5gZ6q(BiJc  MҰUUall j`! dax=*=cJ8o]5 {|]f=#4itc :k]%$q\vnvrN\rmMp?̻pʍD96E6R0/k`6hwkԚvxlb";sʵ5k8Vݻeö.1DJ5k`Xpao͚5{nExDDtpTb{*eH{QZA^D%'kXr9Ua<r 4>6!O! G#J) '&>N؄ 5Q&LƱ#1>BA T6FcCc٘(S~f¶Ρ5p'>A괾ch?\L.I>fTFDI| 9ަ6aq$fb26>Lw,3s+W\.n' ptwOP-.(y\ǒg=v\rm]w݅iX5_^] .Ho8>u`@DjA'pxxa+prV#Ֆ#'ݨf;jm n4.qdȩLʸ\2`*IO& l@)걧1q QeEOxo)A5Q.cݝ xLN0Z^͓6^FWsm`i($RpPX{%h5q=],xHF?gp+W\.&!̭w>Ε+W^RJLL, ~z,^ ơJ3U)lڼB,Z8>"=a~[0?Vx'Oѽi,Wd qI&eFz. %=+lQi"()Ui0@!$҂=d ہ.)ؔ3XFz$Ma XkB" ܼ@eVQ0uM0f@\8aYYE~q6#" K J@PR(O a mBAB-!&w* ;XG5ͷr>9O C7*;AS IDATy`0JW)džxim .ck#^KNJDa覱)3 !P85t02!q_@GEq'=E"o9 !\, F^ߗ\r %1dNvs\r%@W7s>syʆ `*j!X0PH !2RBkNiC_P\\R(B4 Ih1Mǩ#iEW}(%`0xFxjW{i.Y&RIeYzm_,-IH`6,Iu-0;%-BlJ< G n]8ms*th nx5=oDiQMpbG:k=.cH\rʕ+W\h]P4sWa AP, @Yj BɺBxФ E]`<9W5P=PĈ>+3c}DU`(fcz'r,8 cVJ$ UQ^-<)#lP:0I{"K >LMhL-{ ] }oK}igo3 Lm,} >\r? Hͻtďw ,fι̕+W\rʕKj$R)hFI(k (a"7 KUʢ0s)0cq (,i0 JGec;>7. $;DYVӤe9ez@[{%JCHDu]('PN"I""g۪6ۧpCl9\;/-h1lq DS 5}76c,6W\rʕ+W\Ab2,02_ ̅`0'U) H`Fj+m$"VQ (JB60keFF<95ٜNJDp PᕘURi;B4AHG>'Z(2aYLKyNόPkF-iAW}'S+b&~&@2f7Ɔ>"$NHaPJ>DNО+W\rʕ+WKHi4ʘ^L)eٳkaz u Ue95R]:lS0RP&Sәal;f5l\B (O j Pk-}kmi7c+W\Z_x C,zV+yuI4ʞ 6R7ļtVJ^l*-&퉵~](JJt4ygc P ]`0@YIϥ."  wjJ߇ ӯ9`5\- BB/Jd F` l:=Ҭ;\iI`@2]3|IG$eF>fhL $,S`0Ta*BJE)PW,VPJ6XvB\'2HwcfI z҂ N}p`A1X|[# s,AXEjvmnG`ʈٕ]}t>fA_K- Fu>\0my3aPiEb#e FM|rʵ^O5BI;v)|6>o|v/ }g ,TH,:xKw‡_/1p&8>rzx+U Sj0 HAV*V2K[rNԈq6a*  "eAjٚI[E%J\v$LFY^ ;J m02@Hk/ʷ00,U_ c0й`d(: к:$YPѶ:ƚSLsam0iX0&W$҃1,e&l;RgUu}͆~}'{> &/!xUrf8%G-蘒|ʧpƹY!v_`;]3p;;popq?<'Jx^<j9T8/7_{ ͵;!͛߂{;U/0Ϡiّoj~FLMÝ7^<{ˍ&n'} /]&6s`O>չrz@V&eq'ߋN: 'kf0dftX!) L3z%ma+3_8lͮx xsp?V~> )G/C6irK7-w=_W?+q9c1SX gR9V ? ,>\;b3+| cp_?{uG5wgv$"]lJA A5"Ì\*4pLi"aiYK;Uu !%j [JĨ󫪶df &>S\ɢĕ{> Rbk44k?1UULP @* w-d[J,Me pЙig;iqNR9-JNTLooWf87>L(0fBꯩ*dX?Y ~x/}|p[8`G;`^78K+Ϟ8/ţf7i޼MS`ظI6o{~f?NWmq~SxCo#ɨ%>t9~<]v>/l^dt-[){fVf3F˴R]B̓jd H-iR@ct,&5q  ekk*i\|0?X \3\t 7Ke3?Px90П W_~.Q-£v|_{7azw+IG/O*܈->tD,Có4>(s)w_\ZMLo^{nx܃O4 7/-k'џ\~z*xdw-ۍ oŦ;n`bzoPxL;/_ܸvi 7ڌ`o)cKKN> ޴[SX5Ghnܮُ;:xW`:vKE״8c -Ċ=d.@^iė JlPMo]/Sb.8z?<Ec t4uްKzվx9S#?M+7a`{qz"Z0s&| CV}4y|߅S} 6+ ~m|l6aǟ{~r[3? J`:\jH)e1HGB9FlXIx@ 6f#8r,kM&> 6.LFϯՏ!X$ZvNٝ9$,FhZmdrJj/g0V% < _<<8_νo ߶Oxg{x{LL<-jW??cn¥?>r/+ۣک:SO$>n5Qb=KWʳV.Gc=qOn7_{y֝;񃏾 @q^W(Ը‰Ǟ' .;+  JwŸ{zA O|,O?o9` >k)+^_8q̓ދ'~i9|+3x7OC-($v^q)^zĊ#N˞uY+1 ߾mTq%2s7kc03/oG?2ǏBMY ÓiW oz p'V6TEx#N~5JOsy|x?Z7>8uÃ.* b%GᥧfUŋy+7_1LV]+W ٔcϽ%c"4 ?S;끚jǾ[Owy=^I\v_@׼gZK/\s^7oz9Ι4iʋߝ3œ.O]xqgQc%*l|3z?&@(5D RA( )@+B{j9蠝ی[^za'wbٳ^x/75>Ltpү~kO=qޅwaw%G?.9{g>&`@8ǓCɎE\y8o<ܶa>ǘ/>2$~胟ů.W; }\|}rMއk'W\b) c7TҚ !=Ӥ1+ A]b &```!1RNe[ j]A*U4`(W(LT!( /ouXn@#)kŸм0B)@ #aI)${UVSaNMk+zKHk+ &2ɀ-ҮGS6βܝ% !StXwft;Xܤ'؃n^5rJxs _~-w6Ӏ n>A /x3L_<|0QxOũ_xHR<9nSovNa9vGoč+>{nXz0ʤWdЯ]!Ӯb]wŮ.Ǻ/obC1$7#ժ? ЫQ> l{i?Â?9c}GNb K^z~|ϲxo/:~뫾~S_/#p@{8}P^>v@&Ub`_;<VJ|=6h,Xg+b%ӿE v#v:ylnk'W?r=L'jcxl6jH%ڧHXDTsVj/(o<^UIZ(öЀ ԕH0  >E)YJ$msfd:Uf%R ]-b r[gf&{6dI0c ~B]akL)gzOOf:?MK8VNp܇Ŧ̢%~<sZ>_/H\pRso7|U>٫^ IDAT]).~x!=𤗼Ϗcgo?qMnHPP]IC?A,: q5 FА;}(? ~;9k\X ^N<'OzO!w|,H!EUUXa~{oqϿ .7p/E1֯0*pւB,Z,5kq/>z uq8vr6qWz^_#|_pZ]ߧk2 :! \[I<}<7}݆?,rz?rsXl8 3ͭ{YW^*rM`D0 a dS6ʩ>ʲt:mcB#G5DqPW` %Ҵ:E{_V+U`7 ,Kof$Ʀ?RHe`mb7:wqs\5ېv^yϵ?Rؕ٤C%B[|c]ע<~ oa}|-_}pе3D`.WiR?݀^7 g_Pa8pYgwqRVu.K (sD1"(*<1b:y&g<=PTTPQ`*Yrew~TvћTwWU>Oݺ4hЀ 8eeeX+WVyryA j9>MGIfO/sgQ؁<4x|}<*}{ ܇:3A{_Myn ~}23޵o*g۬z}sz-!朗BL~ +uqЅ}wZ)%ViR>u"LBBI2z.X, TᡔjIJ" ?Hy`J) 1$$t b=Q6J,:tB%Ab ~pʊAycF q]%AeϹFJX @Kgy\UүU#Y*S/'۷lʀTV.]@iRaUUqυFۚTL09:WzXkQk y3sd },B[: Vh/B#umI$;ᙣƃ` y3:#@k!FMQ\^ -wd-94w\6^4+5y{_䳊?-ۨAĈyJiL_a8y eF:_`5qݗs=sRJKK7o:vW Ot1 `%n_fŃy_9\zV~ƭ}%-ع`޴ycngcM4iۋg<>jѡ9aC64fOڸ_gPoqIјczOS5wi<0=J>FmͱY[[}vXCp,`'-fK (SZ!T*P,u4d:i/I OAH,2:EER6( cpP)Th7Tt0jq𢡄j+(**"x -A8J!~gh=GBڱR8 #Tz7 MuvfZe˜U,MrnV*8\[iL TRͬܗJQgg$1/:JHP7C`m>ɑyKaA<gC^pe'NLmNmYOZP.+V`u>^\?9ͬ'ԣiҤ62!z)jvcM8`s{3r_p[n%/%[7ŇQlءĖ䬶 Z]9 vN! e\$CT' #|1Y:TLJtf ӵIVM4A@?%ғ*$P8,1zt2Lfڌ!mm$*H11O cN1x uD6%!P6 ^<4Bp+V)BYMj\ʙQe涹 hR]DgFtQ]1F*T0kN*m ᾟ09vn.s<_z³jh/| ްpGp'и5l1.#&67IW,X .:asj\c;6>y_Ä9+P4mVwz<= x'?z[uqJbu7Ҋ~ Hnٚ=ң໼y_O \Ėn BJ:o\VrL/l]܈YeqD1=;I<0_Ga͡lkw|5އqSZaԞN;!ԁ:z :5Ӓow*ӴM?aX%~Rsxcz:hH~ ?*h~gCp)|9O|&7 no` hs\ $j8Wج^SBCi#eh=b#!ZDb096qPxD%[cZp,BFcm])AIRX$ u$$}X Ȩ Zp&sR p}eB)$‘)L֥#d XZOj͔8a VAkh+DJz5̤ )iLpfB'5-*rZVsv+@N0)c):iۥÌdGb3R5e՗к3+EעP uN=*`7*YpAp ptG8pp:|=7 ;6/n >NJb?;ypi+e{}שt84hG-eΔo`~R_ pߎ={U,?OwK6Wp屧q, o."%]zڞoy3w@ pRΟħoś+u1 qCp$}͠%~UᬳҾŴ7,lfp9 .ڑNgB='yӹ5~毀;Z"qI&hڹ)%q y!<0PQ!ƾP ̺˵2Fല뺲HsE EJcp4hGX{0Bws4I[f\jaE"Z@XVܰaJ9P wÿZv7ppiM z~)/0 RN:'^ 9 ,^O|Ih>]ʽ6WULswO^k~n}NyW(_5?zO\GOJ+Z,bZ)2>H_e ! ZT{z\u(D! Q 6,_IRA ~j~ 0/|;OjAvq1[C=F-P?ϦVpsic ^Q=W*@%Xz/y#X}d9+8EYuᱯ|Y-N> zl•~Os6;&Pp{,D! Q[&=XJ"^kƲ|*#AHP'J^A&I< KT4&)TJH(tVЕ;#(B1iz63l2ғ_ib)_J 3gS LeF#Rgiϕ2:fPZc Bfv5©K}ۚuw@~>*ۃM'w&wJuτŋ)#œ~ZP$Y&cl6s-R mY"';Sx(##_ e6EV+ _@knFa&(D! Q J); kRR"$aeĹO&ÐUsVMkؽ/5+&`䕘Y+D! Q)?j uR RI We%äf"b/HUcpD)eJ$'* eI&c&LԸR"%dme*+j!Lc9J .Jxrzgv2ʂ" RsQumH0 .TR#6* /L}/) QBlžP,P]?**~m~.B2`,H 5!ҩ}c&،U]U!&2H9w@:V(z^lAfShPHC"AT6ԓ,5fkJ)q] d\C H@@k7qi4sSTz-F]_ebX;5W4hVrٖ$kkcj2UlOz0a 6^G˨!:nu[(D! QB)(,0 GGFĤb(-T#]pAnaME9I{V+2L! \C$%bX*3XĽ~2f5zD4m4):?G`@.~FUtc YVHj‘^ + uiޠ[ߑ-4.nDLY:w nFv+U\B5.PfsۓiUFdWV4ܿLj.LQYw f(si2Ռ9#14e6CDm$N[0ɂͥ͂zY'(D! QB=tPZ" Qt,|?H0 aV'zIE(im=,T8fc 1%(mk+IK  E٢ڀڪEQFbB\)C$PRna1BHboImiҴN(HShu4Jje_FkSTOS)"2YW~EIQV0omsYޗRIiΕU_TK ̵.vZczlC >!oUz#s tK'OQ^CcKX^k,jކ|Zڗ;ǵr 3,ؾSg26sVx+-\?u_IB(!%Hp@M0NB@5Za0JNC`eE0-B @d $} "b3e޷ܱ{{߬K?ʞN{oggYi5̝4onu_ZY<*zN^v}?|"Ꝟ4r}8,[ Q_{G/: k nCKS\w{Ұmتw~owcY/jrWVP} (fQ$ɬu~f2,x<f2k>pB;D:.ڀ H&Tp U 8g 0ƂℯHBHi-F"CJRA2: #<Ѷ0`#L (僑:xĈǨ4@ HHD8ΐ N ܮJͣY[-lFO4B! Lm KS\3ΩFH€RHDJ ׄʷ2mɮ4z˜Rfc5Fw+2xL*JM@rZХ)XxاLH ҼW4Sq^|2߼<[}7hDž"fj75!;\̞g^V0cJvc5kY#wϖҎC cd^ eAm``$2$aG IDAT۷;n嘣n?sY193(bۣⱧoP,Nמן2╡6~jl nhG2pRppӇGQ[:جNS}͊!*]E[d|5hC>V_{7Ys=LB\f!փcfa\7LX5)ʫ12Tg>禕_LJK#2HdEu*sbNq ,ױJA*Jikik=&8u-%֊IO$K_+x H P{H馎Ê ((**BR9(("N$r4V-6'X`Zd{NʔkfF3y[?RMڋ]8FE]Yن$~%#Bo*IblHBPؤoR*SPES85kXY;,\l4YȒ#/P^m#rKyv^{٠y餫9LYi%aq~p%W0|m{F78^4_fS? O2ᵻkHg7\=OFN펡?ܝ<@[;&<]ֱor|Fo wVNn<=0rCvɴz!fꚌ!ুrJG:Y.k0?T9ws;(\Z.U:U;8VxTARka-=BU! A\7\ 272Rɴk23,\#HzVUڃhB)%Zz^NQf E{W$X<<>K{}RyNBʡ8^:%n1TiXMͦ梷梠Vfj6(?5ZWY`Z) tJՇMK[kK{eMXF5(y%s[6X_fzAC߉~VauxT4 -[Cbfeռ ۝Kޞ3yoȱV_{K55,k޸2a[_7~Y^ȗc8Mٲi/qOt|_%5k{rY0n{Z,}.Rψdխpwצ!g ]uXe7]s8+1kh@͎þ9K)M$˖0󫷸i,|3M&Ŵ=lbxAbWɅPLv^\௘p5~3|8ujms8k~9f};Þ-~3~ %̚8wM7G/pp&_ME*Mʖz55X!Ҧˍq#>a4;Gw)4'gLAM3m@nCwY1'[MgpqLF<9`)QOhrDGr|(V\> \};|c3lNƸIo>w)V!*'xtl;v {\3 $M`gy$O F+?dְ *u(]hTo&[6E̙jw`:Z1 C#sneU~i:sz?'5͚oz hB$?r]j|9 (F&uѫ:ӘlB;9љ ̠16k؆<kF\,ˢV [>7ָ~ ~ʇsardykUR 0/Hx=N؃c1݅Ƕb'󾡴mz^?Ω=6݅2iz^[۔mC Qݎ<E| SFsR.1gq/nد-S^Lh0O]o:4NY·~a?~]xzk\})$;J~#8zq;aIKbE_9/>O~[D -ԧ|Y淖ۘKk0 {Yh4&+KY1ZjEL,\8N:jmEiMyX,FhBHQH!BUt!J>HY1$6H 4eH)"\ϳ8JZ6mU e|$2ӤtJ)C,R-En0u$qC(5oq#T0H{^W D@-ڞ@Mha)WK&9Ecوh>¬|M'&Ggt3*:v j+u2nh.mޗ^QE|3G /*~S6Ì~7cB[pj߻8B:g >oHAxJ ېy1g]Ǯ;|>j-rg S8{׼t2o.Ǡ-!#F_@ KxĤnÌ]:蕁,3u9Ӂ9%EWΚ}*m>Qq֗5|=a~c\>x{5]dGM3i-YTt1Hߑ_)~H (['hvL4$EsQ!ŖP?y F/4o%|3E;Վj7kZ'B^~ޞ|Ɨ_M]u4V(GR$iq{, M%˙6z-1J_ix xDQYc&mH<9+i'}YRv9 uE}2-CΕw#{kthilUX#Z> $'w o߳jc~4h߅N|>]]>϶>>ԃ33ߺi~l<:BNi*O@ G.g䵇p£?> w潳kl qt~j>`N}z]w͑m6~}HҢG?ՆĘ;9^_psXB Zo1LYR ߷Yd.kAn–9cUZ)lf,h;T܂Ey^XVguKXZtPhX(XzlTz"T EuH$f3P!HL @:)G R+ CQrak6ÚOc}Oy4Ƈ@R ++VP֤(EaFtlذF2MɶAWeǔ]+jeY'%TYl5]LƏ_`ĭ 9ٚղ8[ΠvSZqʏbߝkٻmNe3j?uc:rf>Kc)m/7>SFWxyYdEqL$?N7@MIc{qױw0;|aՊQ: ЈzSܵtٖi:gэnvs }x-c/Y0Gס6[ (pZ˸scŴئ z ~N\ϵ(nO3[|gl6l6lMcTUv7;XWp»wٙtz?0kyec_E*P:N8.1ޟ^)8L_feUq[{Gz9Sڹ'+`׵=%3l:~~җ g'1uwc7Rgܳ6`(u&kvo缶[[VJ}-a |6zٚґ8m`+sŇӽK %yaF:AƳwȯGTs?\ݒnj<_zf5.6Rs*lIcGTքQ&|?"ȣC +*kx t3LA@tJ=V!=7TT'BP|6 6L= >J 9^V[~\l-iZJR /TM)0S(\/HRRTC,V\V+V"*rZG!8UfvhQm2jQT؆@QA`fXd6J8rl Rg< 0)OL~枱p=br=wߴSl=JZ @äXU92nBU~%o-?է^'pc8>Q, &2ůI̹6>鴥fX8An8@2y|zX~vЏ1їy**SDNHC%;l2Yl3;՗x˜Ys3'ۓ4lִ Zo.J̲㢛xA ],.;iw_'iwc#]|TY6dҩ>+95?ql5Z'+xA:zze+ńW1behQBݒM+Y1?$Gfᮗ׳PtmR-.{C'NYj.YΚe |X5N@6ۙIIcb?Sf;c?G&W~&''_ҠNuIꄻ#eO;.6,ciYBX_I%<!3 Uʍ"rMKE"T6RdFϋ>BaAҥ* | ZLjfVVI&p;e('|Et[4$ۇYh>nBfh "YЊ8nFENKEjj$xYu*utm&.$ʮEq5s{S1҆9kIS(4aXoɰ"4T1a?1jz |Nzdeز? /mZqtrͷ ,p/n<~>e53_~n~.8\tu>U]^r]irF?ЋG_gNiKѬʔpdhx1_2vSԸoæRF!2&489֩i5Q\BŎϔ_E=Zhtq<8m#%f Sx7=Vk=\d[^8y׈IN8&r+?딽Xa~r*}{ ܇:3A{_MynKzLT{[6ĈPgn^ӌ.˵%Ď 0&O rWqu\tal2 Rx =7#B7tBLȐV+\? _)DxIJZ"ևnQ ? b1FR"tnh2Q HnFHA41$a@bIeE]׵4Y饰)/ljK(CbNI.({ß&}#$lfz!Dj]gfh@e+PD&\;@E\amIE ՞RPgXdJ+ xSE_tsl+|th:3Vjg4R0o |/tG[ky{[ >1oc4C1M/ٓ6י,̺.s|2S8'joz{#gc!μ`:[Kix~bc(kNc !,d(71}f 0xr GI]1,/+_bʽ c8clְ Q`ė2lQ.j[M[[x&>0s{~W&E5`{ aMkoN{V yl2"e^we'U?~aMsnG%dd/c{fi܏q f0uFl׎CZ;R;ԇMtoR('t]'vIX;BmKdX麮q@!0Q`RKhLJViF%sB D(4$%h&@">ܘjek$HՊF_h*I\C6*B,J/L&8P: 'BZ:KkqQ'=$1IPFVæ)i )ۘv&tV g#QA41YuJe֋atG"6+ZɰV4GYsW8&wܸcM-dBz/v+ɕW OEytL~<GzsM؎9 )k|fpwlO2?.:t`'7`s*U3HHOqV~9w_X8!J`}2'q*[GKKuOQV';ʥ 2:/=g!vן,p,^?w%t~i,x[IOӵ8sy^|E(^}k6Ћv$Q9rF1+yBќS=Ff.}:%-KQO?0P"_spGL5&Ti|]}l5E 5'.<Q<Kͦ7=kc^dzo_۱N U)Z:G٥'מ"(*r6/*F\ns[+ғVc룲ޏwҳyOXO#:vT+cxH3*`L(~ A"$_+|`0z̤[L IZJ)%V# 3D#-p~D R"r!!(|T S~`?뫀V)*@YSNM4~Rxq}eeB(bX-hC"აh#H&|8%Gi-Hdg.3]#lj kRt3SFlm23Y8kFeʙdd(4߂$ 6i`:HIL7쥎~׹1IՓfc#|,ώ,f˨z?tѬfW|u(~:O"ޔ;(MpvjOZu·8/ Iٖ=[>u}R\0 IDAT\ƹ<2f4x`}ORyp*Y 59zj> J?⾗fPj=n1Cġ{sRT3{P'#~L^x>nBN!^.~'r̞ Yd]~GNO`euh=`8G^thqWu!mZg e7{>]XFRwt,}zi ?aFk09ew^.iߗ^?ŴH:m`̦E)~/vz '۟Q1 uxݏ׻y 1ϝuZZ1H)J jGύ#]FZ+\2p"Dxfz!v2)/4Tje6}ک 2Qpv6)dBMzH. Kٔ["\ZkLQF%ѕڤ&F3s hЏą{%Y`%s~7wیE'NKo"E颙|M#|$X͈1jȓ1;۲^ew_|&?Yg5ϥ}ioJY0+-DLF|IbΜӱr}|̨5Y3[~OKy\=Y^.op!j#?gT ԓw-? Ksaŵ7pq׎t:9 ϛΏ?\&rhﻸL#P[>?IK'V֗>Ǎ'Q`ݍ{s2ǒ/6GsH۴Q_& ᾿geMfm)-ͯkUʯ ?\T:~4˖2g7|EIEC avOq\DZQǤ@і~ 55 & ʀ##ouH !A+!ltlxa]E|lf4ǔR1=+|E·⧎릿[8!.SG RcmLT EV-W ۪ϥp(//{lUpy)+W{uP MI(Hbݗʀ/]g)tJm"1Zfm# k !8){&c161+3*M DiK|tkiRhC)F^$N9RTAL4ۑj>;Cv|V@x6MM(*cnG1i9yO ( v'qRo`$EqB+q(nۋT\'-w]\}Z:_G5?z[ɍ?rÏyÇ_6j^{/'prΙ'E[Z=Q_uQ2rUlh9{8b0׼I+qʣX')q"C"5RbrԂ4h!Z]XjpYAH"#-^)F,p `o  Qf֕>Dw1Eb }!YQx+HB%X@!?qU;UxP(`]TkDZ9b,B$RHyAGPKbrt16F:wd!8$qVh^EF!)E QFCd$Ρ"2Zo@F , 2"Bb ƑZGxx34$c" R8|6(]3D#HCdoO@ӏKE-EF'K'mo&R6&;.X!*F6`ؗ"hXJAQcLVY"xD\ \S9eH)Yc,NPFG0nsA`8ka`5jԨUgBGPP B-%>،4 J#$Rb>F2)HG85Yp4'RB3͈ kQQĆaIc2fylۻ{}[dƷ"ux &t/s_*kGI/\SzcR Egnv$1ei&|3;Ɨv"wR8&WNC۔Թ֨QF2CCci&bGR3ſ3|װ|}w5jԨXBuP&u#D*EV8!ȳ E)5[" .e if$n:\L)(YZJN`dt !$ylE%DI[EI q"W8' :S<ԌAvxQI!6d @.K= .\Nzt5?m :|$AWVpESHW}eUgPU J> 28Ny֋I&; EZ;bDƥTVlI&_QFO-l?D84=g"ہs~kPkԨQ:VynB 4 11vK38ؠ GqHMA, gxl tWCYf ;TPETTX+JSEE':3dTJU-d@dF`e8@J˕V"Mǰ6!euEᓩdlFѺr1IӠ!7!b[$F! d Wxdy!U7YX2*2 A>|9RH#J1@HHHH/S}̙64Y]N磈MGF ĩ"l"5R@9"!00Jgܵ.G6 3; c |+^9ҹ [Z;${6]:'p : 빢 ;{pb{,7 |DMmw۷İZZfWLV*۰gtnsT$_y.ѷsԎj/=X_LC]/lv p [ѡRgFy-ny۔k~a3QO1( ;Y]W&?㤳9#\ӹp [Aۮ%gS/3?Ip m(Z=5jx@cv:kt8ot֑yPfU k V@S'CƥP(T^;sJ)1DZw !(9,L  S8&rThbA9 dz2"Vayisynl׳33ld`FX=yB+ͱ)82KO"!|Prb%!(Y1:P*|b%g-XdYd"x7!tk|jFskNo*\Pa.YI O! '\Wv]ۇs|Zk'avyۉNVk7+)x'>ʴ#G v=-]p?O̚PLO^ϽIQV[}5SISK} ?OʾӶl:$.wwf$c?Ͽg;?ƽaC+5レwTv\«;׽}gޛڇc\i#`ӗWlg d7ePn<8 .r GKCrϵŻq~tC\MfTa*Nmy\tj:~s8l~8o3x%wn.~$[pަvO{V~7͇ܾI?;>y*mJu~/^fϜd4Y4!mC5j<] v@ )ؔR9 "nrΏ߼~)y1$qH{Aǃ).l+UL5R !RZVqH*¹!zq3Y8@vX,='ʜlg A4EIl -di 9'hMO/\f&ƣsAb5IPinIT #C-V`V``QZ)9tSZX;>U+zv" CnmGavO\V}!sgζUb!dl+V3Q,%cK؎vJS%ɦ|AЭu/q㾇d_ Gò_o|oic{Wu /}Y֟k+b:ů.ﻁ]?/ ͑3HcʋbL}2y79xW8 Y'1HοR޶K~t S/KWTs^źb?_ig?vW~g-@r"9<N.WKKN]*eXO|g\5_߯ƻ_upu̮G or#^9빣\g&ců9|"[;$>%D&$֊Ȃ"F i8ux1FX(HFK1J?l~=i~~$O[~gA}urا]wqWu'Xtޣֹc]?UtWfq{i>$~xo5GrЏY|5^v '?@{}فkYFlơࢡ_KzYF'|j H 5 eHI o!w6H HkRbzdZA$BfHɍ8q 6RʶR)Ee{%QČsvg>="lNLWذnգG6"rlȆG!1!GhP|54̘OoA_ICE4$%ըL;2ұZ#hoХeJN |*, ME8PjaWmۜ]-]|A)SN ~ jt=躶1^'8JL&(gaW(Ho[s{ɶ &+d?%<4EA>/尽TaJCb~u#O6,/>v)^k[̻iQ[\lsjXN]sλ><yыx ,bmv~9֯?>W]}5wy'z__3.';aYkW?FOWvZٕd@)g+2$@ ޡd (V2(*)uBHlJ,,Y!'y(iOr鉦aS3X{Ǭ9Ht/Ne#wj(4EHIGJhÆD-o@72'I I eX0^+RHyF+J 9$h^#Ŷ'DvHa 0Zp6RlD$\i)sKgIDѦ Ho4< fˤa]_=%/'F7:M")=k,O\2oq7^I]s?]ƟXsNs*g ?r~t100J)FFFdt1 ݐsҜlϤE7o>"HjԨ4Ó9Z@l`Jg9qspqJɔ褳!in#QR\c,",'RɈVj;KN`RŴFӚh%!cV߶9vHa0Ѩ!{W1M7G 3).DVӔ1 ȍAzQHuc)8QsQzks' hQg"7hc$DM"4(\$su~{@AM]*ODPn%(_!cp^J.!n뒒@UGI^cp5-}:!zP;v+H10'7@mB*Xa]LطbGc_ͧg{جcp+AIXsV`&AѣGVUKsKsfAg߽UrÑ|~$f1ߩã;V?Ȳ9;w;Ae ?!C`*ֹ.uns5]+ၿ p/ìG1OB_fxxe˖=b[8e:ȋv.5QHsE,*E%X'px,EY;78kXkp(`LFhfcHhjH`9EayRB(\KsĢ,y3mKACb]k 7&=4cbuh'q-6-&7a~`=Q=[1N!@ˈi~rzƑٜ8D3cIEQ?L"o9 W,IDH,H+aqV<<$>`ChxmשlSN?v6p8gF_>\uO8?ZSZ%e|L@hts9]\.nT Za cGauolnens4BHюu- {L-+Z۱h6lŴo27O㒝u-=0>56/_U=va#~w*Na _O݀4yvhy?t|f<SbV<ǹ^oɖ ;Y)sgg/G-_t0 }QQsJ.x&ne5|͜J=UjԨQ㉃œYЗ&P)Ra B+r8ƃ! 7 :g^JhAy)$2ʯdy1!#о.wb2gv4Ǥ6GZAo;Y5.ɆquMm~t &>KD&hHB:⸈Rz=A:i'|T1I$2"DD4u$Zh{z $Den|`*M(ˊEGȎlH5b !ى`by'*)Sp/xćJ}grRmȤ0/vM;:H>;vn0u7~ 7b羌Ϊs/_i[O眷׮jrk[p ɏ/=@WoKŕןW7п`9KRƯߺ/9w7+߇G ڍF}g/壒y woyӑ.{t<$}>}*~_Y{DWp!]q57޵!0g᡼}+I mp>vێ}~ l*;~ºS;a.xqo`?Ꮻ|!vP)c9|B·꧓[lMLL5Ξ |Zx!+{Rrs4p0G/؉7AHM7gplC/zQD ߰KİF5@=";/3(C,B $A[FJTqƂH/2b[8SHe a EiZh' Yu(4)1Wu}ӈekwe|EixM"4}AC%48eQF+#4 BFZ}㸔$MSzz8-i/k xGe=^*u X`lFt"jljTĴWZAJGޕtF[4vs>;A;dϭ(Km0;Yڬ}b oFR?vG'(N=CrG?{>v woĴoowXN/c՝b҉/}wWgXy `<,>vw5oM V?~nZ6_<߽]81M[v\ٿ;'<߱3YY~΃K/Oț_O\~7}=Cs𖞷%W]^8ݟ7SYwjcgOVqG=,:~wmQsEOc*BSBEh7W)ΑYK%8yD3p)4ssx/aE0}8[;Dj?]͆xT^ї'Dhz+{4q,M  w8Q(m(ͭi{nq i$!+ JKPLN̤XF}H*А(D.dJbelJ(x!iGUMYw-¯mIIJ,N~4UH:qPR]i۝ڞ2X85＀kjbY1!~tFlTIO;n~`jH^qFZAPgAfчr,ܡ"#2[dҨXs=9Fɳ( 2A(jW34fЌ:U8In&nA@̿Xk+mVILu# &ڤgL};dƬK9ȏ_?TO7 @ s‹gV$z{\G>1m8:8';Z9h^4dl[hU<l6† C|799Xx!K|f~3xū5jԳni:䅲m["xQQl22:!hZV1 RJz{{CkQj)IEI("t+D2{?ߝ ѡ"5 -YDz+W;8ǡSAF:^$:F*ңci*cK؊DKJthSX!A':HA KւФ)DҐ<67:X2`(ڱ2l,I]wYM $ ::~ǧvG;iQVkէr":U/2‰O>;" @ o*Tumy+hWuՊ~:1/+ԨQFwWMMoC#dֳ~8-+\v3<GF9JH# n5BոԒ,8c !#2:^"'3"J{wH͂RAuy2Ƌl,( K%FM8~:FjGQR TLn2[Ffzp%JH(pkrTC)Aʱơ`8@J)(҈D"Bd(,3k@:&AK'aS4b J"HC% YSXoB"BC.%Y' :D~]iSZV k'":yg5%7/ υY^pOKp%@ԨQF5jԨB`Ehj)EeP-ɐJ- ucrGZIz .J*2#\CG PsX+xgzu/[x36 =c60*^[4N@,e$Ic!ItHH"c/4D!bsAKd҃ZUyj!&G:5X *N!Š{DabSsY*!j.» y r b .QBYX!,kǓI^Vz}lHGv<+ۖE;&SĊ.b)*6ewj2dy.9&n||T o > p×RԨQF5j8@JXP2H: 񲨣T(qEYfڑ@D0$kL4yx8sJ{ d,zJV䬻}F06ZHH$!}UFAtH(Oi!VgY "xfgpX8a깪ĪQ܆QBOk;$(s"?شPABd4 "V ^>DĮ˳RL8RN$UXG&Vhc}' 3i]fuY(4u'.Nd$շA+ -:Wj*=w>{_<Ʈϝ [9saX֨QF5jb(lBHc!"Ln!xk3f` (5؂H8J!cZiP66M*a登޻H}]k]U߹0g+ 32@lE2Rl+8JVKb+Qn(W Gq) & &Ø ̜]U{c]9sLOsvUO=<xj>k'|rbԜ$\PjȴDe'Diiz 9Q@\+\-Ƿ;FFdZKTFM\U3T#ʨ T͹;(g3T҄ ky*JowܐvH;=z߼岻rI3lֶ-^%Zn%s~+|A}~'qpOyo'/gs| ~{ v:Nt^&5`ބfΥUn)ib:UQUJ)!tb@VK-wɟm^{# /W~U? S}KbyXV̚ Bu4IsJwZС!ֺ,UևDuE >$ $ˡ@(I#[AC1rJ&Q!hig3\L]7ePH3wW+ӄy-c ~j{xrs;N5  z\3ǿ?{Z|e'ֶK4ήg\Ҧ"blfF'>tk`@H"HJi&qC+\a*He]w^:Ix۾3|]p%|7rz|/|˟G~;Nt:)vCcf-q5|ƔB18YAD(3Bf4MR(9LS%=_K 1l+'ȿRO J2( Zr 1rq`k%aSe!slZ(HK S{+xtP!62۴I2́{B qhBըO.c8 U$7]j [=l x~YJDU#~GRnD|4WnuoSaUnr&4{xc٫-F/y}n ٿ7Nt:WЂn*N0yH9%Y`fGëZ=ӴG5Σm4 C~uRoz[xϓ7ɟ#'>~&Pt:(" 9()DdY̅ wJX1޾5`Dw\O| DM%R U,Zj*ag+(c15B&.o CA mq'e Lgvs~Z5M gA@7ey6;'垎QXG1}憙noz/ew_ࣿ~GZkm! ^pxb_`*9S!|7w}5|;;Nt:*"Mj3bq7Jm9&̚ ^AB9Ss`N@8[7oϾ;.^Do|OtȦ "l|E`EĨIMbXbeRJ6mQ3a@ *5 V@JT,Zh= ^cSJ2! bJ * Jvq/mlc޵3aN1 ť|y]ϥx|zVR"tLnM:*)1w|.Zm$ŠaYs%wgr|w Kp9~@y971wi-x?X~ٷ|>sx%\>|K =v:Nt>+5RWۉVZsъ V[hI񦇟Ko&Ox|ן!^|iWDhm-xE4r#c 8Vh 0|ФAxTB0( +zH6"A!) <<"=Jq@.<:*bCW9ceH;YiHq 9rCnz>ڔ~Cow3u?rwP-M"'AK/%Drv.ؽ-ROv-e;Σn\~Nt|/ûSgoR 5ҋ毀W]~O<P?sxY?O|iKx779|pkt:NpN2DTz9C,$eT m_VdPafK{<5'`W^dwʱ\@RJ`_،͐ CBBO4ա`DP' mPb% caU.DRSACD}KA%*`CwT\ZrsJD2%OCP$RF.xӄh\zHqU?_&fyۛ,c? 'bg1w8r/!.X9t\ԕ=C;$aXn[³nw]]~ix7XS{? 9|/o?s܏j}-=|C䎧3=#wo?oT/7Kx_Nt:gHoՑ9wMB)G_oYi"[%őR*sQϔۄU[^鱷Ex>>pm=AVj>N*B +NBVA&gWc،iʔ|@Ĉ1ȩ⫈ B`/#-^A5m"!(ΐ2 RihW^XxLyj%i¾V1!H!.򸏸t8.BH&MAl7gPfx*nv9&ŽboԞ;~&O?xXB̏MNs}-=vLIs+W_[>^ᇿ}m? ?`t:N5A%P@\@@T'i=۝cBJAXZ1:]C'ݯ'Og6l_]`*PT'QQWLR&HƔQT1BIIZ72]4^+H[3#'SӱLը ZpZ I"%0SĦ "\J&…psK7{)R9\&SqVюsz[1Jpm&͹7+ iワyy<_χY!Npr"Y?qWnt:NyuC|1bHj+Ҫ5&jq0`Рf'.{;{1$^ys F-Se~M1WCkSJ3J5BE@ a6 a.WJaNOxiyd6Bb#)jmgs5' "󨵐Bdc!>5 bxjS?!^+.Kxzϑ<*DŽ٣3xّH氞˛%rN& E4{U8XKY:/ir0&[#G (0 -@BHM!Vqb! '~[U]so1O2 #B j. dMpn2́CQMdUk!?m:e!b^Z -5Fg=Q7@RA.V-/& *3h@Vk -:RQB)OH# N{.c9q4ϕiϲFbTRZeNwzpcL1Nw5ݙ٤q[nS6;iQV7ScO{98|oAot:N%R/ś_R!, 7H!Pj<ϚAɹcܛ+7k#dELx ^wCxq~KbHh(w{4(9}V\CX:WTR!a^ :Vt6#ΊaWyv'@P#Y`_fnn|f\ NnJ":jwVbAޖCiG@< %?ZFV=E/ܰCt z.t8ޫ'3f'*r؛Ѱh/z:G۞D; TNL?ܲӽNt:N$(SyJu@JjAW!)&"Chڽ`c w~5('Kjulg~j㵸Sz0JzAi{!hKőq Ap2"TTR)1dz7 _SZ~n\oVm4 Rpn*۟<緻zr\?.DkKJeNOt>qvۅGG]GFgg1?'.N.Nt:N5!̑q$| cKA'8/>_IW#>̮41U#XFUT V*ٛhl©*k Up A]'|pd=\GCl- -WmsuDvF<kᡩJ}Ujh lJ#;Kia6 Rd^(ZQK3I!~sJQ%LGdҐX۔fh/FTeʔ Th/xKQ$( Qkt_0$`ZLutj٥ւ(jzUU  !Gx-> IDAT>!ґΥۜi$1zV7o}Jho"Sѹ B"9.P1W_QɹR>c't:N< =p|落s!՝ Š:'81Ҽjg׻ 'WW[@.Ą3[>mG&A"1(^&BɥU**BGV@L R{$B憮"Xk2IcۙD(R)cW&"[6R;FRx$xʰrŋ!C`2njMvYl N#qU\:H tp iэ;VG.k"Iv&0@Dؒ4p.00N*TN~ݚoCk6;ʛ/wVt:Nt:^[`Gu#i 8 M#I#^3CJ쭅`0 xH/e}?"ן>=0cH}f+\j]66bQYq!4UB;/#bibPW0DM02*@ ("+ ϓR@6*{12ڔFL a֏V0c<:ӨKTйCA[7 WA|-v4FL`Bv{,vah;Bvn978qE`\ hкedlelvut:N鼦HX!xGf3#T*+1(V\E(n\a`HkS2$ *ͰHZ̥Q:oy5<(rshf:TJCTWу:VqȱR䎟Y* q<\n wi'=Tܼm_mYhFjvy=.2;Nt:ׂ! 2Ra9j~28JmT8ǓǹXK^׼'lžs>szOn#{!Oq:DM)B"xAQQ͛X;$17*T&xP-- u`Wah uHzl2 nk;UWFt^1Kn1a@qs(h:lQr<}=kڭ /ͱM[([顷m<ܒw"˱t:Nt^VÆjbDN]C\П: '1"u\ﱻy$JFRhN W[~KxbK^-LY@fqe7F<< ( Mve=rKp˸ v!E!txYH=SV]>w{-%xz6?mGXtx]Yv/X+t:Nج¼PR+J[*ϗ+!DT\ ^Hlxrug2O0@#dM1Ys(sAb'wvG.6hl5Y ?`2e?(\_#7iy _M<'.|?\+D$1RD4T(y*;kwwAsEsw<@Q u3&|gˠy,aHP #F>S#Si OyDb0$>6VORCEP<;k!h`*{T JEvOŰt:NyH MLyqoe&,RƀT*\eŬ{<)ka\P!)D" <׀M+X1<9C0Y ST3J!%VfķZ䂦DEGr%4 Iq>5VDj PBLx jsBXen0Jw.1VL@crayt PбKY诶C;jq)쀶"=+. DQ](|tby/t:Nt^+Vb[w}K02[ꝨcBK_@|*0r?AB ˆ`cc*Z@"T4ao3GbȻrX $ biJUVE3T}Bs Ԃ"TxHv *Mj55/M MJiΨC\)",_if'5Τ0{e.q|Q쁝7<[sy886t:Nz+dF]3 M>@-Ǚǘ"%FJ)W.eW]ow{Hqd&y|}hzJkRXk:ĊxsFUUe 8"(Vώ® .-5 #DˆYK搓?WvUHI'X "EAsj((X-,)Ғyclھ`9$ $Wե&%J9uܓ}“S5?# XAe_XKa=nZel`FBVa !iKJjU@/r!ڎfG^$HSm)14`^ә6gx0(hd`Z+cJx5JΥ9VػFF#uĥ's~r=o .ٗztwck&FK=,Y/?Nt:NA>B` u\ 6Dɹ0+פ!(|v[߈a<W~ÄݚA Š )q˼xGBPѨRJ!H@{.I^H2 ?IBzƄJ1xJED`!!"qn)#iDv{DB봔 !BibQVJrBu Y%hkİPUBE$rC<(P ʻěhqT9q1lmԕkrX*Iн)ulrRYf]>wZ ~gmڝNt:NAͩXbd0HũfC=I ҒOMyd|w]udePW ׁzU .`{A/^ a:'KE! lVCrVXFfa SH)Ys6bbS} *VD7C d*̀G '5l^ԤNHaB\x|˲ڜz.~ا>~ P&ۖ1>nځ;.d 0hwV(a@˞j-8G1yBUp'(B]E Z ©H0A1 JuЂ UC4:!!Pz=C`cX Po=`NΤ|6+}Gh㯢M*S#r{̵\q*Yo]9"9V滺Nɴ?G!{P%K7FiRh[MJNt:Ns..%ka] J½=L&ki坼 = {~9S1%e{ijb|IzaFΫnfAlV>W#"Su {ǓI!*2(vM( ~3íz&mr \!E|;au#xaFč8/^b9ODQ!mw´_@Zbpg[<Ĝ ۂء)gcGlq姸{+J{]ouAiꉋx@t;6U̴^}y.a_QOt:N̰}eZmJaV#0{C"x5 :<|qKxgvKclb͘;:Z02(xU:nX16 f3°FE(VHPJe[D_1ʼnCZ1%z9Fk:2*JlЦ,B}qO8I ^LT^H+fyc`՛ZZPQԩZ*a--vq&[#@: 97G]Yk-wzݻUSAg IQkb>\+{p:Y.TkIw ]z59v2t:Nt^;bvU#k6]<•514!y7 ܅/rCy7h-Zfk.brͤ$*֫ `Ĥ8Nmv8|_F&$I "\MDjlBJqa МG5uNEJE uuPz{:g#{(=w'OjF!?;林Y9wׁU$qǃ\Sdzo9|xpbw&Ğ~niq/Nt:NsA AFF |bD*n)arju6i<q:_x{aNřr%fa_2d**s"+&J%[Zajd$h&T`;V҄bKjUUB4 @ֱ ī  B"Hv̩` ա6 :Hz#K) } i2̂lYQ֜7w;wE.bKOĤ8azSMŭٮP4t*TD aw.uzu^[]t:Nt>{TfM$bEF"I8`&hl"xOr|7"OTF.F"B$@)@*Pq*J+D5a'j-쬰x c"BT(t=aLD"u_l-%ɮ@< [G.X 64d!PW-Y2oY È!ȡ֥dýeR˨l]?`ⳭʙZD!a$昫c.U&*si˥I1{,{ ӹK/cҥ=6+TT?鼝Nt:Ng?M1r\YFpJuViTpuưbX)Wp.y۾ yO)Vy FcrGuäFB$Ͱ`cĴx\3JbĀqFLZM1'@@6DC5¶"cl!S'qIMTA|i? CBOz 2QjUkN)F5"z4["ʭ?ӄV9~6SJGD5W=uAk*'nb4,c2edܐKRBk EX=>GcNt:kୢi2JD DLio%o}/5m3K+Wl@ G-(gG]7$Q\T1wZHتf1` +dIz1RjM #ՐD WlN0de~O4) ՄַYDŽyÃ"5;zD!AѠQVT 0FVGSDX=Ow d6n{yuHU&p X]*Um9^MKț~xK-專z$Nt:k@1 xd*؈o|7=8nN<˟^R H yaw dHO;ՆVgwdɲ#Rus(@"z04}nUnf{<"<"5o53+2/uʵZ2¨0&š@y=QhfA1 2w@V %| d`a5< I ԑZq1Av<4Us 6#2 GR H5q֨!.^'aߦ5u 7˘.Y uZnw3 GD{"Y.2}\fo^5gb;Nt:/E5eЀh;ALX~v?%=jo*?P^+~3@3Bd3Qeik~ODќWJma?bmQ+dOGR+zzj"YF!4Om75AV[PBzh41CBR:˺4bMk!Q|0kWc@b)%=VnGE/5F4hq1nmeIrki{xh-x^8[wp=vwu*jIi؞t:NuMh2 &˞hQwo_XPqd +1 őD@uka UFbJH12]<\1RJ8@qcL#&.4 $EBw`X"2%_Fƈhk?1%\\!F$ՈVRJxzs-\v.5~͘@ Di+vf晹V|1U&8r#~?"ݰN믉p;о#LIrًռi'^w2a<~k%%^t^s ;;Nt:$J1VRHԙq8^_??cOTU8nF Ox) )C$HJ!(V*3rfqCU@0N;.N.]$H[MqicbRY N)AQ)A/8PkF'm.89CP\"fצo5sv-g(&Wp#,o=2zgv4w żWA[xWy|MY8tu6\ۜYwB.Vxw:Nt:ߗ8qBC+A'?G"~"XbˑG(Ba)r`q堑" fR% v!Bh'BqA47pl1>MW4>)~64 XV%Ajhx.OR\qZe]'tئZj!C q_Gl" 1ۥ6SUb 1\aq(y[z*Wүɫ5AU}3z#/oޏ{'1Zm?dm{:'.)oގM**p/o6|h{|/{+^nft:Ne6"zZ<' (ńvi|5Rw iǩ~XT)4&TjΜl, +`ZpVjX ihƨTڞbi)s%LqBjAUpӖ[([s6+Q!ূ22 JOa-6[ &r)!:x뿤^RA`KI1FuB2ӷɱg%uݹ A8ں!Y{#r? Աp{J׭ ^zss%~wӽ;Nt:Ηb5rưc#1gh$#|i'D^ȣ=Ӵze)hu`.O+ߟ>(S)$\PWxM|||i4 XET0ƖaZlk:U"wxm?NH5lT*brk8+K0Vr6r(bHP skA@m4ҠZY?UP 4r+sv o%v;g>ϳLyUo}lo.#&7{lKV!wI=.t:NGM0,※`(!|鉟#^3%$"|??#G[Hyy,%$6 Tk #%B5b`%LKQ݀2d\@/ <^Omd Ԡ0O ^xnA?jESl&KSPZ::Fl.4%$UCR\}Ss2X6UtgyVq$gg;E%o?ڝVhncEoӯcͷuv: |H홚C4gt:N%hhbndOJ|߲L啟=J*I8931d+|ɥ#2O;Tl3s к2S0*!2pF]-#c74"TA.ة\MhƈTLڪ^3e#nGcAȠ)@ԁ%cUr:$CuE7:pw{=D瘗o)]7Unw4au-}#Pm?X%pG{5v:Nt:$dB0G_De > ̖/4ܠX1Zh4@doq~z@\8- ^L΅e.Hbq@"5jDBa QQ`'MTXWmF(oƈGiIHdK<@i^+HJ]2A"uYGiUu~zGs/V]0U@c?&>\?:;$溜zxZA"-Mկ&ikj:5pQ?Qy.0;Nt:/AM/z+1V>?}HRw?s+D#Oc*BUg1)_bbIA(T7t  *nbh`9)󂘶}jHh=V+ªsQż)!m,;|23\UA&1琠iI6Q' CK}]R Q"N. 02K^P !dXa(mStu2nk: 5me|\tnuw}y,~{&*o^ 4;FȾ泊]t:NtSUq+S=I_?=o8'cy1ʒYJ!!m)Q6ՊhPGFM)ERqv1eF˜"i<a Rt v UZجF+,T$P9>?a'J j+TRS11P A\(Ab"cH l /#1$,*J?}|}mhPb!FLa,P_g" }LjTiZ݈9͐OU8e\+Cb&FUᄄrEB\ A֎RBB3㴩o+<-"T_{o-@Sݎ㭸;&hu*U.v;oFD.țj{wVn4st:N|V5u)Cjo9~>W+XsFSҺc` DB΅!{d=aR t$A *Lㄌ "W;,U//ӂ\œ NF882$1gն"2EP)"m2!cA\ _*;8{ҨXu+Qq"zN^u ё뾥43w k7;ׄUݺ{{f.6ocyr^:u=iߤ^?.st:N||LQ CS D- RHg?DB5#\*6i8&N!E*V=|4bYmQygDiUՍq}o*a@ދгmpv%opл&ޞqu }@o},XAt:Ntz9Nk% ߝ^O[fTJ]R+Kd 3Ł+SJ :P\R*Tc. ŨgRJN`V(3^+a"||@~CJk 1Ї8x}(!Ak3NJEVG. PKkX@000NaX0+V?K ʭs ZW!gM^}=bVn ٱtp 6r!^cVw\9qk7asAojρB{~qxli&צot:N|L HL6qo /2|uۿ sDꂴ}E >r]ܑB Dvau9Oj$ryH&5j9@kHlfTv.yQчyD GZҫ:f,W!ccD\,O M 3R ƀfx&`<1 8!A Qj10|>M^T{$k_˱&Zl;9پv͈cVvJ q7'\9_oߎ 5|׀ak֠t:N| QFU˿$?!?? K:Ud~e4q"HY0~$" I'~dDŽkFrYȥpZ 1'e"bn.a!%,)byWVnnANSΆ  ୖD- C@m+yf;l#rUƫ&I<2|}pTZ^Qet:N%(Q#ՍIya '[uz`DDx=@ũL:q c 9ֲB M/*M`]3>CPp1QC ²d$ S& {\bhrtJxٱ:*f ڪBrxVCFX(0$8Sqq]xSx"E3ÀGjm]V#Hj0U֜K1svgm\{<#s3{[erZn{yqid ]}X^GdbMVw{Zhɳf5um1Nt:Η@D/_}O_%0<F*U'X۝AǾ.'=UZNZ iLL1B)JDS@jS|)w|)06Z -z d("GrmIQZ:Q1&8Zp\)Āi@J]*: dZȥ(-QFJqk-ojsJ(\D_>nqmnͫfVVNj.|s8n`وE.לV]uX@=t:NcnB\P><|__k^;z8"Yy=SSX,xV]Z@!8Isg")F hP asv;a&c^N,Bg,W\Gx("#őj1`ё1QA :&\JQ{1"(ks}1x'^%ׂ-+F0!:XLԀD 4s+j@h2!xd>DV+^H9Q"0Q{ASjކ%~xG0˸9CP:TGvH55t. yFmZ }5 H"$PiY4!e]-%vBu_ q݈}H{^6Uԣ.*7vn}-8h/a؄dꯉg7, (a|vet:N%QY;1<hد?z$Fe|?1ϟf } u.XT#NGR+.9V'a71>EuT*1FT"x8PGm"ؒ45#Ks\[PCl ͍sA^c/3H'DZh"eչ\Cl2HMĤ "QkEJH,^SQVTkn?~Ӯǖx ?|syTgXowI8k7Ü]N.,ځt:Nt~J RqyOOJ6;JDprYǁ!ET 9m!|1EF~wbRJ pO䜛i}$=蠈  9g\PGi!"K|>[6-B.'XN9fB^]j`Ӂ G T!n Qb @uk"T1]UȚ\zًEOw=p: %N۴]*П5l=W~[r 0tq@owHkNt:N /||ǯ4/o~B\vИ(Vp uc Nef3s>q'Xc<;4Psm~SDxH _9v",T2DELCRR N߽ 4#DGc^H u# Zo𲠥6yNfS*ei5-r4|^ S[KP zjA1wBnI8`QeYP_{>b IDATpfo"\Erg ta6fM=}ue Lz.oAM]nZUiϑ3mV}uu73k1l3{>Met:N%p1ƴ#M|&!v#GڲTˑF. <<@ZVb , d%y %9iHd+Đx 0# `*)!ɡU ӋRFZ]SjIYJf8c!ba$A@2 T46cMbj݈s[xBt F!(Q H+Zb .B *&&MY]KEV:)\2t&oˎYm̫y݈Qis-tE.M=H[{\χgsmu 㪒ϯUmAT*lߤ\?Iw.;Nt:/".qb C淿R` L=bȵpÇDJiZZy68Y( !iqQR²̌ԡC1Vx먌p3$y@ClNEG *IeW\1CvzB4"P*@Bhf0D$ZC H<;|"\v.;Ҫ9VMt#L8#׊T؈{_u6XmU KE,_Gܛ|#8[7egm)Nt:NL=)so>)0=d_22煝VF4$bQs^*:9Ӹc&RpWaE]xYR31@%13a?cBF'࣮Ԍ3ew L@T\̑>$*2& 2F#Xǀ{91?yYEKE\J*՝m0H!0/58xO>A !Z a!=៎d@(8͠ 3"h1Kjz+ UfA#GtL8~,gp{sv?X 2rh wv2ܖ;^)8[w˶d+BU]w0cyJ^˵j{vq+Ϯr\)UߌJȶ3*iA-VNt:N{! !Q]xϔϕ1P9GS@' S㈆RO .P.onJMT WwXla\.'=K2 6,BhӁPhb?5* vrbPuĴ&DGxSO3|\9>SL5F=fN6So)Dȥ*MQTn*l}z&|#L;HLԳsX+PۄW8؍z^RU~+Ulu=K%ڧb;Nt:/$.C),HvqbY2H4GAqBjA3STvi0/efF̎MIB![%陪>gNknCSsEr%ԊMg('|TT,xXI*!4ԝtrRl<55" [0ǣ\HjOJC@j) uxPTcl=ێʫ˨HJ[qɦ:G1}wsiT\;2ԥ7;{=ڸ|"MyRtǻu:Nt:G(BȇGRH2seԕ*F bFbeP樴>N8-G pR||x` 1RKxME8P!ɥ A5Ԝ/pHL0pUT5 1m`yF yE&BCrENҼ 8hR!FWARi xxz@"^(4KWgP׾^jV>(Rhxu$|[tz;~pޟSk-6z{Z9g )wUdwsNt:N'tgZ8|:0`32{f|wzk, _!!2ƈUHCD+`id|\ y! [4bJajĬ&oUA[^˩POG%`!bÈYzQdqV)XTkBl|@?bxdRЇH4#4PO3!AX6|!*$jeaaՀ J)؜@46$zmJkp""%sԯbv~$bϽ]N鯼^'? F]$š]=.ַ.o1>t:Nt:_`ٻ8C1Pu%@đ`#;<9N(ǹn2M c8²^g|ءd*&L!1b5wkKp}T8,;2 m:eZB]{ڲ)H)wkO%bJm2"Tr*{ ʒ0z;~UבN`-Ջh뾦]Ğ.utոnG_w;rr:Ff9[{3Nt:N~DߜX&s=nϨRo[e&m:ҕ!$Ոpb@v;A=c[B@L gg,8qR44R 9FzDQa@U| Rj.P+mm5[(*@5$E?NX4|PEV/zJ` H7.$6'/b*6%Ry5gs^=^]Yf݌kUmm]oس[{~|Tn6p=:'g\v:Nt:_?Hz˯C΅1bV 2RJA0!(ef >PxLxH&fii).0Ɓ#Q<=3%Wajs10st%^0i6HY R2{%.;Nt:/B wGo#k0h5t`LÄyztDDPkeLngGzc^Jn4$PX'Ĵii@"^խS#0DZH)X)>Xš +&‚{LIi@Ia^`*%c90 RڵՊ މȍS$YwXk]Ŧxm;*B]-hZ#mV;'GSO(wOEނĞ=m.G=JOt:Ntֿc^۵P1&m8Eh7RI愺W.ƽ;* dD3t\^^ZoxKN0(kecĂ`낻`/ɕ$I/#P1Hp(Hz IR`b8@L %`9 F @،|[Kn:k[fzR yi6}$Tlw1t 9e>mί;F`xKDY?µd]1G:ARU 'z\>Sޫ{GHQt:Ns?SHB^S2^ xՙa2T 1Fzc—43tvyf4)ŀ,FCkHk& 73k'w;˞rz%gxq wY_ɰs?$Y_vuUtpٳʣқ(v=H~uI0s;j,NClr=T?~8?y?^WNt:Οv+ aLȫI1 $UJ29̨5$ <RTn љibaA.{uQR_WR򊹑LH8غA䮕Pm2;1"U vjjFo6=xtY æFxiz!R%u]HP0Z (UuGi9Q|xd߭7n߅A;!OI1weMRNfϊ<  ,'71pt<=O{LFAkn]ﮤUA\c[Nt:Nq}qinRHqTZ6&+-_1S\f,덷BmPuޯ ) {Q40 mF Pݛ:K*}qW'm\` :;VL0e1&ɆH1e「0D)5.KzSaQݼ C@ O"t?і$۞;Dۣ1Z*Ob<=3C5{+Odz=v7$2^zc\Mr\q-[kEEiM-oG~7u|Z j19t:Nt:>+)FRJ-X0p+Iֲp #*>}ze JL:KޘҌEeb FaXz[x2,+8D^WJP6A.KF^`VaX#9\IjAp xl< acD̅*m'JAQ_2^aAjD܀1WU+uBS{'W#M "DݘfRp[T10U$p&>#/i#>4H}&>Wp'܅!,pT+DĊT !HSiB= ֍C(%*Hs7kI;Nt:Ο0zf7Ur.Ȩdw*UL5g&P0s&4K[{_ߙҌ3bּa;0/|?㿈[-미l+ ^f%r*/e]sBu*FAM[ZV (.xMTKbW`ʲS@U;!&m#Ɪk2Q"TAbs{cg!?8 9&*7A¶=sxmkm]s.6;{&{g&kPU$g}UUld?|Fڅ٤Nt:ΟV ˶,2IbʺryCr͔ZI!gbhlS)F*NUjfGyd[6F ܂-YuXz+ҀF7җ FAL!u`m@ŷJeŐjͨ'c'lm_ V}eL 3P{7@A[E $WjވS@ݨk&H۞[0(T4rϻYs&~nPy2g+=韊Cd=sϦ>4:lwȓ]ޟωX*_ڣp2*ubXt:N3Q1 l",ZNTLU " "Q \G{ÃN yo4Em+E**QM*2CnD9ބO _ %DA>Yj{FHMKÐk&džih[΋5[(|IOi}ClکˆJɕ=ȵUEgo\{G#G*O}-vOl8fKpO{>2%xk=紝A]~Gq|~7t:Nt:7*NT:b?֕u)hu^W$FJ(WްZ4M$4XnK")pc#L59嗙3*7)vۍrl9L @CB3ȶdN{a*5 :D<*#!u#Smsi#VmR+ 8RU5wv O6*QǓ:*8a@c0;>v%XSdGnÁ*>}.{x!\ 6=K/A.Ui#Z쬊8ػ[= Nt:NWxyYJ!ȍ0*sƐ \2*hhVъ j Md^FRqmË\#_^H /EP/~0#zhioD\8T*AY d!QBcIJF+P xsnCPVB U!VBȵEY34&jq1> Lkz?=as|U>˞T)G?'˞vP׎C9ZDqyxNT;ƌ't:NtQch!P)\Hu |qa` BҁNp=@&8!1VE~/!1]3V$u#2PJfHHTYוxDCZ+J`H ML1B.U8]3\"1Cn%EQ:"(JE%B"QLF mXAR6i w#EO꾷x}s=yP~gtyT#TGq޿ԵY6Q꟮FQ[NMzw`>n9DG]Nt:Nɥ"uU_B"r-Ny4-SDkiC"W#psJ5Ƿ+ 1 ߙ¶fJ- 闙06/H1з^V !!6RRZUa $ gTYgW%.eD`qs;VF-m Z%SjZiu-i" IG;+)$THxW)ݚsqGhNs0u){\:z1IJ5_}ڹOpOs1?ĭEPğ>Nt:NGG7g.|l |exjeg Nə8\.3*y$^RIc$TXmϊ pCbڧ&4/*1\hvS 2Pb"֗nM/[=6򉻖N=`4bBM o൉+4A!ښߒI@[16Fic)1 m3QڮZZC=v E³~uz_=DEy,p|otwcȩ丈FLjq/(|:q"ټT{.BVbǩh mSµt:NqA5s\|a͙/+sj%8Dt0/\f1X?VlZXbsZ`[DŽ!`˔e~~_pzcz Jj917Gؐ!A6t-htL 0F:,W(H^!Zk>qZg]! "?y M.OJvoDJ-Pk,+SJTsbH1|8rjO.x@? VKrm8 :myA2ne<$ru*xSg#lO)Qs٬_wJïS }C՛+.1t:Nt([^҅#Ff###Z6̝yb%MZɥb5]0QBeb0̿84Qbn(2NTs|-|3΄ sD( HaPZo ք̂  DƉD(P[&f{hO j\З]6@KltV[G^0$D*)jrxh%!*>*;DчkWgpί纓Sh=hg?C`=,bςq ~߻tX?R͚yn= bwgQy/y$?=:Nt:_A#cDDn4T6ru~,iථ/4*M4N|8Nl Xn,V %J _\ɈJwBI^>zCRjE54ؗh6 a®^kio+\](5gdM7劤1Ŧ]dReŰm%xi͡uv:Nl+h $D=9!]>r>",]9$9ӧ.JJm_Kp;-yL1jn(5Bڧ]&oPޮmuk.eỠҶjB >Nt:N)mR)CmRR!UJP Io+?~3M2YL)Q&r-c[6t[용[a+C´0w] q~!&2:Mօ:%4W*! 5+&< +"`׌ꕠMUHv^^.l4Mw~t)j ! RYK& L)3 bFK+qߓd_Nt:Ο9l7ZDʇR뺐L[abU [=inu~0 5Fjr߾11EʚmC.#>mnA +v]iDK&lN A̰uC%QR93ЌA)a *$!e[oD Xk/tLly! ڮVVۿ Za2CHX5U1A%3Vbxr jIqUgM0~wcu?ާp?ג>F][yN".] 'asÑ}ؙ~"=c+V@@:NODw:Nt:Jp=0_8Pܘ8:ĺnT3n납1Ơe京D*ӿAn{.b֟w1mOlUE{wy #.VN~Ntg?*r Mp."S= -YVv sNt:Ο".bY/a&컔׽Œ^A׉ۺ1ro_^7nJ 㔐- e`fo`ecWJuV$9#?VQi>GncȨq:R|k등J 4W_EЗUW *XA ZuC &Q[ƌ(e#X`"U!D.xNj=Gqy=uEkB$N:Yq$UVELP xj?wETcӥy{J,4|UWLtit:NDM80b"kaЁ8WJuJxTl \o7o/,߮K"ܠ *n(ZJ-":eµ@5&B֭e춴8WGB3 @6-"c hۆJpV5.3yYD1u{ HP Ȟl+S1@q'٬e|%ES꫷ӶS(+ !/~| >jJ 9q~? ?g1rU{$2a=z3c}˞?%=9#x^wnt:N0Han3̱Ս8{?}AY/F;CTO}M[5i@S~ߏCB'z{t:Nt:%pDp *˕Z7TZ(Pւ# mY!"QCVZ ޞ&eJ8d7ʲ4Pڪadǂb׌-gRnIˌ  W6mPk\ Zv D-# Sώ}A1[fNLYl7Z + 1q+q^f$*浙y)C:b[ϻz~#myT|Nr9mEw;ix@9CxO`"ՒW?` ru?.6;Nt:feAQnL:0id+2̘ju6g[3Cdve^Bu1^)J)4L1x'#usA0I.Tw1^mz .ݹt:Nt ̝l a%F&\i:~P@]˅?sqKx$cLV&te' W^WU([ݘ_g|e 캠d _GK9xrT"4*1 `kE@MP[3b@ͨV-.J5CK7:V%W$@) $!ށ),ۊi(}~}϶.#7S DQBnDԶùwRb觔س~tWٓ_iWyPtS4FdN> ='Rj #\v:Nt: T&u%Sl6B":MM3sL):&m\Ayۘ º?``e&~R̘RC 21?6 Lx%ĈaCEgee_/Xv#LþéY3mPJ( I17pksub2oWҐZg.`5LΙd Nоi"s{ꑺz97c wʧgk]t A!=i,VٍD{GsRQU"~.2p?w.;Nt:? uATȶa*ܶŌh"LH {h; )-v^__eY0# IDAT@ @^W֪IUcqsͱj@q'`bkr%!fXm A!:qo2^&1 hM4ţBMF#[^8bQ=ԭm|!>y] D0 :W4Қ "QNy;rs94眶ڢmO6y~GREO<ǾM<|#zQx&{sqx9~ݝSq\|l)Nt:N珳Z&.g#";[2N\df )3SSŨb,o7 'D+FUyQ!T.DȕX*zXfn 䊯E8Nm֦[>dgHhX4qo=I)< !&C‡w*A[)!Br$IeT=@fUuυ/ yOuUenU>{\vV $3#<<#SJ[.n16X$ Cc (Zs QSfxPBݯ}cQvw[pvy/n ާ[MP.5>(q[y|biuP^T҆-v0 `03Sg^z)>cfg~UA1 0iBr9]x}}矦U&%>cOSib=9}>9b߾cy k%~_pڥp" ѧ1Z'$7BvD SAMJMǮဿYL t"n4J#HRsא4Cu9>!Pcׅ9JA?)D$A;HAhSL~ oVɫACOo.Q)z7InU$z(ޮ&vUag6;F/B,PKyR~g>`0 ?h Jŝ`+?.ok+񨔲`%T92CX)Nzi"1@5E+P78eJȓԵ|;Fz:b ^% 8VB+*K X'Lgv1) 54 [h LD˕f4 V*bZnefLu%s8*4EJ43y^VjkYk!J@=EB{i>}"w ő]{~qckN;/p-q[`}.L5l׮Ww% {=L$Et ynu`0 ֶ(^9LfLw /gR8Y#kK飮}Q|DFj+ׅv^g)IS0|M40G9Ԙ,NTxt(3.pZX.Է@&tVN!5ԜIǹ'NJ ͉&\e)%ĭ_C֋wy}y.+ָwI>D/doWSA9 1݊A>Jzcԫvv): V%kD{:Kn>̞+(&;C\`0 v^8ڑR Q&ZuN&7%*,y&<PbdyD9/RC=p ]D8LajSdz )QEx@SOIz"v)RZ0]K&%D;)B'Eqk}߰ԭ}NJo)Jh㶯)+kz7Sl6@P ˏ87+ͮʧb&,y|P쟴db\h_MjDl[>^"w}[oo`0 ?O) Հsi I9D.D^9otyzXOpj吞7R36+DŊ4i#-NhRWT3oL})R T/MFTF|V$)rwf"KwZ2Cd/uFBDu'RD8H>-ݹ)]յ$Pk4GD4BB!.hpDQ1Z^]tuI}|M[kOr^]-yʃB I?J|- 4kgs"zk zfa >'t]/8Џ)8] Lsh}XDYkCPkdFʼnQIO u%iꨆ^c6Q.,`M"R]?Kl}U~Y>P2yTh_8>U|NM玲f~M5kFwݖ ٵu\`0 8S.hrx\{⥋zF<&&pfMuʺRrĀiw,7j)DHhׂTǖ׈>|]GEÌQBl|,C__hglPmR![oq4Rs:G&F QIzUKk J6}c6ӫRvvX~>݅~׉-!|*ʺk׶}&fBnc<+}5li!GE?6ݭEF`0 `gм!!#1P|6xJbB_?h ˙4/Ռ? o(/3_3$a2D-6;|a_To,3\kFD/d]ȹ3f4 6\+b0};RCM¶bT[wR+u+9V4Z#ZSOՠhf=بVJ[ϽVҫ:VwywywWn\쪸㶽Cm:4?rە-H>"w}8n}bz9s?߼OM1C8~{,`0 `0'0bL4DzbTqu)Ul?gOxqZ^;wрs_!/h]:!I(!N )؝ѵJwQ-g<SMtrǙk !(*c&\ZIIԜBde91"]'~*.EZ%rs7Q|C9*(ڎZާދV^SfSz7YI[G `0 2AF%Ji+o QϜ˙VZ3K^aogJE`QAiЬA^z4ŋO u𢄯ufDY2-/=L֧WOb9&x=tDB[ iAF[ >l+nFޅ[k^.\Y[ASqӄ>%5Ok Qi@z'En;iW)N\?%'}Aw/J@D8]yr~>N&類v7o>6kWlujv0 `0wo rWhfd>qHj~_3g{9]ϖ&EU\GP Z6CV%Pw?ݝꕠB0:BF衯^meCx{mqcӾ1Ey/՛hn2jCv?Ep~~/;|c a\`0  K?|AW3ڜrBDi1NBZ $>ԕ|&6￶#׫+د˱z9 `09DQjsj[BBDtfy9w )D,zy-XD!yo=g]3 Y_/*'⤔R8L3ޠ]2ebԷ#n V 0[M")#3nҖ7vBPb@Rf̸nu!VЧU*&}4Hg1uKRZq`)~;eC@U}yw.$;X}W䳽Kon{Rw)H+;cm;?x_۽8v0 `0X7* TШAO^73dX녷ZOr!H@B߇|yyq y] Su; )p+9Dx OGVԥrc~@+t Ere񊴮5|mQ}Xzh^3T6 V {10{+s˲0O3N1kR k1af{m Z2mi}!rhspʵSQ7R[nF>`D(~ݼ26wV۱}YUp ,C{̶Vŷ]x4m?woEȼd{l0 `0xUD8po瘞Y[䉵oQZ%&̿|S|+ߨ([LJ&0ZJ,ebLփw̌Q'<5OD#bJSOv%)Y+<`:ox(0 V >CK|8R[f?}j+RJ ^gPyCPdWۆw>f.Fֆo";}VEplVQMTv^m_P>|#5}:.Cܧ_^3rڴ޺=5 >`0 D ǵ!:Q2-ΗAs=4~N?D3k$ T5O;˚9r i:b ~R@4E 't>̰IO3FL \!E"B'RnsB_f1ւhO h)Ѽ5'/ dYS/+2jW#UPT{ze=1FV9I!RqΰL_f̜vYP[#g4jhC{cZk>jEB@C@B jZKްVabL! AS"Rjs\'qH+;k 0kwT5?u'~':?py[%V7h׽Ny  #օޅ)k `0 ͈Y9a̜y[OGg}ᢕR7O0i@.ƲOH/GZ6 ӅeL|YXtt4 hP=b!+6 T\Tx΅p9Ց,q QΗhZ{Yo\JA"4Ch4v mbu֌vobЅJWxsG+CI!=XgMn"r<^]Ga:z?F]qrA ~V^8,"϶(3CKɮow`0 & Ua IDAT4ĄBR+* ;&$Օ)|PqJnLiVxL$ZYHS S" RD`9cX.u VQK);nS wWg\[ʤ{Tqj3"UIaꁣ*nKp.y%V1V97a,w4[zfzswUb NNYS{]6˃|(`]{v`>\-G?݂(l:O `0 ^dDn}a7'|&T!c7AdBOj&~=Gv:ѼYdP{^BOX?nm/u}9vwoL>|N`0 cJ֌Y" Dwh!2աYc-oSVocbx4e-VxL[.+)FZT83ylK@@t:V2#F#5JcZlۦ)!V iL+UAcD{mkϯ4EąTLTTx!Fez_o$rey+oLiV =ܧOD Ka {{TO+{S`OCl"{KuX)|~\`0 +_xpRi8׀zKɘ#+ϔZ_˿2k@$zekhu'539?!!bo^Z] ueHCfA|˵Qe-0uf*R)1PJfN^+!B+kp {8QD(%Sܙ xz8ىw~+oZf+sd>lﰪP`Byn␏; W;DwUq<>AñqϷ]vojnQ~f@O;]".fw{`0 K^X[!]L\|%j(*S[4"4 sTNkOͿSm?fS4뻍!AT1<-49Ubee?͡aDÚ' ˆ%C>B QT9p|>tk@^ WsYI6e s[x^L5Nm!h(RU8I-8P@Wϯh "nԛHڦkTs9!(rY|&}"hOs;+w m0{]NQ`um~'&oZKݬԃ`0 ObmkԨ4f1DJksYŅ_z浜@ ?&tby;¬7X. dR: j3/Oĩ[UӔHxjf"14.Z=D߂9&i:")F] *Z6ʺa_[ɞr‚D 1P1V-|eF.EъsLJ}^L ns?Vo*nNRZVMC|/@E r@DۯTpzT4]`0 .J!p~f@J ƿ{ +#+z񽮜lbIvvd/hN\h%#BrEH/Kw(E@9- 9>+lRcdc쉭S|< AHƈ1RK(RJFΕyAqyuyo_/11 u%!5&Vn\Z&." G{Abii~/䓴V}}uV~x|>Zp]*cFnoW \qL;b~lF`0 `g%rx%xbr"+ouaubf֋z^K|V^}99R8hXiri:[  Q`Qx;S֕(B2EE3rx3r-_g4FZ)x%ňP5EeYx~*\8)E{%Dޓik&LK>SX^k>Qq/L8-'&AFVRP F΅Y:Mބ.Xc療*7\?N5V"@nnaO9 &>vV7/[qsJԵ`YdkHFߗo|[^9yZ#I2{ƌnj.|{IXR&˛:?;^Bm6vfU'&y6[U{S]CnEC}>T]p hu YU`('z=ZG%`0 ?A\FB5pbLDVs̚@7U 'ܝ3R8 H!*yέk o0Jԣhwi&C3QcJe:XRB4cy9ivMԌTuhjB_ݫ@{8Ω[uA ZFqYN.&K,5C֮wt,*Ńެ;,|v0ub%ǩ_{kRÁnBP?ɮ|֫ɾ*w8Ux}P&Ag¤Hy8!py]91}9FʥO)^rDbbO /|" ڈ)'%fZkX<%\ Z+6w[=K]YoOssn+.hCqδ#Js0k *b{@l`d?߇t'MWlʣ0Qwnm QGmb6y/>>Tiwbs[>d7K\ s'\%HM^e\`0 ()"T ,Ay R2}AC$Fa3V˘l7 30d:f4w9S"αO ;3cJ;:+ O+4p<"QlyCc?kH3@v掉S1!f !+JͅTZ%۹-m-Yoc}[Yx3K8R!LR 1^&jU嘦sz'۶_O)=&b.\Qߺ)oc=w}M>`?>.NJO8 } k&N:+Mﵘ`0 7-r E܈Aq_iX4qi G}XJIAȾ82M j$MTJC2?YFÉSՆՆS38~}BX.]TGkFE(颀Q 8ig$ .L ǧ#b`$ YmY/qi[~xNj+XkAL8{#843^} -^۽cñM+-睔C1>Eϣ*q)*S{3N`0 ?QF 欭rD$*yl)ӁR3)&K+72kTwR ThšZr9Zp8T{`F<(ѕZtS{FtV >u U.4O4k8P݈), B ! qRN̩ӯ| WÌ>4pD\J0nz&yֶiCF]Csq;ɧ;C~,cgBy}MªaF?+tT>ퟺ8߲`0 v0{9NT@]hҬn}bU᠑V͌f.?AŨ\PHTRJZi cqJ#D] >lN˅4E$ ػ/ CܱfPkbx/GD3kY$04*1(*[=/okY֬ ԭmХ)P2HByPp$ J]mʝ=oUusvi= V­[nwn@1vMNoV.ίa`!i0 `09S\u¤;gLwڳaD)Nj,'VV *NJ@8tF{O3˂eݚH,OU]ݳ2ʈlLM%3Iqqw3S`>A GO[YEHyAUi L Y1&^lp!IDMb f-}5ɱaW>[y3RJCh',|u9R&:#AeUئis$Q* bqُJ5y%RDUo?z~KaGOUo:*Bm|PV8J nsgTڸh J mug ]oKga3Dcf$kKuEj:)VRAr^&tPT p8YydfFFBmά(t&mzu9S9heb`8ׅrdbSCs{LA` ېkB2cx;<~cvAt#qw?B{qoɬ7~tGm-U^:"Waz@bUH_ξst:N*r1$#V)O̶+㠜JfCNqDQED@[0nQͨOO; ܂z21^ǽkSN,u—d X%^I^!Us[Gv8PuthZĤJDe"[C^7k 赮#zߋXn#Nk[Qy/6 ص L[n5UT޺>ogVNt:NLjˁS]cq D*bNBl nV aL) J 1qq>O;PJՌ*F9#e)xP J&00Fg˜ 6aIR+i3 )Ʉ !*eY8d+rzK>vzu6!R8-sK:hRJ19Lfe+\' R£Ź|/<(?r,? T܏H`^s ^D`&ݾ7yq9,?^6oB>}t:Nt:{,^5.,uf`SKBƩWr]M,0ʖH1|&%+AHT-bϔZ؍|)̇JP <rvfYfXjKv]øߵVrMm($^2g wc9Ly&y|:r</74(g[YJAW-b%gL* rfvc܎xmF)14\O'2l7H,g#}WpVrȻcÂGP.̷3W/9*p}|W֦|$z>">:b;Nt:B0圧5pfL\0Q^W &y9|$%*_)9>1 0s8.nbe^VcRZ*1FiS&HH΅ϔ`,eŘ&25Y+K%υH[2p::ge߿¿~Wz`!Dg-S*<DS, U*q:D 1 wBԂVӄX+_ٻ|KvQurSp߽/>oE_[0ͼ*NoAF*؏t:Nt~rfЁR B)fD0T()XQ_y `0aJX8*Ӊa!0,#2~MLÈHir<!EyZǯGd#0TN_lRi:Q_8Qy)mjU"J`# (VVZՖV7PBLM *۞g֞QqA2"W4g}rc]ICQDy|=&`?r/羯C|hu W;* ~$Ebd/r6[-*Nt:NPQ":3h K )fZؤL.᠁f^ 3c3K0Q~gD\ y“ Nս)w$02- *E:<}{L`" )a0J]Xز 3^C9?^ʯcMdL 4Mb]RZ]b(9,NLJq)^dcBGc| m#} 7;7q_&/}6|W[ilCv﹯8 *FxcMU$Nt:Ώ!RnT07RHsYǡSTvaQbdmU$4RJ%j`+bmtFvP!kƬ\.UaɅ6j iHC$l\+RhjW#hd×2rl S9_ߨȥ Dk+j %A sfD!RHQYB@ltp163&.Gb?Y=ay;I/wՒ* `# ](7"{cǏB|>:JK}:^OewzNt:Nh}0mw !6Skτ4IqTbbCd.) ήL 7\"RjNGa Ā#/|^jZ IDAT4&9ca0#OO׿}%myY0/+(S: SYW-/Lu&{%|90v'K%b TdžV'2[F|sod ._n[)et:N#%rgБbXŪH7+2+ZL gjtdY؍k/_9ԅHÈkfVKΨ4c`$N'̤HxnT#2/xqJ.LӉ`=g cZCJ?+ۘ^dDΜ$4%=Vgve#cKe6O;f%bP<??s$!IagbPN 3\I8lonƗa>qHUCS7[8יtfLᖢKۣT 9uN"D\88(p.WoA8̧'<QD'?."p~|LL5sgL Q8,g”[OHg9Ϥ172N \FyFEH!n(݆ t´` Ȟyg"ň!!AQVR.sF X3BPT3a12MYax4J(ȻNEXM з"v{r]U{}U ˵\۷TZw@> "mլM0pؗ}pTh%t:ND0!RT03A@B̂P&f6K .m6I;'Mxv%#Rq3cPeax$y32#ŝӷ&T2/_/.6)rp"| Vǃ2tA\R(3 bM?ET9e)!TYmRٌ!q 'Bj'}ފٵ&7*;& woa>₋?L< P`=<$^iDn^{ڵ幊כ(CyndC9Epkkh grw~LNt:Ώ`y>-CH1uPQm|B _ P Z@8nQ d?g9}""L #.` 炉qV287RԔ V3 %Sk!ƈ!ϻ]4cD0h([r&b*82eLʔgIc 8L'\!S6Yj%hBØj!) 5p3\ R3l#Sbs`ؼy0Mˉ, 58zVz@oBk{TAXv,+Kypw@;1`+?U G3(Ub4m,mnooco|%4l\{NHޝքV؏^^$^Fc/c_ޏޤzuM]6jw"2|Hlt:NaH*AǬh=۠L^wڿ] Ll '٠x1D{5ya; s^,(rO/酥& K^a`_lr0ՂK3+e9ↆXkY-t3n8$aXi0Z$VCEV@R )F&B8O͔ mu@M Ȱ=R<,KAŠb0ݔaۿU(ssݝC9Յ)όVRjd+u&FEb$*Q"Nhx5ς*Ӊq3clɰC4x(KΈ%y>cV(`*,b> a<4Ɖ1`N݄mg` ٚ.y xh|+$nlUqYb qH*o0+`Z/ݨ_y; t:Nt:?D\F>0"-'u9w(vjFwHMc¼g*ΌiJ 3Oy9b[dPUXj/g^[)im/< *a:Fa)ML(A.ieB5f (R͐c)Ϡtfz^J&F1it`31 TP'btV5G ;TާM*>J]Qn=qV&t~p|_"ܧ]/[AVka{ Mޤ5?ک|'P?؟.pd8JKk|R(?Nt:NK P-(.'RZƁ"ՍTa;,6}<HCdE2H79ï|GDsYPU8-$Xg,b lZ-JxW+C{WSXC(l,V[ejәLɦhSB8U,T}bgv É0!R-S Y+E.IWq@Ν<|x݄mlvX?yАՙ\tj>"TGuŬ]+Nn`*s=KlnM]BBn)SNt:"{Si&DL*N1!%%[>O[ffB 'l381/3a _z|v>r!%NuW[)OeOeuP!VUV lF Χ5H  Velmpd7*c"V4DSdl'>ʺeAY%LR۹U<]i.:w;?{Qv}= (C{뇔]m'jO*J]}ɥ%sEdM46RQ-{gVnŶu8W{et:NCPrf/#*ih(ŽP=PHB#5ZI(〨a^iMj$q>(n53Y&!)TTfNi%Ār:Rj!Er~$ſ2L6+Bn32/% MCQә0 M/eZa̜'݆&Sf.Gt֊Uci!a5IHmeK1(?n" YP5V.:n(G֛\XErO{#-bN^N3{9뻉i!4's;Nt:`bXH!034c CQzd7mw,'RP c340dAJ6:(b8 J-ZڜLRS$BDYrS5Ԝ.OlJ?y\ѱPpMd3)Eܽu\ƈ{V#*Z5ԝB#z'@5 yw^ġ}(Sv8?\m3냐|˥gҽ1+{={H{V.Qd6$Ynt:NAxP 185bVTVSiu #Z3g Nt:½"g-,5s\N :`ڄ`L\!r^XjfG0yVL9}e:2B4OmΡZ%qL,Yj`hR TA༜Ps8NuC :Èڄf00[!KTT%WC&,UZ+u:Z83̰|\H8,4a m[K*(JɄ.b$;z*Y@BMƣZ=uV-^\FdoζWAV~q+/FgB@oDp-[YUp[nމѮ-;Nt:"L+GrL,G6alٳJj(|yؑ}aLvaiܰbyΜK|Ģ()Tb Z6"ᵍ)DNy&V/Ƹ@A"qP"dyndPeZf4h 0Bʘ s.D Ty~NFDO0hݖUCL(VOr:#DHj.#k?7G/9ƻǴ㩄W̃Cy//B Uk;G:rwAN`ZEDwNt:!J04(I-N؆u~e7@4RR[L"?-E&2$x_OTwE9@5cG5cTg<Q 21ւ06L%Sjzeٲ䌹s^P {rT7Nә%5ܴB˙isY.6`I>}09s*sYMsbcKU"TDRqԜ9.ɱ W*W}Fru/SL.a=܎v6{}T]]5.0z"v5>TZ- \?Ga-{t:Nt:{d[=N#Z J^6Lufl !8xu'f <#8an.Eȯ/+/mAfZ81-,(N  ʹZdaPĉ/R)n {uPDLGr- 1"CIeݶHRZ l@ 8x, ;0nOOFi\aN=R^6&W,Q~w'Ձ>>vx[ CɣGxG6F{\ZLOZC Nt:N%\f81 x(xd3&M-TR| Ϝ?[e t4pȱ,T AI[L3A۰2e-FCB^c)5#\0bfd澦XĜԥRͯ+cq"+,ezK7Y&?1&>}^Xl&#֮Ლ"Dljuq4&o1.=~*ȴ)NI@tVڟ /bE5ʛ̛X><屖V]]9;yU#w")F'{Zlt:NcPxCAi.$[&ad"Z!(9!fd9O-_' DaBh;1]i"ӋlAsb~uqgJD ,9a͉1Dt& k-c^#(eJ. Si!GgpF*V5R}F5SNeriYdNcQ| RVꃛwUT~+PE:I5 I6NʝwrcM[w&Vk[y8*{qǦpIEet:NJ`JV?b8#De##zd'tD@[DЦe/ 10 ?}{ &J(Bv&B' MY*5v22 JY &*/uCv81 Z*#9Tl\bƐR{5㥢A5e ,>c_Sa9L&D8lB5Ul )Mkɵ"r{ !`}tsq.D]-"$- IDAT.3҂^j> ɿWerq^s? {÷P}>EP'4U UܹbrIMEw:Nt:,xuuId/Mdjh3L`M`PRJKiYį׿߾;2(),Z8*缰o)ZH10JfAnJL%,u\،#1Ffd9/锔"^qk cukԩ8n& Rgx>v+ga.,@{0Qkތ!vpjjNrM<3ޏ{ .#X}zw'ZWe Jma9*=pu#iQ:v~G<^fضw"0p jUTk~۵վx*PNt:NG D١SAhY'Cd)J! aka@"9g6-)9i/3'PTmPf88l9*FL n c7%Tr-lӀRdۛҦ( v mf|>SBi0QH&F;:t:NtqZ=SiN^'I@q33JDAYN5dl*/v9&%^OL"N)1BY Gdж)@*$2bt¬RBm1#~])aPlzg /8\ Vn I?qgHBg)&Zڊь.Ɩ\H("a^xݎj"+U=*5"9L\nww6{y?:z~މl]˝޸>v:Nt:r\"Mlb&kihuBZZeTHr|o#Ǻp3cͦњT&QqRHo㪸nXJ\*Aj4(tnSUT6RƄcEB`G۴tNOnTϤ+8~fS'>Tq\:\DšjUZЦYKk:1*²4w wBn ʝ}+,>^]Nqfw=>I{t/B~w;S.Vr˜{}"o)n1AroKڵt:Nt:C"5(nB=p(gJobD4(aݰiDc嵞bY~ļ90O'<e4)lRr,._8O8`n-6FۈvAT L3PD A Q`Ȗq/t+]`?Ml'ҸVL(1"Z "ug1QQU5w:k޻,G$YYDTwGUuojhYL5uff*"̳`Q{Y鵓C`U5_{Ǡ+8\?}*<sn?.U(|=s_+ 'cJzEt"@zj>E:B@d2L&gS4]]w$eI M*/9whrp(*Cy+)*o;g,ER$3C _2ed!*Qr61^^^H dQϧR@m}ɔsX9L%S{L#:]*/_/_o,3f5qܑ5(I`1keHMuC5.#B ]K>mtsa6 rxI}d{kJl:]L7#r]^D׻׳Hbu2L&d2$ıwBs$9)F.y3YNМib|7,?DY%cVѢCsmCGq-ppZ;ӽB-t3]%aYSmCk,na bpXU38 e}0^V3"4Otkj㪣cT3։qӚQJih{Q"c=ebqgcC`E4>>V_@NrGQ8~t/7 QTss!@d2L&d2)tw~F.FHU4u-敳n i#o\XSTp$חr%^͔0u]Pc$WqK1ܝeYUC[}̺mI#;+;)gjoGKoOz|-WO/'LΘ6E=:.B5VQ|;NBΙ;捜*9GdJJ[8G9'ػ) n2HG{!Y'涚dεbH:!F_}\kٯoԐ}̼=QE,~ ޽-'d2L&;]FMҼR5ըH«dM;[?D{}FK&o,i@΢|?䄹a",YYJ%c ocѱ@cYD;j!45C"vS5Z디)ŔK8IphP"dh5~-|MHkԐnd(G`J^ f6dT.)cZiTxc. J)7a?w&^П1+G'{٩C9װ[3y'n/yd2L&'hh|⊩FK^xg6\R4?%e^»#ԧ# &d8òD`\BFOa#uAS ^u#a '\Md̜s֩^A;! et(E9;  -1GCX^kRy-tYe|LT>w(BV%Jtkh21**seT:"PJNYryΗ+ko]y}1jz^GNB0܅R (\nzbe]LU~XhObd%T}}{gAxvNVA8v{` i(wDBm$]qάd2L&䧡Х]iLNL{## hf$Q̍vBd@!:,Oۉa Qp\AB@"YXq\{q8 E8JC^p@75Gizb⭃y+mv"Z'\"؋2ބK?>ȷ6pʑqT4w2L&d2d-z}нC{PII,+= EuYA@chrU\`ə$̢QzǼuY E_dN7LSrۚ;XN{QR Ee0sPUD9+gkpίD6ED.ԑ0HD:eu:p-34k{cGn7q(Sz=%U~rߏ|tn&nh1E^Wԗ<#Gy/v)ײ_3QzyLHjIod2L&'afT3DF67)(;Fw7L`8[VXS{'BK)t%w魑m2Hjkmcۢr$IJdέENZ m{ѣ 7jPC;ҭSJZ*?^Iˆj}{C$sC 6Uڢ>-VSڑ8]{S !~*?.gMPAwbNcy:HQsA=֮h 0}L&d2L&2+ޣcwH|%Y_ˑp:*?\%gNw555,Gj"I"Iu\/Z1"0W\@׼q:؃<wDڭ+ޡW߅o#:1gIuHYXJTr(&jKjJ1YJ!B6'g?%E֞w܊τح86O A.9>#ۮǽ{->JBdv&,V@紻IP{MnsX"nd2L&dXR1rYI"4%*!+?(nу@>`}$"oĺR8,lԝT : c )%kEYs7C˲kSXV76:Kɜ8͉qwz/-gqs4LT8r֊Ї(6Qӽcٍ\27RʗA)9yY\ʟ|?v2Iwѹޯg>e!0FGU9'F/~x׳=>g_avNxfU$d2L&A %8(9e\*Wl(nR8º,itJ6I;UWҨ[ܬE9w[cID UrN9gJJJYP")1Qʙ/t^)l6)@>x;!\Nq1uhhts^RY"ƺPvMLdڣ+"<FnqQOOBzew&שKù.}DLL0?^~KyI/՗<IJ M>d2L&OҖ9snrJyl;՜a!!DY<$ q>&;;/k أZCEnE 9)$%XK=?UDR2)gJXUBkm'0twDUW # -c O=jFRBqN)Yʱ?صzo$1pgBQ_w"NCh nF^ȏb5.ǺBގ~|E`CMɍ؍#S?>qT%Ɓw(޻q]Qj"~g.䣘]MtwzS;OOq%c nmm2A]>VpJ?w.~'d2L&2gkT ƛu+$ rƺJN0sۉJ,H$G5HN  FIa|ƪΗ{㱻&h麪yktI:8IEIwE;H9!j8Yޢ$tkQ%if n`cGOI]A)|H[?|R~vTގg>8z".adeջ ZL&d2L& FI'tkFMJ%iɇ%uE"Y"$+.䢘5~&'ʺT`Kv⽞Fmm6vpNEpDc81 Ǟ'kY0ލW֗NZ:PtaIZŸ1ٽ6s0jaL ]nԞQ5ɳ 5cŘ@ׇca?.>`!ShA_n׺ 똮~t)'d2L&6j,I.7ot5otwr7ʪK,iM3A%#B3VrR=*UbTrk9Dk)#jk0&e 뺰mgT#Hbp*eh ;oGᥑ3zEeE5uæp)UcsWDq4EeZ8pWhfw[z ]z;6(6o=>~OO}xH`ȥ$ \LCO7xM״̄Dd2L&gIi> #qpWM//G9©7LM\刉!)1 %J*DXs5r\;dso_^YBBȥmNJ;}'.?)v]&qn_k߬?sg/+Ϝ>d2L&d|yӽSD(Z,Hj,%qY14uA`jM5tؼ[@Y%)iMXM֍2IDGĚR]y;Q^)K& 3!˗Η*Zΐ;9ŎCW8ᚚۥr- *죜O`NJw)ĺe\2E؏>"Oڣ{&>܈Q<癓z}C>|t8￞{&?Qd2L&_itR294ad8^țS3)  I,ZiGIJƺKtidҬPȚHv$ =`ԖNԭBݶؗDX_(BK`qnTbo۶cuζm $]F[{ uS1X!F9_j[fC[u,v13n#gw(}ou#QcO/e,2V_oOwDr'd2L&ɿěcW:^YD֍ "Н?;3),)s1b0+Zբ!e# U4iZs!jsfYN%Hs%:6*y)Sx'أLi4 )1:ʎb5ZJ:xaGknC3a Grw0wtU⟊#bNCy{|^{kcE.E/޽).'d2L&B7D) 4R^b!)?<}w|XxLL&d2L~3,C\ed///|'$.нKإl"*4#'^KEI*V/Z T*6뺒$>U;wuak\ vb2 Zo2r4{GJ>:7_.ߛEaE5&/dL:hb86v+R/~&>} Rn?u?;߽P&{ACBߝi;"z=S!xD\/|d4L&d2LR! 2Ba9174^Juc]`V,eЭ:A((뙔 p'k{YwZE4H)qYw0a5c2]j<~]ñ -Qǯۻv~,xuBc-8`܉M$x7}| ]Oz;5nO L&d2L&?S?yvFJc",*,Ģ!>Rn5Z?sx-S=0ő֞puwkE8Q}ΡRɸaGHNFJ2DކH'ep_3M6473f*뾏WMkUBqw:sL䱻=p7v1wt8#Nht>k*:{(>z+wC~= wpCxͿ&d2L&S8uYJRx\8FNe͜9^i;ǞfN,K: -!7'PRr`M6ġعNI͝.,KhúP!Ft]^37 K%Aԩck,=:;#L3"ܧ[ZꉎVew4Y8(RX9D:(rUbVؙz(Q[A0 YGSJĵ˥Ve_LtN&d2L&wM ]y}y9.eHQJQZk5ٌKK7U>vbѡZqֲp6rcTHI8 a=aYRΤYDQD֎f\,ѐ\ꉔ"iKIqWTKIoZ72|/ktSa#:zk%Jv2L&d2 H8e]XBZbdx\HY֨ݨV`Ʌ9cx=,lZ/ˁ#USDѤ BDB~,C$JI,$tqpqIUj;.PΘ786ʋaF.p=KpJUaYlcR̄rT zr Qu&cPGmjdԺQJsyQ{OEnlzTdU0nQs@Nsc}9Ьrx-~1YnchÕTW=Ft!={ zӣ{:ռZWW(ݑOS"6"wRgHhOwqy+0o5(Q:Gf_u2L&d2,Qq*HQ˂HB R*GHJ4X=[GU)Y)9NdJ"ƯKY07ۓ*nFo? IPd.zT}7|B; YN"((&07лF)Zج{1޲IYqUR;}譝{RO`kΣ?6FF?K$)S*K1z}UnD#sDw2Sc'd2L&f z|$SUʒw,:c;RCqk#/ szmu(J!<:3uܶpkl$v6.Z.n{CtCT;1ju$:V,|"B,CU`|6w73{L*;:2y`(^oRfz{W_8V<*ƜL&d2L~BV)9Lm MBI ,v(Ͻ"#"t:tbu)K4vR.y1JF^ utHzwexJ s3)%esF=Wν뷯%H`^J\B$;bk !nyRp@u]˜,z;%mܠm$zEwQOǞa=p0Nƭ $S:'O_=bN&d2L&?f^rHPRFh8hsCx{b͙&Nx{'i"- &~:t`NiBR$)⎵"(BkE qf,u/_N,Ģ1n!SJZ7D BJ:ceY8ϴEΞ!SօfD더"6HcB7k~1[x4|9|YWy/4g}ژ;\q׽~D?K}5q܅g/V|)K)wTQܹL&d2L~1 fRR֜ RbgN^q3Mz,ڢr+[Ikf;!'(cRBiI/NFÁJm-BYemw*9+}8[)Wm)Qr :ns,v1])}蔔I), )8ant3,??s#yq5ސ=Wtq:zg@uf Qv7nyܔM&d2L&[ q1QFQU4X)Y͋yS3K$vqԄ%Ǹ"17Ic_QDќ%5HM CjvBUHK=z&]"ez:p$cMtTUuYDQ !imo}M#*璱},{!DϹrO_]%ߋ}rl\m_sDL:W-y{Z>4L&d2LSrAS⸬hR2G]N΅CƽGX3#"{&h}K^)ץ 6{FkLJV+"B'w^^eõt|3a0ZPӘ;: F[ݣ"\phRDm 'qݽ7%_FrCDe}??'r/óQՑXUسG(7]/?~?}w?&V_C}Or2L&d2hl=='0b1͉q WeIHJ^XDёc֭7Ҩ]feTy\*汻Ͻ"px=b') C!%g)Yt ˔fNj+tX; `#GG7`"Xo<,KaY Hw&\~Vswy=J?w񏻏kx1O#OV\S\N&d2L&?òPS&"ѹh֨u#8AJD%Ѷ3];%%뺢kD0Z+K){R Ρjp ɥOR,v&SRvNo69"@7X4;]X1yifH)>F`~ 7QWgn=k>ȼ'TV>域KM}y }tk}Z>'O$]V"wN&d2L&? 伾hҺr:J54 ]%6u(b3%彞))j9%j x"-HEc} rʽMLl=+޻wqSC?eVFP_>K>IO d2L&$/ Ojb*xkAR\Q>*+ڌrDCJA?InKuZˁZ+IR:e]Xr[p=&kx}=bQ}#^i#uW;}P;":Uf6UBQUU%cևx͘GbQpL[>g"[wIp}~=un({Aw+?yz}$grɘ|ZC"Ԗd2L&Ohq]ض3NIUR_W4(fm1*(N9DoETurIlFڪzt@-DD'v.!/3NٴnAmɸֽRFEJۃ}3P͡L$jHTGWzBh !$0VH>ylV>>?Gq!&@V<^l~tQߗgfd2L&d3eHW!W־iL^ɡJÝDR%۩i=\q[n,k"KTwDkhZKLaeF)eL.%rHY%SKCu`Л8ByFmh 1ZN-ԏ*Xǩ BYA/ݗ{Mh!r#iZ;C)Kq({&N}۪Gsk &E"Nw<߉<ܣGRfE_ՏnvO?L&d2wqJNZ10ׯ/vFs8{BgYKcP[(\vL GHw8jd9Oen䬘;&ιS#/;p4 R#6vFwPkA*XgIsEѫ}(mXpPϓZ?Kƽğ>VܼKpMB@d2L&ǒI)~}')D )[cə pĬSPr)@c)z|R ˲zG鄊p<gsɘ;˺r>) a5N~I WQE)F Az֔#XIeICP:ŐpwmUiwB)%go5g,IZFfJb-Gg7?b|z;8>{yޯrƧ&+;"1(w{/׳ QO&d2L&"9F;Q\"h&[RXCţjdAL1=y6N9T9ػ8l6XJFZ26R͝Q cF덡k/u2ZGUh=*Dbܵ034Ec'4HJ&G$:0S iA%_R7Gs{pa5Z|A֭ػuʏٓYP?%>h;]8ώ-#?{oG#idgqgKp{Dd&.[?4gosiiiiiiiiii/H*C h$:E#crs/scf}rT[)5FVR"ݣC]UNvw|Y)׮.{ccg( U-\ZZZZZZZZZ.*XqֱH vui[)1>mn03nuKJM;{k{7F9Jm?S:Z+>??s7Ȧm ;w03z V ǖm6UڐL\F0ej˼-EpZHܳm5A@`{<6z|AW cjv@g{Fr~L}vohu)~DΏ;gsrqw<_3l00YwP6gd>\ABVr:tG 7 =jDTUQJaG59m"DVBۖ1^}˔Ss"9w֢:,bԺAQk0d8'0Q?FO$9n"Ю H0-EDa <{ВF p-7C-|NnG3eQ{▁ifRqsB5_Nδʾyz!8 ~npCJ7 ̄ߍ4\Ϲv/CR0$.d="A-Fh)T0f@ז#fĒ?L *)8S qaZfj gȏf7&`A."u8 gWɲ_&n$%y/uEŘmfLR1yO^/---------}" 1Z2t[8$ &n ,R+@#ǟOZktGx@Yk-96*vl7B- ?tP05H:s0`);;9LO g8RSU0 XLur' {k{Y0 ;gOl +`wwsɻqWW.@;%"ߌ`19 wԜ!k?(W8>kp[Vwab >~|LPd"qԅpC=>F5+I5;ao{R""xľc'ݒ ?4l8Zf keEcfddBS3@OACcJsT/7#kYaB4;8r躃8:~樿;Ԟ!i9vC/{S7o^-m>ϟaO_;/tSX|~΀g3z+r9/.JU7>UsmCX`p@U%{#1hL\Vl-~@279Qw;n tX9gK)e1FeH82v@^qTة#_=dB)U=‡TH=CTu~i1(aާ*){WlW.OG}Kϰn銾Zm2,2M)^n3)6l@ϧ[ZZZZZZZZZZ)ZPUjx*m+4FeMP}B?uMFkmf+sO TuS>-Oq3ߨj~ 8}Z(,VVD$0%N!0a8m2ȝL %(BͿv0@_(2'Z1}~ gs_|a='ю}=WEKKKKKKKKKK%q6k$LQ CCOn >of 47Ҳ$zI鐭@GH݁&pB3X셍F*{㍝IL)J0 F754+<{X : XELB]νʹC?_~u?;9% }gqVOky`?՘)`_$ůsxiiiiiiiiiiI2FJ=]W(w Oߔ$ds2q5DOg؍B;Z'@6f+!s_Ѯ[p(E4%C2Ggi+|L tS@UPJAXZ9U1E4q[.?~X f/&3F1S6&VX5;Uǹ#v*{ nq&d>fH sZظ&;שݣ[] l>ǿJJ0;,{|c4oX(; #cvB3sǚ!IKKKKKKKKKKKO߉g ?qoo-*;iTSܶ~mfv@Z(.5Y~AJR{nf?n0Jc2YO1[rHA)=t;KUu&? R4n+"$OnGIzb6+T; wDQdQAc{ڇ_a%Fhi"d|6c ?Q# %a˟}e<;F̛ tl. lm}DJc`6;@x+QsBa~}käUkN?jT5?'^uXOU_+b>}idҷv4Di=Bj.#,:n03lRՎB&"}9!\Q+tQ>D0"f`GmL!` 0>K" $0G/f"*r3 B rܿYςfϣ}T&Gq 5m2w8{LtN ޳+<ί kZgh|D*oU;ס{eMϥz? ^.---------}}:RbTwZ|IAA1J0hQQw"SO],HqPQ\ 3\W#̜%4 tr4`N ;`&FTp ìGgrM ,GE-Ubϓ FpR8M Ljlv1^~i/+Xr_FB|c~s@;EWg k9e\w׾T3J gPЮǔ" 1ں 0 H ʄ->{tN:7IPAlRrst(ћJ@ ÍP59595 aER] B@>x#v%H8Glad0NNlMaҍ vJnIP#ift^w=2N;@g!f>%̞]C}ͣXZ)AV_uiiiiiiiiiiZFȎ[(xjHIs*摞Jpkc׎'~hm.M| &q?68P}K5)Z30X\|ͨo ה`ZN΂``TzHXy2y0 [ P~`1"jTz~яO#/A?Oɯĝ9Crl e>K"I=t]KKKKKKKKKK1c#umt ) $?~8 ]>[gk`Xs϶"U;LGpB*}1'9Zp'YklHܿ<  2rf9"LfQdng'Jsqy\onl-% -v:Uw0HږK)r4W=@}tl7*.&Ĉ1ba-%M:` s'W Ypl'@~nwwlu}`$ZRO R*H0u #f m^}8ɦ0u*T:T0L(]T= Dky̸;z77zJ*/{WHQ-2]̀^6jH;;;W5}㸉'0 >c`]7(quJ=O◑X+)viiiiiiiii$PWΈƄ}Qk+OC IDATG=DŽ v@D$BQ )j8)X)he=WU/(9Z8FMP:Z? d¬ej,{H*u #,HCs5xBZ 'Pl<6syul;C۹ t#ϣoSe}p|ý7|N\)w$W\DGP=oK__ZZZZZZZZZ>12K+c}3l;ZWhU$QqA` Xfpnu& C C6j8p-N9?Tjvm6O B R@ *U)?1z0DD9*SU,];+Zoݖ1#x3)ssTJP~ 9H&Z\IǨl_ԓ _a\GZ䴯{1 9~LGf>[| `Gk-J8j?or4!#1S$/Qp*-&ɡvě 0#.n6]Kz,GJmR{RP9DJM 'J쓒g1zjgl3jhG>,ә>Gs-!zwpJyu`;ϯzw A0FHSȵdkp+Nɲ*mBS >;ݝKKKKKKKKKKKT(*jNv(YWRkɝƨ0qUB`fo[H]HF9U^`1zY0#NP )vu+`.#>R6H!0 J[kJN`hL58&嚢Ę<ED@%Sx+ 7'  8̰3hfGxNzք}'iN;浩ѾWvn `ƕ}=dqqAl`iiiiiiiiid,Sjyz~:qL*7*n9Ք{61td #oFk0bǒyTwt}tayo5KJA@DWWr7[ekqWRDH"(F2 P>v5۶\e_B+D'wsJwsD<kxcxP:Yz]k:kkCV:GϚKܣhҜݝ8WʺCW\Fy/<PuMpһ͓4{֥L)+@QXwlf"?`8KDM#HP" cT-{-I' ~i#xO؋ b 9cɵ#$5G&3a]QDv1XdvnǾꉛ8ǎQ KvyX@S+pX,dG"y Ϡ ,)pkQcosp,f!<{T!{>aDsQD&TщkaY ^ԓSi0)թ5-"fR@ D۶A-\R - %/Rj&Cn^3E mvB(:P~&0s9 ǘGf NM'Un0W|q]Nj˨71 RfP S-,=s???Ìp.ic ux{3üG \A`GN17NwӈA.L}c6tr/]']iqMj,Ii3h&\Rl "nmD([{Vzömsz,au @C$9H #lwD 3/ad[0 .J&ƨ(%gbԺNm;8 X#0 Y&OH $]{#Uz o!1;)FSjQm0C. 8Hd%\9zk809O!Hkwfmkusp 1ھv{>JZoS; J;zDh@(cD*E$5$mBfHgpNOwx@$3=5@;jhac?H~6E汛ɹhfjDCmZ`{@zO8xt&QQ%k}'w@>Fl5.n](%RYN󖝗 azVpM:4PcUqKz+Iu,|wb,zAC KZZG@Q{ ;H[@q 4]K bg`*8? '$ D}S8G~r/%ؙt ZJ.J]ZZZZZZZZZ^e ls,6\<ѵnT;R P7GMd0+P<`Ѵ8؂2N0֭ܠ]\tzSHVRʼQ#h50Kn Gvc8#51B|=cN8X@v-@].8`QX7vr P{N?5xڹLo\Q̇M?3P8gyZa>KKKKKKKKKKߥH| ,Q!%` sC{pnup8RfE KOz? #-kMܲ(Ѳ Ei֕R#V,7EP4Gr3%lGI)u23ƮN9'wR9J $3_]9Rɶ"rk \wv#P7IѼxcO:>H6Fix& ?T4Kp2#7ߗg;I4Z10/e\PI1C,>$4.~n) n%^2/Gxk7ʠS{gl8 ;دGd'8 (˥oQFxVg0ˬaUi # (ùnqQ0hm5sJU9jq[I0 SpvcRE"'|^v6F85 g9 Y4lۖP>@'+ 4 @]<ƈG"Q0M=h+IEIe=]XBD6hHS?E8'C.$`i9b;Peiiiiiiiiii{1cyFpTVn#bUh>l[ =7@{pBvP:±d Z먵BZk" rlI(\s“FJО`+3þ}Pk 5hw>Y>@U$cɶ`];S&0"s 29RW#.5,7`XG :;%wɒs Kp!DZn 5 ,q(>aAF4 kn/c>eAY}5얔"33E55A "@Qi8Y u~!Ķ9ep&"l'#gH)&̍0""yԟH@u@_03: xuY; 5},||NQxĈ-I3aw?+f ;+J ˘iv}a8I{09-=ޏ ==?Ơ[eˑr(k1(jCE@kilW2,h]cDznNdߍ Ws9KKKKKKKKKKߩ1,sQcTuH-R34'>&ha%Qbw0`'Pz9r>hϞI㨭?fQ[5(ff@]op A&~]1:!{0`nhڲ_u%f#Ֆ%:#a`0Up͚Lu:v*=w  ?!zz39 ;6|4]0i҆#vL2FY 9y9e$Cf%x!@W> rٞn|rl`yiiiiiiiiiiߗcT*V+0{LX mC~0< K7 O?1(v,&F(ja@1]T 2u燻9ǹu |I=o[ {ϏEgԦS sqE<>$*[@t㪣bCu ΁N$`u! _ϰefHeQiFICKr'Ju˹u #qvp#]U|9i&^LM_/9.\ZZZZZZZZZ6 ɪD p{AfEcR]ܶ 4  Aep(b(^]q>F0p0D J56k?FH0YTEY73FX,3{nh0` uym^R\O{3#133L'<@[1;0*6r4RUr BϓSz#gkIkT/aB05j퀮X#N+J!Ԓ1X$^20fsvE{oƆH-8&!8uݶ+%S{Zd[<ӥIi-W{aGw#%"D H 9yWo[ZveTjAo U0 k&FF{ڝ;` i+j pe&@h_)J08;N!%(n-?k;~rpm70d3踯+$.dՒ:bxiiiiiiiiiiւ}FsP8ʱkx&23 ..m'je_ l#S(TUZx4x.# &!"hMg*=y6Rb u+ptlEXzw'~cL}PJY8T -m`ByrO36~dR,RPo9Dr׏K9AV=LX-7m ;pZuwG2J:"zrg}~!y$9 .KJURV! {O27$|ځ4j}Z^f(){H+fN $}.k&z@5Bc4EAOFhfx.V+=W`qM L\d&"eLa`';?i'P2TT8+OXrgOV(jZd @ ƬdAG8C OTc7[zsɠ"PKYJDpki)2L,Ftt'3wC)<_&j6̹uu ɛvʫ,kM=L8Oʚpsgf @Ƹ)r.a:#_*Tsf>c4 u|fAO`Î^ZZZZZZZZZZ50,"0$ jLv}&ZQKZ$C6nϟ8?Bpq 7Iy j4N10We 7Сp"Z!@up&T܅4BO>%jQ$zż=JSgs$:c$6R.Ͽ]ҷ%\V`jH[n@,~p23H14w1H%XaDZj #XȀy? 魁" UgxdOA@GOsD 73#HT5[b% e` VErnsߒdžN=;ZeiIꗁ4{t@nj2\h3j'`;0:X-nk%H_flhXtOЙV8N☉ey>0p38H:D8[vQvU"_:# Aaa-&0܁kUp2 FQ<f!w;z fD ]$3q9QD8/`<]H p iC~JǍ[UGJ#axΞIɝʧR&h^6?_~̀MOBw YybΎ]]$ &j#8g05фa *F 4FGfUXI33YT x#`oP 0Djfe(b&B[^%xk\=Ѯ p4:A-Z[ 䀮3Lˀ%ӡO=p7Sc58L ״_aGdg%F&Pd%t<5'3w1E=,W/Z L-?X:c1:ZNuvnIQnm 7WC!{njwI$ٱUȬCP.[ 9}oeGT5EMER*+2>j88n˗8r& s%5YPV0 MN˔C`T zoPc@5FGF:ƈL1-@kD7hf YF|p*q# GDZ0ż}v''_:k􉆹U(52hN5d''5$w|;Gev R`"wV}ou{^׽Y3FMkaI+p$'?1_&[ 0L0(haX0癳&FؘZ fI xp;@ki3rF0єb a]xr )L$>G0^9ېj=BZk8 =XT"9SQ$NL(d"C s^xAȖ'T4rn1jzcl ki5\'ϧYI=~}5#ߌ Mn_sy{^׽u{sV03cL-g3<[ `Xz8`kGoLX`G[k^`.Q\;fWpq3Y3 p6yɚ>*q@58 SS`0{"3Dk1?ghls&%5bi3w *0]8礘y<=i * Bw7|mltK̥SU P "7ŀT3^׽u{^/CqYD a` Mz ӟ٤F "A/!0'FbBU@or]&A,^a@ "uιd+|ʅU#ԇ8tuɼFx|2֚{09ᾈ 1k0b (9^Dk]r!5 z )W5h̒?;궍m\魶$ w~2Nlj%~ |z?f9߻u{^׽OXr? ɀVhfCf!5j<(XC4"w0@9$<$5&Tkf r Qq4j\ȶ+Ni-RkKMZ)@bax$s*\-D`?Ḭaו鷴7e@%#1[+Wn &`1]}y#.89+4cw 2W_%m 5n&Şݓgl^׽u{^K]]K,Gk\prG9qEnaݘS# :po]91˘* ^d* !b v%q!`&FO"*w 8G`ֆURD@H {903(<$(ใbfL`7CyS^D3 .sfX}w+޷Nm3N"u_Y킾q1J͙Q$׽u{^?e1'qE=0 c!ƕ|| ŁXօ^m ,խmZ4Mi: ^>M`?l~Q\bwm?\nh OR׌kml)`*i, wPu{^׽\@X@@f}넹A(dM$:pG g` {^?r&Mʐ0Uj'Yv)c%%ZAAA\*%gRGaT2Auy=҆ az:KꫪYC/*->_9tx?/q1<;[8`_R۔9eG?+[lŠY2- ne6 )u{^׽OZ’A:[z`2]!6+XD c T?S6 L4f󅣇r`J%Clfz,]|LT2k  rd,uV{im*)հ?nxJn14aR@xC ? ɹ*3)吤@dFO渺@bP_֚9ӛ܊N[`2$hJ҄;\&茠[vJAηTRFz]c0'^׽u{^-G^l&sDՄ"#kxFMA %%<]ÖWƐz`P0dʲsjJRPA2qyM0^@ )yi+)mmBb@@@ƩP`! +͠~,A4BшxQ@waaxM< b>"6kjk1P`B:FxE_= &uzF(ol2"׽u{^׽K$!Qr2LZ$=yc< sO'%Z ̐j2|< Ǒd$ ;D8g\RN5|i#1 '`){D:TO5db9XWY &Q)=H&.*Kbk-Q~b$#Ow3 BIMg8y&磜I_3fmZ?PpS @PhB7$sYk^TY5 5gPp|R~g߳C}4QLL]e(MLbu{^׽u"¼G?Lb8j7=a8A`xD UEkv c D;zpw^IA#_;[Ak'z渑HNL=G(=pc*4uЌi L019*K|g piS8Meҥ/w _\݃b,:o ;'sW/z?עd$?~`s 4YMɄi^׽u{^߾!8Nbe.Ҳ:`y*3N3|{*Pzh #?{[;iqz k0 p ?3NLXs'23tD5q4+~8݂&1d~r$ 3Di> << " 爴XllMa_86cV ip\E% 4iN>Ud52҉ޥz<ܿۓb#R ɶۋ*/o ;_'hRjKl sfhi&Y $wn u81s'5΋~EZOS}:o߷5 v 4l;~:@cm 0"tX@C5Grx: ]:8P _"Kqi{׽T_Is ߸]/Q,ቈ;S^ #Ɩw'ɺi.Skwa^fD/[Y G|ثr?_-_ojq0`  V nt}u@akmCA g$T#Z`JON-D gmHCv=%Qg㉂6ū11,,ޔG\"3YL<:ǑPŜ=Ut 3/Ea#Ut\)OÍ2bd >DArCG0XslrY̭$dj^}B^9"~^۞!6 ,ᴴj#H<_3>1#S,MհK>fn:TḶ>k^ (!Y@ͷ䦵8`&YNΕkV]RbT%3~)ih{7nx:\0_ii%a9NI AtTS3|ŗi~hڎPs*ym!/`|^! `Ѹ.k+/`7s-uZz)u.oM\* J+^ ¼hO_]1_`n6LOf`#LM]E<ݏ_+ sm$"0qH|=s̍r߮#^dSŨ0<9,^C]ЉAZDoz74S|zjojysS(,H6&jg;45߇HzCT*pm}~%+8ޞl}w栶3ǓМXE|~*E)۶7F X dV:ѬL@, uqA d( ̳8Ǐ1\\&*y35i49-$h9|#ffF&LQuW듡X֙8Sp0L86 P2ZR-93x+6N񙛬s5Z>-fnUq^c㸩y}ph.(Ee[1lh0PR^7*2$#)mmHܾa@BK0Uh1I{^,Q[2S$ -upw7&`9]0f]Dp '8Y/)"=[ 9W<Ǫ8p XBցaSEy3|:K:R. d]13|"ݎ t-{H1 ZU[Wq>z_ b:"*q]?SqaҐjv)c&6G\; ٥wT'ʼn61@,rlu9:EUBTdQOEr9Cͼ(>w۔$vȿ]r |W|xˊgP \8, K%^6BhᨚӗC  X~>&hElV#в3CcHxvy*D NgsYJ'۵o*n IDATv$ WMՔQs:bg-Xc{&_g&@N hqdLь[bb_,tWrp0nnI=LCwVFsz}4'S׋g#ATz.h#`5@i *M|#Ğ}H\C\h̭ jLpOF{4q^Pal5弾$W%_ =tu4p7 HdX& R<288: |@ S!5||S3MT!G<40C>3B8. rX T8ik S|@ӛZ ֯IT|iicc~a,#*• 7sw^ǘPAI% |0+4Gt)ѠhpWHȑ"k""5zxSu ,~NPY쥈Lyߠ6})uѓCz$H΂?roO<45KI^*J[Jlh9mLzVx -K\=ʍbsgcDI%;dYE%3g~_~^q#K"l}h%LJi+]H^0tTlO̞u ::B>eTFʌZ %]-PG!sYZmE;؝s_< X/o6gBh#!8:u̯ j>:י߱~ƾ}>f؀u7ߤm1Ɛh^q!a; _Qxe1~0;<u]BQۺ䑻`a\,KHo 0:FYtqahFa*SHAyJB)e v0I_) I͡bV,v 8Uxܡ6ptIjIjg׻%GjE-XVTLO&ktn91AHWncg=[~c 4hnJ\f$2)u#4bБh=Y3f&V,ٽNR%#^@N4uip`$y=>)cN;(ZdN[JFƀ 6x%lvb>HJn8z?iZMr_w8:@P0NfH1G6%,A+% aG{uD0 ƳY1f@$>"0^:>>:T QJ8=A9h=q ^xH{7C|A{Hdx> ^|ƚG}7΁?~|⷟?|,i|~פ$:^3U}9jmi i{'"lhd2QHWG)O['0u|lYaR ;!0nljV(@Cebΐ"dN0q<9߲)@ D4J4W9 iH&^ӏPn x=  ]rՎ1^<=ƒ ׊|yDLB5.JIASc[!ZV{2Λ WV,b>}ylؾ>T,WŚD`Q~Lmꐮ&mºmχYv+]f.Q)DŽA%KIR<!QJkL<mO6t2f>(yGITj@/2foE*.gFhkM87j|4m0«rЅeM0;uْz}mYSrQ[1dxWioQ+L@ BY6rb9޹`FkL}y2 ʛ|IUS8 E}XI%^g3$N(jj`:YWS<#EoA\dh BG#|>]!7N4DܒxYJBIyZ҄f Yzʗo cpG5 HVX=A%쉫i5gl)Nq# 3F`"V*#tp SWQ(lz 6<=Ud+=YcSE' 4ga)T_ŽGVXRSG9+t(99ٖ(p!#z>'K]*vp;Fs1F* s_PK7:D#9=u'{R ֞?;~< ɼ=s^z3]{SyG'~||@D?]Rgz]Nfo\ק P (js#*2C 9),yܼ~%[#aH~*I' sQt"⋲ |н Åof/= &r9ܧ {:_$"i-F"1}kt7;kz&^,e\-M+K7܅ޚ=>x w33ip >@;+FK##lJ=\ G5 ~8,7Qf0l O[̥b-0f0[Οd8 W޹& oYyڮX_ M*궁7z'㸼8YO&{^]4ђucLA+6Jr˧;EM)3/cݟث*&!$gp`boF+}ʴC a[%Pl$% 0EMn X6P=[6'|#"mo臠]( fl 4d{9XHa `{Gg>Ր)#bH873|o4(lGóЊPf Pw"T @ѼUA~9Z|h鹥(M#צ naс|dGQ~j J0Ll}7)c4eĘ -ܐ1[U Oy{V!L C =+7Goo !S&9k}Ԛ8XSzgdX9>)sS|ȹ "-%בl0NdHh CGKj[9zg'425E8O'h:ɧƙr>ZC{D`[o-_{8dkȁ3a`,V7AF0[(r0R %&O{й7F)5upEx1D-VЉM湔tR>=F[PJY`T Jior) M14NI.^4-!˧6z9)*t_zt"!])+ 8m LHWY@l?;QI&*[*a@.],[hϥ/AQ\F-Y,򷶆12]l4&$UryKy{ 'x`L^h?@ѥsxK6/kx1;|U4\Rn3)ޤR%8YM$ [%2+ lmRlpKY4`&F$Xo$9lFo|i5VR!lf僐eLZ3mZ"'-f2y;yb{ Ww3=4xC Ak&O<:@ u@L%Lb|" A5szD\v=*Q3@Q;F0(H$s`=qힹp'3[F4`pRL[8y5к *!ajIAe%g +=jǃ҃q鯝ק\'#,"ҟdLӦCK PCª!eK<0`ӛZa^/uĵ;iɰuڛeKR`6^Xx[1sJKi[i`+J!\qл@AppG1eT0='*T̯.sx*%a5r qdGsCC887igԞ*NV?~8Gy 'L ~@o80 Y&`Z$jDhl9k54NKWZw)z?&Uq2 »N%s֏Z9aa MR2{'O(h,, 3Z`UuH粘i&*T$iv›mJTDJrj8]fgTE$^l6|} A %yj_NhMX)[b,P!:ICbkjI>sa@("m20BBaľb0%86;@ IdW2{$ b黵n]r 7C?!ФO=96lIJaZʖ &,+/@+6Po#IbbWf6Vn p875%f(OWd;)I&֜s> *fXf(nz5(XLj)hQ_Jq=@Z=^8:4ZQVX~Җ XdMfjmtD#t0 [gRl4MLRAZ8F5"y&aTdc:l0@]# rL+UaKn=,'@iȿop[_m#M n-$4YIr Pys0.$>jFP$1%1H M SEoq1]~HCńfqv'[f9e|wtۀa';b:w@X5m`y3^٫B2 Wi3]}&,Փ*>~L#]1z6(6-x8sq6ͱQW,F2p9 \fÔiECn%MO|1gTRwEq <8^ײ3.`vfjÍ,Z4DXS'b+ AxL &AB/@c@s|ziVKmSclRJn0fVc6r.ߛ^Gd_cTАV9<' VC%˙Wf%3v`Zays)7$&i*jߪ}z}`ej3 osFH[]Si®~76Gc QD=B,$yd~Eg(8?.[[1mo,C2t!X` #)G4>f@%yC2lXi9'rJ,JL@ʌ3!W`:-!?Եgh n*Lfsh)7<'΢S H=)Hgz |܁q#8x2-UވhѰjxQ`6!̡ $!L'&}I-+ϸ>zUm5*BX2?%|J׈)&\k098ۣa<#]ZKpfJCC㩊C+ُn=C-̘ 8_g*Gdbdu:@,-|Dhg(WXR6/3eg Fr 61Gw>O?P<>_v< EvHIrT@a.9̚T`d1p}FG?tkRfҨ8Bc]c̥'~kv"F=[GxR2ذhg0x/_?1XZJݖɳc ~:%(sLᬪ{j[ gx*Y, ykIԜO?Oʹ&,s < fQnAMafi\ )/og3/֧wR, œW2dóLH̑.>M(5#£' Ƒ< -%)sGRcqMaҖ,$]ΐx9xSZ7&_>j@ IDATnЍƀs_e߾wY\ӓ97CN{F|%)C'^ok|D-'U8~tz`f'~'H^k ++@ VUsAnBM,cL_A)X8&%b#?FSQs"hZ-p@#C$yMq4C~x07ӏ=@q/q-/E Ӛ{bӭ ƃk]+ڈ4GX&TG;tw E fwi Y|П(^i1;(Ѷxf2Q\*)BE*cX|~afb$֚3㜦7}_V'_Ridf>db(_ՃbR)C`*0?@tp's# tBu]Wj;\Tse55.E&_hY@Gsd_2mJͲ@  <}S 0ob ~ҕdf0`πgw8|Đ9/=wHYd70^(XDMo9( ny8|#F q;l\;95@ED3wvFȧpz^iN[:%_#g/@1ebOx 1j$ J N0>#Er'!GQɊ.lzIH0'yo5H_D8? 8~ 促a W0ׯ'L5ަx}xBGXV^O.8wP _ p6K̪8њq3Њؚ@.V"я72N9Ӳ!6"Iuj${GI?3U4UsQ$_zmH_PhJa9ߐDхJy2#@*5 L,+jp*qؼ 5_^>NssmXs3 zNT&~b_P˱%]@ɄlcD*3i3lp-2c_1>It$s352{PE'YNŰFW&q]|e8t6O+Y5>t%r+m ؝D%j { K] pz3)!'9Vr>RlU3t֐d fHb+IsDKĹY:ySeC*Ȓ_rUʨF > kyXQS0z@y{6o:PRɚWdeynkSxӐ~:"`fB%$4ZFKT0i RdE1N"A."؁c$1ߟD: ^cePy2^-J/G>g`'8F]gI/d 1I>gTSJ,w9}lZԌ8!X;FidK-f# f(ŬV3 +L1`)8"@e+[BAR1j.eɫٌ!֬BZKT/EKZIÓY;>:9 M9&dje5(IYK \C C9^hvP*E[l v, F`+=A#B Q|D_gE#V^O7/2%TLD1c~1g `PfTsϪ)ۨɄHN6q)j>g\ yrvh A~ :k^2R`ԋ,Ϫ^1Y̒爝!YZ#S2<s=^[UQ$s6e0mŠ֜7ϲ G +`xLa.t(Z`0Y7@;+__g&>NI^ThB7|#6gKtzb*܄.[XGJzD5`OR1sg80K@ϒPd[ӕQL󱏟&ySqMp}o2`Zxk(Q~/O&4|s2k{^7v5,JnpGvLO'+}6>@[tc}mpݧD2|RkNlvHH`Q`3,v=2|MT6<=A#xހ1 k5aLz/2ɺՐ!a; 9c:"ұknDDF2@U3~ƶYcK(Rue/c xr6 -sj<=)>S%xL.V)2P4t@702^ HΈ:[7LF}N!NA8d$eS$ Fo %)#)3\=fޝh}6oڟ1BSɀ ' ?.zSq54' G-t KI3޼G\;G #t2 &˖1)<>Wˤ#H$3!i+$+~h$Pa™i\L8RQ&\sAsID39AO0[\et oUKHr jfP7"(J2 N9虾8qG=zO(wˁ9fg<+QrN(.T4'Zgx=5,#lQ;$KrGDV Z^⾱3teF냛GDV̮.1;Þ3UgGE?_G{2Z.>}V¬%DՂ>.QtPm4.IuHirȖOto'va>Z)k\>}Y^0fʾUdb[;O,ߨ1Z~pe$j#8LC2ziG "pT ><< x!{ s/QŴ۬bZ&8(ɃD7<7,<(F{f-:PgêjYE4ȢXrܺH*SyV8UII[0#IEMYm'̹>X(s+BS:6鵳0rX,K),À} l-` (D|WwNe es[,NdG(U}:}9k(yO?;ԓfI9OzlUR0SiQ[1sAADDhlZ kZ`hJڥw '!^h3ك ̍L{Kgt`VQJ Zm85τgUt \NG}PqÆ\edFp88Lh,nyRhƬA lg$'wp1EEۜ섖"8z,um-=5cuȫ dwkQJ[(z՚l3qn)?=.7H(2%oAMf~k'RrbzmC7ev ~6\jLg7eqENl|K.25Mf8%1,f֍*756`&_XȒmkۓ&7Rp.{ &.MޗMp7@)s[5p/]՟+fA5$@mcu,N,7l>g. X DL`'J})zi)'ߟ  N`k3G,bBn J-Әoɳ &233%N,Abc0"RE5<4Mfg ^Z. yOX 8QGY!@SRERiv-/ CNyCV@RFLEUdP:AKjn>2ش Ctz483"rx}L!b lmm ?~f$~ ͏[Ⱥ+KJD3OM; =B͜kY~u,[* *ж2j)늁^A9 }dO_`RT8I2;ḗlⅾ 5#@3ƛC7V6 :'} >Z 18FXQWP<""&  p(4q9 m8OV~F8HuV-6ǎPna _?1BϢR EK# x_0FwJE Y⌺h? x eݖ686S5ΧWܮ 2Fy tA9H9@1 0@c,P-DaZ g*?Rx~o R0'x>C^?`#>>jx-UJoj-8 w1)PZ>O\ägh{4'G߁tQفU7 9q(_??a~ hc\nZq0>R%9P I,61#~c)AZв0E^$R^5JJ TRWUyǏ'~}/ht ͙8^,*È|Nir~ʵDžZq&x]eL?fFdt*ќGÙfppƬsऎcCqbSjMf0ǁDW|gq{w0EKNd̂(u3HSY2ݿ̘~6rZƱ,l^v2FVr*ͭ4V4 `]+rR"ey=ASYRـ.<Ѳ-V~Fn"4 ̳0gўӇ-z I/36`IZk.ŗuE 2'eS62~V^ZJoP)О@AʫZH"+kS&/ю1 4{o0T1#2Uyzmh`ĉ s7}U,5 s+YKk^YT&:eF>Z]GVU%"GqT6y4@MAj?= i@6ZI dc6H?!q2%IRm)GЁ1+F:Rfg5㭎W 6L8Lg6b#hc) V>9*aġ#SKQ|<1AGDWW((-䎥40m_hMc?8`?Ί+Z~9>Z ⁆ρk^g Vt ?>녇 X5UQGhHPa4T0X"A^x> Z83>5iY֠~Ŗ!d!%}US|:Ff ta5@EmPnn-\&5R*T-Aond(5QAܦu P<| 8h5 fTX0EL +Kұ䢁|$- ap^2 pɬˌx<,cy,ž}ĿC"܁-?l9SF(!S.'زtE4aiwlnjpP#?g=mozZZ^ܼ{FߞSRo9&,_ Hv'}ٷK6.oC/6ND(@7jujr93rHx7~#"ң5C'Ѩؠ [T$l!NaWӟ$ņ5c-jʆ a)`6zɄ~$ltcNC ̆JH"PIYl & ,FE6N5`"nAK~hRKG:Q ,6ds[lozIݿ|Wª=!ߍ& P5㝨4<70o!v#>?Jקhd_W?`@nKr x=B)&(=omk(h*O8:(^pw#_BD r4!ВKNu Sjo5˼Tbch_$h@=h}z)ϡY;TDF, 7U EɬJ7ǡ ba0 ߲z!6L*FY>e2LF98 n#=V ժ{V4g7fօ$-6AUKQ<9sqqx]F'csxPx4 eCku 2=Ɇ0xx'-K8PK )-ܴ IDATq\Bo+)=[2c/UM_o4Ky>OphAS\@y9. ^ʄظtig*g*fEKϢ&x9e28%bKFPW~EV}|6\v5~VDTƖqC5{Q||-sm4uk,f2Ҹm ]G=fpgTP4 ɯ\Q"HqM^`n:N>+S._5x2Tحv,ބk0GSv%=CdJaO|Еɶrm6_Z߁ap3,*lKXɉ>&rlJ]LGq( &6ɇ8q::BALPFIk@:>_n p>~<Spr/&%$DÆ&_幾(4޼Iw2_3"ey_Q5KN_o >PO'|,NfR|$Z> xa0=I|!'(6Aw5j)ާ&8ẄtP1=$aFuSąuM8B?QJk 5ZP u2~HleO#PՕ8RdAؤ#Rn+ IW=IֺfDR[N|>HMJAaW #=,E5=dz+}G+AKj2PQ͝ oDuv4rTq  .4q ׀z C[rc k4ZbZCŪ<#s9 y-# u (r z|aaSZjrvPdmDn5hIRj@R8n=EZ]I፳2|"j@uYk ~}hЪܖZqNxBU/_u hqlAqznMINcskH[eI#ɪ|L|ntoۤKߚĭ+{ˁp_tAg2m(F/I5Y"y3žC*[v&< `C凮|iWj6ŷۦu>0SGJaH[#3(ʌb ml6e6ͻ&~?AE {`])17F: x/m{ϛI(ۦ\VÝE|#ٺvx:7D^^}r[ t3h5o2a? Ո\ S{e:=¡&sa>ffIF ̪3PNyX"mnnr e*2?V‡HHPm`ʎ;'-) _-!SaP}fw "i'3tl|EIȕ3($c}V>AƘKq*_3I uf#> @5(CV(@ _3}uϓ ܬze*ǝultog{z|w/(jϝ3ZAld,ZR-q>{КDH̸(I0SF 2cF '^“&gJzd#͎Ra333(FfHط6 hJςV Ϛ ;îXb,P9*zE䄖R8-7 TA2;U1_`LXRCt_qZ<ϋDTo8J AP[x *ZZAkKp<<6ZJ^C%O&):#Eq^u\gU\h1X2 :c$$,溅Mi’=j4n;v#T2HޯظO(Zϣ$0)tnŤG#TpucU o- GulyYYHŠOhܢ )PER~}kOsx6WZa~pzAT1  :O;\x CъΘZXMG`>)l"k* U)Pq*0pOThe|ECٜga9fcpnV'7.b2Ыf!G+[D*.!y^[Dzϟufɩ sr6=Fe>GE Y}b:ϭ|cpÇ 0Eݽ"qkkIYL@"a)؊ݢ,mب9a3ޤ nt|'_!2Y+)$"EBUlʷ*A83RdCgFeƱ_><):}56.eNVj8-FHzNrYܠ̢-^3/,iy@V2KFe+MeӹEM'o>>(:> |JDΔfA8Yg ꛬ|;37 ./7Tdc'@ETzʴ$w>wv QYmPg=.cX ; CA U!)S4]KW6/Nʠ3(W\rcjϽط/폮ڙry f!壀 yv&dݿu-\:AC]$Y$S߳pW$^$駢S-*£I>|n7xުzMdb*ܺrR7$^DîB~l Mr'l$lMNj&s5$`nY4?\쐲E[XZJ@"ekZT*؈)MPkSP1 *57IngYb"ZƒV%Ә3 Ip'+Bb*Fowx] jћa5$"K3\9C1S)겁m:S?ب8dBu;sM 꼮h+6}A\. nZ|q!v V [˻wXRhZbcrs#cfͦek-пD@W̠+}߄L9KiӗNYD|O8 :0$˩>!3lbfCvdu]*YXn{=<4;VgPJ6=A>9g^7=}irHߗB6+'Sۼ @"ܶAN^r!?An`cg{Qe{D裍̼blO3#kBuC!˕m嘾RĖDDDA iD":WOSc6%rD GצMo-h|Ац`#Hgyxr51 S7ܦ'[GϪ`Sү, G%66ve&3l$}9jyD܎P˴s)U-$趲Sj3"f >t׍q\jlXLH>7oQgBJt]JA5Y !#^(!eIkhC9jȻk- Ǻ!BHx͆7H4]rvaTD2ϻ *vYף30vғlܲBJ M%o!Y6!0(%6x14-gP5ў_Y0!SutRmŹc<6T:I3 UQ KTqkz{0eTP DQZvG)kjMa}Ѧm<3jBIW[qA|xVqQOGbJ*qÇEG7umEC1SzsՕ\FsЍq1vTyGb0bt<Vj ;KC6ϣJ3RUE`/(:|p"0|<}J gPӂ>Gy]x~|Ĺ +XpX4:vGȈ;.#NK-%赬0-9q]ͥC=|6^ގgoaLb'*kq'P#Zek%̕,l:_'Je%x8}Sp!3ce F6~aƣdn=@m98IVg\XEaoL+~a9p@A/oػh46߾{5[ޔ/ko}}S!_b;ƭɻK[$z(ӽUlO:k[J6q #soc}Ioӗ Gc)S(0'T&5҆36>P7ӌ4֐z ; Q$ijg&cn#6%fVy= ZlBw݆YxQ"KB2ZRrH!UѴψ"d1̓7 Y? $woG0!Dy={lD0Uy>lIP67N;8SжQ[uѡCQJ ۱-7Õ,f"ԙ?BjEp |4C*j4se.SUHϫB{FOV|>sEdF` |*%>>ÛZCR 2W0"(A )u*+Q1*cM4T Qk[' Bg\3BFfRW딏ZH}0&"Due~gGo99lkGH?Q#hٯC-QRBBmD 5X&AWPgu?-Ў~}Beۈ͛4@56ha.nAgwGŰ })>r+uqVR=8։Ta-dk*R!a\}}͙uhl͟d|OqRG,Ʋ5뼎AbVy<}v4跩 s,hM_eS.nk8i gS\@,XN4؆6[_m9w]o؂:w&Z.{5oBobJ9&\&-<рHw>£Dp+6|2HOՈyn 囷t@إk_ޗZ)m` ]r iE| ̭bƼdEfo--tz?iYFB ?ҡn[) /iESFZ9NW#}m3*sN {QEv>szXO_cmsJ]q͎%BwB*bce 7 )7H/|(}ƶ#34!؋sW\>NsbI?_~F&DcYD~޲z c G) ̑Kr@ (Mj@.P: \ Br hlThQH т)1%~:=5,9q`hۢE$y?s`BFJ`VRbYq cdl>S&I1]BhTIh=hhs{^jt_ꘙu[rݼ=qaQ "ŗ. dkHUcy݀n7#e{ρ 5,3@q os^$̦ft Gҥmd}?RZJ/gC鈍X!2sr, 7y(VJz+ɝeJW1CZ=x T6T>kΈXuVy>8( Iʢu6aB_|jgZbk%2:Q't pWlqN [X"0+$ѯ^TS+2}8q^ >Z 2TCm |]輻 >B 2sbYUz o7IkuYל1F8 /T)ϧ<+u^qa1f1φR"Lءx%B9l lw駄sm gLNL?k06et:ETߍnҭ3^70KT\ (,h|+t(T+su5/SmwB7]ЌA]s{S4WDJ ZeEE\_M8AޖHh~ =3]jE@rd31rKOB좎qzOHao|Bѓ؀}  +*˜'mcTܠ~0!0[0 ֑w*S"粼Zwc"+3'ɚSΛQEу0,]lj( W4FQrz~@B" n__G5E@%A0$'[ʐs(3OB.ޯ# Nb~˦#zd;)3,>\Բ='l= IDAT}?UY͠ |@jhĠufwP`3y)qE2s|^$ 2ͧ^s+ӈQk:B^ s 繨t3.hYr$vIďd\菗Kd-YNEQg&smQh٠LBwlA58ki96&) -'?$j\3pWR1(cLwF0X\]q3Tzrh ̐_7n7UCt0px|2E)q rKYٗp긦B&x;GAn N^[:YD&2PӞCQ6C;J<ѓϴ9|F@Pja9h!{2<5!cl>`BmmE魶 lүW(!8VJG 5czk܁:Q; g, R`#dGka@C1i +3eGYHx[|O][@DcZN[bPNd"%~PT*)lKYKn% tS=(a8@6DFh|6QD-fM|?9zlq{!ͨ`KB|QwyQk]MQ@R!7@ 7SϦ6dEPC4NJ` 1.um U@l\ٕ̌IiL[  S_QYYǡ [` R{+Z磼Jh o,H*mJy/!"C:esA3@_hr@Dzm0 % zZ.ߔ#)] %3q2x e(~-oCz6e94k0"FQ[ ="zXqE 54UbCUJH>KtTFvwj !z K)_h1P_0S6DgO)6ErjKTe沆CpNVYhW#kV**m/ d]$ݖ%g2:^&u6k1bJU6Oi m㚷 w<^<v^g) VBF4F2Gůmp]TTGH= E3L0. Vrzuc6m58 &b\ ('OA;w+rڵ:?3+wi<ܲH\^> @J?S嗛ä7*3VPAi1.o=-quL%Gċ,A*t f\m n11\CPPE._|")oRSضOU+#{3f7'x)\ mv{m%ǻgS{:S7p~߾v|U]>=s&>ez#UШ'= h8w0n~H]o{jLO:m|C U vNXgXo2l{ uyMY#6f-j_$%EgW*cKAE-`H.j$F|)>ʔ5^cn)lf$6@9;Dbtʠq (G1;'W<.?(l6>H7ϲ({_hN@E `s%I)4<AcC1{nkxFpxŶJvF3O{y^h={b.R"D+ Ϙ (HOfNU0x`,HZPjĐYms2R=\KaʒR1DBQ3&d5p ͎ 6_2hgupD`s 47ؤGCb?PĭpÔ#PN In rstfkNL[#3rA(h"Qs )ёA`^!%}XT/CDEri+CAkn362T%x'gOw>k=H@]#"] I<_ҷ9h8Z(APh2FKIe\w"[~]8j7D)ֈ"x@-Me AuY֍A GZTQDgآ1k. ~ `}gt*NEy828B䜰 WK4oy2}VRUxB굙/0V~XO$_â:P\Wx$xF\}.363zQ9s jN9LlGk-8/[t^Wi#[/h}z8gT!¥{@_+5Ei(j+!(( H;xPޛr3+HN͍;#pA@PڢST20z9u#*+ֹZ"sh)SuUJAQyuϊW [$r}c {hJX,+ΨmmqF#g+Wz[%I>k:%ߡV򷳾גςܘXax+6|*]lN@ >86:((7t\P iYNΌ+uRNW` P趩/M*6r'KL"~\rf78ɞ$[~}//7XLZZ(m2XmMzdQz"KjymaYɗo* x桿o"u -9.ȶYWz 16V57|T9MmoQ8 ,ͷ#Ye}h6* R v`{ #.poVX"5 T"=~^ɸH+w33#DgJч۶Y^VDbzj"[vo9%>TO-C{@pq (P& y" iM9V3d1k*yg3G@9=`*^ۡ?uOʢm-imrKcu|`S $OtSXQQb9]6N태鼏Ϟx$|^I-[AƳVpQ|+EWv BB8 ~fם9 ʴ \-19 Zil2l`1­b+DcP-9ʖfC-Fx-!`W :7q /֒lnL[ Q ss@ΔY친P5e35E1&0aP5fĦv253rd5.a0ikHJ-#â LjHy^uZ9_K,Q[Fɰɱp*hy .f&x>>p EqYTGrҤt0%U+N# WWLӆ⍒ݴ:?ݦ\fdk(崱v ٤ͺѴhldR0Sx?WKYu6} ^;eUJH'f40 Dބ@Y\'4FD.g#lYHL%"ņRݠZVl͔-*5=R(nu3P@\}G!0I-t7i1Iy`xDz651Wٌ_fski^Z;ȗȔflJ7E:3HWqApR??\^t>EӓS)?tmrٜ*OZz\1>a$cnjJ9&-37GLeIz N8r Q|!5#nITcÙ/f4KՖDdT l-\,^l<; |k:os(M!l=+pm/LN0O}ye dXl)2\P$KioD 46! rETp }PȈ8CJ8Vp :},yv#˵.!?nIFT=zf rγ7}~]f^@3""%UcnT?-rbIXGWx}O-9WcB=U9k\A7zb}AI=bw2]j ]9lK#Y2,gɐu6u" O ӟϛ&nE*,h$k1CZnNI~ lAp"%<|6t21爯W*i)OU|OLG~`FCN*wcBxxvϗ~cFXOa=>Ў^<7E =Jwb1,1xHA$+nS/К.on<1+jv2f+ `1&NDBQ[]#ix'/h,wc>q># 9CVY''nh/Gd4jgjbJ9fGStơdtJp?\ 0lnEreFɲՎG?a>z {8@qP{%a곁 ,VeI=-x8ՍKotvIlbr^މk/j lsRߧ(%"-s yoXɱRz/RY} 6-5ѳ῀a3e"1.Ս<d1ArF>!g0otRn qn|֗_r0H kAn*,ns5HKC|DI IDAT }l3l7.(-! K؀6@qr޵^caۺ2gvOQi"߆R1N%&' VlƊV7Yܵ 7טk۵ 4 5Czh@{(u? j o"OƋ,"s&WY/I^VOx̦IBr.䟲EJ?Y1BJ(snrܣǃ7>, #瓒Ť˪Qȉ;I }#)P$J){q9تM }6zֻWnɄ %=פ?p |ƣ?rhsBqfLe ?iv 9Ŧhڂ=wi3՛N\3hs8 mA2 ,yzy#B އ e#hbS_|S!A:9!Ȉ[bJl- {-6ӭ?q"J??Ў.LjosF6|SHs56 "svۨ9j^ЋfxWKD eOJӟw 7ͼ/4= bkۥ^IIq<̶<̯{q`:GLt[5饭`d㚑."y>~_luy = oG)9j ͉s gyU_׊!1sJZs<{X\?._CXܱ,bEtD/)ԶLpQ׻ؒUb,O7]n?>>Xzrr6yFsTx.{=lxv;]O=^ >P6a;)ݑ.fxl[ǶQrtG(;"h  M(&綡[>[STT5N/$2U̼>&ۿmrOv*)^Ŷޯ?){ʖ(/TZGY|V.޻̵cqNx_F Nn3{w{qTOoMmj{km+3Y~- Fr 她Dðg0SR@O􋀒'=1!q(>ȵ G' pm//+_ Eu }?gc.%\Kmbs$H^UZSzTs:xq >(Pb" ~FX0ֹIk9W$jE`qӓFE3$n({K[d뻷(v_b'u]W/_ZIz(%4RCv*] 2JOq>GlEn~8@Y u6K/xka<96m h sR`Y~m#_،I6`}o1aj oHWnd!7*Tz!lr<6m| H!H$~#}k/:!kf[QNq'J]FrSr`0/Gxc0ƁX!. OO`Mէ`LN 0E)BעpEZe:e *6(h]y3_XϷ'M z$j=*< x|y,"CD;jTlQoaX9I5 U;1USqSRueM1-eޮݤ)o@ KM"D{<}իhD 7A? HgS5F={_[N VõA0| C "'0QŜux `0GNFrmN.BMba)$P9w~Fqn;ҤfQR"0C|PXcbGn[kE4aޜo +sz7ECl, %ʑ9&IPNZ/}`mۘVdkv&N9PKXXRq^nԊǜbFHm,4ćhy֜rcH#2&$Hf#,l3&_/f`؂DQAm^?Inu iPRg.9-@f3$bBmdc^8ځM4Zݣ.Дݽ5ZО-1Us7Z!e9sĿq!mԳ gfɸL$Y=0lF/`6CUle9G6%T oH2Q]y!{onzTM΂JNmiIڣHٚoXڤ$Aѕ__2۸Fcj2rmhI9: N8#b[ӴQuo8*~k:-KgdJR^' OrGGN~_cJQe6Q8AZQ+S9|Ȣ?K4I5\(/◢T K=U4_4[1uXb)iu;{eNx^?:so~ab_:oJ7+}"b"ZxMk9aˌ(L:|尽H0{lb4sb@Z>Ǧ0.`6W(1dk _ؓ!1\Ú3I܌- VC!OOtiMQY#D9I}7[kcKxfalTX'$6%@&4k8icTAoEi\v˚xK} ` -WB%`!@-zl08FT,ڙyIQZ~.9^>iA[IN D!)v#[|3Kl#%~¢'׈XS~sr#ϩ鴼vPB}iDC{|VAcSQ"ff8Z/y$#,WF`*'TP@N51s@!P_*#nczn(Μ!QLDR*sZBg!bRCK"j&8{I9&LxYPI%7}fXpn%]\3i6-%ke<@dFGu= ๛sx0L{JSyDS3rhpPH(:0/De@ 5[">FWjMڄO_tr,' /g]l(&g0&cDnq×ۂf{ǒ&L`]s~5D<ֆXZM^B;_hpo ϸW1Vlh7F3m1!51| )֘rzv815RCn,sZNp]ro6-^2kƚs+6sRn@𞆝'd[Z ~qLS57?g{9!ޡrAhh? k龣@[:f*M/rp~_s^ Qnhe_{QYG_x^,47k.G6| O/Hf_d SNߊ=[=eT.Oz{&~Ri]@۾-D O^rwIpuTPo<5;b#XY '=x'`ǴvʒN Sx~2[kIe^@~{P0l,]͆}ut0^rE߈)U8R%^,#.ܙD*RE!mD0MJ< xZ)yp*WkXyvXHFɏ[f׺gaO=_S!M1oYT`CHAZ^h~^3Mx>Tw19`AS Ytތ' *VFk-ZGcC'h<I/@fG#0F sHUÄ7pF6&`,"]Sχ9fAPPDSpJdt's~E\MG=nbCpnҟ4˳Ꜵl|xIS~^*Q~&AÜᡕ$L YMs#ZzOn// `'s'FsPgrӟh+&_ql8 rkkHAv,$iɦ%q8Ƹ=dF[|?jhcc٘G;枞59N[=b'!kw TKV~18A- {"l6UђAug4z'`~@kMFVeԍ-;ܓu2UT?`6Lx^-qhŷ"0ג.혆aϪqeQ@iC=賱;E;f{q0B{ BtEXMDSY`IQ$'ָuښj]Eq49hEZ) fc4D<7gv`|@׾Y@_Db5˄Ϣ2GM'7:$^}O434i6NcyF[#j. pVSDDZ/n× F/c}{֟­mE\#8]cNS=m:!} j"TTqN5-ArMs@\y2pg ^`9i Ɨ7_ֲc{4 6x,D"c_׾RdaQ5b$[tX_.,L2YQ`zI,:`.B}iWw*ܳ^dX|3k^^šFo"V`7I]'T)⻇057'o"FD_@?$j&K2^|Η@ DZBe-YZOK5ŗ, ϾOH?YCYB/ji7[. (j Ri_\0í|>BeL ?ƩU7yicw6 2PRC^t4#A_u?k=]tfX# xPh ڵͣ+ lKpdP zV@|w1$9ɦҷ2,0nj&'fWD@V,DUR*{RyD^H̎ǷA2x'ͱ 9gu4X3?MV)kZ"'$f#բ_r|; IDATN} Ȍxn'n.hDFØ3hp ܟfRSNBtN-Nm ؕkIC"Sۆk3\WLL2@.9&]+Н( y 6-,ˆROXw^=P1~#6?e#2b>,8yvøV,y8Os:Y PM',c5,sal5rWz^CEgI ¬4NZl bBc,7Ÿ_,3dwT/es Ǵ?+36l*Q1 |' g?ѤcNNUִh+)%)`Elj|=+137;%ý/kI{Ds>{/"j}^9K9Ӟ:~AHUQWVχ9CâEC[~6^MSԽX%;]7KjIK:RBMrD0ƳEUC+$ [FRJFA2B]sfEn̎ZrX)J 1 X)}*Qod6sL7ֹŤ؋O6 eQX>߼vUz&a-N NcnAl:i 2di]$ږcSU\ e{Ya;c6Wɛ 8mv΍@gvʶrgc^r3zA*dFQ'>u+ ba ZoO&m m?_%s+2zzTw.Zxoجak6TJWR)gieH=.Y3W9[^sL-PhZ`RGB 9p$[t_JxeY RM=s´UxIkjzmJXy+Hk鋈I$9. 7>4H`^e[[- @L@LoO\7QYfa2--<Ӯ :;3V؈7 D+$䑰a> } +,},t!hZfW*"#q6\WlN!Y&ѽy^Өܤd6}}]qO%uȄy46²x3nVl\ڛ~V|Zc\u l<E9"zn18+ %UQ40V3f MM*&X3w3`>n@ٚkZDxЅpIhGHgE{uwQ:yEYTFAuLOYLRx_uNVGM,l$r *bg\8PB@Ä_5s2jSdoGXm=Ks(VwSy$^]3b=x<= bD=gR0?:0pagtv' qqJhlD1? "Fy8f5|7 n~lzc6iym Z8@ 2,sGq}>lm*%a23<_|yR@}ok^`n8[,Z-#e )x~E+%g`+<sRprQ熼zR!=!>}Fbr3?}n@Tާb B)KJ*DwIEv?lE^xaPO;a"p9|[W~lm"%w8l=ח<6[R{6ۛ 8 %D:;VޣȫX?@s_2f{?Tk/S^KW5I6@4nQ,埱xjDH +qxô@Rl݄Ae~m UصɮN]lB9I%^*a[ u˚z+x0Q*R~i# Üh+R :TϒaE[Sxِe,bMIWQDתﱼᙏ ŌEY F:7:]_9o՘ꗴV1!4\6BvؐFuhFHJ>Lsjgư6G&eh&`o ׄ̎y$3 F~fap]%$U1G4 .="󶑇(ZgYrZ'=iG Q*AYƈ=u A2&OtfA[9:l86hƜbah(svqs3fiW-1ׅT!yo?`ߢ"TEhT-6cDkŜ qm3εK rGo=& &iCy!| (U O ׳5ѢYxrTPt)_4HenWJ9ytpRY[l i鴓9t+QN򬉢g#J\h+[HI5́񟘓_z?bʐ)VtM,lE69{n}{ c^Sv t#SiJ2o\L_$9XkNz{Bu~M)A:!&x^C\ 󺂠wCo?^Y$a J4 /g﷑@lu{!(ڭEAqYe(ڴf6$ǽb-DOhohY~@`s9s22 B$d\"3/8'́iuOc5e4toqxL۴8b@r=cp]3 &`ZMMA9*ʦ3pQ 6v d'BqFOkEQvy&,15N:UY>krb\aGDx2qD(*65^o?A1ls(փ^Z`C&tt7&ec&("y~,*y&p $Kb?s t]cqD$$B8:}M)kۊkNبg #Ʒ*ب*iD>Ǥir< .~l׺ )O#%`bCTB1-ֿs2Z P(qoc8~hh~w99C."::Wȴޣyceth Sd/> 0lYx[7mй)~ yy_v׎ `opQo7?z_[oB~VH9 26߲ؼ[}؍[R?$zKOJKk|V Hǚ,"kʢP7oŧ}5e1!mRM"&56p @m o0*@x>``۴_éf(ÄU3R^c_FOg 誑צ}&.Ql[)*6Pv8%}/? .- ܻ^ؘs1;<c.7X2RCvߢCa7].R$[ڔΚެDEb4m[R^>珳՞+U5p{qbU]TƎ4z[PuMdn%Y8HYȔG),`jbY-l~y+HUƱO\$C[^3޾; 2H/S봦[` `St 𓘮 duB9v?n$5q, OGg\n(?x,v*]҆m~+b7P[K`~EG4 :`?9=L?s58̀9!6":p&J~_y97`X\ĶT{-$<`L3`"P\_Uoxc5Nel5KAϒ5u|?6gLq1hI ^̫靋Lu=ΆsǘbrPHIc̹s imӊ`*1skf5ZJ i"7յAZP:p-UEʹ\3,b"u_$Ba^yMl㠜J(h/x|B5 6Ӭh e6FzGFfHx;yemp-h~_xPk%N48%{Ik_1`>O<?S)$!a[o}) CWlԟxS=xoP&Lk0_ّ+ IDAT-%tuS,̩$!Fϧqrg;~9"hLzd)w3qi#s#^e0p\s +RގA(&'4|]szI&&n3\P}%ر\̐]ƍ/Y4\Ӹ1A Mb0%ROMvq^C|'gC?Q͋9=%~ غqbV'$b8Nޏ~~)ńk.xD4&D͌)̧Bf͠pNNqa Pe TcL/{Lk8:xA-!kIK dg<>Q!fzb:XΏ%P1p\.C8M*1`lIP޸xcľ59G|Yr1 |F`zaEBOq,@Ok@ɞð/>ǽFLy'\Z;ny?1[2AEL>=UDY4C{q<ǭyUSFE4<54UЂ qD% J@?gl7ol,L8e =aua,Iogsu!pYÒA$ߴ(ak$?$I 3ۿO?YԊgMk[?`F8 #eIyfHt jOaH-g!)4pTԄp&;ݦt M/|*ӗ X${%.¡Ȯ9x (]s׎O{=69 ko]ZӅ2})leCR2 ccRy\6p^(=!Uw=;޵34#v.;׳qzO<%gXGi^[S 㪢QB cdF`*Pcƙ倔F9 kAZI2.9({Ӡg-86RMVg> 5&s)0 8g4u6_8e&ɕy͹$fqԛէ iɪ(+_d9krX= rPIɱ7Z 2ݤn2Q$fƫOez.%+":m: l[/ƊTMnlp b+HozNLJ j>LlhK/wHs4S.NiTę.q*hVpOβB a$'8<ʡF=h!8$`<#d}1caf ux6W [A4%1 g4276e)A`<iSxt\"#5tã<޸f.:\LhU/2Y0*LDkDC@[iV DzwfByd׵O89.ǚW\3wǏ2k,`sOId&f^q 3t'u׿ߑ2,Fm~ˌ IOJCV< V>c!DEoz+ 0E͖.3-a!/&ARxV=¾l|wK_$_zv/~|ei{rnVNąŃ Y"fuۦk3r iKap7{oqRAs<ڌ"ĢX' '!>gźfMj|dcwu[V6%rO0dZoܲ&FPd1YƮژOFlnױfLNEY9fI߼zoF02Ң5.=1~n|ril1L nVј72]M$~oN5 csv ک09 '%B zA6A>/fNÇb>! 6F˿X*e_Atz3"QH3(uM܎G ME ~Ni\1my{̣N;0ٌ<2.$Rҟx߽e J`eEvcwv Ts?-5c\\'ׂT0,eK_(bBM43_lb>hRڅa&x^֑#mk0)=1^co3 oW$yMy8O[\E߁˼B&VaY(ACGEqY^ 26Yz侳ZO0tđG"b$Jx/&oJ*.hŞ|󳾓X "ȾP?+WR_Eaw>q27*8&^(+TMʑ;I}Bp/p> g2+l&jUV(e;xETQ}Eٷؤhʄa3O(=.4n?"K?Q\lӒǿȨsz_Lv0`Y^T`yᝀwWѡ(qfɐ"EI4JYfJ+OD-& 6frfa_ `Z-ϲz,Ip9-'67|bpyS&hb$ئJ4Fi@ŹE5]5>?EL:9M:gbN%K}Oh-OBMݒ,I{dU쐲{ ofbOU #"GTDxOp\?KذVNj.Od e|xOI{{xseI,7ڕ G95Ȍx5,ʽnŀ #DzfkkAJI8OlLB},ğy b{gqA{^<빔l(#(q!h7w:~Ү`j{~AqrPQ!~6S$`U{GfJ.˨'YJ$n$ޣD֫twhLoqSU_yX3s|,oȘC*IK ZMN=V;',w볢AVeJՊ &KT7V|mYiu]_@DzSh tR(-2*3?3b7P^z}9gt]tE Y>P=x϶ۅ0_9m_]o[l%E0U0Mۊ}NE bqNu(@R0У79,V13?ӎFLe~%nhXγPmVIC;kZ;UT0+n`lhς jĉ>),f9,"(UͬdW< َ$ҟx Q-)mKfC1o TN7'זuΊ t}A$lHX-8^+L#x/5 =63&53=l3=IBk_[ mO ;D'jMNyB?ybnM&< C3( mƒ<ȳod6Pnu,#$OV1{s$ٴU;?) [ !6>_="j ļ27Ut)[ߧ2㍚;#8}HbkWTsAWXXӬ;eJl5E݇s8틾o~ۄ. "RE6\jF?W%=i.PǗOUIXeX+O,D$/ЈWإF1|YIN=d!`,d2NdOnSY8v4# ϩbs2 r~+|ZtyoikpKb-NB%Q(YtK38C{fg`K4+I5G\ZS1?K'!,PX8!u[L\4b;5ךݻ)\-g8As887M7-3~&h\㪦y5j{RhMp{0ytk ~iWiGc!1gė85^>Ҏ`FtUGw) O$!MkvD]ѼWW;66*8WޒNeR 0# !4=?J^ Mzccu|E 6q º/#l~2͟GeS;7t*r4Vi+$ 'ELI<Nk"Efa>T"&*|D G]M q}}FѨiJD1Lj0  Z=#K)O Cl )N;`x_LAoL*l!]? ՋVOEFJ5(i4Qh]Jewh*p)ρ?B`OZ1Q3g'q>fl&Y4RM"5GK2XdoC=|q"?pZN .UQMJccf; U[dZűG3Nz:;/JsڵBpݣrPIu=r_U2PBV۾eIdk8_xT^jNzT?or|KiEqEM=FM3+jW㾷,QDA2&> ]+~ɹ8+9"pK.z'Fr+zE9%V ^]C)AlR_KR̆L90p^2A=%$kqdNUM;?(Z2EIM+k-Y ,;54ۼ,|I]ӈE|ˤ]t _9x.LsJZ`S'n=?S!l6?ZɎY]k]}V|9hۤ@m aM,7ɟ*WwnE ,s7T1@s;|GP`37-k-cD$ ԭIWRHdsH lY/1qw?)ss%5*9^AT)NvrP00-f|#ncAX(kNLWKٴ ,Ny֬=̫Uk@kC4*# 1F5%,V0{(«!5- fB,<%pk85a29c82E! Us"Xȡ`>tҎhB[ t,-=$IZI dxrϧxG2d{mžZ@$h7ipp\q =iaAAxRdM9dbジg3 =̯uzzleenVbdA :hVE8Ow&yX `!;v/^Xs75-H@JYS oTAXtf-p M@wZ{ǁ-iT5P }媥wZ`*,4Jl-a lŠ@Mr Q9#'8Q ]`R\ь39u1oR`m&܀N#T|7W<=8l.|z /JR/S4K)#Arsa!Y@.Q@vJ;VexJǝc•81 Οx6FefЇ9Gȫ18E:T'wx2_N%ס1#-?_"9FIQ4YR$k}Ӷpu=JA \ 6ZLk"l;Q p_NvL=H{vCV{tTD$53spBܚ x ˛(ƘQX7y̤~t#*.%ϐLpH$-Ƥ<@֫AԪ(~ȨȧTq RF8aa//}sF![HPXZbj`Q mH Eu:W-6[xL#pꪪ7 9fȑ{P{<Ty~00  kPӺ 9q'Q_ǖo[l_Z Qg|md+^HXj'xsxz 5{*ZG8}Z܁JAA=nKY86.>W  cV9E>wٔ*y5,@ņy{fyYLR|░$*ǽUgSə w8)5AAϜ1Rcjh*'{E҅JaFЃ{)E^+v gcIck-Yq)>0` 1߂.hGGw#9}Tf|g)8lQ"x HF{Hsx>F[h3H2ǹYkcNZ󈆩Ե^#ODlL܏b2 +J-[d[/^ QBiѵ  acu@kv q]_1ƚ+\d_fw85|ޟho?M$8j2 ?v:3yc$A442fS]쮉G_'DzjR?{t#M: w`lF1jw… u ^'$M81kZ/z"i`Nu2lLA8p0W"vb{U $GwgZfAgb>nEJo90#[ukah5l1lIQDX{q 5p史ULbK& ;1>NYqy6+oZ 7m`ܣD pp/VI-Mrh제hqz]a*ǔLc?6(&Pa]CL|"IV^К|Ȗg{tg,>ih cM'ɲI崊4BYBq(N<lJȨt]+6e@ʠAcRzCa_aWL=?v˟(XG"SVyf(`{{ϭpM21 o`="`m\Lv/ ,(=&qp\xm[$bg 1`\5⢭[OBWʒ*W%kRE H(0}w*Fɬ!dƒ%-% Hk"` LcJr*57 c 3A2}ǁ7K,I Ky<# b~"u2rB]y\)=[ gwv)E""巚3&J苓N%G:+_bs֎ L '%_rlo7$.EA;v#)A lF@`NR9E–Q+"$qE63 ޼e#ZM4F%%=_z8m*q_#p6Hcaω@18d;c~HdL6w=듍 ອ@(ٶφ{441L|NЏZ?fvN{BLގ0RDOJD9z%1-k%gl8zfT G88N2o|߽뛢 ":3a1C=,fM!%J˛hV9eԥB1z3cHoz|b?׀+C4X  cEYNZ;ppu.g}9$,‚ `7ZA ZZ5٠qdLf?Z%ʬH^euXxҭ+ EfE <~!4`-211 p3>-#'80UoxJu͜S$y 6Y~9f]qPpZ[KyCnN7%6O%Zw;Gcs4S$#7.5bk2ݖ']uMwJJc}~٬ly Hm !뙁OgL8h%Y}]n,$zYl~PzOks`9ʛ_u*WD "3(7_^nFoF[LLyw"OD(4Y g-FΈAPJ$7\F|oU9Iw͠=iA'AM (F9= ?Qxj OKwT-CxH".O* Wp:i{>SM$\Xu8~/Op\gf%NNSG@cr )G"wݜ +QU8s"d5* %Gy"/̦'qTsD>xΙ~GY XrZ*tZ<B țq v-,<ѩV12sy5:2zH#&YB6rvF|zΑwq\2hr{n|}]θ {:2  Mon׆ wkiME7/àڔ`N;bIQ8,0W u!5Lj낯L664U!d̛0hDɁ"߽W[#zbzdTHٝٶް 9u$:ŢP礮~gn rԋMJdY2$Q"ДR)"0JҶΟHkj9kb8gO1(o|z#ВVh}[B6OϯQSp(C@]!FVHu;',g[㙱AVdE`;5MO^xdz *[y#=Ƨ-\p|z"ӔI.7SF[$v`B/KFL-ѮX0 1dt?"-jj 5]t)/ŭmzB\y@k’23jqc K)*k8EG5$y1`BqqtᚊHLJB K!M2hG>, J? 0נEyP҇9<1(ϽgP;cE(9IR0A"H;n=W&+$chSi\ tn(ĦǽhZVd吇i}2n){VY1{~~X 13;~oXT9a|TÈ !l`1rBh8PWF3|Gl)fACx' *p(pE\u :-|IMG;} A)mIqH3\H^42s=j󚴱?~$,qG3 lDd>o{o,B jϗgЖ%"TdyOE5dVԤz 8G}#ճ l\I,IJUS6;=:j0Q66l% FGS,d1уs Ypk#EuLЏTёT蛖). fPUE6f_Ю׈F9fVa1upy]uMZbPX@1vmJ]ߦ- CERYIV,) 7n,wA=6G].jmϐ5dG#\&M\'v!s!;!S} ͷ{cFoy80ь9r{8j6d˷= "6m[G]b5!"NaVis[C@{:Ӌ7q*qM A&pLQ"Y@#Gy=qݍGDS@1ٛpǤx4Y{/~BϢ{& xq_O2Qp %15qIOGXYBZLӅ_?8똜l_b̸ 6Cc8zg Kpt*oҸ ޡ}R.hՔl=# c=)y,v: 1 NyP: Z7]{Ag^<7Tq3@(fч]*EuK5{kOo 0ۊ{`8N}1K%P3J6$H~^;8* !P*B18g eıqE,̲UY>3ksu[I|'M "xFp7z40qA{nFIiGP$v~׸YN6XmGMݙq~/p8׺ yN/(,:403,T'psXsV#-~¸g4,gf~:I6|)G{!'`~HH\ԵYpJ'G:U *XGHhd{.V_lge:FYgdAVG;u}!WuTg68IAee'n~8_5܏?CaKŌ~=j:+OK~v~efo[!3ίQkd#7VT2byx,ǽ,OaU#+n@Hk:_09 FY C >\|ւ'/m{>_$>;9l1NbZ^z6R2<~ OOl-TWɭ{o7v`KJ ᑓLJ#ʝHHB-iޟ!C{fPd`ZއjSg|$7tzx ep9Bn!^[虳+lT<i4s9wIϚH(e]`>~]&TVIu҃Q$[qbS OuZ [xLj`3Vu_b%JI [#$&H,=Dpuie!DCJ>yԴU)qPTi6"ÆGkDk)$AxIxT3Lϯ; b fynLWtog1q@ 69m̻tvV\IiO'9@4鱼'V3Wxu߂ 鸯2V C7EHzsƂ~~N tM4(buȇ9E<w$ss&=RVx JZ-gq:5\zMR}qȶ+z |=HEIf/cܑ,=6:/G96sX}oWfxR"l~f,=c]l`[Lh}M>Hq<(^H MtZaQ {^1}Ъ(#-7ヌ=)!?xς8 g'U;IPQE͔7%3¦\ӮѷX/KT#z4 AS1c`>;yϱ{ҙp\+)-"xh) h FM2ax'!h|~c'H}]~pb3y?`&7Zhߨ ?CͩI#OlekYIkzxg,?HN` sjҤ8! $h!{G=t,4&\6?fxb故"t}W~/e. CVף2ҷQ Za TrjbE1g1i!su}FLX3,e^t0b X io w3&eWZw<րak8qA޼cZy"5Gq9bg; Z"t5/(@Fv2d>׻9Ϥz/[x)MFA{ 3y-gJ 4= Yrz2 "Ժ%+.(pwl1T9P}3l]唙i =_`V*4`~;(Hy%@S/ p T ֦/+.W#?kN5ABC>CmFLg|]2!>)̢JL׷Bgio`v*#1+c/ vhǽCoeF4VR)x$K^Y@j Is(x.*Գ;eYHDgc~HdyNd; [lǏ>G灛0 ?OӽP6 ~0w<2:sdAuh&-U7;2GqŹ!hOI~ܾo/v@w:&̀Xe5lWNB|D.\ހ$w_q!Q)Af~T PY~S,#J P"ֺ;5W$S^=gI,BσXn$^5hGzC=DS5>紃4\Ex@O~Cn1K1w6~o-_Wɴ@EH(9Ody37&@vg(f}6p?lş_ xEn!3r 6Àk:9[2^y-DlpNN8gAhfz&WMCz+h-SoRp:c讕}x*/i>{5)I:c`$z.?rGBa٠/X?|Ih*c~By߿7 ,*(W~.c|,B.J#rb^wUX]Ͻ 3*tvG`#76Vm?+{F{^m"7R 72t@Aabο/N05!B,MzFTǽEkr-:MLKRYj! C4dZ|II7/@Ƃ*If[ >8](3M[Úq < Zls@>ib [:(6cg/ RO@ٍoe‰5 5y&gk\6S[!& /), àShJu/θOnȋ(ޥ6YzNHW3i=BmЏ-{nʔ̩FV=gv9ej)Ɗ8`;:%QuSN{OJe!1볦w̕uT9p#'1sS_*y Lvrny~}e}QGjΉq8?p.yW]/8+?? >_F?p4z;.38!ӫ_7~b,~+on01xf\d+-Ci ID8)4g z؀PbҺ| ƃ |ƻaDlqf9 r p>|}v/9.q9,TFbϦUSjjiӴ.ɟ;'\S!m\TTHS*^C+"ь:՚n(}:3;#@q.̡8cqROS6M{؟MBeKsy%eH-}(ō4FѨFc{tj /&X4"Z %Hiy>s|N=&kCkG5^*s0}9K a6C t4d8ZB3zxlwTh`,OC͋yK!{xZұp%ދAaX3Q18͂b%5 8:N\,ˆLIifC"'"0oJy})h,kpoqm%{|ngq M^Dul8O{B:f#hZ<0W0ǞUu/'Wz'5 2'HzPNZ&VHh@k B#9z*F(;m:I`<{Z}BI%НTǜ8ʈ~ܟN"6|i%Qv 6r榵 :q67p\_lW|-xT~DdB"OzL>^xZ#I7euWC.GzẮO& ߕІldvEk@SA!nϚvL3 iM&Z^W)R RTdO׾rs޳"7PQ3d8 }/hKHB*3/=. stL'hGFcqrA 9]ƽYB{doKm?6NAE\ wG{1k4Kb81ywӸ "h%3wgs.@z5%l8Ƹ0n/ ]0ຊ˺Jۢ:ޖt1u\4"0ˑx y9>ȄY}gQ| IDATGޣxIW5EwV6| Fr)? خ"]2ϒ^'䇩;g0<"Xđ?7\rEyumMH^|yZra[[Dk,a,5 +St "w {ǜ ~UFI`ꗍ{<^۟eǓf崲 +WG@EIWEdaW(|"qӓ}  ^G{v-)KHexdA2Z(ֵZs`+-Ty3Rr%ݢ^ϐ17.DqMNiR$iB塤7^=E٬4Zko^SۄxOD+QyON)%)sdbNfGz7_8`h8*4Ř-b]&׎9ҟuZGj{%IrHS2-^ncӞ.twe0j#x;#%UT?us*P-ٔf\gDBo%,du6OX6)9RY Zy2kc<_ UxZ#Z)? IfĄ-Y4mvsx;^wXD7H ̤_Q~+a~YVO*:ʌ {'1cп-^ hZ]YߵhSNIirrr696#L`y>  ?7(ywr,Dwpͽۊ ߧ^_뵙Iw9GVp#!Z]|aD]AD`%0 ?fx؉D~}e.尢 Z/{QHH~Op?kjߤڲAb V)I7 SY:!B(yXn߼^~;*=iy8?(Qa=a̞vh>gB⅑&P<)ޞUgVbWImD[#/:Jn , G7L[sL)qǝ&Μ߬7~JVͣ_X8XH"l nhȍ*u;=y/fsNK͆ roKR(b0'LlLϊɤV V_l6dG%ˆ|zavdWdٱ~ C.z]n$S\I$nhDUJ%HF#r/Q-?ΩXZkA4Nϩdz5hiȩg[s)74UlcpaXtXiJy0^Yo' NԞ~gKc4yIN9f̥|FgdLRT6e1Cqcy]!AIG uBfA )QO ՚[K 2r_;te`XC6[S6ϦŶgCi5()羞1ϕ݊,xWW4L-=+!).gPKͽ'cϩE1zrqy@kx+u嬸X#r}u~U2ǧ~9y )i[Yq b&qz }LD|([WyC? [}ܷ:op/X=;S>2=<$uǀaޠ16s?}~%K~ Q{n7O|YȽΘJ'|Hrj9 !'D/@^p\p_#"_ 0Ί=Bm?4 sSY&ZčkEiƮ>'̻7SuYJ|,:9-'-=#֪<&Ԑ\V,bLvqϙMbCLwYr$iK=H/+i fbB|F 1q_!L& m4/x fMf vr 0ãbjf*8 <*%I){-]Uݬ!n1g\fn4:T6d +ü3kZe2E yV^ @ePlf^`fP hSQ{qk'>hQ>lⲠ;I=F2R@ߣ*Q` '?#2Ɣj/Y+_'<\8=3`\!aD'#)Ni;%9m:X9^/χ5_㺕8`'k gX9+,R eMq mBޡ9ci6էK[R'4z4~gpN\zD G-Ήdi5@l,D(+(mPLfA%,;Vf'Qut _VU+RQRk R gE MEu"ˢ}46' °FsP( ɪ1,܃4315wl4kKFwY@ js숼㰺t9T,/ZG)>ڔZ3*7IoIe'j,:7!lӸ~ Y2yXGO?:JP,Sz܊H]ƻ-^S%g9 u~6\1=HC.W.-Ydi A ņ&a_,FFrJ /`ٜاg5^ugbSʭQ<]JZ Y~zAa7 pk3ߎ88#"HdWyV>o7o2`uzo^lao_ST8sk3ܢ@垭ׄ)qeoG#;FC(It(82NMIs>bj( ѩ E%FnA0uN FOeǵRp>g\G)Jz!d5 ̉Sg(\ˢ8{uk8%kHNKȸG-d.-h͎h:'>N0hp 3$³`RA?JK5 RH ~u|)hNC<25č?EnGcK%p=}N>ˢggd]{QQ7N:[ʷi\) /w7Mz{k-s";Ո6HzU)c-$ט~F%XDT{i/I^9o"UKdAZqS 4[zw`)\N\7fA]kȈ’Qswo=,фkWQXPZzr,M/REgju]cQnz^s[悶axsO|o/{}m#TxQAHH'+7Hs/̓ -cRP}ˢ}' ?)I+lv0'6#<5b"fp@sYD~ A}d6X ?l,b`~S*zؑOtᄌkd> xE% Ô|j-_ݏ_K孫Y4'yuROS(y=<6tNL=M f+ !聣F6ݕ*ǔH.(kFv},|K|^m]#2#Sh :3-`ieQoT} {G6ܯJj#LM4u|\"] ?_ ƥ9)|(s,Ş ާl=o* Xo@)9th@wxFu8NDan<{К#O0[|_ޠ)[2ku< :. h"ERf@)gsXt5|g>hM0$դ\7"z+|Ҙ}.9$~F|unSDl+Sa^Ÿ>~<|YYָwUTT/Q8 XX>H»uTA5SwWWDd&ljzS΀l|^†^2pL_VX!u08!x<*$TG?YPi}W cCX?L8T7Ĝ`LwHy)ZwPgI1(å A12c9zq/| *u]d2=ݏ#&@92[!/cWM,ig Mϊ=.L~G_7+ցMzhF|lӦpiXE Df:+G):sb;g˱Ga+,+;$勷 *rH}! T@ٴ6YnI1#Nll-;}咾_󀮤+s, bd&CPE ey0lϫw\|5ۖW!R SE= p v4ЭMb@u;ƀ\^2Sa|jU\xx<{d PNjc"x_Q#/pN@L>uqPt0|J9u|hc%c!f Ubos6Vs*7Z? #eUϡ)N/B6?'z8LxSJwe n>KA667hr@KQp#5^Q?H0 `ShǤ2{( N$S b{pTQZ':6xQN%8 Ȭ@G2gsek~mzO.הx G*VzQPnײM 붩²m^;ȦR f\ Rk]$vmɞzDO𓅟oMM9-مi ӏ$_.oc)gx?Ga)z\gg/JJ)P3)B'YiQZ?N]#Da7_`EoA);ݾ~MIqI7`ZDl3wYMse}K)ϏޢG|;>-&2BQ';Y **'~!*+6)X7 O@n~p/5D)iξv/pCsHs+_ hsUIM n=:þ9EH0H+G2遥tEd+('9$Be A s=JZ%qzPbAz1 uL i iW{ʛ >nn b] ACt0 X##I`cH Y`)ׯ&j!)qx)sM۔2hOK0^:P]=tjQ\fXY~O1 fP dƪfou \%n{h0z'﷫0:)9W%3!>Aj ˘`OL3 D8?_A8@5čTa14Z_  ɭ1.6yZ紒GNc{x4&Ҽ^̌.! p器9 h1|4{ȴBy/ը[WDi7ue.^<;en T Z\y"\(?ɌY⋾d*j-ȸ6} у8,!2lϸS:$ĄO:[ܜ IDATHm}}ޙx5HXRnbM9S&ZDq;]e){T[ƆMF%U)Ԓ~DO, |{sR]k6aO͢/pڅv=~C'Z1^]6f0A Y(346(S %6 %<,2#hSItNLG&o=2%yLfaS]qsR:dfwgJIwQkW{RM>ݣ(%,a;hu(oH/!{4P69Atn 6I"F [\ɻwWw1iU$fd4pRni}/i ՟I;Vy_ocy&/6[N% wAd!s~cO-W|5xA6qA e5oomM#"oE/fwU6madP_5)3}fh9RRIc3+et ?ؘ_,苈NI* &.*&͇8 hFVmz}-d2) PJJҗKD[ `8a'G6TF@NJ1o 6.AĔeIOΩF鷑;)]]DhHzFAp5$#b,4`vrbz_6XqP aIo,2&uA'E}PM;gΧDI`>Ƚ JE7Dc|"8evVp]6A*H8?~mpR+5+^W_k^$YDѠ/S&382={.hh0ښO U~%$RS>.ctY JMDY9Jhd-$G520d-qNE2zL))S6%QCA[ ZaAEdFO 5Ɉ!x'p%jp4h3~,eO|5k-Lq-__ZD J,^ S.efwLHWd?͐0؋noJǢ&wk=rO"b!JEɆyH/6(q,Nf . 2^Z&ԧDq/ 78Yol=ffM …(.sۦcYȎ܇W1:޲B& XoRzg3(AAy_Z+hz])_Gh>}z(Ed@\X3f}3M~ +$ Z%k"p!!m9%aߐ} E>s?5F- )7%3uyfRަi }3! lSDLo(NriT=N3DcyG|I I6r]1faw+eΨLωcRgUz.q3-l{h[n"lդO(QxpNǔ^ E}|ς  (Ω%?T.)͕F~F[TYju^YfSk@X2'D+ht3! cvm߁D_|0#]9_˄6 XMY^Pf^nc,|s3rlhuo \SB̉PZrXeP%&\c]98g4$mw&0UxJ%dFcRKU 5C&8,5zъ"c‘8HK$ÔwzR´ 2["6eyaKɔ)XT&ro%1?*~Xy3{cʔ?}pZu 8qȐpE[-zZN>7W#) pPzMo*gEg  -?ZLC[ݽ]hXWGJl7<@3x8z/47Gp2)"yTfl.Ս! J·g氦sl`-Nc2 \%<||8tD E&ѼՕ͝"SWg&f3 Jop:ā5w_]BP,J@A \477A}Tޣ\£'ywor_giQPgX܍N y'}nnCo- 1nn^RR-`%YP 塳h2 LKhlk"@;zH@i۽Oޡ !Pe4JATU4"AYi¢[ uFdj]pic|#+TGq@vTt-p$K԰(7$s{]SDpEljmҔy+dIoi J]th M$7 ؂T'P2PJ@:⺮hD;Γ+pxٰ9\< ݊CNJzחD*f!ezK(-ee9#~fȏ?ud> ~2\Qӎ/qE[1_q c $ڧi[IY98 kqJSj6M43|¶boA:Ftu̟6?-M_70:Au/9Qk# nAA>`a97 fߠ@cmA7~߽VıI͂9 u@Fٌ Nvs}51B.j6PY1/ a6c5 E:f7(-5u 1L 6#^@ـ,&Z{|T>BtG(`GtAU )?Y3br&l˲y L01}Ӷp]BV)BF 7 UloI%mAwG1.#~L"@k(<#duJ`ZCp ޚUBUEAIrBW.vy0wD!Ŏ~A9NZϱ­q̏uBh^T 5=`AkrZ~񩼬ρxo_پu@ᕞE/N gԝʉ}"#(Pw]}N䖅(,k+CRu}{qD}<>X,ׂ<xLᅤZY J7|^OظbbZ -'J=Pq6mx?$kw!>{mJݻxuGo,v}O5,*/ m޻) YAsc0skAj۲r͑ J.8aQjLp:܁j]2p0 >?81=LO#}CkDo3Pt˥skT0WOM^fh#U8-Qݶ=DQX"=>=ܗlr #])ݾO6Ea79m,$^f@zIiܦNp` K6MonEp^J|eW0*de<<x7M+[{ܚ.NRYOk[VV  H{/8ѓMAہT{n@q]Ch逾`_`apAg(_ aNj_^dn >c` y{s8/^ᐽfߨ5w[cՂ繚,хR%ͩC>>O|-ƒ6>^RMH,E^#7NqI0 @6ᭈ6zGfm9W11gc  foS>UqׇR!8q 5*4_wxp ƀgkreF7M'ȇ)S<4 }R]r¿CHQR!l7i̝҈1;Jy3 pJr%#^fⴗ2]Q;2?B95+ÃӇa>+ΆBN\[Fl/.R kgé@'F\>Og?|BO+ :e7\/Q1MA(}A\1#FQ7%O;)P y'飯'8%k723"DgEsf sS#4+,HNKNN9\gԳX:V|zPaQϓʡ!ӎ1,(,'&@ uRvZgl}{ ,Bɲbl zy(@U-(aZ !Bz /+ΚzKH߿H! +ď3% . 3uZ2wr*3g3@ZfnLQ$Ph}3qS>.G}fkFQify p:bׂbM1jƝ/r8"{6'͔T6xECD?q2)-}yzlTrƤ0dDٔ^s[N/ِY[[P(̴PB. 5 RТXY#g+YdokLq*=<ۤd7b3_)hRjbs;ϿE{^X"Ia_~dߥvN hı z+ULb;fE>]#GKj6%qarRvݩcMo$sL'%ŷk~41K^,>Ԝ() %ߑYmw>]gC.5doSگD:zpkQAK(1^0/ Uٖ(>BB>Qjlϱnro"bșY|~n)7i1yMOZU#pH}KCb=sI6$p%Dˀr" /3+(=eXy7 2R0q\GtdC_ؽ+\9mpVqX|A0KH->iLDCjq٭>x1!8F3| z|u5O?3y*P10:L{ox]P Ei@{1ݙqT8P08(ԅQ%W, j"S.zE7S?x(ou)8*ƛ&U(gJAo|VSB>[TP=b}ss ZkYvb1-Upl@~<(>a%3GoK _Ob| ]k}Zu/i/ʩے8*% Wg,FAEY]̂!oQY)9Jz|#_2*Bh'NOܯ}#"32̙3Z'@xSڜ*m}7Bk/X0e% MAUUxz )b!u}Mc0?[Qzs9n8ʱTC3Bv$YxA $Q*3,=5#>'bh^6e1e7_`U1+(=zi0AjN ( ԭ15GUTY춄^,s,bPwH-Cޒ/anl"bn΂:y# _} e ƾGK;،~5B~|GZd/5F6vDևPb[><zOhA7N5}ßѯGVq{Ux_2a]2Fqe#s3nT3'ǣ0ZHV>/> g2aW.R R\ՈC"00C@ W窴% T嚓1](Q`^qx> #M}SU gQ1֡rLxk"hdc DM:4(l{"`6)|8Q'~1d,?)=3 yѯ1 ؐώ6L U+n1 K ~#/1ŰwL.:,bZDlr VSNG}`H4}@iAS9s羭+וeQ3^OtZt|`b"l]0?#f`2OREL3TdM. N͟gW Qxes*+Frلx?nQ#ɠp998fي8ঐKk(H::ljK4Tdq`V R<(=-x(^ʴ98PLZ(L;1$?t61LbOSΕL^R-@ U%wR,/U֖ۡ~GS>u?dR ہ'ni~G=hl^ϊ5Y#K'Yw9qN&2>{mi|=~_$Ţ@ ;\BVUd(3x2u[PqJzLfaɢ!3b,Ft}zˣSF,EN ^27q/a xv36G4E m|~BpsxiDn6"y|< q:c6D^EjHFM[::6zΠzwਕ"e, ag,4>?Sʂ7cM,%.8#(ȘSl~S1}\(Z͢#UXo \,,^A r*(>)!s5s.heý07(inr $"BYvЈSI5[5HrRm3ڊ> X;DjN)3#~#N(#M=E?'`EoOT iE,y>865,<y@Z_"gƸsIENDB`binwiederhier-ntfy-5ad2431/.github/images/screenshot-phone-detail.jpg000066400000000000000000007017501517171047500257120ustar00rootroot00000000000000JFIF(ICC_PROFILEmntrRGB XYZ acsp- desctrXYZdgXYZxbXYZrTRC(gTRC(bTRC(wtptcprt\z fw:.15{kOb1^f \+][nq_|bi&"Yw"|{W/r6LoT6jղ:XE!US4cg!ӏ+em4@ qT|.2L|t=#ڝ9uY򼾖>mmlů5yB]^q;㌳ RQ0e=vᄔdUGjt'I壶ni2j.q,CgBZ8ܧj:[l$"} ICA~buAYc-ym?F"au!}xt~v=gtf)kOobkw񏡃8^x-]}^8Zzg,y=gqesDǖ/Z^yS^'j2VMI8L29/(TuTQ>H$!Θ5lO8ѱc;Q&-fp \yb:'lH9c$xq'+mþj"$J!^a}Uv_wxUhy*)*E8ߘnVk mGd(:[g8h^IߢY?I|GM.yHŎ^6>;{{O}C)iz89rNb|,-_g|tVx k%$)fu̵Ulo$I,\%RMB0UϒH|_Ocڟ?քi~W}뮛)v ͪY=}8ɥӃxm|>џ Dx|t(wII^n5()ǣ\r*%c?<*)r'l|xW"yqE%|׵Zo5-+$YpD6j!ս+Er:ltP:ֺgwp¡Ki#3v1$NA<%5|ECfYKa%MǪ&[ kyMvqXy'>^^SݍW9u!xpg79 +-mҘqū9refmzN9@F篓S(HErN E;H #;|4QeYUHQ:8[[zWNגPҒp(vYF4w^\+̛lEeR)f)E-#^^RGyûB\1QFQpɹYO]Xfdb`&&HbT=  bcLwv=WP,;%-u߇!Xˋl;ާKck+VrTQl-uL V^R!T2hDz!ɒ?. .t ^TV"v(T1Æmߢɔ3v|`ŗz{s,GO@/L6k^#v(:Ģm|kh.rT. $UN{xn/\kh;fJEN5hi0nM2'LSC٫L>uZcxϴf";DM{=;wr<;m~K~` '?*JtC%߽:(Ʋn؊+'(l #tUZcA :]<( :u?{v6SBY=qLPY&1N'q=3/p{jo5{Vkk#ʳ1:/O%hr;r\)pN%56˽yڙx{Lcb& 7O_?T5Wius+lyOa4EH7?v (甦^1Ջen%pU]K*)60b(b2Sc81 t/NEY+lDIb$H32SJ)27~>Uw I$=ǒk5-޶DżQ{iW7\!1:4r6`ۭ7b;ͫ14)נ/4e4Md[t*<#23)Y%ݫrS pʨf܊x QUbIGȨ=וGz(/Jh[E;*'naF9ǠC{B-u6bt܊M3džڷ#+KXN{~w1P~^B-3qbre#^ LqRo:EN8aepYmɒ6MClĤ^Rz&h&Npcg4MhE|3ڵv;Hi\ƷommoOm{gTɹW69k^,c,8uV1eؚ!†s0䅭Jbr$5ڲe~\[Ra\4Yf7_9@&H;O:4in:tdlnVp*h)̢,I&SC!rlsy aHAgd;fo-oܵns2 |t1S29.3w?MgZ6EƸWOqtpt1qmSG `RJb2L5xxWE|QyhVi򈉘V?Mkܶ>"^>J{>CcswJ~(MoXZژ|cxt>%%嫎8x=oEe/3 %ҋpd3;eάAhMpK+NRѼR5C|ԤJ3i>3yr1uY`Oi{ڻٶrWK,ymţbBDOK08r"KF 6&#H(lԩ&7}uOM b#&:^k1lw^⧫vDDv){z]3)ZgCn6xKcl4|db"o /fԺa;&շESfdɈt˗I&Mo,v&uVP.s7G~}S\"HzЧW%.Nl&\0cLl =r6_CɌRֶ9.3(&LLHc9vrS39]]Nd,"ԛX6NQZBA5YurQB\#bqmx;DGzwrq]'gSZovub)[Sbmk־,ulϬ^ }@(ko4 뀼[ˎkWmUw152tv66rɗ tR˖~2աZ{=@}4*S%sI~ rJCQ#6SS/^'9!'/q9{&63La'W5"&-5'D3?O?Oo>N;Wvݾ,lϊL8R`Vcf"Lx:gJ*De#ÞU riW*A3)aB&O.+L&i=?~ktUlngnruLl~s Yϊkz[4Ge1sk>:BWSibmNf}j'ӈ拤O̓-;k< M>XTfZLtE|GrDTMWh5o"H;t=p6Z)HYݝQ[E7~yO'*Yrx"ٌT?Wm5ou~)Q便d:218>nѓ&ӕ1SEQUNl11;`C=i-;J1˴Q/춆#/f:=c'Ӣbsp|aMg"/; 9_Y2ZW$SVR, kfnOg3/v6+X;;wz=87t4# 2ڹkLxuzdkziu۵W}OWaidu'3HmY[?re!wu>|dMC&YV,鬶\̶ccoVM݆R^˔Đ;L;Ecg3" f{7[D69mgqũ{b'i/?PquݲESK޶ȳ.${YmX9|/$HQ#5"Ȯ|=%0c(l61۬vG2KvAu1Y:j!b8wn-hr,ebR:b\SOq9eDg})bFJHai Z޶юkyDӼsL1rHtf:k䫵9#6Mlw2c?N|thץqb+@$40e4Ed۫:~NpI'sIM$SvhŢ+zvY5"m6_\-Rm+rID)I2ptZ1h^ݣuNȱ=ec?hs'pVT W8AG$TTiSzgTk`Is/fCcA͚1cǖX?V=?f7< J9bϴ;SjפZ|y)kҙ!ϛ"\c-}C^`UuNeqR]#-ptY]5"(&pAqYx g-DyxgD=.w:p[vZ{Zئ˷WGsJֻL%qNZ-rRscsc;1|ys0;ӈ?(v=]Q elؓfZ ED[3lgΤLJԦhC)% 8aW&ضxWi!'lt,EnGJJqNSnܜ7'Gh4eǹ1~tHPrUrTF4\<4Z|(Ŋ+-oR"k<6O~:Kܜ^TN}qg18?dͽmYv/LRm࿮f,jXf9LD4etĕtΒ6IJ2a,c.p_s[u-^(vO/cCB9h*PMɻw`HɏWW>!;;r9Ool̤M {"aMvۺ["SK˩ +!Y~8m^]4Jwf)E+~&^z%n;O}}e1qg-kͯǏiX ,^:7ϓI9/Ưÿ{>M'> ,c4Wk^;^3^f-۷yxnoὗg_!k3cΕ"[4lb/"|$XǦ k8 (R:Lȫ[aK92iifk$'*U_e=1gK5u \a-yZ9|ՠĮY,RkeN&993̷#X>?y:vY$23]_ygQ8rj*c=mg&{LV{|w>s]q?ox'ɚvi|'8}NJNMls1>ZW%b8o0WN֛_]Zhg:9pђ:NIV(ɫ\ɴoNbiMVg))'6 &fÇβh%ܫܒ':ה< }ze-R352nh |as1Mc㰡d|лmksDIZU).a24r3*ئ ŧ=[u<$!9MB-eNj^okjRv3cǜQ?^9-ܵN4wښZ"]Z٩ڸާ "5tq:GqgNΫ~Q-) FK({r|`=$u%^+ov>VuHDݷk"F-1@d#dc%ݠQzbؿxi9jɉ.. <]& <.duhŠ/TWpq,{O-,;ͣQߴv.o5uԮƟҘrx㧪Պwy~>—[vν4FdTh9va|lld[fq/&ڤSu8pe2lYm]Sndlv7i+*ei%NB:xFͰRhІéY[F)8.K7v>}{jOmbf9,lGc $7!};BQG [()ⴞzmر X<,T_&fNEVS)F(Rt̹61cciZootEk]#~xeඳ_=[{~mw{{S;z6ɋ\Xga+gJGYRQkTͅvuYp&%]ˤF qY+'[W(N2S6W8ǘF7oS&~nБSvL]1n=@.vmOZXl9'%)YG÷e]ucv;R)KGxDq/+HX lHX8͙Ai5)J劉 !!e\ٵi:$e12Z'omi&+k~˛-6[+Ke82ly,uSm.(immڏU~E^~rB}w;R$\K陜HIYS9zFƊDnsj g`ѼqT_4B6𹞇r;1j'2Q#]u\fh4fenX{16U%!Wm➼xXe! "wfGhް+_h'h TgZ"keZeb-#s103hJ4k6rXم[:e334oYgD?ʬ)~^pB\|Vi cWW[9Ze8KbKe׽# oz[$.VXQ V2pj4q]۹%pHo-FJV3w$ݒ5*TE/)Ό>/ڿiMGٗiv[Y'ͣd6MWvLި*f:lC΁leHlg$;#LM战XQ@Hs^SvIj }`-{F-V&$NE:k^;h6(EynErQun+8Y}L[OH.ҕVM=a't®\9u=U 6 V[ŻmDϗ<ì6._ͿcBj_&ަKeǒo90'Yͫ7F՚R:6&W+PH*tj9 01veY7M ꫢi.B,FGooi-j߭';a|nrsR$h H"DI4ˎ 4JLGf\1ܦ8]Tu6;R+H^)HD+a7Lk;ңn[{^ζ- %?!_D8xfQ %$Wz5$0߮vʠrc*T]z TD '9'gL9KEu^B}$"kE3Rl$G]l]~DzqR˱$8ie圵ZŖ4o?sM^-]-.̉;Rb31R=ϴGitܯܦ ڹy,mL֤f㹞.&f–u}af{vdVo]֐6l5[)_h{W'YoE2ۗߪhiӶx{ZkA!(ph [݆&= N>M]G.|~΂ƼdҚzVժ&–rffD#춎ῦdԪëw5'W\V<0ɨ*١T4*mvDER <6Vּ-7DD#&շOy&>WCO?!py?[eϱ->|VM5v4o{NzΗjaͱ2r~;WoZ;?/nbl -0 zC8G&dSҡ)7=Ilr5[c#oV,mKN4q DuY}*&+)yxS%fZ)o7JUʦň;f,g?]1ɴU$KRlV6tQ4JxT_wv{sX#.WkSg'2n^6'ӭsV5-oYyσh,\D֨?>jkK>O5[hsډsU@fn)gIM(2yl.7IRͧbG# {/cFZ5Uͣ*Jn Xxῶ%yQfH{%QLfmg ٘RHneU'nJDʕL)'x ~)ҜRCH5T1;ĒYӕ_ %xS. P[Uet}fnX [y,0vB⾻u%ߘNZu 1xXc☛cv7zZ}ݧlWcq9o`7?k5IzΆǃ~k=L^c M|⶯ S \G+jP.E0Ğ?[m\k:?,КP9;yjui]LZ`ራƎA\6dURH !M ƶ>kɷ˧M~w-qZՋZi3e.[2y&ϑt֋fe]`wolqW'Iz|)垱4UmJPGR%}mx\ch;`:Pv}zԽ)S? xL6:>9NkZާ#cJroWݶ8<1Y:N?!e7$LUpQ+>%̳nmZk))9TcwZل|F m 2щM: dHMaf!'ŗe$teUˬ"J^lӚ鼸K3K$Ň_wQ4mŐb O9DrDK O ݎ◻Cm avڼ{]zIJ;j4STZ:P3lZUEK9I/4b350-rrҼɃ9!US1pr%61\E8-&њ1;LS{'_=x})W6==x6 鯱n^4Ŗkɓ f9kYR2SJf .Z|Pܼߥ@O4ȵۙzTZq}TYyz|k$ԒZ:R18dBY:I&FFcU5--S" #y㵲81~ȆhW85mVQ02RᙖmcM|C]] _])"N:;' K`;3m6Թ/zߓ}+_;No_9}=a mɦglr[CPKfYWY5#Y$4d+ru2i/r`b[&*~:@F iTX ua#QM۾QvQ)F3Mq<䬔>޷SNyO1w1Is|ͱjbեk޶Ó[-7o[OV'G#j`-5Ł>:gWE[sL(Je-EiW8kJɺ6U]o:A|f5T`-+uH ?cR<^6̑cΊo Hr<3 j"ULC.e?sN=U87WQlHy :&- {èwRH$اcvm>v'outy>|]AGc0sڜV-`^Kv8)iV1%<7ֺ0L(܃!ݽ6U] 9^TjX&YUM}q!rwQB®]B)~."%9I9)3a?|A6mU×+(DE3BdlWv81>鏌OO{>38]Ns3]L]L[-_\v,ݺ۷lu;qJR6QTJrqЎjeC.bQ3sX\ Rc)Txjq̚_-X%$3e&&Ql+dz=ڧrAi7豿ƷŶ`U݋0!AҴpxZk#38UeM|w-of~Gz?Wݧz[nݧpϊUf.*a 1t]w97ɺe9+>͡l5Y'̧hގ+&7\'5>i u/7u˴f&e'}T>pHV?1T>pHV?W5lDG(}>r7'I=8+hmꭘ3۶DL"O}zW۹N tO}tF[_e|3l)R-&_vME~._?sH"i&B÷nF-]۴nɩnɷWt:jo_7˗O>'yHIpۃыDWzvw8ӖJ-FZj"VBDÖpEUT:lS9Iv'h+xXخ ;±t}z?'px[y>Niޘi=(_<~uYٻR+\'| ֲOg@?KLmT_5f +3^?tT1U٬g'he-Y2F(zǏb-|0TLǢ!r81M81sߌ;헯%RwF|11t111 {4˒+۾Hxfbi]ѯ+)s%Fug~J{[ϋg4"vtF:%c%-8Ѡ-jun kDlL\섽6=wK\;xSA2Eq[moCl* ł];JF_P瞸=l*!wF)dD-HͽGLmF%6mYe9ij/ !~S'N NNEuũ{KO_{xe{/vGo9v:7Wtecх.8YyKbfXt2:Y9lٿM<ǏilNؽRmszTk`ץ5* ΛŲK% Vw+y f5#uM;K*DcTV~q.ZXdz#qp2ϚKR8p)Y$UTB,i9\]D?56iI^6xmK&b5WI: 'u| 6;VqW}dOko[LvNG٦|]U]Jƞbff6pzՙ_S8eGJh΅XH7Z UsojvYv&.ML~bxpժBwL^w/?SEt*f \pɢwcb͑T7v;ݎwvzدwzjtFN螡᯿n:7s+33K==_b"޷{:=u֜DNf^ c7#g({"uS>[I%pCllgshd}lț]]PANBOhDykL8)0R?s9۴|~t&.˚9OSN+ܙ=g޳#Lt|XY3іezh_.앉 &ID 2b)I G+5pIUɼ63//cmI,{>vD6ڧn-[8tZ/n(2MrIK&Tpw;߷oe-Fo/-""2[[͢""'?ld4|K1ұOZIF3T;a t3xtUrI6)˜;l6ʩ˝dMdIDc%@4ryg1;j 311?qmbŗ_|X3qLY11_[dŭ|h|6/O7M{}_<^zf^7]5xO"{OxL{N-=gϛ|VK2vrx-_+;wGx.AoW sXnΤWsBW:|3g-4q(]zj9.0bw g*f2m)3otsX&5k?Gr tŇ0bŻ+ҔG"!/yPOtmq7pFubEċVˆvIuG9M[z*.?t ri>ֶ5 )ΌNqs-a',JL29_s)P {v״yv=v[Gٝپ?U}b"q/[Dx&^S.sfmd"^"Y{ 5lY)ej"9j͗"*fUcɓJe{ˎɏ&;Z1ޓzZ-[Vbk1 ciVo`\i%O]f;sJeپ3Fr*R13r7D7?]O?Hk=ֳ;Gx(GyGr eG{ 䜹oce.YH-337ͦf{˥?o0ʻh֑2rrSrR332/%;v ;}#"ڊzUrەUpª,P6b#DG6w"ڮ9lDD#-169sJ'Mr;pCV&Qmof$c2kwJle[M*f9MMYeX%'e\܃Yi'jyȿYwݏQSclff+XDD{ݞGŇxgk>|X#nq彩;yvV;y{_|qqnZn /?H{ҋUp]1Y"L&ql|BC+8upU]ebN*|rccrcg9sZjq+WDwh1lOYu/_w6cig\tɒ'c_5o\8b-ڱ=KDcs <|?'}eI_/SsW$s|xM5#&.Ȓbepj`\!:aA&lSӮ!?pTʙ2I%4sd!qg&`*,xf6=f{{>{qa9 bӾ\z[Dk`o\Xf/ݼ\k ִhn8W+;Σ[EuiiCYniTO! NbAxN=IhK-_PQ˂E]oyǔϺ'f{N/pcǚ=lY&ώ)LQiŵ%m1j-x}%-F4 ;7W#"MfGm{@*iIx%nޜ[bS=f}:-[OޛtDtY:Rc`ƗhݼU|[d-:S9m籒}.ܒXLPS_iwMfX3f#n_t#SJ}I[m<[͏ζ,vï.{aM)9"}4 6y9oy6sgk( 4ۢZ=qp!d# 3]tݣɸFOζi*ua^]׷4: S+² dl5Gg pXFSW;8{yGno.]ً ]mZ4Nzfڶ={nbǷ}ZƽM/րV;'iP&md;kQIKZ +I7z|HeoG%*iKzu>qRߩWByD?hdk&k*Y  Qd?0 6c,QYh1=;wg&;]+Md5vczcN]LVrD[:$Q2-yU6RW(ìTO9U?sr8?L˄FiNХKc*Ny7+qfk|bS8xejǿc>L~ezk-;\钖ےzOnV5LW>A 3efn29pP08|\$GTfTE٦N/$+$L4Sn363=D}s>Si9h֦ϳզ=e2f0LCerD R)4~=&&-LD=\1 lj9˃&U>)S~rׄ˭jNJ}wy=ÉK~$&l6e1ro8Xc_+:eR;V~gwx;OϿH3|6>?Ƀ.-j5<ǥXf3kLmWhնvݲd]eMf9 ?Տά]$fd-)Zoa@ưMU[fzܬw&3$7I4r΢JSK;7E&;ʱǟn:x}k_6/\[Z}ᵽ\+3i nFxUL'pU o,)T;99Jsԯmj&99Y>Հ $tp!y[ij=&UPzXI ,l2tm6*½yq/%T2vH$)kHC3i5ɓ^ՏG?Z/KF8+>;e]irSnkVtbұZR3_$5\4"ymےb<@_X0~&78F ,(whb*))O9iLq1hɒ&|'Ov?ƞOmmp9(\lvE91՞g[;ǧUvHsɄ#MM=aѣWoЍbroݝAȹk^,qkZmk^ַnk{|7Rdqh|Ng|zQxH-+dv6WLKN~*XMl=[b!8W霛t]PmPT[8kgECaka@I8-SZ.‡#dѦKɒf}7I69jp_Nt*""ٲv[&|ɗ%mkOrd߇W)rNjK~=㽕tݓ;eܮr& r&6;͌|b+OW  u^ntj|EHdn!۷0pUEUoQ0lb WS:bmh3b^;v̈́+s^F|~N 7\~M7Ã?![cIٶJl&qbW{m1hOTSqqS,Umf5ehQ'ŷ%]jRy*=a՛-"V)3߷~b<#Gy{s|nsv1bűmbKǯL㵯96/kZm.KL*bR7n;jkiY{-CVڄdܷ#La^hZ&\rdG唥ƫDDLDDϾbSoZ0(դE]8$;x#\!dPLT>yr?~׋nU2]:r.9]uNuUTQCsyff+XDDzV}x0nmlկ[}ٱӴG9Jv9ԧ+ܸh1Ӑ2"1u8o 9h6]dLE E~sz_%mK֥zoKfh11jDx3[ouyk]ң`ZAHȧoGcq.^# NLkz|h: "$DǓ9bl/WjD d*E#ccmXVmXxE>1(NyX8v^!Sc&Nڦ9bLl}{0 @""' [̋(ƅ:IԄlU:HeܬX:&rlCɱc04m og]/)QW I5E&aII+ꥤس/f3(S@*JfլZՉDϺzy׷)OQLty>KŊgOӚ[\1)jHߵb'.Y*/¾ޚvs܎Q{b^GȪҶ)UJ.FF-%K'_x3{OR3QLH[dM2v Z^^o:\{OiJ׺KgQMZ;i lcC²u""XKǧ2(S,X͒otxOߴw~m}|-o\)k7ܼKaJJS$EZ+5i) J<A{Ce'iRvRflV]A`!WǰlS2$ r'Mf_gG~ݾ?K~[^W%JR}֔Lִ∭k3kLDDfS l΍|7Yֻas7{fZs1}uܔ,`I,՛'̽)ݹC]q^uz?jFzrBwG_\!%,)KhN3p$_T*Ehw(;֙m=b3tGo~>]ݪ[kC|nGb3g|,i`˵Xr^1F<mbKs(KSI(trPT&NC\z|9- W:+ԲqؗAiնqmEӏo%gy6)p#NW*!Vp2ąipZt 6]zbroø#fM/XY #$"&}::M(׹<(*UؖUE:jsyQ^0,y{Vն?)DDLD^=0z+N6?2ϣg.\YW\zǞjbh3f"h GQs.7"5vՁ_|va65 @l#O[Yݩ5vIb`ʧ]^roԴ ] Z@F5eڪ(%-ktI;39w,Wg2TNU|X#&#OyJcn^kN9Ǜfܔˇ&smJkW;Mc0G5=0^F!rziJn ϳaIg xR"؍UfoڵwXøwVLIGh#Cӝ9uW+F}նKMkleLJkv{S:_-KB Lȶ]%`NLf^Ƞ|)$-I%M3\#̢Y)9^$JNժgX+5!iD|gkwsszÈ{AlX}nJ_ɓ&\ŋ/%)Kxkkv,5o:Cd}SZǒaT¹.`peml^رc+K2} $lAUTy(Nl9i:4"թ䒅IJ+Hy^Y&m]:hy7b˿{LtNy~8pZmٝYo>< 2ޘ[&9_&cޱ ;6\T 6]x)EfG2SN"> zQ()rn'vT' @%):rDRV_|TI"'.3 /U7y1LS>^pRxoh) o"fkԝe[O_?#6c.?Jc\Z?DG{ׇm_bX!Kq.~`ŮUJ7Lx2^QL)p [U/9IHJs.2cUaDiψrogCGmAW-sXi TSulkiF6 -heI7M9cK4bT_S[SW^{vw|LGϿotDGhG=)1n 2N[K]>'Ol_>-z_>YxdBztm{qtⷖNҏXecpe9hVacPv_8HV]?lECZ^]4mYMLbBRY=b&jFOΉEısZZ1xf3=&}>S۷a;?h񛼧P{z.6#m|8oKؚ|/11? Sɣ~TE{: :?Z죊>$}zl,=_)밿xy?8꼭GM#`Vk8f[eG?clVe($r:'LΗ:ևV#PB)'Q|4̳:&1gy7LIa~@jڕm=hko g}Kk[׍4r)\6tuo=8ͭ<{#(kOi 펓3W fu Gi7$S]a4YLKZʼnL %qqo+n!-K>oaKFpE"*nMV`OjKI&Wq%;rb3Z-Jxv~13=c=A[]U~r:}7nɯf|80=1f{DN T˒xVp }3Y6xĺ)ɛ عe=v{#"deI?ĽkyTK%'0sף=ĂIB=:Lf-0Z6}Js%8e 5̜|d39ۮ;Z2cXϼ] 7K[ﱽ8_Sl^LlYÒ1Y܈+nu4}E~ԕ٘?Oa W&&,Y[A.K0lfƿ0~t\m˝oSNgggmHǸ]tدdɛ>9x%H0{!no=u\Ekh1۷iG诗's[s{:qmp؜i8Wk&Hi6Jv=aym9?iA5OSVe[:,lh=FUGdcضg&hE±ɯbt,xw=JFzhYw5eu%]pW,e"6A{ {.+>*E~l߿]˴{XosSsr7tkL8VLJ*R{ZDe[Yp<6 od7u,$6fqY;r˚2dI匫<'RI~kj}Iclu.j%ds66jTmJa^Y$W GHNALf<|N%u:»F#[vdcl$$qυD"FHEpc4x咱g˷idW;'Ggӛ٦Ɏ}'k,V_ 6 Ei:[E#6 Jó9Rc[jҧ"T ͊I7I!rRNN:O#Yᄛ #ܹfSɂ@N@u\ݤlvcXuD5pg q^b hF:xʄs!Us\ɼg?Q-c[#STUK :f<9CltGHU 6HGr g\18+zM&<b~]aK6xy>3'ɇgJa|z3U1o1cz7cdA`(4O&V9gíX^(Qr|:V=*oDvsc>f;$O^LMf&'|LLOvgv0Adͫ8&|-s3kZ3>L+uX܎~rb"=UQ^*D:zJBhjjʟ8.3$u7!c8)sQ{QCw?>Qk.?;q4s7nOȨ! ]W>#H??s?7zyjtoK}l5_OjY4݌--Q}8Ʃ+LHr}N%^Իwc܉5ʧuvf|zsl5ˋcW Njh~'!X-]#v 䬴D,?xԘ;q$fax[Zi{F_LV916o2U259YNfL!+,gqn%XHen4Q?. oYK NcV)&fdd ]Uʄ)3*&H@w8]Cxk_QIVݔw.f+HD^IVPslUXnÆd W*!/ R6͏/b#nLxΏӼGI^N_7oz?&~7>I<=u?`+dbkC1B8#44}lќ~wa,E1\(YCWFM4_X݋rd6\4j0y?'wWʖةEOH~gLj{&hQA^/wbBקԷZLYN-j^=֭&a|9ũ8gjx+*CkEU3HAHX l3fθ]"(V࠾ds2Uge:8Hc3tLL"&s1pѿ[ߜnG嵫?LGx|磙z(6pZOky|O}2aN)X8vk2jO1))3bͺ} ;P-yXt*۴Z-"feG3{2TfEg>cR?h?eT'$djd0SĬ*C<y[1Nuןx ,ʧ﯄nNi}Dd$|&38E_IJ;>^@`Q$Q8k0%oF[ՖoN-?6$M,ح}muDyw!4/)蓧sj9_⸞:Mح9R3_c%OzW1ŲJ@,GAY;=uI&mAڷEӢd%+MJiDZ0FQҸbGe41$;I tXP^qcf\vMcTM ̹U9Jy*Ff^ymĢ!龜(ZnqK(R-fԦ)lX׎*a8n6|%-xkGrww>vgO OC=E~K)kw1O9⧨[%k^':ECoMUbu#.rYMOJPE7 MוpE"Q<Xr|ZP~c:ʭ43F)Q3 ɲr',e͛0EEñlrdv֬͢O{DD;wX~}toV=;um<ɓlrϛ.F}خ]^pSQc^COMm/}Tߘ:%l;+eiqtaQplb홴M42y]umѿ}魥϶}u}?kD{VOi|\-}+\+/|{F8N??L|n]~WOZbσ,Œb afiz"ا#%w"zre7j~ЮJKL1K9_=IMf'De˥cac=S`S.S*:cSQ՚n1rqBYŏTvVE0R`6Y4k[~65iffOVA;-`\B)s2k * gzu7mGrvh;΢N%$l_U6YJŁ\8jFOr#k,]q=";=1ߴNj;tUz1زlsσS)ˋ.k ھ,~?nl1K&BdGI_)UQ?Y_1#cƑI"pc& mO$îfM~ԕ)ϘV4DEJ~4tq#4q+^= GʽXqXDNY2tU\\fl\8bIXkB9lh$\>M 5XrQ^inyϋDv߼v]3_'oP枏s;qhMqJ]f֜yi[['+YuS'zܤWE8J=="مbA#dk9fѧdB%Vs{+{Ta-.J1; > b^Y\ccdYXLZf؜Zٜe-=ͫ蛳۷fw__.m FәGõe#=llc8縉0VkI>)>/&}m-,Ull^&oH۴dw_ Dx;FaH Qum#]8k{ HҰKA-N$h&JR\f%1b1C`9s.{bJb38;@0m>;x1=#ە\6.K_^NZgbpVm;{1|18 {;gxn;n|>Zv: ejvqXo{*!g 2fVR#dǿL@ΜDɶMټ`I!fnPmnޥCUƧօ2n2%mbTf_\A-\i$ޖD1;wGyfҏ5<.|ٱƽgJv;dŎJLy;۶*LŁ@w\RwM~{ bߪT,C9σ9H9.֠ane+kӾ˚1J3.2ɒz9|v$js_4Mwbf<17XNK^S8p1-dܯmɯzvW\.gXvWV6oqf.MxM)qwp.̓ge.ާxI]rpc5~weZ'k.+#uL8CXn\- .Lg$O(Ե|u: Lt{4ծs1~IelE?d٤rm-)17/L]z|쾲D=nsuC|7)z>?dεvM+L|L1ś&kÆkVG Mj |o'E#&i9*ZʖLl9?~'xi][ݳLgu y)O⡛IC Q^ӬJ3Ôҏ~wN :h%톗ff+{b|Ǿ#xnGu+vNÏWc˹|[m{[zfj_Z1q[JZZwzZCo?W=&OWSJY={%..b3|ݤP1 J4jh$U%jf7ct - 6Z5ۥhטV瘕 W`!rzܾ`V\*f(IGԑTm|v\6"+3?:&#LO}y+뾠㺧s2{#X˛W&6ZZ;ս)3FjE&=dʛ:yIiw˾UVQ^QL筄$?X.k񓔺PtFb|gfzUAϨ+\kp^*. 4ͼXDLxg} GnW>_k9ϛͷWïxN|j{e: Ƌ}w_r;|*t۪my_H+ ԇlIdϤf+hwM#wT\Em1M ͮ"%kAÄ38WJJxM LɓKMb&;OOx>nW{4=CKc˳fxl3|[xp|[ꪖK]=6 M֭7h-B֕K%!tϗ>˓8^͋%2x݊ke˖il5o+dCv.U V rAf&l<=(9l&xU##T̮{Ŕ:q~8ǃ=ڐ^{.`ϵ,xhVޖ"-r-gJl& e+mb"gOYk鏥pm\&So}[Y60bάΝm/LN|[&k1 ^r]y `JAǬf❢6EgE'"庥 -OžfRQlغx,V^Y5䋐t[I H'yh+u6 y"=ζ~=ǟbcΏ{vs2 ֻ~;gڊxɎ1dJEˇ.;mjZmfq{ǣ~][Wq3#Q1y&D%]臞/EF eƪ ,u5TǙ棘-CLRy:pffʫr8"4:D¤Br 䖮vZ5%hH9U)|ej޵w//2ʸY1Q5$Dٱy<֟={yv1m}!zY<=|::^3.1am|i3N f1z_flWm[|M\z!ɕ6t:;X}`;xp+*ʾ ܮu *mbTiַtN-6ITv`1{67>Bz_x"-8w>A6ogOWxhy?ͯe8w=_?~/ȫ C9m/y?ͯe~w|~E^Zq{kx|9m/o''* g{_q{kx{~v_!=~/<_Ws;|^ g{_7 ?<s;|^߯ݟ?gwO__OUA6<i;Bz_x"-8w>A6ogOWxhy?ͯe8w=_?~/ȫ C9m/y?ͯe~w|~E^Zq{kx|9m/o''* g{_q{kx{~v_!=~/<_Ws;|^ g{_7 ?<s;|^߯ݟ?gwO__OUA6<i;Bz_x"-8w>A6ogOWxhy?ͯe8w=_?~/ȫ C9m/y?ͯe~w|~E^Zq{kx|9m/o''* g{_q{kx{~v_!=~/<_Ws;|^ g{_7 ?<s;|^߯ݟ?gwO__OUA6<i;Bz_x"-8w>A6ogOWxhy?ͯe8w=_?~/ȫ C9m/y?ͯe~w|~E^Zq{kx|9m/o''* g{_q{kx{~v_!=~/<_Ws;|^ g{_7 ?<s;|^߯ݟ?gwO__OUA6<i;Bz_x"-8w>A6ogOWxhy?ͯe8w=_?~/ȫ C9m/y?ͯe~w|~E^Zq{kx|9m/o''* g{_q{kx{~v_!=~/<_Ws;|^ g{_7 ?<s;|^߯ݟ?gwO__OUA6<i;Bz_x"-8w>A6ogOWxhy?ͯe8w=_?~/ȫ C9m/y?ͯe~w|~E^Zq{kx|9m/o''* g{_q{kx{~v_!=~/<_Ws;|^ g{_7 ?<s;|^߯ݟ?gwO__OUA6<i;Bz_x"-8w>A6ogOWxhy?ͯe8w=_?~/ȫ C9m/y?ͯe~w|~E^Zq{kx|9m/o''* g{_q{kx{~v_!=~/<_Ws;|^ g{_7 ?<s;|^߯ݟ?gwO__OUA6<i;Bz_x"-8w>A6ogOWxhy?ͯe8w=_?~/ȫ C9m/y?ͯe~w|~E^Zq{kx|9m/o''* g{_q{kx{~v_!=~/<_Ws;|^ g{_7 ?<s;|^߯ݟ?gwO__OUA6<i;Bz_x"-8w>A6ogOWxhy?ͯeជski?ogOWxhr[g&"xw\lZCEśM41Qs+T®Uv-Ն׽* 6ucr #Ǎʨ7 (l.('d soSs2)Zצ)MNԭF}2ys#&xR|%E{:jÓ&+t\/wI3)8~p\;n@p^9FhUb6lR흴|PS&rr&[ 2魕WK~Z@_蚭uwh]m!q;-&˜J.9ln65pwI~Wbkm9=ڬ ʕ׫zwHȻ: & X$YƺxijVDv1ԣGEG7Q훤\sd>_]>}=^IZŚIZ+bE"R$fa#ab'; Z`8A7Dk0Q|Iȹ<|TtU3*r+7s'GnTUvkCPm\7pcSɠ|hF1O1MWqȾA 1L^ɼmWI6,"wrv͐ME]S4!9R8(eѦb/ ȨjK\)ۚVK9b 䤎)gIiX|JQ?Hq[g+))EUk+z1b=ɷt̛7Ar?rde|ݷ8nܞ>%dlB%euKWo:e3gya^ sն٥~Qѵ ObҊ9X5vslRru`tS"/ 0]i]M1i^aHxQFnthF=(<`B@5.kFDknl :n)bC$eV|xτ#J{m-꪿OD %~SroG4pAj͋&çnܬb"ݳdQeTM$ubniح ǮBr*F=uJv法uy)#YRZV6+lnVFvJnǩUmE9wrm9A ³xEl\zie#I;l^EdY$n :]͛u8pAR.N*I&LdP)H\d1ߪ?g5>*MrT:AI$PUB#H[UgE.HW("Jl&)VL`>,7vs:|U;#e  B}ߑ(ө0r|eu\ݚP͟-,:dU9޽^=J_]>rf;jlHG[>ίCMZd9Ut!,c;ꦛI:" c: MƐYtr;[a$Օ]W _X󹪪ɳ\ u5j/e#'%Bc.&"ѲqroSEbd%^0U_}Be52L'D %6c𿓛ʾ`X.G2uӫvhD?61 d-L\F;%ۂDFqIY=Uevʢ+,*f,xLٮa6 [~Z TkUn 1q7!*ǘMG .uP9͜W1O"zxrݹSŖ1LJ1yy>"g 1(ܾ,xH 3_)WQڴ~ 35$D,,ybawcלQGLUZI=*ȩF! s 4v6BtH' uCM%t~&#{IM/NEmF<C[gd3;Jj zw˭m] a9&NVit"H69_;4vzAsV!GzL=Y\omITvF,bbige]4c4He8K[֐I^TutuM}Lv2r.~^3&O8|we[ҮO"i;'nxO8Q uq'yelsfX}~sNۻs'jj}'$(0OgҍL_ II(uN*">eT'aXͣ)}V^,*9Iq:UA՚xQ>։(pJR(hЛ6)eUL{l7h\&cww9g$ %4miCK5f28D"DGKK.D,q5+9D3Nc+-j#:ֻrAhfoYD!>udĴ*Fve9Icw:s[di6SA) hDZ3MxuVn>;X,jIʶXSts_q\lL5)z]YDmqE;y!ESk`Nk'"]9o:%~.!; ),LLr=YUeޙĢ2RlJ0Z)V2]/i xsLأ5 Ȋ)ǐnle#'JؐH,yduzp@5YkI;TeL*IV"ZD;7ܦ4E@^wp^zyeG $U4򪉤_ʜ1?sc!y>)}9'"tVjLn^Z&'Ka(NViH)\Ů2:B4UDXm g+Qͳįab9"2#=)%HxSq/ߛ3fpʧSܚss{~ϨS+3J~َV^rܨ;xHiHWBIjuXƨdxh1fOL괐'Abg#26>5#dGh3gLFnCgbz4,s9oU91L~R*#XW[ʆlǶkDV!_8iM֘J>S.x,U~fcVQ)ݙ2=;f.pqMXyZUvܕ\ՔnURi- Xv00I嶏nF&>Jxʫ*c:먢qÁdže;a$> |Z5DHYa-9™C%J?:Sǰ/R8,"6HȲaMbͱnћF馃f&("H! \N`=SA9{g831ߜ1].Vrf|]^kkrzb*!JWE"ng ݢY k &IdΒL5 92S9.s)Kg _.jlft#Ͱ3EDO1OoJXFc fd1ܙc`z;Ϥɂ,Z5_X"Spc+S5pj&9Q5uL+]R?P>= ֋ g]b6CX!CYg-wv;t zV1[_:CNBTga?upt*ͤteQ! r0 rqM G .|&C(sQkcƸO_#woX5q:S* ;s+t `ʅɽV:řz6,sd5U$CW8&0AlŏC ƽ# Mt?:ɜܬsg#bYlglcUUEmD 1LfVj&Zw!`li5Vho-8xSŊ[9PhuZ^rs%փԺ~+7QY$ХQFd3xͲ[$޶p 23*,T-ոKw;tq_\p*%׊LIw/eM`ŀqoP6M6?Ԣs}[% M4Ɖ3|fː##_E) %׊{/zOlIUn0+:wO!{'>Go3>@(.Zr]M{bM2 Yvm`)+-B."ar^\˖%Qh}J`զ7_Jz26Y(zFŢ᫰\RIYJ0.3Ms_ݡhVzQVIꅅ$500FzO 'f7[$]U]k__3M Z:-frݝk ȵ@]ʩ1DQSɱ#`L.N:n9<>rG ?`4]1~*xI8l%Y2(CǒRrpqftՊfFRVRF<>66=k;|j͛TUp©gT.w`[n֪% z^8WkG*ͳb61o'ˤc/%VQͯZG-eʆu-NIFMt֖D*UR;K3̑vIѓYl]|6}u/!I2OcMK5,F63[a)Wn8SIBZDR ?vYg|nͨ:_uڋ:m҄b&9'DeSTh5Fƹj6Pu5Vjz cӏYbGbmՠ&*B?+#╘q*:9ל ZTҫm ]W,I򳆁o1߄5E/v<^#!ۏG궼qSJfO,Zsaʡf:U#׍# [n t;{5yPNOm~qrس]IE$$e1C4BAiN6l"R zNcbU!z_u] Ɓ: skõ:[@5 ]!CD2Zy'1&؍Ď9Q;GK o 5"jR)6%qw=2 )٠u=y%)Z{s KaYJů+lD2IoiGƽE&$Tyab,lF8oyOo%iRV jZTϛU|i]&dr*ɠVV^^^MD3T6q/!r)23^$us9aM R+ k[x cYhWʒq~'SrSqzKTde*kwL7lK Ze&6M˸,uJS+Jr>XsZ>Xv T,V-I4#W33Lz&pK<ٛ#Pi+ݽh.^=ZaӅmfVEeiZ ^8H"&2dɃy߻h}Aټ}Քmk8~Je&fi̿l䙷4SfV]{w%fꨳW+wvMBOSf59E;p=)hz98~)ghzi+S NNt{s+bVJGXDQ ۻQF82K81qBڼ]^~uj9ݡ'q2+JYh< 8xE.3bW` ˭U}ç,:@qRkڅvV2xc)tcJ* ߕݦ3GUE~nrUdThؘ?|)sS$!9WoNU~^e;iBF"QY+X9n̒)4 /-cv^Qev]>NVFziÖ"l+WU$_`\|%@gwW.wW#6HlGZʹP5(7EF$ȨRn9q#V+=ro++g%V"I7d̚Iė;ת)NuS.2|Jp|_u\+wώvZPM-1^*]hpE#`;kD$9TUҖ\Ѥ5޻o5hWePS/ʼn xيQgՅ"nwrl:ý>8Q3|}OẀ[A'-EeUpR,ɛ:Jc& !\Gowm{{ b:P\J&ȭ&R1=]1| SppEHrB]2uNj7|k$݆|Y륝*s#,c9ɍ&s#3J61TEު!6;8oɴq>gvp?ء-~tjR,Gɲ9Hqʍ|8Nj=B42}Ok5m~;r>VqWn%E#(w 9\!ˎ^Ō٨YUyU 79U4R$ 3c$Qy_h)˟?> Ͻ M_Y xNYn\Y0$DQ}D9`Q+G[84I ⽚;aޙRv47īlyxK+1ʣ! 9 hG͗2 Kځڑ93k ',|y+EcN\g?v]gɳF9}}AxRb.HYRW+/;v+{1<>/~1}h_:~1?Uէg6~gc.mͳ͋sq=m]whM" ?~mQn5]:]EF"2l$L9W͏8<_3YVWtSq`IMxہ6e9彧ԤM+}F.0aud|e<6Ѷ}ٞ}n$=3<*Q2Yh'S-eղQO)/~3x|YWn޿:\:к{]H4jywctqzftgpf]gkDzD#_$\2apGai П{$` $:xqsîu\GRk;ҎnK`RWjc *Ugs᪱>KIW̑Aĺװ:wT @pߤ %;Rup[jD,*AZ0k7qY E<\. :cy4VՑz~ޫ: A:RKEbJdSgM9$3v O>U$u1Ǿhr[2 7oV+jil6^DRm^.٦,:BVZUAFJPCQGjmZbJcl}rJ9Fc-.\>{hʎT#6;f;M"nĩ;)H{S.ׯ-Nq;SMqK-l}ZzY߀?9#qXܮVT݋.jNv %Q7n[s-AM]g{.62@]m:;6kYscˇcU|tB)0P" ٝ08e~v cj5׏KҙLAB^>/VEL/>41Ost|:yoYWd-hj{Kl;KzX=zBeUVI0L5M ~kTf# "..!4{@6-)5D`H5<N[ܴ޻k>FDBmo'PO#pyw,,c9UEUPǗgmă7aZ"+$j3Yv.]1YbhVԸQcd6uYҐ/40?,e]$d[wZ^b!rv:JBT,83}[{Uڢcu)eV hr^bjI"wV\u^NB]H%W$$?:果ǺuklE7*bf\&[AjW*6GOB:;^NãEJjS۞ĬX"۽4Kj|fV=9v:]ʳ.xWvMP"Voi?7+-rCם:Tf-k%yGhy`W1FC%%,%g"R+do}Vz.س;]8[7۶+خ׉R&ȼ\Ha,LI y6ik㦉6CEU*b TRuHb{$VdII$ IȦ^ }zzN`zXfkEgpo ͵,PrM#%FBA˲)tQuNp<㞒ܜJn n`f숊$r9 V#0͹a=h7Egܕ'pI \|~ކ0jg-uz/(:mJ].&Un+)dYF-bKǴp)Wmu9*A,(57'R[P%97q-'`} HtK!.4"=Co:,tوhw:+ݹ#_=,DpЋSgj-cHxBH)D%fo=a]?K>S,gN Avv:ݩMvb UmfMfr̢іX,׫e^LZvYi1%^b:.5\l( 2!}FZMj wvU򅊲֟LǖJ!h]hfbt# )d~H,J=VMf$I~!NGwu*t 7[ZtS!1/?"T}dNAV:jLZ-3c+)(^6MU6#Pz^El~.u=/ {+^VxYC>c'^:A2sK+%k#˰ wpȪ2}>q75]TvEAJci8-V }иJx!v3`تM)=o-/ q@S]DX[xAK o&"{vbjoe}XU')$u n{XQ!I:s:m]2*p|ε=J- 5cli7&?ؤhҳǾ"V" 3ǎ@~TiȍkivjKMT25瘒pR;A43 7!^3Y2'hϠyS;knjsE ׭ jHeRVi*1_Ue$V:b'm%JGXB@(~9c-'qƂH0F+N@[ȹE}y}EMsд_`}#W,cpQEkghܥ紫wΠݕ_]a,kW/A,ϖŽzZ9)V°S)/NURcYgd{čt݁šrJnDZJYr=D<ܺv8O^Iә| 3.:U38rOطJ+X+۶cN0A%@/*7zZ9=Vxȭ,fF:aznvmZ5mFȻj #޳lv%rHɦSP\ ֟'݇_qPjGebI%Y+][ _a+fηsKuvEJ@7^Y 6zFC;ۥV΃3RrZWwO]mz˧&ev}&=.֬1+2)Uv%Dz9>9%F^'d9yjMh߃w~=Jwoo/݆ރϬXbߕ'%99H]; Eq{v;~g>BJ֔~V3K8d,鸧;E}] 5ozW_ҳoeO]$?ndHRzF%VoVr>K}!dyL'\5ₗS$.ב6zK7/b+X숻)mh덇"l՞+"1%_3dF2N9/cc G,1x7veRp ((ER9r!sAeUW9;&u. V2 c\p&5[#Ԗi uk',&P$`}bPܬ0oViV\s2͆aU(Qg MI hfk¤ *kuVF/ĮqTIaj*oV.(޿ pnA5Fd5XV>F1Y-3\v{֯udDHhSc.v,H&HJM Y,.HY(Y($iqe.)l$zAzu!],8>NRj-b[>(ݐ[k09xMAIEm}1 sɨL v֩.zw[:+]ӥ3iw^׵-7 Y ]N+]U8szkĞxe_W^.=65Kx N定r:n;Pnx|d TΛmh9WdBXu0ق vQVHX Ұsl&YEJ4IsUk1% l|Y#zVqO jHjmK^xcY%;&[euZ'e:˷<ݲ!2*ۓGRL+T&6LN<_Z6IK OlF)ͿjSˣa hm} =ïepxjEo}:q<6Ƥ}uK5J5J 76ZnYm˼!Jh[ k`^HvK@ؖφJ=wdŚm-^>.kPRDj_Ll;l2j$ r~|k:K7ΊtnLi״KgBGWjS`kUN5a\ޚ'A=8kH.w-m{_9P-/eNUd.5UlϤ5Cήd^Ȱ}3+*0<>G6(w G3OdWUQ"=,+5Pw3*I#(a=2'v\~"=K{{^89 ?z0p{LciLW~'j"fv/:sԧK<[eє&8׋S"HRkas"ΜrO i(_k vu'[hU8]BS+q5?UQ|LuF}핔&ǹ4ۈ.~}+?u ~,ؚO5fkZ.6"Ar rLO[8/!Hl⢚jZ 6wק!46S@%2N[u?OeEEfuf"['Uɳ`62o\KxT 8}o|~>WK.%޼Ѵ-njc5upV%T:{;l:!U2ܺrĄcW]"&N`}Oֱ;3(Mq)l ڎ 1(ֹ6w>:+U#'MDrqasoyŞcfEEqn:p7agn&2 AtsPM'厲|ȔOMXrb[VXp-a&Hݫu?Q#?()z/f15Z~Vq2E5sWOvv`xNrOi1s[ | \+A{2ɘ=D/.$E_SZd=ҹop)-Q3xǪj78QaP]6&LkL fjq7mt.)&nJl$Q3{1zԋ8c8vs?71$k6w:w n.82TY*-.uV,xۑr0(jd>~nT/;Þp?Oڇ?v;Lq_NٷP~DÎE/!$uou7t*Kw?o 62U`6Y *1E +sR T\\]pr*ZqTXH޹ԚUr[6SIyH2էo6$aT1)CϰWOʽ/#ήdiq{l[u[Jm}o|F:5JR`7h̑lt{B)U_SS۱Nj uFسNZ8@ =tϰYbݩѸtDxbeSsm(;.tqBV<!Whpblma#0~Fg 6Wqqc1cv1c1Ō?\ƟFvϧёUJ=xK%KGG&VmJbbdy%.)UgK*n9*b11M?:CE{_H98+ȷ-5os֊n\,Ĺon6_M X'u՞f"5lGHBՒ:+ʮTB4,Nfwpk(.P &ݔkXhȢѹO߱bRQH֎_ȿr6,DznգV騻+("T!Lly^^N3~&iv-5ҟ5*Tb/wf~ʴu#GtQ*:s ?#B-t-;~5kMcVQzCYa[aH̳/:xIHrۇ S߷ ?#B\x@4o{YEBmI8Cv~q!j+5?N.!].3UzG,Bz.'35/"5a(-"ʜ&sB9ۥpWerxgTTٹA R.C]US_ ߢl,) S .=:?to߮Qx*ߖŽu4u*Vڃ㲯LWd|Z  fɱXd/%X^ϷYʇRunἡ˓3-X^@Y̊e\qM-zw;Qe!l]Q 5ZfIWX0B21xыȠ3(TT*sOږP1_u#1zER+f* eH-+>S& ojU0DؗN'D pX/:uu pD,Ar>ؐv铻Tat%)gθsCc-]Vhe`;v w!L|GAѡd>"o v*z_PM&zC޵hF~uE/i,Ulշ yN% |tꝦx_ j#IYn۶=%4«&3~M|29D銴Ɗc+Y̽bəwQמci~rmWhUj fãSąf%Gw,3x0&::pnVrS{I.H*UDjtO>n$G<\Bn=jBT`u=dli(ވmVo_F}m_<H(]S3cE! +DXgU"3Ņ)\r)jSmʰ$_OX+_=d:[f2$khx~յFbyÎZT>X$9io C+ k\ldZ"rI2.'e)t6si=+ivf#"#edch;쐖x\S{Z;UkR[+~\4SRvW}ݮvE|Zy;CjY7rjH/p9)ȖgvVy#XlW ;`8Ϟ\I2x3\.kٓ}E\uH26[-‹s>o'(3b#&FrֿtR7f֚Z-W^1WXkww~&DfiHk *Ou)({~IXWG| :ogHcu%C]5]bbų1cC)8IT|3k|?Cgq꯾nXjӧ@X4:X3ɿ,%bAjyu~|qr不-xGg[hqI.h7z\"F7eE8!p_;\kk^^D5dfzv*JF] -NGK H`]R/=գ\uch`Xmhlev͖2,:{b{a ;o((&6퉭l f,N騧!!ZmԜ0+4#*ɾr)?//:"z۝=9Zβvյȭ;b%N̵֊ #M:1.Ia&F}|ŠʒO eknB۩wLQt,r WGϞ#88~~z[}=i1AX[ zVVնzձ(كk7FFLG[RQsG,yjw&;s3$hI.|jѮ:qco,6D462fVl^],5Ҷ?}v]`JcsWh+O5iצ#G P;7۸~^tE_*;zredkZwf?"J*kfFtb\:M760~,:{b{a ;o((&6퉭l f,N騧!!ZmԜ0+4#*ɾr)%pP;6}/=C8Q]R[c`MSP[u=2*;Aj`hdg ?afb31&о[,NƒI:C!\cɌc`>ns ]6#Np߅je lNVig>3W̓]B%HU& T֚Ѡ %\C|Klr ֗5e_~SR7+Rbɛu2l!^|DmRԹ+[RjcڠYv-K$.]'-!.uNՙ"|3`$.qtD:':wk]RRdASU&@2I5e,NI sϾoT+[Tu4vtmFWR3y&'Vv>֩L6>LGqJ[1}V& E~8YeL^avMuVdo{Wֺɭ3=dNMw 5ťT X ]z^+e1:Ι[s]qH`ZPetӘG`;F(5J"JD{l a|ͿN ~NJu|([łeٿklTnl5j ǽA'Q뾍X& +o5vw=3ūsW2F€ymY\-5JCw:EUs'IxqH:&¼ M=Z* Vr"s\YB9\xo'8FW{Z;wXjNR#5UkZyM&oU):>WrVTWM<#n_V:q\1]|һwUrX+#RYRk { j:mzI&Nmv:=Jz%_bu} +Z A)2 [nrDT-zzGjkFqʶmOWzcj5zf؊=Y^];x=u[zwV:z$]hRD7mKzݜZZZ7J%w;k}oeiSHKR`[aDHmR*e2ngC5u}BEb6ZVcDıA$l9MT/r(:&DגU٬Wծ潮PUU4RCE{U?\tu%t/oJ~--Wy dJ*T=Ly.e/0yu_O<v]ӤcM)*krunl"v4͟<~ OR Bqo93!|pW w{%C*az߂crƥ[RխOP2cMG/ZjPN&%xx(9$ٱV.;ai$GԐA4EQiE"4I8}DM2c"d&0RJ\`1`v|5 YtvzZ&[6#[a76K˹5iٲw22.*X]ҪzH֑ .56s;B#ڛ+)6 w g-MVҗ*޶len$^Awa׿ Ta/&QiFnX`x `ɮuTEtT)G1 J?4,־0Mqg{!c}4ərR] &U̍I&2gyac<m۫IwXkz =^1Xo#NVj;ʎI-8NL l'+Up9oAo^ޗ7yӯy'bZ'Qt :&RN@V;:,](xQN+rOkVxe#Fk/_@'Umhu *$zm|L+URޯdg=eVRlG][qlԪ~XQ)TʙrL):YGk 5r<_Pi5 !kU1,PI*dSh"[ҬvABYRJe"-9OSexDE˲rt)|]z:×9tq8wJJ܃[j[Hd,g/_9=C83SԵdk2}cyLw%](^P x4.܇VԵkf AcÖjɡg^J&Ey6lUZI!$M4QGZE$QHM$N`4L .0R)qc!ݟ gB]*އVb6MHM͒vrbfvľJt5|C,7`ͼWzwf{DΨBSF-QK*(ce((W"?Ԅ0_996[>Audݲ٦l9TjW_xyi2 {Ǎ5g_0=0u_Smǽ1DYhtGXڪ֦nZSؑ,Iӛ>N]l̺uwk-pm^#q@Z*RK`\kKzYVec}xH7x3I$ȡ:3W[jZnD$"BǷpeTx"m~4|XZ.m6E:~`uɎ,8~ֻsKn eg!3OA#^@bPel"::2e3Oۚ}vȋƴٵh.03mxJu L|\{\x..{'/c7n.ng%˝F;]Cx-Wu`D/cW6*7_~wuǞiE)x#sϔKqNK ȮA;#l։%R /e!;i[#N>rv❪Ʊ. h6x$C(]nw`;b]Zkv!<; 3' s-!>P<;]ڷ^[n6EL͵qqRn-kհ3\2AV{ zS;FO=Q@wZ*kv+lg<2{[_3'-!P1v]zw/ rNrpnd1ŭ_oN9`m4%Fr:KJr=9 쑭2$0eQ)!KZQ& lD",n1ܼlk9Xܳ7Lw|]LʮDnb)%l x"A0bh#d;&TW%eEP.JB`ʥ?7;'3- 6"9|l6fŚK:rSwa4QH)s|~<ᕁLqK^(| K{]D R2v;̶Nl|yS_+YڇXME(:MUHo1LW ox 1JՆ>'Trի=s~)Hש :.ZE%TMB1 0[p՛J~7RKƶYk-Tg'- 壦꜆)o 5MBpCi;Jgkt<^h"v<*!"&R6Ciݑ\SRU1*Ou:+_9QYQY/k"VQ2?H_ ||E9ZtP}ݗG&&oi(Q =ǟ.>^VlTt4unY R}=^q5 (bґܱzR' U% 8.6'dB髷Uft_qTKi{\a5ѡNZ*̼Oi^U ̭y>0e{ai]M]9˔.1xװ e+جhUٮnE8}gNH0>>G!{?>9yh%}ޓY~#X|(V/fwh.Kq'1ՈUiޥ%#iOe~F6(Iva`񒒮$9wozvmr P쭽y wM۴ӣ+ŴOؙS5n f%\eBD~!LnMC"gϏjc{';gW|w'A^=G4{Sv}SdH[ }/x\w~zEoG~"sK};ZWov?;>g^@-t:'W h!<$dHAw\.?&b)_S8|[oi|0{< O ؞'^_z+ӵ|Ŧ^T Q޿ھӫ5?jz_C/w!YCC^z?YGn?i m?4;Y}'/﷼W؞LgKڒ>/M};%Oy$zRgFovT :[)*}rFWl#'ڪFQ@c|j2K%)rGIHڕUh6xI]8IEI<_Ok.85k5Qod{.N fq3mbj.dᡝv|)T*(֛jvJ$ܲm]Hڔ[/ί/hr ikjV#VUrFۙIlőQG3eN'5RK5WuFeU]7LZ&/e\ ޓ樓u+; Bc]]Hcs!`h"fFZ8 Z-e(<6 gsep ~62 ַ 4ʭ 9I vqlƵUQe=_de>ahԘakK@Ple:26B,;Z6%]Umu7ҷ#7z? /K߄q ?g~C{GzÍn;_:ѾXVc£3W<- DžSxFR0c]&#]?3?UY-ŧ4]Yw[DNn*}X#eԏ%!,a^hSwv28vz^P^ۮVͻȭܶM{TSsRa5T52#k NHS4-j}ciV;{DU6g5O36vե&ljWȴs*Ħ3(f|v*9ȉb𧒻%Oɍe&r,|~­nV{hgo,Vfd8V_vNv&5KTN*a]ߧSQsvƝA$lS! 59lrIsk}qBv(ت*XB*[h Th&1C`ʬuQE V;9^6^W,p%# ZIC#z#ǯNHWt$ow0jAhTuć&V6n*,`"e;Z~CYqJJoV>Ckn[vVϖIbGjA6,bku6l!ärJbjKzVׯ .}ce$$+t6r 0kyxFVx]m[g8RnQlu+Hym~M;'Ypx\%T"27s(>}*8҇JjN9EMڻf圎ٳѭkӸQPHzf ŜD2odfefe䤰RvIn<[קQʦΔWM2LKUk7k5ٺO)`+3͜D1j՛ɹ+Hij'*{-ثܢ 7iG3Z]٠Nk(s+%!.cAt>|ojy&3:lZK5R_^E=9#iܴZgk{z՘w+|TcpuX*[nʞnR7+oJCl kHCG_׻]]ftS,c|XŁ@pPfi^;rvVX);X5r͍ʇ<ᜂ %j7c g#8dQs BBTySD\~@ #Э7- 82 Qxl0ɫ.xy7h5OL%>ɹ×M&[-ןFT'Wv⇿ _z½kzϺZ~/g{3wwz+s:7@rǻv-V.5.)TP@)lFsGQ:Qfݻvh[5jM6nAtHTAS)SI)SM4R)J\Ir3z[^BPa^1ȮpI TBBzIIzKrs ןFT'Wv⇿ _z½kzϺZ~/g{3wwz9şîC7߯/o/cOu=s__xj~=?w=ޏ5>E;?o}޳_JHZq+AD]Z mQ$SVe'*OQ hͳ2r5L ypO1pnj\e'*FfΎr+lXn9ӻT\V5e$@8aUٮO,6߹/RM60#;lNܦ >bsvw+9pږIY\wỄEtL*))D!E9LC)g8T] Ak_4wN˵ܫu!u\ܻ]ij__V^Lԧ(L YGD4Fk|RNdm"2N~c>A% =9}쫮ƅ~u߶N^pqR^ۨ”)HB.0RJR)qc1c1w`ԟ#e6)-_9NZ72&ٔJyPLptb,C"|SAD8uЪowF՝>Xg|%aS5+d"Ff$"1b˷Mפ"1ӂbA9&oLrq\q ?|vua҉U8W4y5I&T ]dJ|!9SG8I/NCJ+{.:qim'CU.Zl8$.$=M9IMLĎZ''wTΨd黐c X"2Qtw8uQ MmP ӗkpVdgMvͱXL./.66ݗ\xLkFhw3:El(?Qmض*mRtȳEߪհIh_wk`s\k{|*->pjVIV[8ABzfܢqdJeMK;e-^a Ә35^wT"EJ%͂8yi4`KĮ <8Y-4߿hڻ`\aI 0. j;XTsAHya>5,8׭f5]Sjct Nqc:r- F"zjJ~S9fYO1!Pzp˭E{FV5R=:K؆&J^) Z]U]ܫeRM?$1$B:k?/):o}8ӵĦ+V&ŀ]íد(qs2I/%R VRsslőjV7ZJs6zEy)H9[{ԒiDKDREo;m/INZ_a^uԱ00難[0*LooS*a_)\8ڴmi$AK^g{[O Zm{Kgr8Gyn}Ax޻1<ؓ0T@Uz|M' DY6Z^ľ\)&„1.BMDHmfrGo"^ o_j(i픣Ūr;',1?r9c*UVS2Le襥 s)졥RE骧c7I5L8*U6>39 1ysm:c\miD+{SIdꋢN6eYSd@|Z}W簴x% 3eYtߙ3ᴋPO$#l^5lwsslhڌF&i d(Vq$< r i"stES3$ Ln~Vr ԝ#[m&hA$[KidAZ#1aeZ#%ޣW\/3[Q͉wZSUX'SvGɱRAC G1-ELm̚OÑVaeksu>~bB)H,I?i{ueϣkxA/C]60s\ZJ7FJl[eF% 3`!#_MVU!|\d?AK.7n X d**"!O8|cC\nBo}x%Tׅ.7F1`M˖*G$+&\H1bĉ>k6GĠW.ܚѼ۝*V]b0[\z6b:HDWjqNu~R [PI$>i9 *;F]>GXMF<Ɍe*VuFO:Ah02l(bjecQvEqrmg.1ܙ]8PBmUSOkм=4}R~eI ݚ}dBAɐa.]>rݾ \TouצZnXk/`2Yvfȩ^td=)h"0xw\мSd˻V[l!lFS!$QFF9X*ftt-aU4zTlֈ.Tk4*!+Q50[Y[.ZP`h9ܵjruU2ge ͫ8Õ|ʰfYRqbG(4zޱTE㪴zE^th6(Dz#n u8v3nu-XP6a]-H{y8EREܼU6 2>P2 ᤤ;g k8\ysSKF4[4%NR?7A)ϒjF2$qlq\5ß#%cGF2- 6I S{L1R:Tr0|4G9쎥g85V"gUo3_A̖LG Ɏd1|62Qdtjܲ^D->Y'i 12YnLy].UTJP9˗QR;k !4ʲRMhmɽ\EU2it6] E\]Mn4~8~o3ft<<1 N<*'V5fKSJ\9`dLS`.d6 ݏUhNO!hso#LV! )׹ֽ$/]$D|L z~9G*b'k.<ܨkt܎iɭ^z髓dڲa;0a,.. ģ[ n]4<xs덕Tؘmee38ul6peLFMꢙNb"rB')xڮΒZ26>?+v(r]+SppʺPYDC6mV_NʦvYrZ]LLSa}ɲ63>qOz7R0xؽpX4; |ɋDTI͒xd##lnZ[\[ڷd괨LM-9 *Zŕ,WpxP+?ݝ[j5sBU)6E,Vu0<?wcz|_֋?5_|]@h%_"SYm8ʼn˞FŘ|X<ǙӗkCb<|k`)<%OUSOkм=4}R~eI ݚ}dBAɐa.]>rݾ \=u' ulRī.6U3Yc;__.M98kRp1:r]z#J 'EKhjFhbFQH®Y]US Ne[lq?nž|BacV*g\[s&~Pڹ{#9^̝| l:a'v.$rG5K^TZ:GDU,WJb{"8v]ӌ7nC8vYQuecf5۫׾'TU(0\[-\aa^/S*nJGܼ+N$焫v|骺EVL҄DHaLh䢚zdr MÉ\cִ{Xu;6K.!6{tdlvn(5W9m8!e0J9TUNI2͵e'rRjo)+Q'{ˎQ4MD!IR5SP:j&r!ld!˜639qd=qc.Uiz5^-)S;;X^VmG"RDeD0xT觬U\3Ukp[vFd qT MÆ&Pfo DXȲkeKRĺ3 w+-0SPtE s">\J"le͏MxmGź/OB?jNNjFyۉucbNYw$nVqMJRWXŽɂ60x'=e?6tpTE( wJ"gfN5 R!cG aRiiU!ium!!*)~)hl]?f"C*Udcٜv޻vk/ BEʅ&8hYEE)(y4Պ5,]gLG9pT>tȍ&?i"ы6*Mڶottq(IJBv0>U^nL;bu0ed}jϔ0p2 !*4}9x)X- x'>^I)&Ebq~ (R2z)Eo< zWU^̻ (()R2E,&ؤJy0`u$[Ǎ0"t&dl=j73U&UE53,4GPŦjQul%o+h8(ga4mdlg)/PnY\xQRHGG:D3*c]JS9;{cdJ6T'IL&ݣԄ(OɾTY&!Q.v>O#997IwB֢"dWutRqf񰟓SīLy],d67=8u',_U39F/eo8Ms a* ة*CU&rjwf+Q@W_ν&XezO6S4]mEKU$xG,K0YTfL(ɝfɒ'tM޼pY_ipUp[iKMVV=Ēھv]EGdmʡj\{uA\6rN8d7]2,+3EdU%S1g)r%62\w},9/p㔞h26lyQz&/M{Az5))<'W.RY$u2ky3mIy&ʸ!$aߍU~V Nfr.*ƲYJ9%4 2GL JG-1Y5S脃:*M}ߤȸ`B( Lڧy[K2M*sWP4N~Q"Lȣvo;E:)xI:tiE["v&tMDIQH"I$0R&d)HB) 1q9!m{E 8eO&˃ar`,OFԺTMAAS\rkW)q>MѼ%8v%t5Qe튦uA(RSbw0>Uقb}$`&r| l(BmbRbCQ͌9A%ꬒ&6 ݅3ݜmRn^: l\ϫ/Ԍ]vWjmVQ_IfQ".Q$#Qp# Cuae/ltcl|ui҅&>[EwdUtbc?wfݜ~ZqnjgkA7O0`T`$V`ԝ&6ꕒ2Cu}woױϹ9!Fi w_IT65;b#" Y D@?g/ DC7Oѓtt5ƷT!IO%vw"fdUc[֝@ ݢY巐d6#[æKu1;.i֗ |Kyʜ9AwrPO%&xeTu hs|wȞUﭡbktUb/aݵBQVRyIWY%*ٳ4rKĽM7F5I!ywjo;as q^E&ԉsE)O8?8ml 9]6t40YeFgE7Qs/V_u6^ƶE|~ηJ/dcS3Sb!DDnEEm^f=$Hݣ&Mҩ٫V馋t!E"4RKJR!JB)J\`)K┥v0\c1c;8՞n[Wh,"KoI4rE7 0Ѫ8: 63"3K=":Iwyռn}h`|εM]Z8/ݴ"k_,|졔FM&r U s(T HV6)nѭ6 (EvNB6C\g8M r;>Ab*=}3q!?ljE6 ˟|"DϜ`\J*x/!ѩCy)ئɳye*=bûØY13fgHY_[!y.M5{yr>4*c2.ƕlVJWɺttgC/Oh~ h-]NZ"EFܒ7Tk"r"Η[ WX'74։5duhe˃ cDQrF Cu͙BVaV121,lt"B0F=C6ĺUcLӺaQGTc1]d\U*zI]zӷR2Ca%RɞBc  qۏZ+8]W'cBqYmeV/rV89 (+tȍ;Zq@ӭܺsI8rƳւ`ˮQUPQU1c6sc`Dk k1MٰG/q狊ۢ7Ez}H2 91&Inm]db#y4cE0Dk&Qh3*2"L1Ϝd6Mu־~JI,[P%lFe Ŗe:l™CW^9O%jHUEUܑp$(ڬjôPɑh1d:=#F1:!z|_֋?5_|]nWjkuK]HH7/Avg̜I'1o>2v\E] S/XQrN_pyY"9̤d4sT *{p; ,Tͣ?UJ68GoIGD?dF~V;r8D<.G.9?>\(!Cx]eSfE˟kg9\*Jq(]x9 UTk&F*%fKV43{Y"^EmuɲzvsRHv1U]ԑV"&|7hwnMf ,6pR&e1sg)K8sO_kt{&c6mm~EE&dppRxnGI5_*wW`=YE9Δo BbrѲķSu;G$I,2jqò*+MV\跌R?lofX1<661dٙdK<&37u'KcTk(Ew/3R6C>"dzTvE*Ʋk/~t2]H`$˩ޚK=rovdGǠ=&9*=I* ]qq${5kB #h ъ+X.$#Q4sug%p/xړ&rkm;JlH+w'.3殰Ee#5"&Q1Ьw??b/$~2r1 dF!b*XċTX-ߖV-'wy7b G2VHpRN%nansT9̏uzV-Z VZ(Dd|M$V&Mrv>I:(3d6 l&.r\qߌg HPsvEpU5nVms}0k2|c*T3"EU6< 8s|?+r89Mן<8n<p`˳gLXdh+9ox}JEuSM И:!T+lFY&F!G'aaTd1s^;f|#I\*`6# s!^|MÜɲt~,2?~wi +vglW7nr]Ws/GY:C,IhE9p#0rZ{YwW\P9dpܤ%&9?„"j9lc'/h_Į_(z}oCcٺ?>L;V1tLpEfp7MJc1֛\Vmqxt}Ks:Zܮ8{DDFK7Lw,Xn|YDlKdA|[:H%9!S`&oML3.q?p0m`ƶ{޹0ɋ6,Ly1ڷ3[Vhp{VԵhڳ5m=&'&&&&''y@]]t=\BY9,:GGXêu\N%m.ۭ7Id%XT*r6kq28|wWSmԇfדkZj--X1g%[^^'7ծ_DDGv%'q4KpP<\[ogB^'s.Slp -dL2VgwĽBbUZĎOTU bܼ}:l]$ᮝθ`=񝶚]lJo4.̃S>F&uJ\MםC͑bHú26E:j4RF5!}5]mg3ϣJz],89e&&iO~ݢ`qo#\Bg *RgZ{wKG9y]ٻq]vn4Ja,H.= Vbcm{w7}l2ZWW72G1PIGFI3B~9 h|f{{AJkv͸:l\=:qDϘEV@yk^u]FlMK xB=5ެse<;o5, NHc~o`6ŗPMwsߢQ.z~S<`=Nea$Ur.+Ih띫RpʍܱP{a 1p0,gg5%"b+N.n{S QZSG,˦6ZuB'grbIu:u꣱Lݲ`㖃C TOXRӽXu㭫SoOk{Sl/\6Ls S@({'y=îܐ(qkOCȵ^A_LtF4RIo [dɡ$ۙWw?fc ysN`c 5hënMD+4 6&LIn(t!5Fl-ktI|srcb|Me`fX$+*ȉcOVnN֜憈?)^ͺA;%vܵmU1VM)֑*]e(;^v^u¯F[)7[lGS1NrRy_5PW_f(Cٱ]^yq>wSlMr)D^d"N7RujSZ-J^ݍi-|ؘ8&m(ԤwO4= )BGKb%GJhflG<^Q5YW2Y>k(鳄 Sǟ^;@+QWK_36k^׹Q%-/#%fטXfaL̒1*g*2~&.y]SckDڃ{CiēY妯``]2rs*U]lc38G (ma/f$ppٰV-W0[ߣ^Mݟ s63;|KjߙJ,pa3q_DǧgϞ2'yjcYMeܣ՗xԓLƪ)1c!J\c1̿H}7פ'Ex9]ErDem ξ^s<=_ئJvD/~O?9}^:}Nڳ5ɻ6| /:vp7$/s8IXS=6q3ǎ,d1swqq19ǎs~1ݢF6Ѷ"`&{XÒdq\ 6@sߓaq",9d\cA^g6q'?#VCٓH@8ǴPSɓQbQ<)p3qXHJs2%gn"9\qNS?}7gj_-9zѯW"g4[r;ϊ戉xtk;FC-QGf;W{{N?whzf"#_Xdl+[\M\ҕi,A§V:&qTد,aZ$Ti3ʸy$YՓdWOKM9%jNBW["6˴Z-^VCZdd\{v˘hǒ}sgqߌY~fq ?}<얞M?mܻʚfNi[VJUmɠS"ePtdȻGI*N]iVLa/{+׋L[l)We)vm]Gա즯RINЎ߽YzrWUl5:~s{mqj?!駍$DKNyǎۓiXw; jKӔA"MGQvn6*01JNc[=i%ʕpR^9%`'MWiHmdV9=R0⤲(H\䧕E|" xl1`%%֦J>IA˱^Ad5?jgzb' *1rS)g8<B^SE6Zuߔu4LϮ^NG*[~f+k+I=~4T>P}s>m 헽?oXi/&s65V&YƯb5zwkMJ!#vA+ERΪ2Órׁ3gn򖜾 sa$τ>rnFR#93ًM$~f|&1{M|tWHnɵyԪŶkwVY?6_IOcT[+ZD4 RvrTOf-.N}n9TuVbd;s"'L5KbjrK`nj(Q<&;M3oy5mMl5$X "#_C_՛}FʣDX-=SC, 1;}Oٮy$$UZd3! \'ʧ"(*rwf5/vN(Ks/|-zòv⣧KfYoiی0-oM5 +XPYm<\eˑ;;H8GH}il2ȲjKNyǎۓiXw; jKӔA"MGQvn6*01JNc[=i%ʕpR^9%`'MWiHmdV9=R0⤲(H\䧕E|" xl1`%%֦J>IA˱^Ad5?jgzb' *1rS)g8<B^SE6Zuߔu4LϮ^NG*[~f+k+I=~4T>P}s>m 헽?oXi/&s65V&YƯb5zwkMJ!#vA+ERΪ2Órׁ3gn򖜾 sa$τ>rnFR#93ًM$~f|&1{M|po#ܴKgP'KibSQ!7c,V-unXkSXlGuʩǝ@Z#eEetc'cKG_AgPas<eqw>PxZǷ}gww Xn՜л+6ZgTD+xI:̜:2hrvq]cb8Q(\'8c>ӻV-68S^=d̑߶(O*j]qKv6I503 VnlgG=ct6ui^ۛ:R^vÖKq3i[rh;'smYۆw.Ɋ9.wc̏= lj׷wՋ6QvB* 4W)S&w\$S1r\\Z&2knD(`6qd(U00,HK:-%&T~9ѳٖ&;#&Of1GLNAD'wp͔8G9}yL uk 屓3xrل<,GD~LS ߻ 㙮=FNp_yϐiP],2O V}5De.m`)dDMEGZvm[~Cr ok:CQحZ5ef-N̝e^#"&%ܲ]tqu}`m%xhSve0ת.FG_lr@77Xs^CODǦ)j%aQJ ncԪO|m ʼn) 󙪸r1GPqKT. ۽Lߟbx=^rgq3`3qg9].Xi.0Gyܵ֍І!$ kjDErZ6 ڶ5cdfЙk*ָzXQ &/xr[C\[F 3Jkݛiu)FE2Mk4 t]'q"aۍ&mw7l]9:ƺs<ՙɐ3.):ǾkJJ`9o\H.Jg?~3=RU]:X vœW1K'ғ+T=J׻>SnmpBbmQӗnc麳 ?#B[g "-6>GiS6܂m"-wJyX2afo]c漐4'Z6ZFqiJЗdDÔ$3H•crح T0L`*g+{-'ŮBm!zo'z/QV U8o4haqkIȨ0|3yK% ͩ$Kje)&)-{K|S畸.ݹ]LE9]EYS'QCMRG{N iOkR}_@)s.nڨ̓gwlK"Zc NwMWP[58ҵ}Ca[mNMwe^ӱ\3TDE )di^QxvAY#l)5H0Vm_FG vݚ"2*v=kKش*> >V|LcEtLP9C{掽˽hHSeâ<}JH)U/Uuʒ$S9f>pE^fS<OnLHpov^Y ݙN[/jmIq}%)#W6j:,n] t鳓g9;=TqcŁSI9oM7d6lNTy?!k[d*D(MGkZ勵ҖjU7_^qi{G[8ԍ#qrslЖVrR(CZl־QvFhɫ+tS. in\WSMݘ:R.xҧRW(kwԓnVrc=5n^'> :LםhjukxՋӚ\rSMڔE{'.wD-Kpq3JP'ƊJIk6qjsdVAhƬSAl vZ6d*]Y.SӴv]t-sGr@芩.\)fJH9՝*ִl/HEαFeUbAA/5_ t ;Y6_x^m~49Vm Ih{+xXn9g,VTO*dsc㴟hޑN5r"d("j8FR,ru=#FP K U,:2x78vE6yԄ:m~{zkYu& TʦՓ͹ AH(Bft" !bFT*z&c=jV̯F]"_h/PhIxfڷi}uCWVTB #%vV;_On]M:fdt~ꙶZ&ߚTu/d6Y@l  ش oaJ],f vNp(6 GH4j^QrE]?3JoUʝwDAk \MFaJRc!RYuӍbJAf1QIg)|kcw\? W)_ %B:w/^i{yH;d-#֧'no2~#cבy9gU|ލID6U( >mV4wWaYyӣT0Fjvtd.͏QT+Sas/kG_ O v!~O:#BtTeroၶj}Mmp)X:*zQZ9Eڶ١ kfr̙Wz()_׷vաO#ȯX6֗-m:@lER,VyִiF-ѧA6Zv͛:(7n ( o HJiR)JR'uhiw 덛*rhqVìW9 ,dճגj< ^W27r}~A18ScrJ)YEcXЎѹ[^uYS*~K4ˤv:H4lTZMqJ8gR3v6mJ9,9čOjU . =fX]6Ͽ%8V]'-#-obbBWqI8&{G-,\JgXǁo~P+WִmU(v5xq%mw]d\UYRN\W.U:7>o8Ū8yq#O-Y ]3\lZ X- }smf (7Js,b+ށ=M;<@Wmsfqu0Qtü_H c#}Y%HW4ЌMa;,c"D̶1ӦK01<7t 5K[=o++:Zbt67u16|Zl^?>PKlͩ߅Ԗ 'HS0ʗ8v||Ҟ>Fp4Uq(Y 'NfTʏ$V;g~35ʇ; x!{w3oӯKG>_%1sJqyg[jv#{f"+bsfy}ҽ.?_vr־Yxo;[L׿iW!:jx[K\SW:]xZSɣ3uF1/ )&h.)y)]2vMM!KĻYVSu- =䪇rE|MpFύQ%0Ub㙺jW- if6o1u2 24|κnB=Z=鲴(' N[x Q:ۋZ£ȹgd[X*2N";vZ:ALrt'dx[l㡺c/}S[6:e鏒4mup]DZ7i6[ۦ {OJ6zxoSry083l2ĦɁBD"W#ɨr'h8@߃&揬?=}z6ϭƾ|V̓5+\wo&;VfbմLOi|z_%mLj^Rh8f&&'&&ZqZfww%4+ժԬvW)뽌f띇mA>E*UgWC ųgTm,sFOJNY( Mz{sw܊3olD\lͤ]adzuÅa%ߨbg2zlݠWm$Λ8L. ,骒2j&c1Mf9 ټ S۽5MÇRRNzQo:X.2b˝ExުՎ8/)EhO2pZwrF'X1ԒQ(իIchZbNjE^6 2@CJϾ1{.ק2}?t-X7V.zvj*V:m qٽE)Mm ɷl*'ÛfCHlXG`Ztܒ,21V%r._LA˷[ªots$פW+;7]GOר1'{sOj[RO+ M[HoHk}O<=FxHɆM}ܶ2{oH;vt?xrRMSRm:3*(&+^P'-Xz43YR.5rT;)ZࢲcmE_'N**)Xc0(7e_%E]BoaqGݑ sn+]@zeZ{u,us6I޺hq; SVcd?v1>Ga! !(he&v?-M.QʳHWNV! 9R`'˿8-VW֠>WeZV"X@k|D$,[vq[&vlXAdHDH.1-%yt_|ڦwǷ|pݯ>)MmWGa2(T WpM$f^r&EHn⿸cSS%mA}yz<=3P 1mR{٨+~jh~Sv"n!b$9f9 dV> b8ϋouubGI6'+R7;eֱGOAJ3DM*CRm:HxOA[B`+|^* Lg˨K,KYV6pl+zXKcߜgW/O>[u 4m7K[{F&mƌ{Ѹ]i6oͻHvB3W/^EפW+;7]GOר1'{sOj[RO+ M[HoHk}O<=FxHɆM}ܶ2{oH;vt?xrRMSRm:3*(&+^P'-Xz43YR.5rT;)ZࢲcmE_'N**)Xc0(7e_%E]BoaqGݑ sn+]@zeZ{u,us6I޺hq; SVcd?v1>Ga! !(he&v?-M.QʳHWNV! 9R`'˿8-VW֠>WeZV"X@k|D$,[vq[&vlXAdHDH.1-%yt_|ڦwǷ|pݯ>)MmWGa2(T w>PxZ g{Yɝ=4ve>S݊ ݨb&OY>oA괁ehWZ߶б}_O߯v/;,+*Kâ6Iw*˓"ܭ&謱șxS^ih>%OLrJ[d&dw+.}acYcg,=ʛ{rjw M4nܯ{۫v&ˮ_Ӑ>m.P۬آ}_hAʴ|/8"k<ٷP + 7Ù\p7%K۫zpGEI\ѫ&gctrN$-I]b:{M\Ck}y]itd n 6qqCI&\pTrU*_\z0.= ?ggA^3u 26J97 hVD^B:|ki9$LnwꑪG1W9)q qqg%Joe^acVΜީj܅VJE”e9wt}+K$fjՙxbp_O>v\|Z*W_w?lW0?]xd#W͋;\ ,\C<6ܸ4]3 0rV]xIuNr2Gn+]$ʕ$Pgn3{FWk^Q;PJٓ(_%,_heXŰdZacBG9eԻoX{M.fQ ~nͧ?^9ֿ`z<5!ܬ鬓vӗHN[[IYZzwEE6 /xI2现Z9{zY3=T: VSkYӫOmTR+5Z326gMY5E&6 1G*!GU7:bEcfQZfXio[!zŮ! gba⟻kc2k읶rK<ٻ*]6{|xP@&w kȹSkv{WkfBH|JhE_;kspOf~ݢ~wK|<à(f-[15Tx H#Xc+.Zu{x8,w, ]V wkNQ͡됕U{fؔivQ):+N&9Ne:0i]xj RPqOf Kz)6dbš'OM6}yc c38W8jhݫڬ\5GkHk3"tؖ^B$b9:eF`.eSe$E d mrR,knv~kMZ?|օ ({Kd,b0|Ql#)6nͻvlۢգTRlիdAf ݺ ")e*i! |Gy iXV$TmLYz\%Wpu{+ԪurΞL8i;$ߔ^^o+4K-I3!k̷3[ qt]5<b]ڳ_Wϰ6qJT߹qA- o'ȆT3o u&{P˓ɰ-3Î+x) ?hu껱6]߶l'iTҐb9;OM5Lը줩47JCl }C7 d>ƕaw]'eon] R/;E:- n-#EC,E!UNӶ<)f!i;nvW,-:R[KUs]e7(>FYו;VĩtklS;M: cX);>.+!񛅚ն⾕i-|>q L&0ms5i|%|QEy[*:I&RNpGR-Z憖eղӓF_g] V̈́|ӯSotgr~c7<ƈ@LtQ:È6! eUtɃqT)4E%Y=R*tJvun.Nwڮj =R-׌;S2gޕd{)hEk˫WiPrR@k=Y0(f(FƴOVrϦd}C-,:`t=MM3 ǀٻR[ce֞AƙԺ<:pU}m s ^&\-Zdm]2 g&S,COm{.׮ch%|Ը-"x^+D\|f6Ȃʳt]|j!|w N \ѯ[~Cߵ풸JR5-\r E+"/AIq sw.T55c9turWSqɽ<|.Q4d3 QLaX)8zuCLODin>)Z'nJEJAG+\ڮX/,ʶA7V2XKIp@mbWtݢߵUo@;am79'( k̤Lbex!͙?#Ui2u;.ջ^*RmUkņ^7eJEn6ILgtzg@-VzrȝZx+%(uIk &P,lG3 iE' qѿig9ߜ=5xQԂ _ֹa5l6~•3a4ܟi/"ay1(*Sk5JZC@BܺQ0쐎iꞬLͲ(.oʪc@/҇9bK'FNW5Tjm_lB,ƾ{Bmkjܟ6 s֝tDSӂ[%+UWANQ4MDL (R59rS 9sJb83)ٽ7OWcSqpU7*ӚkDͱ-xf0H;M$֎$9>Z,sYj#FCrӵۛ;15{jT]J{6- kj z3:=fFؒBĶ -vcl]S|SϹ LuFG*u  뭅Jd <<0}o`K+bު-׭֝VCm=6>JF5)Ănj|1\r雷CZݜIFB]hh  T_4IWUL]67P\J%{?qo9ozݕ~e(qْn2DY*w)MVH7qq oώR}WwJ-%t-ZFmHYohGFV}"eDnD`ŷ"sGN΢OX9cjŴc !dכ9YW,#f9e%+#8\QS! =^]!L}wyGﵤhZv 3mu:VJzN^VYH4j'*pϺ}v󬋶!_im=U 8c5#xI1u*.;h"RQ6vSMi,]Gez:M67V+t=g}EQ%LȞ[2& S91uf۠Ѣh6l" ݳtTAR)SES)SI$R&B. c9>/P_ja1Nr @j>SiRPmH,֯oY݅3Ưٚ/&iyx_:8WDz/}~V"gZR]< ײfmAL8=r*ch{=]3wͅIU~ClI~7GLzPDYc>/nc-u}s_Lҭwx> Zө7Nmev4UxabN11ȱ}"Ϋg " ۼnKj~Gk֌mᩥjV2R:,jѥIRk&Z%Ce`QsJuROKjʭ({[Z.Ty71.KY6xP- 8UIh80tI'vOHe[H" B*8yq􋨥Pǣ]f[$4tu_/xWkkq֯`R_ѷs"싹UXȼz뼬Ѕ+Qݍߡa׻/Q3'y#6.|F٪J6S6 heg*VHTO[ 1"a8m.n4O.uoe":^Wۛ6sճGВ`/՚ (x:?vvk[in-lś _MfkjMmLL&8'n]|\wظ1`vD G56:OO_qF'nhK0Dj燤l>Z&FO?O'nhK0ulS8#1ȳxvrl{[,tbe:*fFUDwJ co_VţK]z[մwD,d!~yHj2U<9: ȹ2H92e /~q~9_ں.(Vi֞g+2g*/O11@gHrnAOy+dfQVd=*olt4xi & &ER9BV9.4FZ'ʒZypD;6\CXԎ;Z=LNR1#$NCd+)1[vqg38;׻JRr]d',Hl27XQpVMі:әp"Uc%sTY,# UUU7LQL(}l>U{ӓcO=|#hns@ ꙸ7 Z:е]s9?Gơe px4|aqNFC´L~eOst޺ۚlQ6[334 nL7|jF>3h3Q2$t*[!=>tL sHh eYg!Y犢ٲX1\&2bߜ Aq[|6#5Gutu'OTl^Z=gnZ(l3D*Si8Iyyk*+ӏJWkSzjY.HQieyI4dJmr |΄x76{թm.dm0i=:ĎdMU-V\3q޽T2p=`MܲIskmoVLʳEB8CᛢV-rN#k/#G=c% SSWM7>LwŸgzf1>c4FaTLЋAϙɡT&x} \lineO_[e[E6q 3lR5lBurIMjvZ5YTu0^*"zRRtFJ1|1o.Ͳ긍]RMCd >Pޗ}̮lXkvL;[o;-֏$JwQme,iuyQ"+4MɶA `Peɮ;r3q+6?[n -psS̢y2eU(^(2FS2qfNB{i}"#j֥OYlN^k$uIzϝype#^,Ww$T \]ShU▭4rS*[mKgVjB)f&=SАM$2BĨIsx yҚGY?v+zrۥ:UETQCs"[CRfmS&8eҵ%X/M؋Gٺ;5le[\PO%ũ3mVJ^k 7~T@J ʽ/T&$0U]2lHrlCc'Z֏:m&\~~SV\Ge-f1cx헺1JQ>bE.eN7"ʿZdV*M14U(:UV-,;i2MPAw/~59Џџb՞ڵ-̍ 4gX̃ݽIk&x;׳N H% _uSB*GLkf9ܓiNzWY_lz)Us' y2g T(rKE2g4#3LV(aM Q ,3`8_*MK[#IѶ [i (v,%XJ̄M~Յd[RFPQn؉7K5#R,g;kEԯLY8;U_Ll1YE|W~W77Jz{u?`k;%,qʓH2s/ 2R!&|B͖6w7m$v59ydy55 |6BMI<LvHaWp;SΣ{]t*7VjI1"yi9Yr;Gm^|u/?92b$4TaƏfcLceysys9 >pT>tȍ&LcLo݉Ajm嗀}Dq M`$YL)=wMOUӦk^k|l`📪1v#ܽ#u\="1S)|:q=!wzA7_7铖rɒof[#'\lfSՙUG) ,Qºn:sɴ]jVǵ; ZE ip"s]k3хɛ8,6Y"Zk]ƻ71Vo9>+>tAOۛ L!po3Ò>#H%>ܩ]-BHu=5!56}*ˌ"TkRm'9 K:fZJ\^<|xtmir#wE 5h^}+xa7U8Yc=;wP'ͮ$W7_G M+5NWJ!^vUE"ݱ3։GIƷp?BpQr\>׬}UM5e"+/Ĥ_e-Use3vWX ^qŬN;Qks&$PKrvm’3ԕ,\8HtfN#:Blf l.Q?6ZH epdJ|)<~$J{)·P18r<|3(}τvsf֔M4[VڡS4kՑnڤ  grPG-ecK* Mlg3ݑK.8 K˨qnn E]u6̫-Շ$SQ±K[_Pe%b'=dn_N^#IQm7|6̋X*MA1\!LGygԝUxtfpEΗî2r5Y׬a,S,JRsUYc[Uf~+ klDYɹtɩ]TH7WxLCjR:Qv3RFPRv8Տ#6SSiG6j?-W_Ms!mE+Pe'*me"NIYYh*T!*ZfMҵFiF&x6PQ׈9+3,v};&P9&)IYxsqбwҒ[GFC)rEdpcQeHLd~qB [:1iыRmY?kdkKOX#2ўޛ 񕲧j5:bjRH;l#L)B3l]S"Ѣ*,I ua70.A,nX6MQhմLA9K'yYŴvk.Lup꽷ԫp+P͎y\Ho|YʡX(l$bRfe(8AfLBr1<$SdEŰDٲf,"$) c=1c~!aՒFiX&(K$U<%I'X!)rE/wC<5X㮭RT);o7qMteiIucGcb=//&(1 -.TQ8^m])5״FJwJƲLUdc۝DW *i9u(pć4ys=~Vz}j:q1qdgYט,˭='>P\Qm_^Ly/; F*Ӷ϶b,\$6QxjtRj=͸i7'v]*V2,Aͽ?oݴ[xI̻f_KA$ٻg9sY+'e% MltS&.)dx*6J\}gA;_:`Ɋپ5"x{L[c8{1cq#H rco9glj5MBqg8_;-uTϽк]UOݺinN:4rV$TG;NSnǴ`5 v\,Dl30tR9UYDc+dݸX)-X;pp}:Us5j~?Eˏc_cԦW[qO@RZnWՍ2l`ǧ1#qav/$h1 |c&>8N?Jh_΃669:~ګ*tpT>tȍ>m#ct,c KM&FqMA2MȦGI)HK%r_SrRk(u `Zg I+2>Dr29Ǒ$s(0ge#{"#\޼eʾexG;1N6$IWn!3V2:H˼zGlE6޷]D6P֔dȨDTUظ{SXR."΂dgQS bY)R-n*կWFhJMxvkGr\&M9NEr [L5-ՖaXuI==ZBA<"|J0U_ S23]q`<( ʡSM5.1 IJ+&TI,S86\r_#woX5q:S*#u[>MokʻB6:YJ0e$C4jƪ3`ܦF2g.LM2?hRRQ4fBJE1`'pK6jպj,uDHQCpik*tŲ)RSwEG#HpR)f3*EDTYD4Apn`]zY uB5l|#.ѫi) 27yrfrOUhL\_:{oWu7TV'l6BPIbĥ˒Qq ce 5u~^!ժc8x(Hɳ`dͲX)EHR~{c1X*g\6nmE37~pW*,Lc? G563w^{B/QWippOv|)YA Ҋ,60͡drdN\L=`h4;ʲDZfvX%L"͜LIDNs>]vª.L"ŋ) -wʸAYJ'OwZ O\cg!aP;Xh*g 7bق .b3,tZfTɤ 䉐7!~m]6Omx# [ cc'lI n11'">x*!v%F$Bb03yfἪpz'9ȨjFKԃ.1댒cAq[ v*ϓnjYZoXV$N">唥!JB)q RKwc1c1cƽo}[ v;Ȳ)&6xw<"͡ QȵfRn\B]?W}a7L?&/9Bz: ؂g1̿Ւ@sO*x{#ʘB@EۣnQ!#f)9ݺ'fF`vDMI4ȪKt𰌠"k1a)e2d_$PUEPDI?"8&9o%ҼH3Ul6e3eN >=̛`pa_f-ǓX3'9hK׀#v&ٗy\{OiUc$ە&ȄbqƞoLz5Do?gTgwmfbt>s7Nbd7X9fb3]H$2N:=hzH-JƶtںbG+*+Yʩ9ө'4n?\jZJa:Q$YԄWsrΫYWxI"*h"ݛbdճdv}ĝqy97vw}KIA/Pb aH6 l&[8~M? wʹ'NJW)5Lz̔,1󩸂FMs5 a**.F*s%>p7TwFEߺ2^Meb#VhՋUՊJcQuKpEfշ뽫dl_6rк 3JPȰ3D;5~f7iflI;Gބ黢~Gn]ϵwflٞW^A4oدK'+i LJ>ah lw=]WjVXf&r]Oce#^d\xb5QU3gqSxNL)@N پ.ܼԕY /'ElT&U$ % ATΉHs2i_pLdTlfesPVZ`͔&ZfYT+SLK$KU29|CUWrhVrEzL+ܶ!aJ#(.gpde\VO. ]M7[d9#Ƽޡ>cjMfSc#Z,prȼlE'Pq$jBQ$W)lGBHq湦hq6IIO1ܥyT|yDVUK?"US4fGʕFPK:ɍGgwsFbp N%M9hr,O0C*%)O-TO/xN$^[“2غ1GqWp+,0l"=:";Ft[s&;dLʟ*(b7mRDQCIɍ9*%J\2|yY4a/jno$I6kvʹrb"ncH…œq5l%PfK_X*숉I;K:,,RGm k'*#s!F/?ҥ?b%qU@┥Z7-{;l-rQ.9EXt⪵ô]i R<&7\2<{p$nN컶UԭeX{b~ h.w/̾x$Iw)r筀&r?l1 Jæ'tO+eZUO}b,ߢѕsnW]e4cM.[w^嶡c]{EӋmlY&ad[~i |I #ȭ O֣i䕖&jZ yl'=z~2 L&U_E7Iq:K(,b..ڛ\Q5q̛ {R!^Mè[h+8b5l3U{&.c'\4;Xl$]6B6`QS ۬~fdfm>$HtL )HM)Bl9JBJRVc)q`1c1%Gzm7lPٻ91&sMVJj=h+8aExw"BHT 'zyڜW-m#`T ^GLʨ_i&rmlsD:eN(G+&6&ЭF8")݈H3e&21|qc\yCu}F둕:qX@!2dewrurVx;xVUSXnM\޺fwsBK9bqC8n*F`11x'Ǖg/~M/OӟNVE>`uuI.b![ T3hdELO'>vUt+EnLY4MG{8Ɇ c#u1J5Ut2|PD,wF>=C#)Mvɤ1h>TPnV 1ϒ9͓9sUzKZjeY =`h_fE=s ImRsVEt7QfU2, )Vn]-w WZzKMNX.vfH6TTujYol_ H 3g9L*e9]E\UW Nt큎4I䤲.^pL(tuwd]KV]B͓(s43y)%^}wNвq45r-%w4($˹prbNក]0:fM]k6NPQ4MKX+vv`f:HA\&tTȪ+tdջvM) L8DS*e\6J\dK翻?{i5k;߻"5UQHt̳x:"!$dd64dC<8>l~]R4VҼ6uܻK]jQ i(.d7q LvdMr93xhA#-bhS(K%JsK!ah1q-,dT[7R2rRf>= 9xM6IEܸ]B")UR~{1>$r Zk9p>3܄_$ʰ|hI ygSLB=Nzjn\g(='b_uMq`޴ω[siLa+]pWf#[xj1ˤIBi҃ p&uZJF^)9O0|ئrnU<@:4{έu'XIW!_I-e6 1mݗO!䛤|1ѷvj^!s)WNd9tɾ}8*SSKӏi;tsߥ7ssz8k^}L6Sڰ\7}d'oO.Hk=lR=D[^Bw8=^_Fɧ/3EL>YXm{Ԋ EZHg- exjK6U9 M~/UK$OJ{- AE2>$YYy{o7}wFue9S@[Ti&KdZHHi d\gK$o߄ݚ,v[Lp74kU72mtOf&/{}o =>>yҸXtIGLq~V&W:&J.R5A_2~Ulʤ᫦ꨃMdT:g)޽$wE7@n][iD>mfپյxL2H+S'!Sh9P!SH1qmT!5D 딍Zw.vJR VtLY E\+eྎ}O?sWuGڻSwAHjXzZ=VU_/Խ Ab³ EnK-..IyU(ۍ{xZn3RE^d#hzԄkU r'/Z Sgš3t+Cw7v f9 Պꇱ)lQmgU+i5,6ꥮBWB=sPSFڹg@|)  +fxˇSKD'gۜqM(AvXm]Žj6JQZTmkc_֊MfRqQ<[W>JDR9RSh~wRkq&rw%fjԥTt$aٖw++IL Yv4ʡw09,cl{ 9)1 ۍTo\Q.mu75MA!CLRJEuvQᘷ)ٺ)GBu%鵣 }Q~/3v,&Hlp(Bh Xx_Flݜ[:Q&o=>6Uis_1Ӣki)`m {mUHyދkX&^e) );+ 19Udppyl-Y1 HOl:nF]EzΜh/,9i6"#fՉ[)/7VmDm-4/t m{v|—Cl1T"9Mz2ȼ~j'c:K&Q<`bD&|C.Ҽ }UT]6$.9ySg]e&HS`*킧!\R δTDw.=Jv'PNշzFS.rβ~@$֭YgvlԻ Dm RA<"̓u9S")8.3lǜ9˖RkFh;P>SRA3ݜ%!(3swcޫW\ӝ9sunxmb|9obc[xgx:[%76k$wIyO{ٝtSaUt㎦TN|y/z p0_Pʮlc]NGh>1BI FB Hȕg[0E1aG dˌ쪫Tțrc*\c1/=sc]4גzSh6,kϧ.س˷jvw_bږ)|J$_+UO79nK=]+f߾ nC{]+mDcǓ>5J&?]On^NŇSGK-z`Ë1VյGd|^)vRJlѭ&:N=eQ-\'9sݜ|F!b1L\k *G|̣ {&4FIl28ʋx]8w ޗΐstϿMV5զ7i,"Nc јN' &CK$8;y-}Grtzz2 厚CIWF`qU *jJh"*S}%\)Wq4u9`X78>wft㘝mZSg.,0_h7qѹL9-p䶵b-L<-YZ|hw9IBA4}*mB+NS%ɱdAb-*k L!cuqej[rLQ d?`h"f[?(Bǽ Dl*վ1.8y0Kn_AOѬ4b;c*MQD H>Hcg9J"c&K2h"]~n>4őtoWS|Cu+49l9k k|5- ˯cgEmIGV_ӻ</X3W.+:yi--iOolaj_Vg3ĺ3بǧ{'F6M\}'b\رeLޱjlw;-j[1? v>1`XTWA 9/4?eFi;F:خwV[/+;o%Ȏۗm?5dO 6hm?FLMl_ƫwhQb+锛͞ad EQY#5S9rC)g8t֍=Pݹl܌郿*lJ0YWX^:k2qQIHJOL!P $SiTΒrIR5<1˒.upbL\83g聾:Jڟj,~oY7RޫsTvϽ09#DeS6y<,.N.٪qg\7]"wאG6M]_U9*0I3IBaіUMgpV nP5dvt x jiKKxTC3vMeaH\w)?jsFS9lhAi(ctE/[*\' vPPȨt\Y)uO꾒~˒0Ө-bf0ZqQyϪѓneNxNs+I1;^-m=z1J[V"*:k)bG&>Aٙ=?*y\K.u:,X%5r'VC639q3iṃjWI20$9R3b֖{]y8|Uk`y&6а0FZ;-Kڋ:rSxs eI#cÜg63h)1ƭg Lu-T"L]WpTxܐKӑBWcfE /T;閤62b!4ڰLZk#ӟDz3ӚڜFhu-mr\q{_1_wwmq\z5u#/}kgp)])u_Wgͽ\:/qӍ1֏]Z+6lT\mLXڒ,c2vr͓V>frw|c:Ǐ#1ҸեbdD>={Z֟ff Ԁ1M2EFdw1TÈ1yi1&38)HR)R)q.;Rqc1c?j[>d#r'q]:K$||GMBŜgѩU:=JV{ޞ_3}Ѷ\g-7H'!!P9S9pbJbpb \83gb[^bGKR "c]H9W|(l|Yx_PS7{0j1ׇP_d);2j.{Rp16Y#d3|jU'2#-je"3>F2lUK8*yTΤlx^"Y󿦟ӌ{t6xÆ5uO+l4 k75lkŏWg_LGJ=Mx}~KIn#LزZ~~],bɓF ݯ_-KVdCH`D*Z,SLj1ro"JVtcvppD4l|xs &$oߜwdOj))&C/~>!;BHq1`|Mv+kQxc{+//KѓՉSu;H<4Nh(iŻGn9fα[LyE~r& f~Gq%Ȼ\=XފZe.pLU̮(T@nxV*^),;dGFOA 1ߜCTUS'P>sfOxoRz]{9WmW-zhh`Ҍ|gz.0-kh~;kqxm1Zslڽm;> U\1\uzP7f]u&ծ],jΛTl"{ qHf*SIu۩ϟȪCc( ;h&#ulkaX"h6Iܕ"-bWpW+*ALC`1{sQ5i{8x(SR |\63Ag.WP"Hu[S[m5캺Vȭb4r=t[^=w,Y4U΂*E*x| 9Pl4e9RɌcgR9km5~};] # J),ٻ0p劫$tP1]%2_ v ՛Gxi'Smlvg ҍ͞qk5 "*2% qK_s`4^&zԊm~uv-o-7O!t[5QLe2:YLdS'p7@_sW:"ə J?.Ќrsܺl!3tZW@Zi(;ej] 9Jok9(4pL!!\ &SekKmz/vGm:NNu9o,JR: .=ܻp6n)d*\6lP]4r WۛBU8͔hYX謨y7lѢ"s9q骷Θ ޾{6RxJ6;4fY(/ x/ !@618U+%0&wr2#rZ)3 n ڵޯ|b6mN2G*]oH,gs7XE]/~;9Lװ^Vtjr9+dzj{;׮_=kowNU9xsSZW W]@>Z[עm %fy$!g.Q6v:.[F1 ݜ9һ+gݯ*vT4ȫcHŰ˷T._O8P 0ZZ]kܓUIl .9]rx~07S3aT7m {>ѻhRm[MZƭ,ǍvD3Ǿp75\pMi_^tUtNjSk]ӭ6uZ:~ ^1*vLStVl[)ɕŜx߰/_m;&WWQPj9g wMRs$k[8EQDž$h~!ofH6R"XR-Ehvn]ȼhɿ\EwB!_ßҿ^֕H@uP FA]*j[m+Hk0|FϚD3G5_>r訑Ccpl\檞qV[,/\X[=ʰ1kwl8S 6־ٺl@'jWz򺢧o튤 I:Oʭu#ԱyaIwH ᔔ{/3""&5de$ݷareE=zD5le]uSI2c&9g#95xFwSN]D}AjQnYшv䩷#gBC˜)NC`60bb1sgqg3jIoiRuu#Y'رI3xZ>$ʚQ ]EHT9Mc!i-U vR-A8r&yM ;qіI8O՝<|#v/[ lk^_oLZ#d;Iċ]&eG M$sP&MRD_NC!c8?͐8uЪowF!î΅P}ӿ"6PR9_nߝ^LrDH.c[̡#2-ƦI|/b̼ĴlLc!cJpov1xD[5EU7l0.X^/G|)05mGGV9yJ?)19=Qms`s_,Ku^/kg4Ն;WUXG*I(K: GJ5uS19 |0O筛W<x&2uenm:)E+4 ψLɖ{=v^[f+u{Yٗ0hL׎DQE2ɍ1R\~tұ8D/it2KciG֙1Hbɍc#z\@)7\[UVze^ 2n7{o{5 t1%)FɘdzpŌJlf0+^?eGe3tfUd˓$_u-]kT&XE*| "o/Z/c$-df)W q^hl5n^GD qLԅZ0?b*#"gO 8^AupEUE -a6u*?YWٕWQFPؘ#b ݤ=VR$],H Tޣ\KUft&.癇~<}p՚Y餛zhfqH.[mnt'oCV_zb (BDm'b!8@ctVl|zG=2nvL\÷Un{97:mG4Y5HLpJ9k-.JV7Q,jR򥄒dғ >gUv,ѹ n:$~Лybk:FɬwS{YH8P:B=vcc9:$~ЛybYn+.ط4b䬤*~TebPj2xJ>J/Qr>K'Op}쭡"N!_.nVEdNUY%骒Ɉj9Cd.pb82 t򗥲T+sOKqUG* Lt!F#3"텄'&Z7w<&$P⋖6hL*USU;!pYZk_RF.b ~w w KtqËO@ $[$k3b7xS&%dy)%s#ۡԣ8d~z M5=u0^Œ'cˤ]V?xK{kԷJDiɴ$5La![*FP #eE]"v=žB׵kLVJ.`UˮyT"z$|WS5.<w֐EFv5z87rPd+o5&9Jg8U EYP\>+4IC]`Xk86jʷnՓvvy0,D28'gd9dWYRw,nskzU(Ia|J ͨZ%-UO8 |9?yaKv":b%e2| έs<ck{֨ iJTCgs '^k 8EXrNؚID|%tG1UXq0?x>3u?x #F-;n3U!Mʉa,VIV21%k-vT IhH52=Gn)ٛ[})bҙ2bȿk2O9ndfг.Y5|Yh;DU Mw%2tggn;6wou"Y^{K!^|E=*ZrvyKWqBu96<۰3KړM_$nHj땤 g0(b䎙ES4Qnez &raU,5~f0qgܓ)mR[96p͍`i%^'<Xth rLwU4_@v+[N**=z奢3~2+^ž`W+Ӕ)Œzm#;1efmĨ ޺!?tu2|Y)eHJ|)PRD˓?Er!y>)}9&)b1M1vqg3gRѹ~1^c]<.q@#Ě ɖ|HIxVm+ tIHڊ}yǨ5]_m*5Y0X 8Ő|ڗHLr.՝gك|Ug7& 7E3w+g9tw+|ͺ)~4!di -2Dh jZe$G:f?L;+r^s9^F1 A7eId%Q?I.Tbppxr"2xxXf-"b&TZd-4lJ ۤ))R>ϢhZ>U;C6l= uΥX#YxG[9pr97_ѣ8ڽvEj_Xn4&9l+FN[J(+e 1l%\SR?a<>YlDYEE@D&qE;x\s@y뜜fM׼[a:QK!m+Layc4l|fB2SS垙6iHim, V <3p*UU{97gKDg e0VQew}[@.W(S׋% Fvb3QQf[yMrPAstCaS~dplu ˦uwں^L˾1d FYF2_z*UNFPIT3T3C kmyOZ*tZfwvGDDͩFUDd4A仂¸Y˟pl]S"=B9+mFv; uWM WN~s5Y)tU:+$|C%d'o+B#ZDŨHPg$6>5,u/"({mfz2T)(:lYG9h9Mq>MT|gɎlx<&4pg1db9)l=T*ce18ɛY9Y&QM5 y-Onh1M0h%+ocLrx8d b'̎>F6ښvNձ^-&5zW),%g?(IٴdwM# ;S]{<-uˍbj k lD&Ԓs|oZo&r\X? 5^AFHgO8tgIJ75/$746v8#?ASĸdEb'Y8p٢/ !L1QEo n礀`p>hrۣMTﻒ Ͳt,UZ::kb0,\b-eⳅlIKʸFOWjyw}aКtro ;Mm+(\},zǻIOc]qOUK>(ejfYa]S3LQr TJcnrrI7^m5G),\3.qG?cѳ5(ELKN7H5wS+FdlJ߶˳1IWLd#dJ5 lvnHG(CY2{M ۵TtJ V@6gwII44^/}"PUIe :gXC:8O&XS}o4&Nt+{ˇM{rN-W wU"+/ (r9LT)Kx}‰zܒ羪ж]VaL3kuʂ,?AV$aC/C7I\F4.-HΕo2o,3aKMIM1n1䫂5`v DHvfIHɶg<)BY! =tv]A3_ !î΅P}ӿ"6P5־׶UFU lBQZF2}$"pܤE ;CEA5g%5Eb^W-8p>Y4N)sM2\ÿO7[Ӷ}u*1U<2bB8OÔlK ܲQS-=eOB-Zbٻ&Mh͢hѪ)lճtʒ ۠H (Be)R1Z%gQi2NY֩!+2VbyHv,/(XHHóeLe1uP:n}ӣn^ӗٚޒέ^ogm]w.O8Mb*+U(S@cxg&R`| 7jgz;Mw |ݪa?,ܔ{ǐNdt{SUKk֨# -p`n(Z+jDy,^" Xe ͐uGﳂ.?ҹl*]үT3 s0M ]S8.-wMTZ5̤f8\"|V[7dɲ ٴE&Z5E67DMH(JI&B2!p\c!O?EӜ"Paq\V05 s`L-Yn5H(} m9eff;'_pCx{ۣ~ }^YtgM ˆkE׈h=eB.U,Rr eߝhG_Ǖ:$~Лyb..22:9<4;qqlEGM E Zfl$vMS"d)pa3 2T<61rr-g!%5>`5x*tU]3s!r aƷǫu}[ ۚKVVHPsKh2t.ĉ\Q&@HM5U{N+h8p 6XEܥ͋:W \.odn|͛d^3tnj3"᳖.ttER5S1r2ź.ӸZ&A~tQ4!1sݜg?p0ZMݷn(ӻ2Qjm[WMFؓd*r2nUwgNEYk}[YkF}7TJ F5쑐Ajl.H#<)W}HBdЌ"lL8_ʴtVq/sRq!O-Cpߊ,gԈr[gc)aX(u%.U1y0L'5|nZPGQru,<#hD䒊ʨ&00L`G>WzM!AzR܁ |9&L"nVTqTY{7"hW dYxBEߏw34Ź~Ts$ & (DE"4I2d DL`!qqc1EdP.Q.QI4|[&YDNV^p.0 [vA vu!W!qؚ5q-j  x #~9'mŹlٛ>Ƌޭ5V+PqL&CWwdtc4b;thNꍡ['/*z*BjCXLͫi(NbShɚʏ0Rd"QhGqun4MxI,Ӫw1۹qZyx0O06hR#Y1k5 kڎ.N"f-IHz8 u"ajtR]WpZZ,ټא]"j EJ9RW)cF6M$"p5Kba۶Ī[8KK|RFEn6MґVIL̝% 1 ,k05(p: 5DL{r9* nͪ%s$){ѳ]"pXiKN̓״y1{N8$f6OG2Rҩe7衔 /\\4u^"+ZrJW,'S Ejڿ.N\f&@1ʡTe Q9)'5gs+r^ia+-Td1R,F5c.P.'\ͭ)-^EM5 3A2T"/rNI5MUL`!s٫V[͓dllժ)n񂦒$R$D.0R&JRq;wx묬kf=~ʣ[4jOMRM"#YbKr U']袙.4z' M7؋tIuL5B<*`YyC!6+NX6Z_kvڼ$o-^E2E5po$PpRp.ȟ]$Oªd1~{uҋѩcB vDbpHL3;fj,LH(WsN3<9UMPd׏K9-Thki&s8I™23-ӐzXhXX^.LDwJBfvM)}9'`﵎D={G,T]ݡFakqs,-*Z~NN@O s.֕+j}y3.ߧ\[ye˺~xd3hU9C' SpR8M *>vhj-gk6Uwa` g.9Åo5uNpmmiD'f_F*:tct lS|YihYNLܺxlBH79ZrؚR(}7VWZk\;]2ݚ EfN3q1͓VF!k,6Zf pZI20VHFIt?"|c?15M8YPVzz k=^<M[1r-pdZJb6\[eWnDi-Ʈ=Ybl)!S厓_Q$VpA>Aw $NI8uu3V F{Tq!Gw=gw5',UhѰȮD\eIFkOũjVoYk4\͠pQNlcP-Z5ªxq36~1_:CNCxk R"du]B.;g6t\Ȯɜ6K.qm]k{eQ) e[+t% y$c'2I n W DPOwOZՐ7uɎ՛~qj(6P-_ X2![H 9!1KnO*6k֊r[Ekf-Y"|0|\*]E)>ƻid̫S54-XʕXlFn%!" d\td);U\W\ ^BY"#"]s&511w`>n@pqMjyۭgƊyEI'R'S WGJ "7Hy:ҝtW`Ci_TU$pu M*0&7rv$_kq1x#n4ǝ5 :\.UZ9f2.2l8+/;~Z,|8?vV:r%Y@BZks-^cc7*'"m%&D|麩!>"85jWW`utL"ZaGDEk.&!UE2\6C wKJkս:pҩH^j]Vm≦dl͓T`̇:H˔C ,M>YHU+mfa"7٢#砥MdDwqR#Q\n I*R iFq[*j,㴉g%*8Mt-6dú} g S&ZferQk _ ?).HLɰ`+6}'&&L rtOr|xR q/xY?Z~V+Z2R1i(9?~b9fĜ4xI & &ER9B]QW g͊}C[ F7c$󃔭;@h55a!3evLoQJlZօ]c_o"Kfl<*q^4vM[toNrٻv.EF[9Hp2k *ɪQ5 b1L\9QL;/]y~i7zNe2Ӌ)Y<æE|6s^Nx%klE۷UKc(-%@.>6 IUi!aI5Hc2 "9Gr[*鸚i[yu-a>=㖐=ABE)+gvFsӎ#I:u>=9rU8pKu]ueYeEUUC(s9c&r@ډYӷUQa⢬͘FFK 7l|X)K:]SuQePݻLVvVLo=UF6jEm'6#PpT'E3r\wiĿ]֟do8 V2WaY %rE &0T[5A$R/ʐ: ؂g1̿ՒZkfP);JU`lnrMc $7~Gڑ(rTkSf!!LM4R. BJBJRKc1cv'u%4v3{+V"5B1l"նYj^~KD;hiïtoQǙJr~GƒWV#xYW S^J-G9t"X9|&S`9lcBx=H\wm$.VJU*ѝ|68a'la9K r{O$]d&LLC)V)#dp// ;}ʘO[=4u7QS& |)J^tq׫ o\z+uj NMni ݒꌴ+X[K2V,2(vF/0u!fmʭ}yBR*5SNj_61Icd+𫜼dbMb`CYjq#RV%o-\n4z9R0 $juzͥBl;k=6yXY!Sis3Ne%}ՖoVl2xlfiDVvY;I6¥EdUQIDY<,bd(")L\WwN 0Ryͥe6`KZM!6hss1iǔhC 8装rjB UTIEQ4QE3ʜI'QE>pB&Bc&9͜Ll@@kSo6$ְܣ:S $);&ijxBT)Y+dg _C4UԼƲAgo_;]&훤R9d *}c+=F@c"^.T|5/4k<91: Ue/)vOܷXbMlu*U#-OsGC>Enh3b>fP52Ħ'5Lf!ի/k0s<Ƅ۹uFȅ{^ՙM̄MM6 %Um6W2$Yf$d ({s(V&rT3yka9zz^߱ٓjBB,q`3W&[|ݍZښi֨.$Eu_2g= rvK}8t'O-CKnN\iVv-.b馬lE+rɬf16E%xQ3I4Ahk]SHgAgRjNHEcHWUyOURhDRsl xӐ"5o[cܴbW ͋6"f%_.: !' 㢘y ֺ;]VuC9\of;_y#"DKT6jrw/^݋$\ )/ޏnVX"#z 2~˞xܮ+WHmZ ָl1{e!M,*fM4^JF)(],>Cet+156կ{eMeP2ۍ`e8+ NVfD %W 3xg1{lrG9 S}%SuEW {ʌ Zvd5:uiD_|cM@: sQq )v׫Se)k^붬Yo[A0Jf[j^y"%x&zcrgZZi"l k1 muO9 WH1qK]wηm3{a~BzxʶO8W,_59k4zl$=w1۶ztbiuG9?>%oF`C Tii{s\YO퐮BZADbd,vWTlX'ktޤqAg;MqQא"OQ^oB2e%4\p$Y#D_L괜/m֪֩Chr OfW [DYkYMYYMO6RV972 ZZG HNFo)I]3AsTbʨ5{v½+3+5' !>N14ыyhM%qt{#`Ke8Sq Mf!ԉYvȮجVjSeBguv]ƟQhl]Hz5}HVvs ?ŕ|&E0T^w'2CILAjmO{DMTRm - sG¿hJ6hG([PCM~\#ꫵzw۹] :StH*ȇ Vd>7*ND[ ߩsW .GS{~}F0ֈPuFuY<͎791cWjvl05P'tpתG*.R=Rbv%Y~mgR2G>ui*r&jbRoS:p}a9}i uf=S w[g>UE{=ky {:9p(GnPI`k>puG1S(hֲR6TbuZ]CqJkey[({g=zƾ)8YnټE[tw.i隹Y͹Bq=̧I< y|M8yog6 )UJxqݘY58]/x!t[Ry7X5n̅VZnreEUKn3bgos?+EbӔ#6VSv0c`;ߜwB=0L<0sR׻WFlŋ_m+b?55B=<$ҍˆEnl/%to'PwO:x''=Ϣv}N3pܬ[6%$]Pԛ=:-;[uU$!,EΨ{ԟZ󲪫ls^V|VI1jZ'+Ժ?:0Q%N u({z CO7nʪ:š m+S\hٗn&bBߓ0xc589WJO*ΎZ)=H"]H/#LSѺpyQP9:wr4sbbBz$&٨jɵ*(B"$z|w-zO~ga5^++ m1UigKjc'MGE$\8]\upgЏ:Fw^J#'lFkZ"[Sgmk-M/1H\W~T?&5vjtkN,M:uV[tsg/-2uF$U\dthrQetzheۮ>J׻/l[de~2֪&[֙dg?).> GK@eL"Veʲ]:?QY̖柳ia`nLg| |6fⲔfcyh '.<{In 8CyZIX9*pfkq2 n)#$R*N)ҭ_$Rl|ǔ&ڜ!˾gC$c`)zgKNFƹo!ST &|1U΃Bj0u,9u몯E[>Π36䭒RRΟJZbƒFQgTn8iY/W.^jGh}Z"ALR*ESNn^7b8wHDg ͲU^oY tP:Mum IlRUY"KW,1 <]Pre 9{mg~7mnSn4-ugbLi7gJ]>YrO1eqŞ:.c(7j )ӛ5>IhHU%5Z8modZN=ХWEs2W_E6N5PԻ.9= +)!m]ސך c6oui;Z$6&:2nP+|böɳVĝv*ٌZu$r0AE-[WE 5cT>?\x͢>js kC}*ZD>ڳ^#Wzy m4. V"2 zƽ#30YEG:IFỹ?Mo?]P]R>l=+%kO[-%\V|XS`"Nѷu\CJսt+<~Nq]#tExy)9$Q#v}KS#3ʞYgbL'R){2VvX>>rovlZG8a!)"cN9W"Z]'"}CŮzMvF-QD?fW2~ƺ$<$}=|z˭$ӝ1&\8fc)T5^nQa"dNǞM#0xfL͒3jf'UUY"*Tz}:SZ8s{7JMҶ<:ӎg:ѵ&ӁuhnٮZ4UU[3"k<~W!P:{1\TԹ=)c=#7FjVYHjZ `qYۥݵeŕTAnlv9ӶieROO_ZJs]ӂ&Sgҡ1!"8]C"':;vt:HuǎRئ9d[` 6*܈tv"Y9ضn8:S1/UFQP{V iy6Yr~e%Z{IKK^bWp2|*F+4a1(q9?]Ў,Rqjse!Җ~F#NɳX3Fq' +J.S")UWv&I&\EP"d&2cJ\d1M.ҼHv29@Q䮻NikDq%g};- eo]4 60ɚ HN驩EQP9aq1sCBqD 7Wڶ!R6%Ovv) XE4c7З@usIDR@VҰ|0on.YI7ZsPq)õkoȮzF=Dzܢbi%ʫbMHkaŝi/J+^v@1<"U 5;8Z;]69dE{`Uk+Mȭm';b34Hܩk͖Գ *d!\lֵtg%g*\SWuΟ [k[Xkhăi9xȳM9r VtӕfE.C]UUv. ^&J4yز3Ǎd,6nynU["ɛtyvҧ1uVrAKӮ!Txc4mɣVwå_ ,z\r?\Ohq101!bX'XIJm,e&f9DR!|f1͜_w5;V狛^fyL7qTaӱX!]{T3$3H6EC gW<6iu}BF)vjOT>!RbZå=zㅗ=)q:WG'G ;ގ ݪ^q/JE>6*FF}Y(8b:F1%H|uK']o}54r̵f2}.Q?RkfYk%)?.\"SIRP˔B#0=JzRs"ZЂm"WpFz;*gnY4kz/P:zXqGOhz?Yjj-=ejp7zU^Yv N%{(w0C5htjڥOtpnGyW*E}Q­{eI,|iNQʷ\EBUy;W;MjQr`FGQ,`<7 9AUH &s?;PHl{u ZG'6*h(l*xw%=](E&~ , ͹E ](Ҕ= v2ΫhWB]2%rS;#۪?)hߤR>5^nQa"dNǞM#0xfL͒3jf'UUY"*oDce&8C0ydgƭ?)"H+ydJG G5 EX9EVjC%F9.upp d..:%,bY6faS)4d$[7O'9ϒ" 1l15l`R.C>`HE۲p!Da".u0"5|d.1A*KSj$>dqYY/}ѯϧ#/x|k0ϡ&M׋TswJ ykʼcvّq#Nfη* f6ŴTs;"۽GO958oS;k]Hjjz]fGڼ~/i6n6jiYGfoO9fMm Vvo5j" ݳt6u$PATETI2! -v g]^q\BVC:{<;iԶܟ9;x=s~1dVŘ_U~W#7%-{!ecd[#%Afj:\C׫zK8vyݯ%fNjzNiPBs&[*j>^I,Sw0"w)kHisqILmU$]zՒ fk62lg90xV%QV}4FlO!WG5Q.3NJdXw#*^Fv;{.[o5R[SRܱ-`%b=i: vK>EpdC9R KI:t*L8'C^}|:uK"efl˶+[|,O+yGznNCi=k(tL;xٹuvm/4$l[+R;0rg%VU)эD5eڛݩ?O?޼Қk㌕1A3պquyPA8J}D݁\VLr?5"YM8E4g<?z.xvEWHg vC$ LȬ(SB9r\Ki5%"Tz.WojFע"XIx% fv>oZNb6 aӚb%}W+n;{,U{7t- 8;CڜIkrZ~~Urmy}W^=zdmA?o|'F}krAgR!}G'ejYF:[>`sU l(Gvk;xS2㐁Kj/|6n/|oV-A# z޴#Vifj񌢛%$B{=Bu飦,:[S`X2|T䋨D:lYtrh |yPubfGHhsRoz> :ח]}?y9hyn4Fli 8;[\dkCBg>kɨtfr[X 4nqJu.y{-)3Wb֦&εNVcg췋Kصd~ٚDd#Jջ4-ۇG:{}9-մ~Ժ:j=H=Z.vV}x̔MRF5G{~!&$岲3._=7q Qͽ^^ab֥[*a&Hl9_.HI8p٪j'(vLX7kt]~|#g75jXDZjfzGfJ~Hl;Gvs*wCBuFN^@̙ ȴKyu\x1 au ?9#ة d^5S]2:b%ڸ*k*U4.0r8yH:TV!xԥ$ѐ, I#K9j& \7S/\O֝&5VKStޟSU|k=FQ)jԎH1:9S1>eooSd\y5ScjbVERkuݴ2wf:Xy)TdG-'<??V={˲[3O'rkԗQdKl) }9CEk t>^BlɱAzJ*գӏQ4w1q]nĞDZFI-J[dˡi8zzǫ_<,U[g $wk-:Uf~ qU;VD}QO{s;U,ikiE0X<BXj~l !9D~okvžy ʦv(]~T5*6VOq4Y~kAgUO8ݱvܬB/ON$3nU a~&2r*{0k'+&dtKpTI%UR>i\`.qS.\/jcEbWJ[qND<ʹ+`𯙐^u0J:Eqm_A˧v%R:ig[m`/ZkX&6 s+ 8'Kڱ&CZ+x?{E&ΝUiSw WԪ&d[TU_1 SqN(K` 2i6Uah;][5r (+uzVUKզz)9v"rSioJU*j#*DNSLD[m=2;1SUZd9J;gj rgQ,.✓- ѕ`QPy6W8|t3Ysr(_]/ð+zDZK }1\zIպߨ\TZ5RUjTi]MN$*YEDhžUUrʪLsDZ>{ߙF9M5,:Q#6m]X]+*5e=r0y&IYEN#̫R_MuYs;IGZ܃S77ةeI~W+f|^!<$Yޫ5[uL~뭗_'"wUZV2ϓ*)$+4R*< KnMo?]P]R>l=+%kO[-%\V|XS`"Nѷu\C9"jnɳ\)*f_ (ǁB֍}90H ssi}mu[mnBWZSKVױK!#9!m}dVrqKv?jS,wtqu;._U85M{]Շkx]Ukn˽⎳ >AY-_c 6{7kz{67 ]V>R(E*X2Eӓ&L:vD͕^ v//<ސMzU[]U6zDh~Be]L"LGHٟ&NnvzQ+7,C6jIq~eY;*sVz` ^\'c`a1^{\F6C׋{Sehm]gQ3U>(HLc 迂fbF2B*ˈ)e-%!-IUTSu=mW6Xi.85[&bEV\&\} ylK2oYMXcys`j !IмED]l-IX]nQ@_;'ly}7N΃j5pjԍZ[R&s(M3K侌g& 5_;v{+X>k_[$%b eed?Q<5~Wp;|NۢRYr+tq\~iӐ Vuũ2+gҗ9xo.͍iҎTT12TJn3Lx6ٙR#^S+ 8vQX/Iba,&JL#ٔϗMAbR=Ǿ{QNk5n51ޣJyc!J,U8MGR1hG@6a<{A+j i,lOD5sXJ.s3w/OWE\c oC  ~9ңuڍ=O|FQp)Otn+E#B vcžL]3,”1~oNtvX> ,3:K@ΖWS\֋4OT[ޣ9KF=̧} #. )_g|+n\ rʒ}5_A.NgFA9ﯳ*^_)]KY'+B?jA"ٵ zl~vw# pY.o?af,KXVf^KpotYx7Kwx)֛Jmcjʈa#ĤaVlR~&VJiIu~I6 32(uveQGfv֑j:c(zlCrWg!w6lMack(B2f Fth7:{oڟZ(Z'iUi'S#)qynKX7ZoMaI:ʭ7\j (P;~{jo_4Tɕ$ѩ8JvԖ)}及a6V3PX([EFc[X-V{_4E_E1_fu݋oRn\ !bIoWm`w=.o)ـg4Q-Y)p;Ք[bh&xͦԞFd!|uwr`@FI u>Cy5;0~(e,Y3ٟ$HqDc&[ nWT酝w^mkԕnvl]5bX27Y ݝLdfJ6&o"vzNМ׺GOZ<td)+ңvڷ u]O+L1$b9j|9nI5A$ΒċC&̪4[7eZB4dlALDHFI u>Cy5;0~(soLb67 xH dQlnh $PE"a4E$R&d)Hd)HB.1cs֓?W.AK|jwi8`>QxqWaikʛ(^dL1Қx*uld|Cw cIf,$:G VqǥxoR9JmhDkg2u(&@ؔTlHE{& I.dV>R3lBGԻR2d[b jik4*.AC64Yk U{CkL^Zd5[jӮ˒D\ÞEnZc|00r([;_m16Vs[iH&>أa&X%2ҤTzh4e#|/2viwu{;;}d:8mI7$9_va0=wu۰և\c\}\Y8:FCF:b"u:D*ܤdVH.plDbg8vsݜgyh~|lMB/"E'55J3iyZ6vR6.2c'tQ۹,{cdFgy~mgZ]osK{anT-ڥheb]!(ȴ~ϧL)Es&ce"ˢw?\q|n]aME^i-~)v6({Hdiמl<)zNE @P|:t8W*{r#;aoV36#|oR=uݖ'5hיJ ͎`EtZTn(6'l+Y1J_Gq~uPnS^ˡYnfsdV'cy6k܎Ԛ -e KtOzAqZ8do"ſ6m?% ]EAJ_0i2rSؚU,Dπ ~umi>Ȏ3迄;QD;MPB1w iulS 1\#.VO^i~{3yE_{ `sEq?<1Otn+E#B vcžL]3,”1~oNtvX> ,3:KYvΉ쥺W6Cɪv nuHӚu>sfbA=U&;0:5 462m !16hR:H̝Xf)p=A?9u۫ ^,JA΅-[ n񛳝݊6.bNn\F;MY,M-2 %ai8f#6pv`}nAf=;#pe|b *sl0OѯKnvǙ-u,wߜsBJk&ϕdSRքKgHK5|m1VI{l繺n{&zqm*|f0͢yU-S{Cen؊HvzCC20ӈKnvBvw,_Ex M[7o^̻cٺa\e<}(zrdΑ]5t٪{B~ͬFO[/3ViꞬٓoR(nG8Y$u YM^ksCK| M-h6UnmuuM3;b0{IckZ>}u.r[;GsJ1iX?+_Z̡Uٛ=u]:u(hgjͷ34jѷ\wlUWi^ h=am]cie,sj;Sy?G r{4XVS9Vb8DיM+NȦy{Q ?bB^jHb#'rvsulpL`@ۢ,T9Ja E{0[#r%r"da#q͑fPj^Ymτ;u݆ {p2}e_5kz7gEohq򁸺@쭏jqcke%Qf'LuD5&g곏'lz ӴlIsɍ^9q}r ){z7Mͼ)7*𫙫ҥ-F9MC#b*)e<(\ 'IL&UU$l'P6)_?erRM$K}K[=iEzH @4%=7\{ݜrHaz^mab Y }&eg!URn:jf*&D9wpf ]MznFrEh{'j]4 bzd,(eR DJ0Y6!۝g~{l܌= k|&ُo3UwTϸ SdUk;ic$$U.=:Zs]NrZ/Oo-=QoNӗ/z`/VD2HH|7N 0h*=wʽ̦X:lmMdQJ3FIEOc$`Ixs۽T|Wԛhf`7}lA2N1]9rIKBf"%VZeG -zomoρ۳)s2'89#>5}CIҪPwml5-r (zU#:GƷupγx<; ۋhȘ*%? [۲ou)uU<qy$XE%$AgsL]qǞT뿂vC-Dno%l=Ty riqMˌ[%y=wv?-ҟN2p^Vx黤3a.Cg-:zR iN!zbѡ;S|+$)!SRUџ=v[jjC,Xu=_{w嘺< /-ww\-ceKnVUrJz7,Ժf3vBfg>Wߴz=uO>un:SCDuhkɳTsS?(sT'K>xpӫQKKE|i-t. rZI_n?hT-d+O/>i3 ?wEh> =]F/3)/:N?:SY5kGҌvQSX>X#x=llG!8ğ&=Y4 _j,PL1Sv fl`D\RPHU6QK^y{=b[3G56\̻IN=oiE-FPRt@[+tK\x B!HNz$~‘}?DV7ձ+onҴWIIv\  "+$g"\MUqĻzyusoXZ=*5"I6IuL2rp cd.@/Tݿb}!w}J)y}rţ&ŗ)yj$b27v=ǃ<&⦅ iv}}j'Rin; R"7k< >QÇpȮ(4?tWa?QwvL1wh@ DʙaƬJ" : GZGZ^n9ߘl5:;s;\Gbf2ZW6VQvsEps&36N3g%)2lc9 xsc93ߌ Ntxs=Nޖ[.mLB磞cpuC*E%Zn艮TNgP 3#^;Sy+P׵ҰOlJyWKo'cVlpj;ۧ.)Z+lzcxc򣈜`̭q>OZ Rny |kO6]̜HV\P|6MtL|P`jd}$Cx7٣#ZN 'u]a8Dg Ho xn*wnt-NfX^#!?^`Rf)sHMvΓˤf1> ?]Jh-XD}4٬ݹQIt*\թKȭFk9ITA5i(b`ab4 Z4ɀ2.ͣ1W-I'O% NTN|5#dCTw(N׿]&}';- V˧X)-ш뱳rG֡k{#01i04;Dr40/D9zFnf`;;ZVcȭM3n0*d_Q).8bCWU~?ycmm{Ֆa132]f;Ţ%Èi:Li39 %K:Ir'1^L}}ȴ{z7L>gU1z"dٺx" %83b;ܒ>H)ojju`yhf'[ZegFL.MLBA7 $bVz;vwT;1;ӖyUUU^(rYnE]bqlLDr㨟%,9-U'%'"U9ʺ|^VU"ryW[vy|HT{l;mIa,)kxSs?unikRamOǥ7T;̴Cf5/JvD!؈x&#`cpI 8I`luٴ9/z%g};!-Q*i4&&O5g q%_E2,"LwNF ehP̝lKD vf~#CuY0CmO7ptx rr/XN,D/UJrW`Ɲ,[X-1#'h0s1LY3Kv11sל?ypY|u^4O'l5 \]nH$-̐gLQܒ$UeU W"v*8S/[؈ .=K9 ԷVnk!x7)k곾dTt.,Q<1虺m$+ޑ5/Y|~8Q&-nj)@2v2-%w g-UJfn5X'-}n:^CqJ\VIi2UZ 2>~VZD-;n5 />9i۬M#fK/TԝA\Q/ i6,zJ!\3Uer[]znZB#aZܐp-9?;-EűAw2r.d\]$S9CK+`-:'%uVb%jY-'RfEXY zve,|{#\If(usQc'SqXk>|4=ipPkiaU[{BuTu4L5X-(^mF=sך[dmw{Xb޻[8:?(ݛ&.Eͣ:|uv]=WS3_vlMî5Ωuҳ |ŞHDצݨe8V>ay#d[t\pm;ۻ`nt4 eK\\RS8j:6[B.]jHF-l'ni {8h׮o8̎@pcpO Vʕ=b.\K__٪7%[ь8i `{8*:Gm~37 |ձPYZYfmv=h;㞺[a˙¶uDB–?эYbޝ!_ɞ] ֐ffqO>p͡R;sssDm_cT=8GKimCaouf/ƭ8-iV)zF ɒ(̓zvns6_ #7_8uͅ4m\:Vq cao׶Lk5IԶZNN8%Z^ CP5<=ˇ;#G!{%;9kT/~|%w9;1OĶu//9-!E;Vv B>kY`+K9˜J~^PFcHX#r՛.]J]*\(kєf4IyH.͓$\bKE6\ .;7Ο׻F"vUvUC[3T"N#^*nEs,_Ji"doP>o9lZ\ +gݲnRa?HjX<)] ިxWXN$,N3Oh}ed""w=NN9 qaQiܲ7wx_;S|IѼ?- lvY phz[Bʄa*rI;g,x+`#(l=w'ݾf;L}$ qG_6|t;{7IHEptkÙ[uܫ@ٚJMAϿqVۉxH9ju\hc5RIk72_m1, kI9F2~#YVٺETEC Sg8_Tn/VKn8J{[i_:&V43Ƒ8_w0.-.| -7#Οw.{S܇mc^Vr,*uYyg #1RIIW :3,$Iދ}o[C}Jkab=oO^T0[/BڣQO3jޯh)b7WG<"Mޗ0KDzHT׮n\:yq:_{F:C<+C_ < &4 E<>q dѿǔ{p+{0,?:nav'Guvƪ-qN_ٸ= -[}Ogkcđ<܎# n#_h-Ev)}kkȷhe'ua{ ˅ߢ6q,PUVUGj*hw>֩hA7uq}?:USD+TJ䕞m1L1#e?xKg93=޲Q-=;Fmvs;[6""¹ZM4LEH2WGf#Y &n BSùkR;.|#|fe?@vkj0N@;WpV)y+e/Mesp*/Re{WL]r۷=A0fFZ9 3Q:8Ip&]\oNOVkSKjI*ZABl5m3Z-Ve'WeEpd&w JN))Mvi+ވ*ċf/Y{݆6J2Σ{fN(vE}vNgRrTsJ}@՗}w&hjݎ;وh^?g|u <:s2bord"LlȞ=k\3=z04cM\ H=oj3GJo㺜B v$5^U7r imѯbp5l/ZScū|+'U:: #e%1NRl`1s6;b383gR/U'b*Yu<-VkE sJuflvKSr*jFFEͲe...VO 0XܛZrKKJ?v0gR/N&0\.0^b"yOzur-[FE[ywt9z^S6i{(ðHkhtPx1\صzQ܌J$/jKI5g) ]My&Mgr곳2mavAڲsp[u4зkQ7 EʺaluƉb0STb VnN)9Ϧ7^'_8P6_bX"=֓cۺ"^2 T]K5N`y30L~)}5xYgi;FtbñB~943$c)Igd_h*S. `Q<:q^MKLS`Z4g؃RQ' \۸1騃v{)(˫1h}[K\f: h iߥm}"W[\Q>ɡTQv=uD{<;YwWmIK*rCr1ߗ#汋,k=*U]3t4%̛X<6Kg:GuOVV-yLhHSX4>{BZVͤzЏ^7e6ݞ)UHe(PWJhqDZ|HPCOS_A%f:vE"y'\Tó.Ȍ_)5N;s('snhZ_aHJPS*`õd_8MJg߬&vQ Qz;Nsd],L.-s$E=~ͣ"#v&%'ZPgk~n=PrWz N2dR4NLF9k=i ZQ sm6|mFo&~~w:3{ yؽ˚<ض)PxG$I=dZzpÏZ#\kYWF5b,Ͷ*$v4E=ruc5Wَ>IP.<[)WtVʓg.cj3UC$yNhihsn"'wR.|N'*lZ[tFgu鰶tZ)r>:lMe2u .1(C:O ЌPrq+WtWsͯ҈nkPƿv6]iv {EnU584"]Y>͊Ց΢F_2 ]v+)]3uA֮:+&l!]2:[ޗۜme'OaUݛ8gڬ5_N ջD$$#䚑yڠv:lǮgj=*F4me'Y}g讫AR]\&Gmȋ/ΝKrո'qj%jQldk*tPSlcfMYi:휃tQj!r?֠!߳]emz{rGytU3&?3_w'2zFYU_XצI7&ywdUvml  83g'Ȱf$Ԗ%}UscVN?vpwm\h^%lf̬29#V D[(}d8ɳij kWm~nMf ۍEf _E7B8u/;*C_9ł))6ɇDL(Z&yCxsE3Ikrڑo]Ǻ\{/1s j5}aK4J:QOJK|ϤХvxoϳWh*hAFp=M%boFJJOAK9!$^]KR/b,(jR0{[L=]g3VMA1r5$ǒRUcGU |V.2uD\a5.H`]ڻ;+_NDXkn@!wwn ܹjm("P7/JzvE Udݢ8u^hY geG(a$lj=ηv1 cRyBFf!7WK7ˉ2u:kL= ^Ҵj rMG<MK8xO1䔓#+")'N:pJ :WlwEmqhTS`jS:&Vqjn +/'/(*?vP1W}[8-n7%x^6w$..`~\F4 G[ )aͺnU]|DWrHr+]LotEfN3se7GN{1lEP%V2MܻM ( MM[?ǂkӦ`]vznl-A}nQfvj;D:e[:HF7!5Ty"ؐ.Bƹ9 ">tlh?1 &#6N%"'X]mstx\&s &H靮rʜN]hȶm3?&Dy>9CY:(݂F,ȹ)sa1N)qY/&>2NIP^bĎz.ӔOiueOY=OiOR7k!Po5b㻕;@zuJ+$^Vox驏+w6<&Z<8]z_L)uNP)U (:_S)x0Cr5`؄IDqY\Š!khUu=n&NWJIh-1ČtQg#s&Xf'zuvSۖs}c[KWv; {jP'ՙ>BBhJQ dLMV偘+X:GEߴvyUhb7zQ q-#lSh앫D5̊2-`lb7VFUN'%=V1F=uH?l !4kcd~ǩG]r&RqhSQ"f.c,%/ ` 1z1zY 6QxUVޫX4\8#)$RrpS LD?YC:Ude#6kt eNV**b8kh;ֶ0m٢AIC dtŝN`.[ U^xs'Z:pwZAO ԣ^FMRceC*)\/,Xo eLxU])88HZR/yi{NEPÔ؝`ZBjZ\c(IO#۹Ni6q˒!ǒP[Y¸DxWM8h=>on}[[.M:宙L1L775_ЋCM5µdXMqv_B(Jʲu)$QϐQ9"2xU[j%p$\g|g7,{z6My?wxN# R#թUͣya6>6peT:*:f$19BCxܝ}K0˖5)6-;:p.pYfTL"'.[x|Xr߂x.{DvMWI@n~߼3UBnƛ.5mFfvvdH,VRp+BST{]D 1ʺmGcڴ2fYY-Ȉy~Ͽv^a³^cljA% 9538qlĹ+Y26D=VYؗpǍ))3u㫍ʒ$@V36bX O(&(0Q-ٻqD$ݺxS#lжNfj _Q^Al˥p:Fb)+-wmR:7g+9yʆ+vZv잽~{m^ךґzQ!6|%r+[/Zbh-7NO5UMkHGIKۯ Vt}lmUz/W_UjtZ> ݆jbr4G-cb$Y3o QM웿~Ӽx w08ѣyCTj*kl٥9'ȚE3!d#W5X㶄0zcWJRЧ5n\o;Uc2&$ɴD]:A &66¾CSf58(ZZ"YEGWa"Z.&9"X6웠ћTRnLQ+>: tvҮf$7jMG8ۧNvHFyUTȊg9r&'lvj:㐚;`[:-X’cdՅ$qHv2xyNٜNEoj4$6u3 3$ػ9򅵳GVf d s# nQF*VQӝ]gMs/"7棈qpPվ6<ᨖsCrTe*/ݡ6Ձq++OEǞ^{i%'[B.f1`o,/CI}!Վ5FP{KTd:ryt`9^곳q;cDyz|0mM|e7{=gzr7'E^4lU*v )]ڑGus+:-MX3۸,zTa!pvlޡ^JZ%]foFU@/-1%8,{وVžniLݑV;h6rn,Cs>|ݔh䫽c:t>qĈَy.o (wgd2:+jm:T{ެNj9ܤl_v8-ezcm,6~PQp<{?nkg'Rh:]ՊoWzSpd%v3tbYWHaɆofnb2fyoUd莻[Itߋ+6d&1ai rac$iN1)0JQ3`UvW(qqf7׭aiJtI<Ɓ,=S)/^(Pmk]]cUZHOט=\U۠,ѝ#8%uǒ2i֬qQ*+h4VUı<3W+l-Ol/ck72ۏ.HVH/ޱz ͩ9e]t۬5vXIԗ r/r2#ФKIbwtwjؿ1<\Sc;:y;l_.N.[n>5t٧tb&t~vemM%uhh"Ҫ%bpfߧ>3-$:`µl6e}j!ä@3UvNMkI3X {IV[//ڲZvw2٢D&T#(hiy2i]cXK(\qg91c9sc?1|y~`D;KG4;=~`Klj=Ӯ9,zkkuY>Ö?l)g?\j\c&qjl'Vj^BʆSݦV.KcTxZ%7hNٸA8b{l:Jm4=M];ϸVnAɠhthuu H8wtŞa3 9I]H/PqzW6gvF3}kk8iحl#ƢWHcAL#Y,,U"Y1rGH&ՂN>9Gn[$cyghd9IGL1Kn\:v::k־OH7-blAyJktx~I&)$wG:?Z:+#k]3.rSZN& Eb0xz,%]1dFHl=}`wxWod^"wz u}iIL8-Km2ѭQCNPYDTD3Y?t3ϡS>Zۨ>ަy:`f](#mFz25HbQ}fj:J:vii7<+Wڻ.1RJPW~GuCd ʋxn|b˶@;TUwƜB7ídHn+ԝ^e,qɣx0l9`;~=r5]]T^񒭵y*Dz\lJ.Nhc*O>#f/Ѷ^>qA6[ܒfsXͪ+UwD*6f#;U3ʮ=$vw$7&oZ'blNk-TKK^\%<ϰy|zxtf$mI(e[&Ia>JFiv  -(Տ\03 i7vҪ^׬ q vci1jxq ʎf(vCrr tm6ف Fshhg=%97ttԅSfʒ`.+.Zhޠi;,3MdJČZe=f]@ΏE \Lija[-j7W) bH_(U]Y7o\\ΜfX|~ZkXn: LIc^4٠YY*VH؋=u͜j%˶rA@fߣoNMӧNxh[-~aݰqZPRj=6RbF ͖^~E<*P/l! 874fr6MzRjkΤڌk(6 4jPEuOY#;IzߠghW4]t%`s4#WY%1?Zj+uXʹjAl(蕳FMw#;'>mBJW:ٶb#TE2'h3v壥"" XUYʡiѿWfi=;nc2Soc\}L=iW *{,,]<:(yʞ,s9!3A344c5 =5L\=ڜ(&bWնrE̳$vZGe lzmh Ůq_'NOXLlt)F4T֭UBJ[jTy%yNa5hE.{cH2lMg9;٫OtCnbFqJga?y)g6RҲ5*kʪI-c(kUK%aa],bSۊS\kTۼ_̫lvr-_z5ͦ]ƝHӆN$o#$lvmɻy0۵Ƚ ̓"Qi d)};+T}~v\*S/dO^xM]I]EctR ƕp;!.z^y37I[FQdA'onK▄~_k(('%6/,vPw`Nrbͬck?M:$-vFז*ʾ`i1II80*7L^֏k: ^!*\nLm άs$j /ixvhwJ>, ElrΔ+5FY&!O\wlsk'k[VVEgvu0_,srHsyI}Bqכ)yH|prÔ!Ar9EQcxk*՜'q07M"ٴG֬b[Uj<.*5P>ypW@ue׋8Z4D:ȱN5vHYE p2͝GJż1uRu'ou9O7Fsi)*oc=Je\PaS -`J"ZV:tR8#/Ӫy-*Lm-BG3^]IdB&+lb&UCct+;TXWpMY?56zݙ+S9V׶ي#:| $vBXwZNʬŘoW5_Na[[`^n .Nhg=o_8+*/T9^lg&Y斢(NW=7ʛ^| ϋ)|`q݌q\;]Ifuɫt6KsnGʺs 1-j:*9bctgvKzv{t`.SVJf6lT{C4Mmv[>=x9DZBH&or_7IT9\8Ks_ˤd|GqV:aa"EjI`Qzv?qwcĽRY%+LeqfNٙkSx̳ACJ &0tcT\Lca̜5S,"ceղWtu{3.LdP޵ݝG;7w|iq*f٫5VT{[_lL|l 3a'D@3YE{đH`M+~i!"uMkY*'!Z]WWv6L wj;rk(*GyԞCNfD6h-*35ֱmЎodM cՑs<19;\mh^,xR|qJ#zXaܟE8Mf_V_6CFC뻃 U)u4nT+S%^N:)p•+燷ه5MSm͒rN6EʋlJ5G $Jλ,/1^a= 87gsɜ3argb?vq U'ӳyi=9mȉ{h8Ԧo&DBX#gl0RL.YGrH>l!(z܈5kɷ zuZy`:jOA^bw<6]'Z3;M;\">8b2[|MۯuREa5 -ang&.0g)L\`yshG!qoK8ܴ*׮w=7!l7zyyN)]%s%h\ıc(S2%]4[8.o8OĎ7_k -rrI+6u騊'RQ.Ws) +FɅ:#_ؤ3xUDVeKUڟl&ِדsyODό6 e$a#dffdDD1w'+)$QѱNvIW8Q4[r&CgϲuȜÛ-ʱXޓR╎gezjͶ~j竩HX,zJv9Ww~du/59Y659syK5d;y t1˟-jzD%*䩨r]~zzsւGZFzMCGQ4upiK٭itDlcG*}ԟѧG^qn=1ҫ82NKh%k^fXkm tlh?>kS:poKvϔfXI>J|-EˮņE2S:#y!3G#ZrFnӻokW/5zB|Dk^6;eT`IwGi+N:͡!~rD INt+m}Xq rC>&V3$*tLmڶ|wE7MWm\&Ul%ۮȪ+$sg)ccWK.z&v"nݪ UqLu؁=IǿU'1c{:Ge0.OM3#vjQD5Olsܻ?O=LWm+p /.kg;j'[28?M[4vwm )9vnYu^ƹzSV"]"劚S| lc?lMu$>BDi-akLn"\ b&ϱ.# xz ZbA,Eyw{c.T8.=NAeFSVlJV# C6M];VaԤk|#%3Ż|0SltO?kf!#/偛F-~{fDpEoNwAͱOnZ__n}=xƝƊ! tg+)81O#aEed],oS 7K ǃ}{轗"{<-G_{KdImՍ0Y{-D$lZ2JUQg2 ۛЩURA%]DEΪ*rI&\EP 6pR1c9]Aҹ+eeƱ[75rWRfޭq;=jOS..wHg,CO7itdrשagպXaF;PYfJuCnӕa#t+v9s25{NDCLǑr&J$"F6|MZ:[*:rd.C8W8HSvb]/ȕ/pq>|ڵQMu#DW)z9=7TetDCSjWd &sDMlk[UD3a wU*ĒQ%%-bf$5*M?қʿfRyG%os1_̤,8|ڝK,i'XҫNF1[C%'_$mĢ}vfr cuSkcZ+Bu1V1\hJ2z5 b՛'ڭ'8yUg"MZCۧZ ,hzYvp'8/7R^YVIJ̌ vyhױ KcTV*B*!ԿpO\@!W_tQF4SHPZ+=ʼnYwZf..>1^ye U @g֮骍ʽmY#]Xh虻詨YVe#^s˵p̚sWn޸:G|tת+ǑT}akk|5,׌kӯd!GE_3/M TP5RAĝF.}]J:rw5K'P<5gZ^Ӭ/tg_O*| M(uaj&1 䍓qY.[J,Q\zumKncwZn.M6N䄋TylGmb{gbiǙHZp;zohx=fZE٧b7j,Aӳ۵n,&ݔ<4sv蘈fm#c8.tp#kqˊ; mt(+ aXQg4RVX83$21I;URԇ1%ɾtռkmAgWdl{l%};-ffP#Y3bܤ;B6LE% B,uqh.=?[lΤ]J9l"R5EjgƮ R)\{/F]"T\ 0ټ1ؒݻIӌas.Eqz2vUֆ$],h(j̧hJ.ˍmZཀྵ݋sٛx}wrW68}:VRsy)ںEF8yGIKۯ]<}^~FƔݒ[-%VOtS5U51{bZ r@pd8jrVxxuj/kkȬT<7))䙃N:ԇzV:RKM[-;($/uiGiMFCs Uxe"Ni>n~W4>zG;IYF12yr]t I'NPquV"hQNg5Ok{>b{ahZmVEX dfg F+74tԙ͇jg .X.AV*N%XM&#Y9rrO8Vvr6.gzt.=Jj{KֶUrNXWUn֏b]iVI gpW9@ԓIqA3]XS" tv:h8M)wdAjU~բ ]ض[wS]_ug+q /*4+vκB-:dn}yأ(_sg=%NSrsx?}f:KYےdVޣR2p1׭feEa< crxN{m1meXovY$|=zqq˖5XYҸZvu_E RB)WN.i}7MQ;0i\ecm/ Y:/.Yyt8xsi^5,}W`fq4YR2)H,{e٘QS;;^zIlZaVlB .:ߋ첡IYa]>Q\&Q]s}у@8?m5 [ִPkE{(j-M*gmm#9$fh,/%Qc$Y%Wl]LdL8nDR& |d) l8)d<{Q_?(w(8wVN>eغ~"0 u\LH ȋ(1#eߡbhrq.+ŢqW[v,مvָ[z,淓Flu %l!1];\5m?yU^*EB%]U0)ja֖hXePd6fܧ9 & r9+:+x;ŮQRycn>sж-xu5_C]D-(R2HerM4>U5JyS5ROg?5yxzbi;Hرo( 2=⬎=&12t{woIfzލX FpqheӆlMlr>5^Ke  _'3guZ;K9 ^_&m*Tս\e!]Ղg5jW]gP&ps7״mtO8VM{cLue[wǻG޲ѵAW(7ݡΧ6aJ]~7!(V9>*J&ܡVS-e)pN Jްvܿ4gL:c& *kWѵ#hƸf,iuܤ߼)ޙQSw]ʫ8QUOO.ۄ/[O}쥷T#-<))bOYihRqO-ژK'OGcYFd#Kľi%(ɬl :c!3|:.Z:lkpΒȨE1lg4hWmÂxS/5x۷"_++ k\ul"z>s5E+6ݳÞ̔ۏ]'Gʾxm?bp23:rҭYCu bbwN`)mf?*n2/h“15Qlɬ$+v[ ZLBJ1Ǎ2P)Gob7p$K k~9 ة1K bBRA ],cw3zW(QYư)K-:evēKR+S5,x7xOYh ]wvw ;deҼ:RSZtz֠#٩!*毱^G (;p4WvIR3КAlIhWQ Zً̭Xg "V*;h5ry[H,,jv훮ȷjWrtC(˪JhLuTP!SqkX]1nA Iȭ4#-˪<6YXSy(4XE3Y9L2V"QăG0sӽΣ|/LzVu+Q'3Hv^x\V'Q{TFY(Ežj,/xƥe֫EIW sQ*WуTIK_ydYrNL=q\/WoԅܫqЗz͒I+%[ Ez%5cgyBzҼ{ |fz{]ۖV%ڊ'2+(RWR0,[5"J /Ƌ̓gǏ.ثe;Ij͕vmɚ m~eVIe$d$A#"|0)Fp#Kk*JȌM/Z )hɪ.AVFƢl)#l(P7~EøKq1hOUPNyj4+Xmyuun_(d\cI$ʣ 9J7AԬܻ1MȽlP|6g&mFh1Tɧ`؝BWȕ@;a"6B;:gsqt8;-:D6ss& Jb)SoLc8H| |c)C{9M y5NWqفPɗ޵톹["'EʸX281wv-7S^_H*YX\JC8؇Iuֵ+Y^=3p$R~J]-cg8 \Qs9c~,`S3CAsL>n ,Btw39pye~ܶpæ.v 5/oVG=tDvͬJӨq u&2򤝖EJjna[ƻt+v48f5vvG+$9cT!h:Ak0_0G:Q\  w l콓|k?Q$O-y #ϠonjXVyz^:۶+߼k8I;zuq%. nf"ic*[2\E{1hnv͡7X66 "C>k=15~oXn솠tI>=) It}m(®VE n05J>Tx^sf1|-c#ӕf Ǚtv>Z[@凎M,URkpK5B%̸'檨*osθc١l\FZUTӠ> XJv8Z Mlb%fe\4jS3nQH9K&3vj .PBZ3 cʰ`.^-ègrȟ> >δ*%:q\Ʀ= &ggQF[kT%ur%A9 S[ yRi{܉eu|`]NLkj v뛽(5; [%+slUDsBHrUbuۗ{I'j{OdU%ճYu:læ9cqj;-g@:UFn&H'[I\TsD" ٲ$.NpO+,UU>r)I{!prwsՂoss ӎm4vEzM*vÏreUj ɶeGͲb/g"q p˳yʎ,rF"և򭨯w)7g[*a"5vVJWWxM\R*e!.rL nz: 957[2Sb{{iUֽ쯄_'zh{JO7OY4Q{g?aA;Xϲ}t]i/?z~WSgŗT^.":aŲvjGAbɜ"z=lU dܱNr1fK.׌M/O0G|iKn5h9[ܜ!jdfVK\zTw :,9(ܣYu"IH~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P6\e~~&P >xGcŋbG& bO.V]SX1qELy6T6*XY"2D\sa9`9SNc'?|x#GrZ-gNRc3iI3dd0UQ@ SLUAnr9 E$ySA"%Ʋ33En:]"e$L)sͲ2L?pl'!!qpجԕMXdp0oT Dg".r*6;3}}N3o3mr-f-JBH&*dEqݒ 92f9ڟYZ(^q8gw/2߿;n;!lR:tRE E#' &^&\]}ʠeɱyU21hR'5YpWEg SpK ~/Yu2LR9*iyirľĤTd F='dx;x{>MU$PL,4.N6~,.Ll1<RD#i4K¸b8Ϗ lgB\dlZ%fa$I~|E+tpG8pC$\7bHDkr/|IӴW.23Tn 媒Ǐ?.e+.u㜟ZNX-$ǜ6fs7vtNCDqݒg)IGa10E^d$wqRgt&g11Ԏ>yO =,S|yUqϘrUx:M|`GPa B?tŴ+?zXY/H!;ٶ)\' 9:eC& 2~flNtDYUU% 9sg.q?j/ HOWy8I7ՉE'9pvR&s?ݺʟ%pR9wYu`2"QsVʈ`psݞ~1ߎ,T#Q&TVBUI>Gl7!0o`8AJ#QAs?lE?O' ;'m ;`f?&3d)sݣ6% Fo$18dUg'Mr3ll;׻ѻ+vDˣlʙ(({fk3C.Szo?>[~[|`?H-(Y=)L%;KɚC>;*S$K쀭]uY tU :8KrL$nPP+ ^TVl2Uxx91rT<YE1]>vJVj3CZber[4tU#g$G,NrA*TW6szWɗ|˅ !K+ȪC&J$ Dσ63qg8s-#1fdBͰHf~<`ϙƳl. L.6sRsfd^t7ˆ:jnL&F2g~;lg~`>|Tt1|yMe!˟gP:K$b**)M9&]W5 V6Lr8KAw<8IJ_E62skx=y؈ow;rM[/ Nm$ؽ4l9Ϋ~f|.i7~tklhF "ŃDvB79suVTYe2e91CENV:aYKcۺH yˢ;HU#|g)9.Džʯ=ByO9EW$IR?R|tR>{t楳AQ)8]38AçN]U1Z,hI;0y"9O>n:binwiederhier-ntfy-5ad2431/.github/images/screenshot-phone-main.jpg000066400000000000000000003773111517171047500253760ustar00rootroot00000000000000JFIF(ICC_PROFILEmntrRGB XYZ acsp- desctrXYZdgXYZxbXYZrTRC(gTRC(bTRC(wtptcprtcy<-m}`%okk[Nulݐm:_b[6[e<48f"fV|}yӴKi:shw}>j>fiC4p|y9çs,qBTl4vbca%$v2rd4vk/EuMdUԲ)!볡q4)MXط5ok{rB?O[E%.k5ܺcЭTɊ񊼶/(]r=,ZnSso󧛼\ǞL1Nbk_0}Cť7x4rjz{޳79?͏ji(l˵W7g8_:?,wr 9iuMJ*ҔXDmIQ(*~!~3L.5u=g#QM5]"­ [sbY.QBAd.5׹WKRǢ,E[|$.:l|1ָ;Yim= 9̞ޟm=-Ez>Ym{G,v ^նQ|>џ Dvqڇ0mޚl[TJZټL\+m8=ۛRڦ,Oq^1ܸiH^*fvdmǍ_:^*4X|d5mF6Wg g۶f/G+U%WN:!ފVQZ\ԷzZ#t stآ:h*kNRۯ캔g;^rǩ!2}E8T+en &1A'I8gQhVm㦣-^PMU.fojִikZwkY{g1t]6fn:f:r4Met[ji5yLeio6zǎ9㙘?F%YiF%Yi7R7^cŸA!,oe.lRkKw+Km+\SیG@)mD/w%^ϩx.Mŗ{YqkNS%-y/g<?>1CV.͖YAuTAtU*_TIK..D/RJҴhYQ~Rr/:iec$pͤV \:Uk}$mYN{;.Wnm?9$q佯|y+ZkKs[MbMgdV[Ok&=ACM4ڱW5ͫ14)@8;7d0X3g#ɦ#1vVQGS/Piekm/r!mnQ[i[NLWWjC^5dq/%(]gVY G+C+o[v#UZ6Z]UY{qēY9'X:29&*ҕQDnW{[ԡie>xݯ\])%͵>wU/룐בS)}k[k/Ze+}}mjX{ZWkģ/[^-J,߼Ʋ8{Is5xKu:]{R!Yodr.߫fِ\/|du~50v0k75S'Օ%\^4Zö1g7‹)*pׁ5j&|_p-ڢ{^c;# ,5rYv.0,Q}_umG3ZJ1^ɌqKV{M6Yg[]7{UtzXZ\i Vfixnŧz^i-X)['R-Mi^e(q,I*ctopӗ./I&Mo,v'z)eִﻺ8sNSXYv֖ޭmDQKR]KiZVRYeϭ[mYrmkeEֶ֝]u;+[nr+=a]';OoGV9%}8bGj fUEw \#Q\88t3>GD|zWo]:޳ާ{qi4|3b)-TMVkݎ?3D/{M}@,P9s[mo3~'aWƹV."uF+kK+ktR}m󏼆r٬6jGf2J/'JVBۤg*]w]JEس4;-#K?fG8R/hq=Vb{-Y|ݵn>z 'N݇suy6Z$eNy.O7m&MUy8mly1s[DKWʷN{;)&Rr)$c:nyr7MAJ%z&/,Q+۪z:ޝkJꚊ'޷ݺVĝ.kgxCo讥Ӷgd۴[[|Y3ٯlq`݂mYUvttv/&$2 17/bh4[&+Oy߿Z"V-JNf'#No8=hiZ2 vֳ1o"R{ע V]ZS.濇mGHc"׭fx9&ga:3d .,Ikśˢj5xt<1$jdnBܚtm$-WY}xj޺۩O]*d} yG7Z>ҒqrX匃e7mԧmp,}]m+SI9/ x ȍ3 Tx>5սҭlneÖW2˫kkK4p1k<:۰KtY 7F-Hڻo}Ux>m3Xbhm3϶>Q=F_\Foun˹RjZRU,v2blK5:uwvڱXصo[{b85y9i66h14;`j^i4[reé\ذV!ᆟo~;ml_$ts<F9)j?MvoY7QF,{%mԼ{N/]L}[8{|VMD19WW1^,$KTIRyW,7[R[I|ZAҖjaJ[JKoj[KK.+Zzqju3dE23Nbb''~i=?fzkOs353|S^ޗIpe1|ucF97hډt9"}_[~#pXClpM>XbOn֓6YmR>^Qʾ eQ4!]ռJ!"#{p6Z)HYݝ(y3r_ imzZvgڕk؝)H1uzknc虋|f1S>'WoF:[=su]U[I&WK&55oi54ַ5ČUŲ<}̃DUUr)&pJ։zT_ZRҵS ޲ɶ0 [ cheWJYk_ʺYD5iWԱ)d|:dZZm6."g?.i=LA"> w{XneT޺"֏}gWAY"N2G ZY[fB3YL1񈘉}>6fǸg]f1FÓ&*eɆפg6Śo:yёSR !KJ9EtdcGq}nѓ&ӕԺAU[Yuե cv3R`{+ZwJ1˴Q/涗XKͭoU6<'FTR%xӂ9>ay 9_fr,>m,yHNlhnܱz9}j j+LmkscowÎf6Gޏu}4Z}~-SZf+VɚKaӎ-o5j~ K#>-HmY-׮/_^yOR˩{a~ԽD%гYX鬶^-X!Ij[we^W RUK;yb)?}8F=F{kpa.g,ZH+=1ůi_?Pqn=7bЖ*^EKEm%~a;9uKm!uQ+ز+0Ig2w&ͤs4|t]xŗ$gm\X&+'zjYu_mִ*;Z8r,fyTGLC5\k1M:UKDw( _:ъWb(*=lTxwM9ǜǾyb#ǵ˽ zLdcUh괛6EiڻͭZ M z 08N~sj 02b/$ۼXSDW wIٔCMuVC˖6#iV#g:c7IbtEmoYZRxbYx^^<8o=%L5Sc"Ȝc-K? Gi.Z%ŰwR>,NF򿤢f 1~UPkYWVDgGO!'lcJ;QXkr,ЬaoO|'jx8DWǷyzAv=rtf۵5nUj'$fd[Sidǒѧqb+ 2#vN]x?'fTxoW/䟹{%gm&v[{n^F-]۴nɰ#-9v?xUeRm1~!\~$ؚImqz-EwWnѺ'dXYtX=BGdr2P]l_pF%!XITityLr Nq̼ O*4cⵎN}c3cpNɿWk[=+|޲R֦5tYuSjibiL͎d'{`s 3(6UGF;i)s z쉳{oBUG;-CV'$]VڹӒo\Vie]E֭S[UJ[N}ɇ<C޿vk|: cɒrEo3Zɒֵ|/}kLR+H`x顳NKL#LhV9|:cA6griZ'[;БzU+ݭbͮɩvf+kLDDLϲ"=t]FS0Qŧ`3gzŎj=C&Ktbγ}W3f[A/[ұe" x5RԪ)KO.[qO(?G -6Ȧqk0*ҋvWSW.UOs^kff{/=!4]1|[ frⶓm|:;c^Ǩyk^g OmH6pvl۬ۥlիd]× jH7nVު,֦Ir)uYmn)]8ȭ Akz^Y((l6Z]^=%u։V쭽t917WyQ>R3d\m;;b*Y#eSN)ʜD&E~*w:Fmcv2^m^`;Fխ,[SZ)mm/imSڞ5Xsƫ!ʷxv^"((z%}]m;[㎒W:iRTVzR]#-izw;hAWMlY"uAY<ʬȥ~75ś\3]^6\*Ba2Tkܬb$]k.~5[[fOr9\&qsOSOg=w0a"V˦e-/D6~{Ug'KdӲ3W #ǻ&}s1pt՗`{jitv1LJOmM.?y-1V^-\Nj>\8 ^9E/îiph66ZUgNӘjuJ1kV"%FrDǾeuE9#JڼLDϲ]1㖅욞krබ-&U7v]^?gu+Z1a,J✵kZ?R)JViJRk_U)JSZ־/O˳u/)+]'̴EED[3lyR7/mmeYjRm,Fq.3!W&ضx']#}+b͝]V}+j)uRhNSnܜ7'GBA0\VY{qy#|kjVڕljm:YoZ|ыV/zZ"X#:Kaܛ^z>Fټm~Mo3kŗQzezKo4Mk5cY_2S#9' %&] u3YQ~ؖY]ܕd_eZ6Wf_vNE˱T/RVM_6B/-۫we+^cBvv9Ool̤NExĶctevػҥL˨ܳwkYmօSƚd9{#Ls3lתnVíw3t˪Xږͪu{b4R!Z5ŀW@u^o' /_9/Ưÿ|fN^0Dw6?z%r;_?;+ ccۥ6/=20aYTD=~⩷6qv흼Y6JDZ9F6meJSf3]Yvqlm%4z8EUr7W. W[Ǥr(ey،z.UVFjAk*8[\KWzݝ5 [(3^a)Oe`Qyddu50q\fڦ_"<-^Ӟ++dd^o4|Qǟ?r}Vǡ}gE=pɛANilol[\tM.\FUvAqCUu6K$Q|=qKV5jZUX7y9N=~źl״OXG|1UOHW߶~}3Uh~7 SSh jnTMU:hYGاv/heTJݵRQ;M$)iWu33W:/u$|<_8`1`ֿ53׎bf-ϔyFm~oz˫Ϣޫj6Lj6}ךf]NiT$Od1wrxXAOr*FkVl)v7W+KK7u{$MU~zcOgmֺ/05iGeTt<β/®-n%tȤ֪N&993ˑ1 7[,I܇{fpw-`(QW8Fz#L1YSm>ȏ fяZ]=K&j;tZ\ls1>ZW%b8o0WN{]Uq%q޴hwލe={75rWrNYFMZ֜-ΔR)'6 qzIr нz8|ܛFi.^đ^St/{8 -eqI~u.B^p4I9__óHwB5v>ql6cZS vҹeUȦ-Y_WuVާv/PrzqmJWO13w< 7G=G{hk4vmV)ß':^ihtSx8i7U/ t5 'O'Ucwp|9/$,orUEWI=;%fuIjЯV7;ij,|S4Mv)a".k!#(l{.6v[lR]!T^6l.FNQݤ|覼Jmb+6]eN FFut-/2^M1b$c&'$r .. <]& ;dz4bQEWr٪+O8 Ot[&Ys6m|Dx.nꎺLjWE})CpnixO 3G6SכwC)}rui6Ȩфsf#Уhȶc!ou&ڥm޳Y.gWsgiX܆Fȫߖ0Ր3Q/ܵݏ|Z4RXuj->6|0:.Ռ'L"luWm[*G5}W*T:t (=s`ނKb,_8i*G#s|g'ʥI2~+:1w2e9X2RbbY."8=+b~yZ-Ot&jsYAjǸbLocUlǥo܂nǒ}:]72ԐY L]@ᯠr 8l&+,7@Hc7J̅ WOc\s7e_T]Y$􅂸%iMQu-t--OzFI\UY`|•f/im^z>6vnInTn P82Y[o1;nVڅ RKz;n+:2pyf^Umd69 tQO+se6Q^.r]TukeiR4>hŋc#|˞9ϱҴ&OYj5}?Tu6Y鵗d]c1T\lQgZs.>4vy(t3 N1 Lcb&Yԝbѷߎy|bͻ;[d}t[eVRӿuݲ+wmm]ZSikz+L9gֵgX㈙3 _B5t}&GrF]5'Q@? t:{ᮔ`q/NKcer< IO1#}8t21E*͊^V.RgVp83Mn\$rLzk$hg:gO%Ԣ\ު-aUbmx/lyOOz'|n[ٛ_QM-45zLˏ$ 590'YVoKuXO52"uLlL |EqXi5!j9-olLdL&颅Ϊ([H2ɥ%^t-i7JYf%}d2^fʚUͣW*^ қWX /Kʈܚ}#!Y %(3qlk\9'h1tN}:[:mzh:NXt֖8΃Ic{lF“n`U<\.y֣ʿ􋒘d-vQCud^n!r\wSʥ`UGh w2GW$宯rn{ mM|ɷOޖV-4u"ʔ;qSXVZgZG?Wu~]]VGkiL4>-qZՋZiDs)t<86|2 il2:X ݽ,q cgOdYZz[n6</lkO+ێy'կ1[%gl촛 MU5"')*}zժ,cj0Uk|F%6/+4%xMQV!'ղtl*jꈬqK.Gm9MY44ƺt<̻{.1|%IU襞QcZ,E-VvMwIOPp3"؜Jav~c9dqQ0Vfm_8a&B9fi0oUmKԾŴZk3J[`d.ܴclR(KڠY'S|y0ldR>[ xT1un,;m[.o WkؒUJ5i$=i"}jxG#$->Dq_yE6_Vi[r)l'S6|\8-lҺN4;dk3JplHn{e]3sNj7oJRɸ5^vygҶ+4BOx·8A,~7J) %IV~tAɠEUڤcKi<[g;]5̵z٬d^F)k{_GN4A0]]qdn;8D+X,\?u(x{w:nc8$e[\Yi^bŚ0|q7U܃ޛm׀[쓚U£R]eU1YbSoy5b v SK'' !30\DKrrrRf:9u>~ۋA6mU×+)bH"}[udlWv8wb}^=9{gTlMmq汗IOͧ5eۗ%/mgn㾭v͕V'5u(6zэnY*z,6(x9_#ۙmG]b蹽f]kᱨM /Vɭ{I/&l×7mWVG:sOKѬ=㖚[IoޙlŖŘm},dfG6\}[DZZ`}}KGgot<^;.Ӛݳ4iI뭧4Oh\TJms|?/IOſ9s6_7x2?7|LdfL~U{m?}}!ujۓ[Ymgh㙟8Æg)EGJms|?/IOſ9s6_7x2?7|Ld慎3`Ckq \ͩ{8ec<ܝ'wv\DtW:WL_S{fx:gDL"O_ w;Iwim?+gp#-9v?xUeRm1~!\~$ؚImqz-EwWnѺ&0dyVaIrI׸Vvbi'evb޽]F,:rĸiYeFe\ʣ,K(Xb UUbIX6u۱bQ >w? }Ϯ?~hޓsNiŽ[MukqV|lR+\| ֲOg@?Kv6zV`Y{~e ժrl qF,Dd;<c3o>.M7XǏS]sN[L+[ǎxj^֦\x[cC$9]W$D&Z g#)5 0]aX3Ag[;;sDE@jS1u[}.]mikJiZvo_~K[mGtgҔ5iOU;=f?z)S[.J֔ZnrD۶f+11^|>#.=]צ6=noF߹bΛ8T굔ϋS4"u:AD3nnF %u:psoas7Q-f/'Ѭ`)&f%\\:A:#eY[[SFSmy%]i5t4o{25r,fHZZۚ\֭l|V{q/=]-}{nam˨7=F׋.lYlAqdݳf4yi>5Nke:q='+\ΔT͝7brMfTBBco!"NWuM;Jڢr̩e1<'7"k d|ø8ig[sF nIU;leSJ}^y-Gtgm?56q\3$gR!i!\.ș׶t'FE,^ښ}5g{O^i^^_GF`]tv}C 6,|];hj)iv=R9+H$7m|Nة}錾6N؃|k5V;!uarѬXJ7UX8AYW 7vq7+xT<8_=;|JŸ{D+Uk5v-6oN={fϷx91dݷNJs$8ss-yA3ט\ͺxiEqm1HgeKHĿ?hMɱui|\lL}-2JD2JXNֳV,WMApAϙ8]V*wP^2n3=x{d,ٰ)4*ɤ#%rR\7 Uq֏#rte.=sa69,ƩmS.hdlU|Sv޹F5I:4i95Snq18{f+6tǛ/ W4=InɸgQ5]%cGWؼY&6N}t?S=V ;84An*F3uK2sNwջV_oYulJҴhZ1_{#&. ߧW!SnH'Jz4S+)Z-iZ֖Km}ugbui)统eˎ#Gnb}o7D>tWMܙc:F 2 ʰ̎{!W|srJ!sɈ $X/r *Vj%*'[Jem2Gc-m=Sx;mBEQ>|Ikdh^xxlآy"""x%! %1tS֒Q սl$omQ-\+eԽ5lkKM9ji($Md濫1Ҏ!rWӾQogmv]Z@q1339>ZXjs<)7lLW[E2vŭY&b=C۸Q{&/zU5g_;ޏyg|/9~MMOKW1툞'9c?>*qj3< د7\80{_nin#!.AoW 97~`[+3K9nѣE+HhUިUn͢*+rmѶf)6sXQ x}:bùqcbŭJDz2km}o=iRN>'?عeJiILr)_Q qF묏}X޸f"_mb}[1^%4$k 9d);e}ӾQ[n+@v׈8-N{jg]MWN7|S{Kcɴ׈(3|\YOd"ׯ2afUV +6YfRO Ul ݋oLS.+\wLy1Ɏ/KbսmjڳYeolS3ϲ,Z$-*9T]J1WZ7juר66+^Mk15qy{0}M}né͋SkdvK[=/\3y[fl϶<3[gegI&uwIɛ>K˒Ds|&״fxP'܎vd-q7uN&y Ћp&Z޳&YgĤ쫛JMM;vgxʝez"k>و_;:~UOijuYqyojbqjuQ|u^fS>Gcb}ѿkHWE85W5o|z6,{JS.UZ9+hɎxW[{m˴ :h;9,dC]װ{S &Bo/N-zӯ*:}|,5rRrE4 9<ý`kM]vO)sD==8zꐲҖ㮛7e7s֛;-XvC }hug s1ݧP^́2U yxxYG}8cG!bI\;Ng8sǗ8|K4Nnx*}t3Z;deT;_ĵEù?+ 6c,wEfDyϜL7}ͧu]+nY]ߛKǨcL9tj×xבuRI[(܂3}+TaF'Z꒪޶uq,?LcrA;K+;Kꜱ-.[ٯ!;{+6{e;]}.~bcZO|sow9iٗm鬴斚koY;%-55JE=tc/?L;k07=Q&;٦ΎoQ+'ae9㙙O33ߵ5i0[Sծ=N9˃&xQɟzAl }Rji;QͶуvY;!Ewv+ SO6˖x\N;=+o+N']o>myj.1'gH3pŵ{6=axɃ.-شpr9qvicL&mivݓ oRUNRiKom)^'\՘~OrRʧ7ϠcX&ŪdzFR$q{su̐l$ѪNE,JN=wo3_8LLsV=dMY;>dim>_0j/kJ_>=+kxshlx nF誔NKڥR;ۭJݭ}}iޥ]JV]u+_M;w+CW J$int]4AP,ؕpk6fe㘷՞'?6~ӣwoMt5ˤ=f+|Kڳ\yp䉋4^&O5_- =]飹] 0="c#ceK! HiNHY;,~Ie7n*ƋG4o`E뒳yt3sV?~zmfǮ4⦢=.昳bksұktsiDǵ]}RnNn[lkm+u]ZSݭj ܛ"k"*(u&RNkK˩Kn+JҴM%Ę [ܹ4A*e-i}-4NJ[7fi8_ũς|tN̵J]=9:I֬vJҩ9jZjeJ\_WM}i,Ncl&8ɚG6xʈHNQZEo_;Y®hOQlT{V&S1ϲcYmݣnvqϥuŸ|֬ cÚmZpIzcp$<۸lFM4-AI -u:c6WaDV>V%䴒 KGIoֿ8"f5ɓ^+]k.n=vb]N-uӪڜ-jӷ+Xӝ=i1V͓uϞ92ͭiD\<{.Bxw *u&mǻ}{YiGM0keܯ}Ku;n=d('Wp }æ_EM E6";v*誢5."cXM$dݳfLqa7J˸KY6, r5o}M[Q$mWf-4LZ$;0n,3"g[1fd%{j%kxդeƥ'[WAvدshH"Dyxf#"8/d4Mv;nzQ-FzE/ּ_kZm.KL)0=udd&[S\CL:haedڷ]Ȱǥ=uV֮n;mȈG_MF.<8r͓-1d{Z\qyE"ibjfv(_c-1WM㹶r(lDGrŻUnl]'O13\Xŏ=k\)-+hJffxDG=Yt>S7{a VfqMU^ 8+Ju]v+uYmug;t/rǯ^.oV场tkY× _zܢ]}խ|pyff+XDDzV}vUVUåf}Fl#J#<[\4>wս-ūxZfZ-}?lC=>2^-l gwX\{df!كx"t{;&#, &f^k-i$q J)T#DZxgXb#TusۓF,V=4?G*dF|r^Qˢ)L$])* վNRvwW{y>bޖ+jk1[D? |?Y{u47 _Ǭ_YiiKNM5s+M3T{z*kAdso}cJ$YKZǠۊ}F؝weִ*m{V{LVMkLb&ff|"&f|!f17Lz$حܵO 鲽Y+/_mݝRjյfm[Dūh&bbbbbc))]&Ku|ypj^b՘fk12G37+qVW"tC\p^ Q}*8Y45!cq/pUY>p%Ǣ~{<݌anM ]֦3Hŝ؛V^󧮛F.+.֦,sj\{x{[Hm-۪6 rf]گ˚I/YVrDb ۅp? =:Bܷm &Bn'Zw3aXbbY G̜O ȔϰwIyf\ʖN!2uYs&,8~VgY^~M91:%1-z8X.VA]{eqj Ŧ:sRp釘]Nb}<%?mڽm!d, vOQN彲wx)yyн}Q|ͱ׷tɶdMη㾦\8iM=c_7ZOK[km0y䘎 ڢبX<7+fŖ`$Zd(LHe"ڪjN;ViO_5aQX*sS?bb#lmt9*cINlZ^o~eiSq8Xwle*med17% 2֭ckU_j)+OWMhM+3wox\+myXWyLG?Vf'&cܺw#9w ɡir/+gͦjbݑ~"gE6=.ls #/} -ؘ|>l̋*Q9vWǫT+Ս\Ҳt?{*?]A~\GDwVZ"''3y]+:KrK3n:Tk#&ߓ>\}v+ݨirx8lD׋O3}p?]!'8_ìvr9|8YdZի7DHr=6?J:h]Gq9D 4֯-t^k[%5jwiYer~U 틪Z[e|i1jm395yұYt"7V,[D־lq+) j-ul엄&21)WyvR~^f.&Q Jc9my-( a,3Rc#hŪǖݜ^?<#ω#[}o1W|k_;6ڜZk񊞱[c5brZlw+h:Cpk\3ޚӜn="6ؘϒ"GoɭŎԘ""b<{'.Y=TfӼu.=u|6W\<4׿U{;zvR|mh)*.M靭!pɬ *F-ݽ߹i3oKUWQhڅ/TufK|OZi6^yW!_TkV-|FjTg"vтks.@Eap虝1IXEc&5>/9,݄YFi:tʷ%U$oIQ+zx<`y֌վS[cdSÈ!29F-Ǖ7f{R-#"392[VGCFt9s&Ŷݻ{ysO͓ipJsɎb1WI>$42O.oݮg?)}'7dssYyGVO'K^NJz-׭#Z"$ZG:zzެBY˒ս|qXffzGb/-vϷOSߦ.4i0~Q>ivbŇn^JZ4kN$9#d2;.R~=y;.ZZK\1{u.EJ:N=E!/=*JG'ԙw'I*ImY1J5A+!;jvяZEg?fV-V<}+xf"9gϏ>'/8r[M6gmvϩɨKff06+de,bo4aoc{ZFNY>-0UgA5TF:>őJl>t-|;! 6sαޯrhvݣEiwݳMJmlX\y/kmpV2eZڞnSK. |f H՜Jp^KZV*=FPӗZm$˼t꥿4q-i66)VK8mEk1$C*i(Lc,T4ֱ'v'F<5Zs4qh/?l{b9=_|:Mn.qڵnV{j4wk|x%[ն,g>g<[guNtk-ۍ)}AkriX*OjEh\6\Y+Y۶wVf13o3k]-927ґ;ac8"fjIn\Fvrk^1c'̚#ˮ]CgYV jh# {\a{[Yå7$xmUilo##3TɠTGNceKAI{f(;GJ'_S,i+>^S=s|y^zsj7kbozLٵΣ*j1j0Niy+kR̖\мR&Sz޴,Gv4dϤ]4c%>~IbUYl{(op)m) SgkE$NвcȯjvWOBU5-ƾf,wG,R_N1\b1/'dϏd8^#jQ/ҵO.+{M3N"M#xb}? sWM?Hnѥàu.],[eɷxϒmZ|kͧ'_u_O q̿G"510r)_dl6c ,f^ [ţ%VQqM񏒸wr>Y/Hf[%䇗iqmO|TX[ӒG_JJz3~lܴE;dJ"xӗfŒ^UcZ4dF==/ͣR8mǺ'bm3/~!n>L-_QWl_:.lwLzL8k]Dx홴x \{=8鶷Q{Z7oz/=S0nUL#w'V ԍcTjms/z4hd6w-_0B!\e:d0_XG0HVc#\r TfK1]v+MbH[ڱ~3<w1٘Ů%Ժm&6s7nߎovn\"fԦ,|Q|Ÿǒp1ۊ/1I=f=93Gbo]䒳-1K3.zSij R˨N[ZWպ#۩ˑrXSNτ?6ߧ:nblkX֟/ds|gH6Yt}WK۱]rs[My˒^rZ^)Lvة:0:wx.ԳY#&+=]{76b Ǵ3v](p xY.N*]]FԘ|6f#`Oa,!jP914\ŲvA.mi7d*XU%"W+m3>;{0gggrc.ĺPWJ2f쏗>Tںa8Z&o|N1(MG1pG_4Z 3vj馻w)bȭe'}mI{/ľ8r$vB}CBa&(_]hu_OfNEԹl8ìNckV۫om/\t51τsfwc&vl:uOW0FL82xZcjj64q6:7t3<*:/ 6"d1M&l:Y疶Jy[Um))k|d٩JvX8)m])ub;kq[nėոJJX:Ku<'iU(cb~4pu^Ѵ\2rƎrAtUPx ثU,֮WUU5mipfe665DL|+1ïw[tVSҝ[.Az87Z`:bˎ|yMUV`^&o/.!q5ꙇ=q 6qIEãee\?nr-fޑpH[rn%jw;>HiH6ur;(._OJ䉭j~ \n,N(o6.xV+c{6#Do[e^RY})uUWp}nRYmnmrɧR8xKǷ혟6_[dغюi'ku&S_,}g6f4ђ&aŗ:Ҷ@]xSbOO,%Mֈӭٮ\>Քc$4n&qGZKi[Q5<+ޢtNmSO3}2;x< {b|FA˹ӱ1d.m4[e\Lz9y|y`}(boL8k\wg­kiOT3o[Wj{bVfc(QR;>o_r=wGK?O{OoKߜG*Ȥ?|N*? y-ɗS.ڵ$l֏]mWE&TM-Ikp~=]Eeq][ZB 97r88Q;EޕWw)#+7U?7z7yQ ɖ,:^(uPE'F(/8{%ǵK,ɻc/GdsS)ˋ.k _>^l1K&Y:#9 ,kM5kcVޕ) 2suW2Q[Ev,$wWړZ]㲉[$dXzmآQv/bJY}.%Q8ky.]t9QRhV%b[[_VUG5FՖM; ŒqԲw=I5/N*E1G7mlM9TSME.VabT^1w{p:l92VS׳l1+YҴ"RdmQ_t޸^:"tQb}IW}M.J~lzYGJO^ 6ɜ@9BF"1,˶lpՒO#I5UzsgBOC$B_d dw|u͓|& 5&G5^FMSQpk?,Iڶdyn?S?sWvsN>7/-.gvSdb .IIyLk%wbwR +$vb"ً'U#urs!ɝ-qpL%wnS |iZ O*ݩV]mTE+wT徃`.l[(Y$UU(SiN$b"ܒJ8dΊxΑ8ubJcYlظ.;֗W_̲W毗kV6wSgMS"[{Sǭx;=u}KxSz?{?<>>}oQKf0:᫻춪1ɟlgz%Ѫt,sJ߷_&ysf~OmV|kӖFz}srgOUW56T#49FA&uڻ5dY',l ZcȴnV:MGwk4 N.OJu_UKmuIj䭪u}(ޭe׸tƥmZlE*'X?S/---Dx}Eܿ|퉧e5vvʈb5=pݪ -f$'cR/v=*$2x3 R$Ff5lq^H6p6\s=٬{5cj͵u]6o~\&MYγ/7FL69kEq䵫gVoGkhao3f<~U(.f܊׷Ja^WY(֗7]eeY}R/nmԭ+m֔+JҴ;i^T5de7~^,gfóLFbmdk=g/[~~bgȧ2&{9?5+\BI%3ǮoQ˥}w V*}BbA?cp[h'VWpNPV+e[Bcڞ8Ď8qp=[;F| -ѓiEZ;SVʪˮleY5/d-Y}ekuNx/RieUTvR)e뭥kӫbmq3sc(tscwqIgp%\Z$Ѣ%we6MU-Bswxo>]җ}1lso_ݼw] g/1IGmrMRR>E[uY,jFU[7]MNnhKpp:G+.z9 R]Dyv8@V4>U+zIKƽ.Sd32ZE=utխ19B?-WT|^eoW rcW5J%8r @p3QT" "]Ixڥ{86Y餬k+nwh?ow;q͹={C?x޽oG]S8˕:`7 $2wHYt6C܏/oRC%U5hJUJc.A~-1Λ}'y:^JlM)ZlAr|X({,wӭ{'K.A~-1Λȸg:W?9S{{[}[|;=5g^.gN=xhVQgY),%ÐUµ6uk3jbHe-ףarzxoNj*9E]-~;nV:Ow$pim_Kc|;(ql/sP9k[s%:=S*ų,>;p\V)u$(d}JV|uyk-"'[W}yaA路-fm?QMVpڷ^eS <3VjhۦQ^l|{vL_3Z(mq0D{:'rYdƽrd\\#_}^xr0 uG сaf[  '"e+I$׾[kYwvr+{}-Rfo7+f,6>AxCs)JV58M] dck;yCQ/vklk'0q[+lMDEbsJ}(K>:jqcq-=;x0Ѭ-zwԻdzgt[Mt$g$Mj=/H -o?՛[ccڛ>Ԙs9DDdо*Ps1lZBeدI GʽXqd{"'N%^]q36.1VexaXG2 mċɷ^A8cUw%W\65涏9|8ccz+mV-YeǬ&NpɩKM4LZ<.%b=W^a>Wn1s|H$E8K*A± ޠBģ0x=}g,]{'.ug0xgn{ hvQ8~_ R+ǖr:[1Yj}ug?bԩVҵRB`:|mҳmyyx=8;ηKX>ۯu|5Ż43O}@,$<\a< .b3[>Ǟ'Td0+E3MT#`LY2V|Pl|#hli`9<>SԾ׽xI5x'{)R)bzKTL 1NJJWs68(D9QPuNz5:4`WOtm8b2NK&k"oݵZӪ_5SXb53][n^X]SO!x]˸jɎ}2:'8w(Ǣ2O ^.g#lx5+{E5&w2i3#˱YWpy.1/?2J$.b%O, -g~캶wo+uĮAD5-LjQ>_5&hvYU_Y()h[jZVlwsmYLqcq>mS|ګmhխ5n:Z&+-i{/%bշnZEb#F~qS-on:c_1FD%!jl}KMCQ{RMJ'ZWg=2oH a Uݮ KhI.Vܓj^)F1Y)'+wlE<{b'xISm+=Į\v˦%o+:[&I+#,b$Rka>7%ۏrxBv&MPkaRorwžCɜE<ETTR&ӳ0mᳵߤx>a#'M^#,grma.ӱU0j{'T0)mݒ8{""'ٖtmw}:}vǚ3i3ũ%⚜q5yp^-6)Z-%f~{g'Ld^ntrM$6yQTX0t{ݴJ_sܠͥU !28B663<`Cf+wʼd\.J`_ /fmݏb&;g퉉`ںu:czM6oݾ场jmiǃlxRzOt٧Y:7m=~NM=ݗyV0_FINIdxcL|߈OJY4WTek4Uj*M}yvƻQf 6~ʰ܎ɥ1Lg,eJpqS0H*wWZ*`.[v|"#dǗ11˘L!t}-im; jts2dɋ&;dk\90]͎F4庺%l+Fkyr--kեԧrv,bwJҵ,.en-9Cb,kbhU~3ۆ Xٳb^]6؂>-5f9 aS |#8_VzHCiklc=vK:m>LՉ˞m%4ZkL~.f/lvZ,Ӌu59S))~ʹ펑y5ZfM}0+{`u{0Pʑ(Ss>Wt}2n7DS l+3ՑsU2rjeҔ51' ^VxhZxJwO6-[||ϟ><ͷ7Rv&שl{ŶSݯtY5:,cSQLiZWirmg5O37z;N[u2,w,l_mLX%+29E=ǟsH.2VVtj'z(Ә=0wMZbb8爏(<3ka׻[i2msśG6 ƚ3fMNlSثkV4Ưx&guc֯[肒x))8JU^.#uҾ bb}-7\2͊.ˋ%|L>魢&>pn+ԫ&e#[´fTn8A>cLYEd\8VMlcd~uu[TLq䶚ɧ1.Çxuǎk2ջzo}7c43{*Ƽ ?22#/SqHQU$p>WM^Y?5g1rfLCފnD63+mޣ{mY'u]SȲb368ӌS];\c12,"MǥJ٬;Lao!WmYAQ16L{='0ޛzS˭1=vr3s2edq.97ǒ"agx'gH-hJy$R|UR.YյnoUt]ڲKe=YW`4?"٫LqGvdE)1,6fȄx<)Y%FEJ{6nkj-^Ɏ9y{<HѷoMfqxgSq^ҹ1d^Zjds-kJพVQYb(9M yr>Zy^#}QbQ7v&m`GQ'1sj2b!#VjyMr>UF]<{gr.rPc&x"-/o`ҍES(e[3|H;9CĊp ҸZWϷ<|}{u):4fi8+Jbŋ&׵qaÏ,}){kHVWgƻR{_y^ 8%Uò)|bUX xYekrAU[z)P )c*Ɇˋ%dũKoYVc11,6ٛ#e8`cl?u\T9U ~FhiMNo뭶QG˗>Ke͓&lo-%""&׼ͭDDs3DG[h{qΕw:z}}.C9{~='ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_Ǵy?ý_ǯ7'ϵ'* CGs;{Gs;z?~\z_x"?y?ý_zqg{޿&^=Oݟ?._A=}<_WZއsiη=}_~7'ϵ''ʱiݶڏ6Y4Y-Zo0oכ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8כ,|?yϹ̗o}8"ӧmKܷk?B8OK*KK"0̫[ >gd᫨KEfEd .ķn <%斏\?|uIM,w=2 ^y0oUTj-[MU5U%uT:~sq yW:t G+͜$qΰl<τ8չժN.~%?u ۜUR;5Ccekng^괒bT좨w ]adչzdKbJ/USJ^kZF( ék`X^Õ8nqi86# ~ 3 Tkx,rTCI;úmmwmLNmɮj8g#- gw$Œ7A[ԪQIdɜ4?T{@<[8y̾Y'kIRYܧT]b.mշ?OC_zÃ0uTNC4]ֶ8ŮQ,ošBţZ׸тo Jڬ)Wg\8l靅чIj-ϓֻg[^ qKHHeiURVvF/r}کj RYN86m1 U;:od_/L{g\8l閱86m1 pٴ8/Tl띿 |[1s/xZ pٴ8/-ÏfྈSv6EotǶuȾ-_k-Ïfྈ?`?͛L|C ѽ_c3X5O"&Kc-tra4k[Y#YaJ)[O G1,z)Gͥcw}ru]T;;R[Zbz SBdtLb+Ւdɽ"rm)r)}~ԶÎ3~&0?&uh>~1d;;|Q*餝;}]Jl^Qi8ImýtČ:Q 9mzYښ]eu)Jon9WߚyLk"\HMcML=9hҙ, e"I/N11vZu5rgJORiɜ13`#)\/B~h{{U#਒vJR뮠pGe;߳c S1G/Bz_^B9yOyGc6֚7slxSW_ꍉFX!1:SDr:_eեZZTj>ZA@cϚ2T^]?cd<1}NYɼ27%ܺXNzט:'Y%]y#k81[% 8j`X9ڮȫ/me\ ؐ+<Ի<y;"7nr'ccә[ 3׸RNs3ʦ$klsnzJV~@ e5vãޛ.e`ǰL:1䛹Q- ļk6d;|]8Y[bo&ꥣ M+D<ջ_˜iYxؙҘ3I'1U$PUJFoM:6-IVKy9K8eVJ mh +]7Rwc[FTzxETYD/z_!q~YArc vR1K.E-e$\}>ǥW{ r/%uVZ8fsoVOe[@S ytd.M.5˩11`')r{Idy-jZԪ.E6Ly }YsljM2q~[3s;r\cX+HIh*pK5}WlOA MDjH)[iTЫe;vvNie+e'}&ޚ]KK˭mۭ.kZ]JҴiSOc&T>2k^{7%3}m=g'cnLqtr\fO&e)PpQ6/cv9e:gU0:R4uY9o|amش3\0\-_ wnI{u#u4cI4HL%و ƛIDO.n<9Y&#~ˮ"vZ^V,zm)hF?6$FvIή_l WBk,qGF-ibkmX9,/!d2 w,crr0uq{J6Z.eGʳ'Gq>mU,Qv*o[[{iJv//y9Y+ƮQp?[[(e+e7'%9'FSh'xsI[[cѲ1](Y89͢^v4?ñ}j+*c;EkJ[OK-}T9A Ne9$Hlw'DXB2^FRI$ы˺p}IWB2oR>mv$k LOjQ7Rp#H&p/6ZW.ˬv)}H櫞(5 d3'q bW-%B, ux#-BVI–?:sX$60^ܽ:zULcثjcK+bwމ%b%`Iiȱ+ d=Vҵ"6WJ[Ki[c]ҖJZU)ZBsƢq,~FWnf166}1[$}qz_b =F3 VX:#|hGy)niX}ϬhLġq=Quk1[A=W6߰{_ƱEWqE,vr˥O63ɍx*leOGꭗ6ƽlc bϰŖh9B!~!n|!(\jpVY&*ꦂz,I'moQETؚv[J}Vm+[JR8+{3 /8Ǹ6Dlk^M/.a13EJZ;s[i^rۮ+Jsg#xl}3*tu3uR.^ O~ml=ė1"iCɈw ),֗Vʹ|z_OvʬUSSۡOPko4y KCAN<'+uiVJ-Exoc$Үcl&R1(bnKSq%pޒY#v[!l^6Q70y'p55rr,19z/? c{G$Gc/&ce#Zߤgj1^VPyb seVK/)ZTbR3xlnSk{`B8!8~Qz#We΢̲,X󝀃21uR1COuMn0u9`15ȍ13 })I3`&.{CW`ًk%)>V>L=GF`N[.<ޙ%ș#N<ղk⯙7Al]u]3Z̬(5t#O6}ѽ팶 ./d!e\AC/ l2'ds׫Y;ݾ%Mel*"ꬺZ)%eRbim+uu-V)C$s%}RUh$MJVj(UV۩[.vҾUO)Chr;Ҳ tK[ʦ1n MӆJe9#[z; S;ƷrtOKZa?/k#(֝`VBrԠ=MA2l:v7'+3JrO0Nh;<ۿ!ԛD'0dX q_2`.'9J//ne˨ hԓ /|}З>Z:tܔk?<̲Y[N򻒟g'<dT\ܪq?++J^ۨ}TS־V}@yWʲ|oov G< ȱlăx+eMZ[mio&c?[`mhL+2L^N_6̮ѺRer)^*_mm*Zg]eTFiCaИ)gqfޤ'noeU/VbU[JY'mGhAhѸ !AQ]*ݲiTR^Ri[{-+`n;ux&;'?~Ԥ /a '5zD/B%^(Wm/ Ro9qoЪoS:P?}v_$sMKQRbV.o%|Z]wv˖v[ZR}@Pw1Qn G7r՞N|}R~6t]}BtPȳMGQl+sJZD=+9 7{dbNw"lv̜55= 'FlW՛u+m/P*"~Ďk/jY N.TqrRQꥊ#gzĜ#J9\?UTHY6" n=OؑVmKFcQ"QS6ːlKM1+kaBXR$,nA5AdY)FU;Ͻ2,+ؼO0lo$ b4ܗbe-VI;n}e:+n APMYxKBq B$gnxڅj~ط! ǒmr5Wɦ]!OO*Be-?L[^2M$g,xt'ϥ2LJ[*ݪ\pQiޥN\NNf!Ho2<_Ӫ(T[s7ǸvRqncy ){gWz:Y ==H4ڳ5O/wl7/\B[sk}m-ئ{>c\[7!"0pUrGd[)-|nW'](ٚsO`W"pd_Džۦ'`x-ZN}iN%_zw{tXf!(*m'IDW'ޝŇ^6~?ߚx3Zׄb-磭S=pj2}e7VV0zP~^O{ 2כcc!ghq=t玮h'Hc HdU{0G]6i]oua}u/ٻ#Dd#>E^ZlFZ}O\t&М!q|{V"s=o7]6w)-+yXqf9V`F"ǽ8L=2z[j39AEK)(œGǿ]}߰<e@@>z}s:L :k뫕BJqCLxgj^-,&"să6kB/zWQ&ub;<5&E̵v/7v?! c 6RU7vAVj׶Ю(=>x˝ήy̖˸kս4,'?]^/h@Aؚ5i.ɒ`}Zޚr0u阌{.ۧV]ZU4.KsR_YFēEE|ɞ d1{\/]gmۦ#`&2fF969-*d\'Zdے=>wxϑe\|X-d8)''m7!1 I۹\I4%FVA .iʮ%م]N=kN+]db9ktlLsSO- SLMG^&˱v5'LJ}wo)7`m=Z7!b3q)jسlBhCɕlY0v>}C_zI  ~csAO]OMG--jB(unxVVRk}Kԧe.om+SWrS92`Wg g⹆))ȼyxK?{;57QͬZKR{[+U5(oղSYٸ[ F-a^"\82H>Q{\/BѹkSvn!:0cuj~Ϸy=-ZU8I_^'eni{%ڽ헵:ުWҝ$ufi84`cK#:劒hF^ʬtGVD+mRzӳYqkzBeMpI9)V(r mTnԺj-g,)A7 Yp[87chU7o9qo_$ |: 1o$iȷhcl[7IXvۺ##ıgͬtddsTGGB̘dě4fѲIjպiI+,Nm+r -]æ̟-Ui%m3LnnGImHw,{֭]ں )o@on?9=۴9 N8mYsMMRLYg7823ڋ&+A5馝[^K P bxݚb%,qYH+1:cumXF턥!Vu]<'i!n7"ow`rY$&28M!p=QKkFMfp8rMkD?EwI5VԩK3pr#@-Jļg+ GklC_4~֗L[+QTa Uo$+W\DGuOޯ)rs&?^i|xd߄ߕFVf?h(\.Of5wuM6y>\Fitkqo_JNᳬjXeL9la7,GzM+WI%O't>&kDp\jJNl쌋::#flH̻nߵk+< 4j@hDdOa>I-Xw͚nXCՅ nFkmOt5ҍK{/}78RLe9zkw~gCqZ}SӢ_x]\':3RhIֺy]}/->mE[)!_JG^)[[whU-yOy5V|w}ůq2 z3M=7ne!^VN-AdYJ]` w^klA|N &Rh=-Hj=[iq,EvT cE$]_u;~K(l5~a2Zx{uSSv=bG.&Qju\շ6R#uSRݢzj_n ۩3Y&ج=!NKdUQ RAkm,;pα.q?}toND/=w(N@s (i֐pkfݐn6qӓp#5K]=nYmh89ٯtxQ rK ]vQk}xqÄ"m+WVBo+L[N~9[׋zϑrew ~K"+m-Rjvt~ӫ9sMxI=g_U"|gNa-k}/Lhku[~'mݶe-cƠs}pH?;B_hSWrS92z@p姚j5s06p$w+7bܚ)m&Y})#+tNpg'AdYC;K ԝUtͮfFSzђ+$]Z Ѵؾ:hlhv /clqc'&b]Kx/:c(#^tQۅ(?b-?w_Oe# ry_d?ΘJ8?p~<1pJ؁O]W5E=uǏ?Ҏ?LR ry_?b-?w_Oe msYO537AH AI3~XN0EHǬ᛫]PRID/il }fL`M h9f>Sf^fK#c-tdH|R&6%rlz5ȵ`~k|e;ǰ[)J?EZѱnxJ%AAt6_r}]%b`"/F)I77i{Uo 5orTSm[_Z{JgZ\lALK)#cg!5l 6h{eQm;#w1?ђW{2Zh>M͍4[5FY'iEY ˲c q K'É5U7)r(e }7X_a]ⰳ9[y˿b/UVk_rw$whzv.SU;vxNu,iJҗؕ[ZҽeiOU}Udi>s]-1?ѫA B8--bJ6I$[e^_UԥTXou;hcw?1pyivi kږeyAZ Y/=LTֽw ٓ!e I 2s ax֬Ɲal+wяFDZ-m[eMխ|F-<$i#r}Kp cYc1CiFX}g _%%_NbIow%$r)gvZR;ǵǚcX4ҍmNJJ<ĜēJI9xKRp0==흝YP&^]J\Pmgb,٣[)W:d6j*ҵZ.\@_Pslk]V0O_7>ًImyNI%s'uSܥno,.v,?a6޴dz=~Fg=u $cC5AȧD$>QW7_6^dk8~=0sBnt {F ҉Yr(:mV_߰&au$YtδںWqYڷF2)q~&j2s6K:ZBd&ΗǶpJJMy'\[Ԙ+%(݆U!p,gMf{mo$1iVKy%tvα.(znK%ɢjjk4$9 1l"&IGW$9KUì=)^ g]{3 sZ~},cN{iխ>!ւNDÜ-/C6iDPi~/ T6A{/R'ftڮfX12 &LړX ž)IR&ҍkbdVIE# ktᅍs6h<ܝTV4}oZm׹W)#})UlNF%=-B-[[R6%&HYkzYBFR߭tsK;ٛ+=%uMj7Zc9 4gzж,MtBA)xwLFUP|͔S;f{. &Nb탯[br+&VsHUyZX\Ku :qALf[4S]LƔ2N?rW)˙PC*[!֛;^>N6Z5B(VlǜR)S^z {La= v:HO'nST^-C|UՐdN+.:c=m,g eǮE(㘦n"˞JrORBJˮߩ0P$;ygfk%Ͷ3s$ŜkxwvTv#/5i}ZR [OS76+@)F>zVk3)Zk\9\lܽojUI><>ۤ){R9^BD[ĝ|m+t'Ӷ꽷Z`kJSNe{k쯸yDDU7Msv;ph66CAs%+ >yx'ڰe7XEʞm/U]oNq86ձcep5ҹdN*ENlY>qWWik58_)semYzYa vw"!ʫZǽHuhBn[蟌޺^mY5]Z] /[> <=T9|ӏWӨa Cb3YeXދc1sEZbԥ;)ozW1X54}/Yj1uF 哤,g/'^ӌy#R:(GhRiE-f.Zv^`팾񶴺ۮ{۩ZҴec:7/0v^1M@%kH܂/+ļq{;l2D|{MR ܳMN`pSZ}6R.+zqw*!-$Q&*GG]zӏetvQn$k>*ִ)Z۵Vzԓ=VVw쯻{7>k]ÍU ̣6$b+ZM]pzʡd|+ A\%3SH1RK#Hqc:o߉Q)yYe[ayِd Q75Uqe潙:qOwn)m\C˶+fr (UY79B :QU.]W:.8α|Zue]4f.fBl$֪\RꃋV[;*XǐC^xW^RUYch;"&᢬e)|m\UuZtu/|\ttIFx{-O3us;9^w+Ed*,ȴa'Hk^S:[h񷣎K3i8,Be##)%Lv~07Ad;뛦FQ'eUkJ֝߄F1jVEU=db1K]^m<[}r]Neݴ#n r1 IX}UO#*Ͳ+m+EYcV흴c0L*^x|.-M쭅^f&kPo޵w͐REㄤQhN>$),Ւ[e8Kݩ^;[7Uda:{Z0Q onň\[[ dN/ѐi|[gWDxb?)7HYjf)bli$)}Rԃ3G냲V_7zvl$gVua.,QN*08W6͟8h&:H'lls/9ԯ\OFsI1bvUcq*9J&"]UEl_zKSݯ4VnԻ/5[K sfig2VVT4֭jWgrmiV2xC*>Ϣ:}Kpw x')s>+ful/UmlmE@tܣ֎-p=W6grq/2X2ecb-4^Xk1[h=ߤ6tfkdKVV,VN.EI\kRjTJwxɇBl> %mk{4 Mns>1VSܩTJ[}Ҵ3r.g\%憛kv!E] Seʿmz*坹U;!3Z,F\.SF^UI?{1nȜ+6y/(M<Ȯv<ҹ$)E;et?)y͌7}W7Џq+#6Nŕ4e۠u[=F75Rm_?JԚZS]#,[69ooA*F_4ŸM5jH@CC+w{Exﶩ]J[g&tǺ-r3Dד쳶 r2&.?k(oFwݩ9ksx"s^+[*Ρ;_^;boo- 6d޷*MexYxqnQ6<'L ֘ܒ֘8AJeṭVkrēM xXה2u;ˎ{[v\n]ft4eXO&dWQ=D۸t˔VZĝ)}!G=hx"DŽmYM6;[ļ4#޳_T{lF W=_flƙq+i^9HK[UYv-v=h]7d-nŴʮz}[[#U#^BBk~<0p@&Ρ`>!m]1J3L H?:Bym!vVIyD;o&~AVW[9kKsiۼIøn{-r>78MTVvѻf=̅5܇Xߤ1 2$ߒ㳲b|6YDO81]؍ʶxaN:<Fݘmc"oސb<ƵҙYi9Yj/_އnإJĦܺqIG0Yb:M*!s)D˷r啊xt ݫcE&?sup$_]$7oli9u<:ΰ7:~b9" `a{zLYH*rV~%a%"7y} 1uA*#.~6VUbS9ɊCnZiT4'J:N4 ݘwY,ۓ#} Ų?)qaHJry=2y3I<[ڊ(!!7+8wv.^;}[? lyL=Q6FF)5y#"C9bEzM(Β7PL %d~)4rJ+cIQL֍ܹdi Cc_$m3r΢ :®2HqWyn>qK\,;?;<^8N%Ci#=!罓Iv31Ⱦv#uNZ^eCVb8>&h;OKtξ7ϡ0̽cQ<;+27پY?Vi#٫$s*kd䠂MPEQ4NJSNvֵim;kZSSp_Rm/2m1K3Y, e LW y&OڧzU^(iezF8v؎F-59= y%(.鋯%|t< xYRfpl|w41[ZlXn'.gc_<~NWj!ٹ_۝Xv= o湝/#\'T^Lc %>TarMrWl2i;;_F[#WYj(\5n}̓v:N▻]6~Q ԛ8C*u4/kFbp/ެșVsߦ5ܡG"bIEw2G?1Ub|u\SWjEv1Z 7Ww2-~im3Egdeڰcr\|G U&2X1B.+6SikQݽG0v̼J1}drهUC1:zm̡LQ]|N1թ)eRUɺNZݑCT:_gn:\G[SrDHbөrM;p(k7Mf j.kڗ\ݵ{:'c|ϖa_$W0l&1(ˢ>yxR^ۗXNâ٫`OysбqXw0Rr75XO"QFVzh2L[R&Rq#d,cgux93(N]-ų9jIx6+$hO#ƷtG,]dB'ӏ/yqp#6׭qY1LOkGU _☞BXy&E0rkVN;#N]AM]yAY#0e4$-Y;Ѻ$|#HܒA5YڤuNpq7Zpnu0o[ӑ -ՊcCd$Θ+:yO&9׭^i{{9j` EE5YKI+/QUTM;-רVeҷ_}եJֵ)Zw=ǜG\frhhn(WgMfZ pbg=xTUMvKm8kw=@e'sG&;?rLd1s}*լ:=۔VAJmw7Ժ[)ʨmAV0}k\&O5s69Zz@?6&ۂ}<4ؐ#D '7L6(Y(MqDĄJNﵪI@ܿF<5Z|2=+\fXs Ÿfq[shܲW~ѣgA7I^G5߈<xad׸™wa9OKʕs7ZҘee,ic]#;8d}rɣOtN&{FٖץԵkӮ3Ud-eFSE9lYdӺ^Ifj'^[uL#s}\іe&vyN\#k]{p qm*Qxp{$zK>_4܂ڬ^q%ntb2" X‰WU,Z/_F9b7.1w1һ%渷 ǥzxViYKn/nv4oFjUJlu\cX6.VcfM%$6{i-B_j !l*$]+ϳ|l kL^`y¬W31|H׹qdPleecB5P{FNU$wr ;;gMCa'ST=6^hCZ=`2e)( 3җp/GգQGRG%6KIķ_vQMI3  ɥ ,dOBIBUT\?MeNHrWqCD>GnӸkK3w.lbأ)Ik6bmѹDl玝H8Fo,eq-rxq"2qhhyGx  :|<t]݂h-H;3'A+*)}Im׷c;d}@zWy {q [k\*˙->]7{\YUQJf+¾?:VA5m,! d>ˎEk[8[\l[4ZA(GP,᭗Hw7ycߊh?r#'.K 0(v%v 8ZOUM2X*䨗ޅaѵnmUz[(g=/~%ߘMxyl:4AbX$DSY&JGFRQ& \0|ps~Ӝq]cybY:[!KaOD7y&u{eI5O/)t256>ȋ!a?ƤCN6IK +m\3VX&%uQ[;/os(cǞꇻǓ2+Rj\ue3ʰm5{Xf*5!%){ ފJэ[})EOo{0{Tr[RGf,Was)h9Jo9dR.Ѷc)U,MKl85W{ V&FCBk) &}xbWa ג,dx'i̋T+Z:tܔk?<̲Y[N򻒟g'KN~Cc vX)r\n)'GrJMjw{ )ҧmϊ-lKZk_mkm݋#e9*5En`ETMdR|W.lq?QeXc RКSţoHrv[wTMe/MM3M˦Y.I+MÖvqw^'glT850j~Y%g[]ӼC؀ּ1&glNѴ5&^K \^kbfQ[urW'}J+mۺH-Kfm]iI9(=G[8jڻ\65KbQN\!Kꔕd;gm[>\鿩6ވŦՒbmti((<z+jѼ~ϱ{fwWq[56Mk8!E8h "a]0hXEUc~%uc9z,:S]3xk!785&S=w[3C([ll")WN1w̶ehiP~kG8h-mh+^/6f(E'9 VmWe{-)ݧgaOfpddk <+<|q+y9pu=Cw~'%ǹY#7#zmY3SF,2UA);6>qqKY蒘՘diZ1W'ʜbi[I 'Zc'ԒwiR~(](Aޑqf-,k]r¼rlpj[{W6Klk@˴j.]$Jw>id8w2}'6Ib|N2VrhKCL:J*4yaMkhq7Y5}Wܒi0+HErw5ےN[߯|V"r%RH"mUNp/)45Ms_ L k0lw "[uu|y^M4aZnE]`Ma{G)JM.?1 {_MԃF/[YrF~K62/Ǐ*dz>:P?}vSڿ*-7i(^Oj@DvCow/^+x#|#˶I}'7˞gY.o]nf]`^w훞Ol^WwJOIVaĬٔ~Ekyv zQڣQs&uUjIJ}׹dpZ^UIH撺Pd[lZCaKEN.zwV28[ӝeeVlhrl۫j뤫~vw~+yEqg0UC79l>er-;8·#ڴf,;3;U7NC8;'e´ unQ{TY%s\Ӌڣ,0 괗(({Y3,+rT뭭՚mg1#.~Gc}<ЌH2#!*9ѹ/N".A:UdؾK1&S09 ײ1p9rlf. }^\tIcuk\s;P\} ѬfܼwAF?Ͳz_'EH]s쮉]#7oBf fdЋE#ڋ3ŶR[dW<ذ_d${Nu&QПB[A%{.)[Du)5$SK[e]_U*s3˺){m۪%Rkeۙ*S۫b_^or]_h_m c&U>rW6C~t;UoϜ /{ZWPeArb_*z(wM ?7@n,Ccg鴌{ pn2>Z7F &O2K>Kh Zk^/7Gdw[$-3hw(d03i5]Ūqs6g_Oawu\>QyrnBsxKdv6|]mxUJی|c4 +{ZV;wRcJ7yp^2& \;_~U<5m)vzV<='P-Jb.i{ kM5azJůMa RV[%%\oMF _vR}? &WS]% f |UZqI(8 <{gCI,IQv@.;Hj/!ng=A*g X\ dC]YǬUi$}"!<:#8Z=Ӗw_>JnR,>I3Fr#yIKFSǝŴQ_J5fr HickSles=YvOcƸ^dY4Ґ:ҙ|u~'ZH=Bd)!gH1p_V2 H Ccw4/|}З>Z:tܔk?<̱Bx նXCɽo[Eڲ]t}(+SWrS92/d=յۮۺJZ_enNK.)P*zs3$ϰ|zNo_]=PEkM2bԕ%*R)J˫KJօwM+jA^sx2hukJouijZ7*եKiKN"3zf"~/\d(ɰZ-bO$+jnNRۓR[kZVAn'2r,B} AePRdY"g#FH3tv.,QDmY0uXNֹt 1WIɓ"[ycW9܊Q5듻R>|ٙNN8JA,b䝴F˜R,pqkTkJ^Wu~WNd-%{2GV&vrQ)N]mkC6nkLxe<ϝƮ邪$$bE6ȻYޥm1CM1y+tdUHGH2b=brG)(W uӽ%lK.TGeIT=3r~@,[i3ns5drkJܲc ۔ftrηjս R9dK]sI6.[eimlVR۪Rҕi_p2n MuV5|嶣鹶9{n|DVOb.g8S;<6&6<ԖLWQg& "53}m4Gd^.]ObA 1B}|Qj#.6onzuܐ/yGۻ.f1MߪsQ/D6׭9 `JƷym|ڤڷQ[Ul.[#COFɩd;- ḐUE3v^uU #4?]=k|$u0OXk<&cIk)푺Gbv)M`:Qh^omhm7qIj-  ZYjwYjvrn}ګ.*JUgguZc^qBB\UxHK`a;V*,qsf6-sq )Fz+.uu\\xM&4bKوYRj̲)rRLsF"^"bM'YĺoI=Z8cfg1]rTU nV~ȇP.\FAf荒/t>GIEcI&B:ӃXaNGɍ7k7gv0{㐄ϰ}]БbţHEmej]6Wx^#WF<$IN /㗋l&v4vWcxfs9f}  #-bصyyvTcU+wr#5y3{l̑rSQs^jQKHy4{WY;NHFl :+x!6fk 91F#"rqPn-q&ɳ+ZQTmI4T'قqq7 ,i,/'~E:Qجn-nU)d圝 q_?yqM}LVS)qkHX&[dDL2iI9'w jux-'_,5wG(k a%WO*T2j՜8M'7\0jkno=ocAAc0?`1hhYdɺ-o֦VYOU=4NG$v'^z"x12Ǫ1α]Wi͌%FAl"w޲]U>N]=ZOA##y텉Y-?;yŰ}Ue0'WiR[%ʼLw3H0}An|9ӰU%q <'u#҈ͭ3heq7QZkw skLm7rDq|}yى{< g!$=Q;Qa4S›ƽ`Xf.:A"fozܼLtFq2^Ey'"vR XdĜxJ7titI[,R˭3}'9Snll ͹KِeI+rɌ/nR9a:ɫV[xpk3}ӞZZVϳ4lK|/gªlsg!57,Z6ьŐNKs`:ߕ|%ԻkNff69 ^],ݩ dEOCHdiݕȖE}pXN25qǡ`2W Ι1jẔI} Ttf> N9τ\'̮L6?c3`m#l,>v^EdqHx>vM; 'InglMN}q;eL]6ϳ 5CsC+x3A} 8V.*2O_#Kq<0[ȧ\N|sTs-}kv~!^Wʳn ꬓ57% &QXjקGTSm^'fic*,r}a+ŮY\5:ՖyAwRXsGM;E5 W>t,֭8C;;:W;қ+X\Fb7Q01s_ r R (Ʊ`94e |6웷.9tY\F3K%F3\vŕVCIJ0|_XrSOeFdlU2 <f[JX6ZWٮV'00-ce'/ǡlk`"JMOX}vfؑcwI?|єtnSxe 8ٔ[sf6 Y'Z\D'\Δ'7gY~>vÝK}i=5dYӜA%|5ɬ^m芿 Kzr#N..s|hjřS|vtu}˺ų,rVr'ٳqf-#Z(窢җ[?cdpc<Ү٬6Ka {EILkmͯ Jb9Z1 IŽ6%d?>o]U&?Y+Kl;#QY.aW0]o̥5ɝ`vuYd>+*Hȧ Hk'I8[t0; Q&gv&%ʰ-y3#\)uHC=g Q[ղ륄|+Ys;靉b"OŔI(骲%V[E .$i1C_,t>&I#=6:*1rCdFH`[5̏e6sOFz?UZot\*쪲x/i{?I^#Aҗ9nWrBK68g#u)Ol( yer ̺b![OM̼f37!Y\SvjJ#UimߠFߐO':!Nge͝ٻL=^~ Q>KprW_\~'~Ȳ"7"FInT^/1lk7dv4JZKc^l$yκ_.j*Hx\ec"3ldRU4@}З>ZNv>ǍAO,SWrS92ee8v]5c%'%&6.5W.ݹVlM4춽_[SNԾ.G=kh$pII7xM5.-ywj+J*qK.EZ\.Onχ{7?Ĉ/{v|8ٹ$A`K"۳" ݟ>n_qsH|ǷgÏD 9;9 #?0B\8n&ӗKeC:֢ZYv/ݭKwn[p]̓UnW_+ᮝ)ᯎ];[mŐQ5JXC !xH5G4ku#7(bՕ_cg3;yXske ?zlwDZ8c6iGB[H8x)A\Lj GF߭IF袝=VYmr'muRZenKֽRo``0WZYˑu }CK-'ct%X9FE=GMHr0HvAꏖ)=N1y'Z}ݨ [UKOW]8 ˯u1lO !m?VvPjE ùzNܓ:OwL;6ߐ˴ IID()KѕFX8*Jijj4l RVҍ6dٻ6mhѢ 6jղIٳd$A+lIJSI$4Ӷ,ҔUO1Cݗ#я-?~6k S}Z>:m1nU71Cݗ#я-?~6k otOC,e+ȭ#-\r95_E-w?c`X9Xv/gU^5I4lkxLGE2kb fͪ lպI)meYJ[m(y@+i6["kaKi\붭edx$ ZWz[lNc]sY>43ܓ/SUcWa}L"Uŕwsn&NWiJzJV}֔짽B7u&Vm+[iJRmkZJR־P<{t^٭xӶ#xƽ]:(o2rfˮ7mmqTw{YǛEHXYYur)8EVYE]5U;Q%mYwge{.^S^-C4kT#*b5.hɂ+)jeŵ몋Tl,Ӱv3qme%+^MqbO2x<{(ğS狷uȡ ]Wlnz*mDzBw/K-R˭/ۭۭ=UVi+B$68+IX.ancX">=+EU]0fUV2v&;I&I M$S$biK,Rk@?@r:$aȩHbjܕK|MrN;lN\bWmԩD_cȮFn31_kL%f;v >E%.ƶb,I x]>,}r_#UЫ-G$G (Jm#&l& //v,^h,KWEK/{#UTr8eј#m\5zͺ0nl]Zfg(`HRx"Vٽ0% 5xȞBn2)H<6g-:F=hFHft[c#reTUQ6ܼQv~fS4lK? =uĎk)Tm8K5f$[#Md'.Rۃr^;Gj22^KY-dxݓ4E{Ae9hg+нJS[OkfOv5,>]aXBnAr6kc+KYe7gvc//iݤ2zK_%7W.l²r8aozfTVǖͥe1SjXBv3uƣޑCu;+$048N^2?y7C8tk'^ $T`I(9t/tDy %pQ5^v\tBWuutBJ,u_5:?WQ ;'aaud3kf1Ȼm,>]b2кA6n%u'닲Y.}iMK5%|%3Sy*P쌅ħvXf!hmi>A)sV]1'|uWw{WIl7Nm41zje&ۮ؅]Dsoq;:5I+!0~JU%n45a->J_g.nY :f78=D_tf-2w Ռtŵl8bW~ɽȧc:.KjHP )f6Nr"YD:63_9mdS9kXHD$+(l^kk[~x7sH-wk̃doһ%xo%۔oId"UXBZG>(`_[[3~^oZt6V3q/QIjl(nrNRJ=Dhq8g ۟qq1zcmqJH+VKQ]YJem]]ݭNКoeuCC*O"64ӼbPg6Zדp&oAkMKK^bOh Sa~kLfq g&37f>BL%rSrg7G5n뤡z'Hp9-fߎ('٬؆sǬh1kxVDdҒ,v4HSq%"kʺM2^"D{h|k;܇!ja&252NTVNu(}dނ{Lsdc\ 7%p,:V[J`o3ִkK5vs܊"AsJ'8z0@$W[_rS{qyfZ!p u1pk`g2u7lضmu3q6fYR.,sZ+c;O]eΉ9$2[ǾRgkUE*V0[LZ)HMóB];C3=mYNX}n8(^4bε[199Tݥz,bpZVkXֵmkZFk_]kZZ=>=A$p>Bq]fņEy\W\gVbGr-dXEΫޢA_Fyb[X[6lɳvl۠ѣDlիdAf'jH7nVؒ("IjimYm-)O?K.$?pNmjbQ1>^gH>zPͽN_$bC])wهp[fX7xҮSmfnMf|nsθ6>Z; .$ӹ bXɉ (n's.s#"#J: %$ʛ~ܷMz޶ K\ٵ!mBăkCXFNʶV\SWd>%"ؒQ0udK5TU/]ܫ|Dl?"Kv+`2ɱ1s;r&R3o#-sEڭVMZhJR@0)P_}{0:o~꯫ZދP)L_5rK4#K6^' ^/J=3 /I|OevN睞xO|0|}\af*›Nt$a4J[mTu#e+ګ[Ծ.y8w3>M !yL0/%zK^G賞xUo{~Z\7y5/=l ϖ+kl^SB1E [ѣHVws/vS/1 lm,IѐV|RuE.;- V߲>+7ܓO{+jDcSnj^֖$&{^!wRNznrk7ar;;ejVNZ. ^1U5[%50C*j)1St;M76JZ 1(0̩͓kkKVru.Q׎TU.9]UokMRW_4W}^諭:4?4rn(2=lOS!s|bm:Vbbn"Q$ݱA}^A$~LK9I?)8ϴl1z²/7ҘG_(oOj`o#{$w_<_V蜛JzeRXԇޏzS~O0|w<ȼOWO`R}Io6xV Wq;yd7ygyxO厼?~_wߏ.Yr8:jTf ܦ64R7ɵzxkuAKKiZӺa؉}Q>_TLG?1U6x~s{[ߏ|ƹG]쬧AricVʱA%j$MBnUvYDV.UhjSV'vEn1DbNr#6k BQʸ^ۯM5An/D6pq_/x׍h<o$18XyVr!\,ƭf$L$k^\gM|eC̮S<ư1gn>F죜Yw&wx.ez^8f\ψZӗZ/{-9l'(ml'([sV3}G% ,AF|͋֡t8[6޻i%2L43.V%{fmѶVvڭYA( ,һƷl5-įt} Ț;chih&Aֹi)G2ȧ+(K&S2~(;OGp?jc"-x01x S.+hQԱX^D֧7v{QiO1ǼG}nn{U9BNgOB̗e} ä#3T/yDI ?L='OɻOz.*s1+Tnla:_Lr##ܩ۬~c)eY1Z?zEx6R5j&ymo{oWp/Qyя&#-zC=yΈU/Ob|vl|_sMa8kN*AqO6m68O;G"ɲ)"SZ)f~y.,lWyP천vOZd3HboY'חReQ.1ģU#rWg.Fr'w/9FUӏ`{(UImRA'W=!_6]t.zJ6JJbGCtV1xlqpnHv:YEF)6)EU]k]Wqu\GŧYd36Oͯ_ueQ{^(9$`WRiWJŃvD&f_MM:7^e}Q|ќ8G(!<釤7s)/Ew|@6-ϋq꼝{>!˿[X-+[~-h-m)Z֐oӷzϓpmo""ɱ כ*ǟ,B*P4_}(9U7N$F|5FɤUg]5$6GLh ^*,rUFĢ pc!;ÊB6nOқG#We"9 8v]%OfEv%Iì"FTY %|=u*U&Ya2/&uG,A8Jڝ'+խi[Ce1+L\B}Ru,aeeRBv!|Bҍ6~TGY^l+dc^ÿ#7D#]%PpV؄c.nR˛?h0ϙ2y% l#ڸ|-IVm×+}ibhwVe]uiJTo 8m sƫ"lo$.VfYdy=͚dQ.3yI7O y7(Htm n}B6VWN~VOA'OylS(FZr6n+m|5z]N='&V.w X'i Y:/祧oumwwޞZ;\+[N꽣 Y^rԕ 5NHR.VlUSvOv훀6'3/4vNZmnڪY,FEdDNR˭˫miZ>'Tq}Xl>^Kk qAy|xH\Pĵ:yZ&_r ӻ =VXoeaJdx-vOY5p֩V <խ{4`׻J+)n~k&$s|%Zڬ 'Kյ8pntEm7lv _H䐊K_lŬ]}ɶ¦+uֈm-SUG]G,6{ޱo2dt?A[*vHǤk,4|n Rᄎs9;Eqyeiۓ]fd9Ils-[,q/lF6^e' KCJhIƘٽ#}[eTc,V'ssw;{{;vvvߧ>{hm;k^Qc4CMEc y+77 .&5]O*F[ZڪޭVSkVjҔkZ&mkZf"DDDL.R}<%dOu>Oz@):ly[X6nB]&7hʹOcg$p+Uhޒ;u"]toz O:ڙp.s)j7DhhYIX*[nE:+}.C$sn1}0M鷤6ho5kjm֥tT{k}'8؛Dgժ7&E/fY܁ceg+JӵFm˩N<:p&mīu3WU9a<7|ź/;}ӷƳi^Ϸ}gp=h8_+C!1)U'1+\w;{)ڢ8ܮB攧_Ns+c1z|[ٳG>T%k&qiyh\N״K:gO,geod;3̐~JW]ݥִF],ȬWڢJ5SR,ouRVizEeEPUDU&R+m[Z^ZҾ=/FMTW*l7]yˊ$u]c2vǝ(]=t4տþ״}?O>sxsi1O)3}Nў4.f4z_b=vq%Y})ZV>s+}>12KG\,]O  ʱڼ(e$^Ar+8e$ܶ}v50ƤY?A;ԶV܍\ZKGAtUS\31GgLyt?'x鮳龭9=%+ͣ vύۖ+1_|*eeom?iNֵ?ֵ8w8哞 c3kk)U]Q:^,v"7ZfBVF1ii(UZ&mi"?^|-Ehu[Ǥh[6>Yⴥ|9{LS:E%Zϼ2'r]-o;F)tm}( HOdn|Kj6 cB6&5%oB:9jTV]ۗj7S Elv8+}'=+nc.A|oN=/4ͮLvoKL^fb/M-m80_+X% tex!)e&վCȚڝѬ*'epd[E)%긯4V-[DZ'bc6Vvߪϣ04/.;5&&>h^=B5o/1X,#yFK]{zLYӐ(U[$j $X$$$YZVogO e*0,s%KE9oVꦲJ[oorR,U ]WfuCӯ\<͑sbLPUcv .I]ullJj&V AjR:jL|?|{fc?~},DZoŧ c7V+\uZGŭL4ǖZv8x/Em{i~iJA܀ҴI:o{ooe>omSP`fd<ٌaeYeVqTQfɵ.r.B>-x]6jYJK]r ;rz_UqGbU];/+I5^A+ߔs!'mk3o.=ny`M NJ+ٞLWF@:V% ٕY ۹}7˓}mSŴ}{Ow~|ӗ\ݷ{t4ٳ?vf~?Zyj|{OtF9Op z_p#dc;_L޷Uދ&"VHEȳY*(r嵫:zLD1111>ɉ꽦gj0괹r`σ>+M2͊|y1޳hVbbba.*r;侟+wZ5UJ^ə&PNJFj)#:Q+mAT:5)u)WܩMܫ_Jod5FE%Frg K\(mb_r8uQdG/ZWqkX$m-Y+}}sݯv׳OvS5{'Rݟw>}}u:ӦtێIw4늼DWY;qjڙZ1Vg™d ,dvpH][}+جW'إ((2JBw];&h-,IYzevwm_Y hvҸ]Gi)_%Jq1^U8]ZwZ}[~%Bޚҗ1SJhG2u6]smF(WMy2j-?*uعcL2kQkF?]&w)m'/N=,ƌAVښ6RD|"9ef˨{d͟%yd϶ִ@Z-[6C8wN]51c:S|-c3CϩmP&.]lޓuęErRhZkh|q s ˧[\֋d|,%E3Hi `[r,p' 8AEjZw)k{;S]?J,h^=ǽ_pҳMrZ7 <urnt;Akҽ4{mɪe{aW6]ضED&ei;e3+ޣF c몝Xf,R1ayyo)ퟗ=6{iZV.)^s+']Ni [^.Rv%w{*A*Ee9EkujZ/m?e>ձt[OW3C+??r_Mڛ`yR5VmZbxq{8"-L\g }:}4Qԓ"o!MƼ|ʼ?4!/__oKp?ziqje牏)b.Ot7-l:&o./O\rxy,yqmٓ/^xk11s.Y)_WGq3q'f0ߪg yǜS#ɼoO7G_<8福߈ɖ֤yͦ'ʳǶ<:פG]eޏ^ZnՇuy05ةrW6)2LMfk^ n~_R-=as|V/)yοU?6y͞E7Hy>DɐǛhngGZ!Aͫ|zzދWb;[EҜ_˶1 p%ã>\R0Z5MT+ZR57qJvR*,zA+kZ֖޶#m">nZ'!fEzRCV.lreJ}΢9?"gSm/\JLomi9SKhbcP)r)+k!!m)w5Mg[m-?{}v o~~gooiC枺R?+o~jWJ]ڕ﮴JVWJ\zg]N?Ϙ\R:Mxײ-!^=SV믃yF9v=m~k-mULz%r[b9 (om)odsZ5ÖzgWz+m%1co9rd'ޮ ξt.&N. ֻh`j01^&.|VZ9MvuuR,]uթ~Ϟj&H9F3<)3>ٚ -|;*W,Xf)s*kr'}Lؕm)JϞj&H9 (p{K~$9a뺊{Dֳ'QyGvOI}nS\ǖ$ִ62,\flsb$'$q htA;n&uNkmաˠ+"#N!^5m^6Ԭ3Z[55Ϝf"gπz+*$-m1ޯ]rhkJ-*vzԶlaz68/KAVh>'\0V)rY{\{,jmۧ?M~żz4]׽+{ƛY1LoiiVVƕ?޷z{lWZ'OZ$=S|smvo|^~2diJOz0HI)3+uYc.iEcץݺXyJfb%.RҜl^|1?7w-SnݳYqjMF9W. n'5消՘yL >05=Z2 bp6Ϯ& ә)o?wܧW; mZz>di_AsO@_?˩Jݾ߇)6MKkO]i^{~ 6;{i_} J#KT=O{@YWn6f+sT|Dgu+W"5vK-N[9:}U;i_ݶ.WV+O]+Zc(jv[JZ|?'e)Jᓍ':XzJ1l#dVE"n:W%־17f14?gO~|1t zi7c-*~q\x7(y)H _t0{.Q؜<"sԮM sn/BzY3rʷ!⮺Rp-Y9Gf|>,ɲChnZHZGُEo*c>ăz^oܝmw4M~֩mDUJ7Q5k%lDJR]N{|=LXبMFEkŪTE&LVҲ4h",Nme)m֔}׳elo>dt{~3̿AG}%h6=6>Nڽf^-<߶lFVvRnwv{b1(V5~FpS=;{v S)Oz~g{>S~m.=u}FT;io.ޯ/RM2J꯫vzvV6n@cY$C) .cedNS"WR.}R,zMzzwz)g#{We~׿O{=oJdrc[RbԽ-[RMm[Vf-Y@yܧ3/ME޸VnYJw!򋬷Tm%mHKZI^f3 QG_2A5x lIv[e7\+e骝'} yI*f~,ԺwdZKԪQODe_b,i}8N=>ēa3ź蘊f''?[7N:5u;<{LZo3q~Ϗb+ǭ8Md{,ǦE1s ltJUꊗ5qm |7n̔LLsOL{&>/˃%œlV2bKcɎ-K115DL΍|2%Iٓ>xoMg.jw&Uu{Q$ﺝqEw\cpG`\fG&T"Z]u{Vk->^6 }u#D{= :?:YMC=bՍF8:JSvSюDLbŒNO/~EdHђ.!0F"̗mj.ح<)Yb-,c\5bZwRb°ؔ`%mOxiNR;.dr6mkJ6={[;-{KiuR)3qҭhy;/J,њ_oR)_~U>N_ZX Rޥ=ϗO_K?mϻr]{5m|t5zZm}kUcG~-k[Mm7^w*{'s lv+J&;,B5K]Z[ڰZVRҞsO G1xᦋs?ˋedž|;~}ܫ!^Ifj6 WE5^2b6ip's&V_k/%u-m.kNo{, ]ux[LuFR귮/)e{\wSJe=vSjݼ?Vkm 緕fcL!ނ#lr1뷬LcE&4:is4͗5ffb5kٙuG4]>K;qiqc1bi^}G3>s̽LT=k[>^~jCCw>Sߗ"*^={Mݥ[J{oxc~ 1kKiokV񘲥ꧯ2fwiOW_ܧh iOW?u)Nv_otﳽ}{PF}]}ݧguoghT{17t=_iUFR?{hzWk!)w{}[}gS_j6ۻ~֟ 9߭+z-(zӷ=O{ {L?JֿYm}oܧ=ߏ׷}T}o硾nǩoSC=O.~`48}_Y>^|/_mS{|_RYOt[;>짹z4;>kv~ ̚RϬo꩐;;-Oߧ= mgӳN.fƖ߭)onʖ}o޺W=HR?}@۷)OWv־)J~ڧ >s~~~O{~SzRz^+U+v~vȫm+~w%WP1%#ߵ{e=^ tzv{SҴv_@.}tNߗsE>ݴS}3O%}RKOm+)<㭧g}>s$joj~)Nߟ1[}^t ;=_-GS}%=_~}DZ*Sܧ)m)3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb +di_gSdd|iGze}eCdd|iG}3~~F.=3~~Fb =3~~F.=3~~Fb =3~~F.=3~~Fb \<׺رmm=|ڂw]e؝..颕.(w`XWhZC UD_YR~nJuE>')_t``O9OcܖYʼnb6mI4N)[AF1ZXV-Cc#:M{ԼVRozJu-ۓU%-DԶ{ ֔kZR־)4SieY$yVތ=*%i~{mRDlQ;oiMw&x/~'{nHJ ?n'%]J^ An!1jHUZ4ZSQkKJ3mϊUu<2mGǭeo}+ZVײTPoE+NRPN3]]+Tp\cgNXPB&yZzwYzI}x`nwԋITbYųmenm)[m->SZS)N#w "oDl^nպ ~IYbWEW*[N˖Q&6N^(kDu]d?ck5OGW C5T#=[X_r;T۫uVPw"pāx"h̦)Kouխ$׶V[wk^9O;kV93ym^V \)dثo֕Mwnשּׂ3.qr)'[(#uvћe\V_U{kv!!ilVjJu .PRi^nI ^˭Su;/hЎ'\fVk,] KYZVQ}owUtV>RIo[ҾgoNQqt#Fn&q'.DPBVj6%cmjPMʼnm7h:N@oq}nUSR)eom*}nk7Ym+"FQCD-ERDl9^mm;,j_Qtä{7OãɸvvMUZ('z+}imE/[e_U)J7l%z0)t)^w[T㓾[uhlR+Jhtvaql%0"Y\I/붾z[wEݨ5+K/+3ub Ee_$VTkm͚u,U%N?Nfxx7IZOnQ5o_]쾊$^-KaRn/*򶸒^RmnރDۡuim'uGed'C2e7wʯoJ.|D[u;+[kj{;ޓk/ †17#H37 ?wwP/I G$TOf7mmp#Zl$rEPV߲wPR?5RItEtYl5RVTIK.e(캕.V{+Je9 σ7ޫ-`RR̬ڵ-4\խ[J:Ur-zwYEtd7Z&W\mW+N~/?ĕN ԺƫKqܧ[_ڬ]=VX*Vӟ[HlMC/szE]QhR;)U,\)JʹhQ?$0#1,t1c7%Ub)_WcwhN"ҝSMËo?C_HK=M (cB&dMӥzJ^ؚĽ%S˓nMKMŶײ#3 jw߶Ȣ)ep;Cc @ǿǰлy! mtR=ŖYZ}֥m]^wku;lv + >}}MWTQ{nv[e"T$v[[Կ_)6d4_0vSp{{_m}Ҵ/MK+zK%u-Q+nrNSBU1}8KݯQ':8ImԢJv6{Ggw;?vrN-.U[}Ѱޫ}K]oN)F9v5Һަ`2),X4N7l,kZַUR(uWdt,׷tYK+KTNVMdTRr^oDžҪwPk[ /go%m}Vvk_'Nj\%G'j.`8t˶ʲ[hɢ&񔢷Tb5N-:binwiederhier-ntfy-5ad2431/.github/images/screenshot-phone-notification.jpg000066400000000000000000007004321517171047500271320ustar00rootroot00000000000000JFIF(ICC_PROFILEmntrRGB XYZ acsp- desctrXYZdgXYZxbXYZrTRC(gTRC(bTRC(wtptcprtI؏NW&CSٝLg\t> 9suVWsx>Z{fg\bkYwL9^🏼E(q?xb+[jjf+[GVhź>l+ IU#V&*)(rT@NUsԟOF];ՎV(ugEOF#X&67\k)7^_6[iOP/h\ꊖ$&Ld񔣕F5@brW6 ꥷzޑ.ݛ9柜pZYD[U-@!OXqBzu-g$a.]K6Xi,HvzBOٸϠX?h9ՙ$]cTẼfd6]UΡKnM GMͱTGYInR7QA՚Iye[6AHE Ð1b^uI)^mckvFX}c͵"X<.߳}"śkIq7'="l w%6&y6y_lHyFU$F3ncW_c*Z ,sǹA8E?\Nܴ=:ؑ|l'piR**b W]g彆3[#&v+j2#,,-_6tա(jW(m;l EyW6 wb.okYlfe3x#RIuL2*R^t; R'լw9^o L2Sgr_d-KgOn\sèSTfv0r8y[ΫbIt)kB"ؤ*h<3ـ'Cةmukqsj J# EfY^4j740JC)6wkqi}K,f/t ]S4q0KRiJcw=D._-t/rg*(9^bj]X4Þw/'p $tQ*DW8gv Osw?_SG<_ף%?JGD֣}M{9!J+xX ut4nMv2/4{c@\^vUF#[9;Aiqܜ\Sޟ2iݹhsgV'`k ̺iTl쳖бѭ]9%拖<] 2鲬dtFTYݡhίylKb]ăat>wVyo.0A\&~ );kRqOsQ-Ε]8;>3$}j O׺_-j%+ŕǓxI/=>Kz⸶H~LV$i͝LJOh-WMmu7ftg aH: ӗL<}vf< /qJ8s[B 'MY(]LyQhXHK-*nLd-16^„InsU^bVU.܊GV|27n_ctV?nQ5w&4yQVYf_.'lkhyQBr5u,Yֺ1ycʮ`ZtUm,Ēf|3Y۔%T>wn˚uҧ'k֫ױuڭ>TĎY 5nPmP疚IB*E9TLJr)lc8xٲu!Lq[)K\v; ]o6 1yM߱AK3I'~&g6)/35rѪj61WDU{b;6HMM_^I'RwMNYenJY( W+ldL: MNʮfeN~^wV.03yno5ՇNlhi& ؋Lbi;̾;ohD{ʣIu'2|w? 2dF.[Iif&[pDUm &mk-N%M#\ZGD UF*n4n;4~qu-6)k}\'K21,-q%c]݅Cm3lY&hg7{#btw_48*uRz3ɷ6/B|V]6f&NCe!߳uVlma3Qk}Qnh*ooVߧ/[ToJZ1ioQ{%Y5\2Qh;h&lv&@[5vXHK¨caCXؤK7;_t(m"QG3Y:.O,c#Jj 嶉|dQ-nVѤɣьF liF32U,e‰&m21,/ _9v!˦,Tn$QH)wcһ7h N.>ߛ. xFl3!mv6P+%ᔆϵ)H$"z u=D^Զ^B)vnlZlĘHBVSc,ՙ]2~Rc{譵]л֑/6ޯ^wNa_J.\]|tLa"=|^%׭]+E+=HK .8]lN3FqZhw 4\.ѐl1Quvw16PA+`zZ7oy!ײQOPcs"ixy1ݷM̼%n^ &\Ѯ 뼻]='OoD,In=\,UgÛ@6ŕӬ3Qp~VnWѱ[edreTvLqcN]7+\ngPbc/YKܗ**=n{1[Gn|\?35RM\W'jUb" BIg%Ib}Je,B.sD&k~Sq~F=ʃ&E 7K718 R6|gns P+'SnbF~vUҳ eٝ~Z}9 9jw1.fC'JSU;;6wDݻM*.{dܶf= ;jv]))y${gҲNnE:Q[D;zRzYcK"Rn21R1h9fDUf)Ɍ"7xC#<0fr. 6]zchv Q* |^~ r/ucٔt.6Mڟ/iPc--jqn_BQg]d)[[T}f~61vms:6=ܺ TkEw}.r܎Ez2_vKܗ;\Zc:Kk@BϕND^S|$ٶEv{1ݨn pHi~drڏ9U SH^XgjXR4-/#)4ʾ7 ۼ iuU ۯr,eMvvɦ֥"AFW+D$4|$;[9iz gޣԃBh7IN%bUha[pSU9L>;S~ʹxʪrUYCs<$8s;܇nOh=haDՕ}]VxgI%$EQ4!sczϣ &רc˱AQ;+"Le#IF>C9nn0`[o$8KmŎ]6][9,UC_է.V3)_1{D˜6hpcEmuh%jڱmUSKd^)Oqivc$]1ERg!MW޸<ALϏT}:{-& ~_ZdUi)BD6N?k579`ATzdQ6qťͷ8OP>)}y*AB$[%FR]d zpRb=5'Ț>QI2d "2d625f"̓ #v4nD۵hպiٲ D!HRržUߠ:|uVn 3mHJʎK!IǙʋ/BzO D|+(g@7lNV>SJ׼8Kj]r_18P呝Z1j 4^ZGGU[[7w7:~Y %X=dJ2I1 xOZ8"4tErtEtT:J1'_d++v#ZnbwNċgWJU0,5\(U3X~MGpmO5lO,~ O,~7~P ?wr;}OSqAs>q^ǧ|65Z"uT| |㻣Qʔ&pG(CJ&U"(c(S>9.~ {ӫ1VV1&\4cc2H16R!Kc.1cGg/d-dUK1dkJH>aq16br9hQ!;Nԩ1T13Ƴuکxmnr&Z>z1SԎ\81lRq83'k|{}Ob?1}?]~?(wsc;޻}q3P{9`L?\3>?W4s1GXc>{ӽX}?.?{s`}}}OSsCWm<2\Ϝ~8cy?ZTvZ) .quDv*14Dž%&FqrsYMN hKs Էy4[9gR؛fQ ޯ966Ư ݛsC&pd#D?e+&ѼlkG0x4zUlMv[+r(C٧+[ sBS+\"AE.bRx.YZFE)Mu`qf8fqen3h G-?飳aeJhI$Y'^U%ܜۮ[ܐ ܐ.stQkbrBeC7|SqdZUL1.3c9z)Υv͖VngRHxgE P*Pe3;43;434{ 7{ 7 ^=0xM.w&cu$וgEY\ǢsvS*9p\/m6Ւhӫ ZwX6KRZ1o`{Mّ璇i̮)HR!!`G*}s,c y12]/?f R:jEzJ5cf] |=ʨ*tٞgv 1gێkpm6srM^׹o/+a-ˇo "rC3rŔhXY)TU~E'1_ߎS|3뽡 n:&.[k![ʻN˖+.fٹo1+WnmJdp7s>1^SsFY??yh7|@}OU-=_ɷr;O̓ǟG'/P ?#/Te13|T{?xg;/>l#ΰѝS-'X6=>wu%rGPmcObb$4BV%W^=G)u} gxVa0 C8>mzyswLw܆<$~-2n29cnNοN5;VZT%ȍ1VhQ{(ǷtLM\@uAOUe"_]ls壗p50df0DQڋ_@n4:Ėn{ 5 ?'l>G<ٯvh5bmU]6= g:ooi'ڏeW5]^i[P%6UB_ud֣&# MԴ#+9Q[RRT7fw}9uz{k$ZWu`˴;LdN;G6*^ܔu:ffV'mY=buj?b-3:zyj9)%rѬMdޤX U+S̋ifԌ:mjSrB9s+.ӺNR2_c_N8h*>pd\+] z\cC6e#lEY1!ӳF̢kbbRbWNW*j^n=LιOԚY5 [rvmKQR-)$#/+sNk+/?_I7Z2JueYWH'W4VUrIh\#]ϿjE^IsG3 R49 AMvϜ`5cn_VHmK[9y=$ljI\5ƦFJ;a3d=.Z9'2v(t=HwFۄ{_Ё5bhe!4Kti i!hX caL8Y@,!5oqoyZޞַ=,rlzƷ1y*DXLA"E \$71)ːܕְokU +2X(y9톸8Q" hQMQ"f Z*mEKm."WiEp5ӰWH*QJE_\D|أ#\޶}VQ˖ghqSwzqyfXk D%3'#rƻ>rEΒ,ck fjke)p}SV^%y`n\8|WE ͮkwYYyy{r+|]ϫOJɫC@i1;" L N=Gz -yܚWmpi ȫ ]HD,UFe >qCf9G>rW#tc-Geٿ7ҳ![:Tm%/FBf Qa._E5*Ǐ[c|1V>V̝޻TD-K$Jvi "I0 iJE&{cw(I#WkܫZ[lQzfX[ z~ =2 :Q`WY" cך/uaʗ3!+rϜgn2nH2(;]UT>yJn󚗚 crٴ5ݿnqa. ˇ:O׫6)6IdUۧ:]ӬFzХzqmnOk54numT¢[.Ս~F]L6Sba$ 5#v.]3ς2{֚܌ڳ^<{pReqXhĴ~WhkJ:VdbY&Uvn߶<r0}y_VAz_s2N,8HVzs&(9|ӵP8]UNct=l}}Gh])mIrz:j'QVm ƫ- EBg ^q[FM29HTOu Ni@&EZ奪?%X7֏NCYfB17:nY:37KmMs )M:%pNsי3}%:/6\R0猙"(;:np)ӜȦ3pa+>vW˟nic?8?Կ^}K6}YngKue2h©TH4#:OoMu)&bOceӐJ(UuHYTJ\uZ٭3 (C&HպK>a-.*o$>\[㛹z].gUyٱ~GQ$4D!¹\N5B'dN4bv6 $7,U4$7xEm$ѓ-9}VG_p%hWmm'umj ƞˢ*+puNjcSW=U6*,hoa n׌|k@.,t.KFp`߽-VpBՊI3CݷO 9C]!ʟi[/%$kTIVtX7<2̹%d\2nYb~푐< 1뾒-5şc:O=itr R ; ltQ)]ȢʇnCc 8 uO,9[/ّĽ'`@qՉc(EE]YYͷ|牦0gM^pKenM.כuGm݋Oӷv,Vݵ(Wq!{o3)jSo!lo`XN%sݣ_s1scZzh]W 5>!uvYiR]q,vg*,sCWT^EreR:^;-sqjl[KG^Cjv1:{lCK&%l㦶=|AԢd'ѵz]:Y<;Smٲx6SOQC; &@ʓ[{ȬfW%Ɇ2*xRce3vps 1]uWKkdXӐSo6"5kDneǽDMTttxw698mMim{"nɩZjp!avY4jo?tLK8[g}!Yz OS~6Whh=i\ګsr1kTbD̥ƮQfѡ^GQ&yzN$KZeBM޷k@-楼Mֶ?a킩$cX(x{3 RpZ{"DWJ hFvɼe!K<%J88۶3pH0u[=*:lqpYnۋV8DoՔnԆɓiZg LgiѲlME*~/6#perƷu >ٛmmMyӗR-Wjو=VUxy+J=V/qk`g (0rT#|9?s1*ŔFՅ >Ѱ,lۖ$KwSY;tu|dL3E4;lD[K7(һgxYZ+vOk%־I_,cdP}m4K2B[6l\avB6AF;|Nw>SɤcB11{[cMVHwȕ$/ >7? w"&o b73Pq8>vDv0J6-6q$4H2c|'x׽6&+GVga]"BGۃ\ fvx)f`"d#{{orz]ls*_칓"V4IbUL|۴f@><=]GuO׮4WD)t2x}Q7\(S5ZˤiNK&m']1ee []*ܕOKte7S.SʍMs \A/n<>~>'n>폧p_(~1z}k~(Gp_5d~qV:)ʱ\: i[cKZCq'e7쉔AI.ֵi_r'nfމwahf7"DdhL[+hňnwE4fm^9rGC@G}CE#IzQ8'dzk5>q40fK+Z0 {7tCEd{N$ˌdW5̩8qds7@2L|G(e/SrS >FV~]J`>5aWuKdT{K=b''^T*ZO V _/u{iuLt˩ӲEl]$݂BUK16qk+%&w7ZNeWpE:u!TO7(؎߃|R=ɜG~|* Xr2jwsB*F%+ۿ7Z#N=kuN'YԚ۲,1ڇt8 Ng \zҎ&'LrjS n{WF<m?aVa1R*RZr546QSGJEJGQ`YFGMl_v^3tNIDLƷ '7SZ:ll;'Y]duD 5b9j[^F3UMԋ&v܊5{DNN;wu+ܣ1b<+d˴[sfu91^Ƅ?I=@C!&)l`1Mg0bpb383g:R[2(f]JZS em4U6MޙǴpNf_cת6釪Z-:^HRe:Ci'fƺy[EL5m T]vDIe]H>B'V{ΪծUitȍKnXdNPde&Z序+ #SYpY{'\^)sjS]l{;EN)zJJ"Z9YnH0r=IRٍyÍk.05lHu/.jdۑĕUS6H 2k YG2 gd>?U{[SjmA>ٔvz,z-j}֣a6YqfJ8Q dWI^]/dGm}ٍk>-ܜɱq1 Iu=*2 D wgm2֫6;igXFꑯ)+Jd( 6Rx;c$Y`5??RCKCU;&|!_Aޘ6,Fi K[{{lH/9D 듮hsŷ:LB]$Syse)͹U|e{3w>{~( HEuBLE7L8ڴ#_e:р 7JS`]1mV|1fvKIף\9 d+,8XNQ52 ee$ܴӍA85n ?VΝZ=,9ք;+TZRj36:ŕ~ yj~46Kxj C3H%|t6陻5 aōW8cXٚN51" E*a'L7lʅcmiضN 4(ĬtԵ洵UÝJDzj})!@A+vkpT1v3#I/UJGT#-˜Y67V\з vm,glVC*rS1HLxO{h9TkRv٬[5cQբSw X$쯡2sn64ӷ*޻kt05wRaSVBZC) chYiiݥs^K@p=?oΊ.7U\^F\8ٲWJGmPEgXUߴze>iXaHK+b2֒\v: M&V{z/=s8l1jл>;7k^udŦ6aT׎q)YY_jE e`Ru܂J3l _c?v è궾*lܚ ﱢlCacmǣIflEOl}%HR* N2lB"3sP 6gp"7e{+Zڻ!lI5˽2ʸaK9]EHŃd9MKcMKVmcY+6QQS2H6no&P[50;ʽ1܅F a7Vƹ8VVj٭,hǻ5eM'h\{mGDFiILwYXݝXĩG_p%hzqũHgrV|:L2!&jY"+lZnU!$ܶdQL侥@^d 5AV-7xߙUDj3Gʰw/%۽b+"'L/i9ZdVe䦥їK1+fd"^FjFƤdzH1.Ed y˫u2ښuC'_Z[SڤbcYrqMu$f v f7Tjt;~TnYYr[]%Wif`IF'-Lyk]#Ӆ*3jOdhʛQPmMwRIՆ?3٨`F)$&9`)cg8$zpm3W.;qs\ا/)7ưrs>:ZlW1u:j5\ۿ,$G\(IK4k붭׼SqZ˫ù mMEIl54V*.#~eJعm:,|{'Br>3GUw-\̫QiMHN׫*ò__?`ki|.+hw*(@.]sTt&sn>4hK&Ak-_U3Iø 妬L9J=/lU"K z{uznF[:y 6ȵ2Y;5n䎦H\Kݪb.Cmg| NyNKEEDH:j#S!tKp樗= N };!q`AjnE-i#+:ujbN)nMAXg Qr ͺ&"SeBMtp ƋvΠ?^~[/0+0ouv38 %o1&<}u^|2܍TH|m]w2?xyhk#I!ԇpZ }yQ; d,\-p5!_zus|0ⴢr^?;e&'6sqLF]2Ѳ#d*)prleQ͑Ay|Q)'dd]8}! ޾zctQw.8pYeu9c!TU^'cYl(O8|es16ܲ<|r<ˌ;:ʝ~ݏLZskgq~ /6ji]Wo\ Ok,=*1 i|܊II Z->zZs=z#뻷mZk9OGγlhBCHUK>a$I5;133i|||7<;^|ӽX =??[ooGr{}\̓{;sC~(df<s8qgp_7 ͞y>ŜWOlzWK-Ղ[t7.jسЭQIXN4;lыyIjō&4bČl$ k(xL2,ccnɢFYU2mLQCd6sa$d§)HupBC6HCRKɍc{`38|~ dq`; "~dSS{!0ouR.1SEcE79l&1Lls~.7tL&\E"P3>DO; CFpl5lݶaSGKvv糷#(놻 MZuj/X5dUtL(S:! |.1BCO@4UCO@4UCO@4UU4Jn56dUbyz]3%Β3ne@ʹECC2gm9vV~婵utAy==, MVJV)n0 c$'_ O檉^ewQ5КY9ITm5Q3`騚r1\61g2.;M:]upbdM$jH=cUlyFL\aӜ.ѳWW)T@BQmhywmUHF8ĭȣUI}6sEXPvvQS,Y%F<H_7`1یfsčk,~ c\}f~s1u~v?oy|?;X?W_N9GM(lol{\wTN/qQi*ԝmeDVOޓǃ'Xuc*.Y:r}$Rp^~[>\5^04-a~4Tbw;#%n 0NvwgWɽ'pw=Y/-\urRfv89&=?KϘ-ڎfNsכS/X{zk-ͩ̓Kx;ܤy[dž4`g7dѹ2NIdqe1Hq){svŔkJ !e}t(ڠ*K`鿰 rg;3gim7ƓٛS-W;\Rݿs0)q4iN! ] >l_b_xZno<{hO{zl[ׂ `~[rd˒<-}]>/0ϏcsmjcdTIJF#Ī%lL^{\Wg{;{c:׭d way;5iZg`fv+_z˴o#y)iik83gb&}8L^ Y9H$[ >F=/Xf27mwM"r*(tL:g1M-*յ-j^ihڶZMmYڷoKEhV՘m[Gf 93Sеf3Z{0VM=^溗z{y_{'8<731[[L&Wӎ5fq<9h^=!maO>"rl_:ͭ1ZVm洤Zֈ!:mJϡ@հy9io$y]<=Ǒ*&4bPɖ!6)pݻ&M"$2iV󜜭ji\dC!% \b:?{x0/jC7wmh]763O;\fÊ՘F/m9t)~+g=Yy 4Lz ķղKUD.;TTK9*v%B T͏6Jr NL? gGEpʎ8.sQ\0,>s8;q7i59o1oyi18>#Q^cq~Tqc(5j9f1g)͌vv>l 浾4uTЧn]Sl]\#Zؕ U6sٌ&\ã9ϛ.3u+]kC0lxe;k [1؉RU6?x9l>͓Kj?]q B<\rR1|^mV]?#J"n/(';^6y\dfښj1"Y:?{Ә3nt/Dkt;ͱhrYq?&}9gSD}^w6-N9jY m17t1b)~k_7ɗb|m`>= b9 ͱӤqkt?zk Wk߿A$r3q G\Mr{|/P< [g+C{Zs6@RmdǛ.{ NO׌?dXe]g?&{{볷c9W>og]3D(rTqM`qM#\"ʂΜP21͟6LlM~@^R?bZ?ao?#8qg3? >ȸp {{RP{~y^ѥIqGi͜)NϴxǟrS>8cHw$)ÌrlD"k0^U; /gʈ+5$E'qO(`O'.\tIgཝ?It_Vu1:z6-+mKRc.\H*{3uW7p\f)#Lɓ0k㙜{7ǭ6OZa#cF xvM*8tt6A6dz6x&<[W͠ug/ByrL}Ulsj|]9eMy̓Ok#IO񦴩бFWO9ˆ R6.q6plc?csuJW'8&ѭ,cg.meP6{qٌ=?c W's>9i|2^#~3}rox:5|>}_}OH+-r%r\a vyɱ{Mg%?>1qX(U禫r)(E 862۹K81Jldόg>3CUӯ62XVG)%c͝e^P{. v7W)z9G]H׏xͮؼGaurʖ]33c۳3cսt-r Ϗ{[c_Ŋ>v6L>`!Cn8Vn SnI23Y 8bXBɋ4q %|N2EccܢnS*͝v7t'".ITSslsaݯ#뾘{k$v/\s|o)|o#k-MbUWp/t}<7H1=+dSخ#k_<(%f&q,R8*E%} x.߄.>3`Q-TJ7'Ģ«gԉ+| .^e]7O8pɓ6q sW)7qO1ြ~3ߩhv9 ԖI_5Ȳ{3>3/ DfMqޞ+ngU\gosg*6%$ŕ1T961$9ZIVd3`9M 8 ~Ȏ{3?WS/hDy}QyzE5|Ez6- Mr14mMOr^Y'oc9s1l1nrl9s9{sߗc~u|6a"{l}+N)?ȨvVd6O3"rqzٖԓ˺M!)yK +f"e;Gh*2U|2)ƹ'~S.#mHd)2+V*''6;cdS&^?o"f~]3 =].^wϏs+M[[\&k>=UVbg.<_'\v/`9-\׌6vq. :dj _Jqla^oqsycgζd[՜zZߗ˳|9>v=Il|v ڙ2S0+pLܚOc؋V=z1_>rgtzL]d*F3rLEg9yYA\+D vGNDΡ~*SM,0;8{;G 6y-\;[x/Ջc[b0D'Ţ--19NK83\{uvSr`jexǚc=lg-})~/莸̓_ai_[07[aS5-. 5dϭ dplש6dFkC`㺯kophD$|2_ݫ e;Ţ_ LWPH~u\1;=hnW Qe:߬Dd芵S !hɃh'nY;=$b~~eҏ$$*.ӅsaL*H"DA4I4~^V`p{uvc_${g4ϫkf|{;_S. a˰?iOistGCqVy>JDZ3b[5 վϳ5܃ kZ$g|V`WUx  2G2dGG1OpVZ(EɓU>)Ab(!2'hi^TW#Xe#X,mR" jwgo(بVf\炣)s}>p7⺯>S_JO>sh>"vt%[<^Kf?ыf6p}Y%{Kr=%_ fhς' _N#^M{fP\L,+|M ꯥ*0[a82N0-ogzLB,YHJӥTxh\9`GNLuWN\'kb'lkg.<|^rs+=9я$ڿM ;c.LS!b1M61g~< npk?WcKOX&2.9{rBTLҫt۠ff" qpQ&eMȨƪ|S&4Ag.WPMR:6 \iwԫݗW74j+;TerVNl:DڛLO=f {VJӤK2׃ϾϽ>u\zEDݯO; $|yyPVL]]&&;c%"ޛV"kSsm޶O0fxG=Qjs1npܾ74;}Uώ}Xszb8lS<زRfA2rQr[2ZwÙwIWd0[E2o)aE`dYlt\wGh\FJ/E=x=:MrDbY#B#0deH5UL#P{1psfɹn޷^+Z[,K\tË-oL{82Vsy߉嫯u\)jڔc1V2^қ^Yrco_6;Vˀ()[cSҨdTҨ>3g2gsvI#rX2>|J|yf{ETXUSE9c9c͏0c'Θ+qBgl}c.q8 gEKts1yΎs1>sdKsZIUPs&fr81M8?w;q6@^e+KLy~ ,L}ns9q!ybvS7%IDW ~ҝqyڶN嶱NZe0=XfdV à[ju܂ltT^x>UPg"&p=W>[DVŽL<[^\/6z e+-t;j 9545Tw3$s%v7*Җ |wxUB]^NM8x\9b* muLR;M]*|#‘B9|誑[67c3vy.ou.SxɦnF36jֽ4"wk;u\{Xӎ5l󜇫mI1je6qyحm~o #vpI%VyUCO9F#x vwæ\29][<>x7Cx+Sjkq:[OKS0kk`_,8q+*!Cwۼ!wwsb>[fϛ%7ɗ-{~v>]:bNWfh7tu [8DUTU9TIB1L\g9w[lM}ͪV ~>!Ihj2]JBY"(3YO8nsVKkC=C\N{Cƭr\Dc,f[$Q|2~T)ó:o)z%k:S=).ypG<3Uigy{5[?l;ͱSf: 1|C'2kzD{  f>k'3$8LV13>{{꩜c ɻk++2d7b ٞ̕>Տ.pNy1|\;|arEvMlTI<?2n@9> ]5zN9nrd 3%1PCg>+s.n1J!ڡ1v)+dUDMdܨʡ \8vg;q6EdbO&O!b$Y@(.?iMe*)?yS VQ$  g\Fµ1RaswyK8||)q'.|zںf"rfϗ:DDu9 N/CwM];Sgwg$ǯ9LDSwynUi!?dcw'PHk\dDΆYڬh\e2eZV߯]vl;֫Z`T\LY&SL܊)VEX*I_dUs|E}|G|_x{bry;[S^f8-q.u3՛Mlhkpz׽x*V&i\ӱjxm퍬=0,#@y}N:\K13զS|Of"4:IB5+̪llnjj[v5lMmx2Z4җbֶWfcSkf3[[[cbا>Űaɖ0aV4㭣(YM"֬L;.K_YwVyU[E}od2Ysb>«M,IzHۺ˩Tm2hzߣx.;ѽI]ˣ}E5oj1nx;X1dOG^ x][ow+3\rn`]]31ud31J.k"k"dU%R9TIT.LL C9)3؊#1 Jrfq3tȺK?@0nܔo62S|]yIJЫn~ wcrc;1͟+.{c}ܦ<\}>,c|ECM/o_ޱ~PzFzF5<۽y}>cy|WdzH|gwce|w2%tshڧHԬƭ|c=[dɋ(na%qRػ-b<Tg,63BJOKX\{\GB~e6hg9cҞϽ]A|H˱lj|^F=/Rwl}~g[30bᵱ_/[ؘx{G 2vpг)VUɹW)2dJNEQjŃ4t¦& CRurޒU)ti׼ަ:yG5H&lK*8LB*Ed?}^bDF {t{q]?ugxoc3{YmsͳW9{)=d7pz߶~T\y+NCf&bh˱qb|nͅoEJ#%ǰ4>0~5o2q&H>{WҽHWzTk{ rZR&/jƯq&b㳸p_>s4 1 =qu~{N֤Ϙc/5oklrWϪq[M>et,y:[SoVTd)=>6 |kBEd+5?̃ dL<aV),YiSJc0Kv-Iqv8t$:5Mئtb&M4UVmECa"&⣄l~55|~3.[Zⶳm[. 953W|x1xS\Os44 a:ya{lXkL<">>ǽI{S׼I÷{sV|[#H43Vca<ڱ[SFl/OZ[rɯ5{UܮVqT2;b̊S+7`t>S+o>7Kk6\۹qj`|4cof5˛$+6Ch ;MlYeç&jaMS-xlo\xůyVXmcnOt[=iNjȼ͑ +oSGj#gjTHx*7.Ǥ|ޣsҫ1$Wdꑧ@9NtaB ,Gr\ӓu~\sWd`gjgrNa%p:h]\dL1sیp,oҧvzg'#[]O28-+qM{ƶqN]-ckZ{GnNt.?ݱ9}-xvxcO#ExZ2ғ^1Ԍ{zzR9}kq9i.NVcDɈ1Lhyܝ$t6 <nV^^7#E&-T#$vq&1g+Dfb|!'q*9r2>3bǛ#|o[%F9>& Cwe9+jl[kqK,+"ܧgy %یB83g@a?LO\e˷tiÃ_N_[|6rl׼yN'/om΁ y&1rI'r͗pS_g6mW'z3pru7qAMD/)YqeV-DU>+ݶ1}8Á)AW!{x]̜/tw?qbSwWϛ_cddoX-_1_v/ j9>twΦY^qڗkVK'h<=4cOcV'^9mv-E I&u.;0%3($9!WߟiV-kk i<*yLIc5Ȗp͖ʘ\ɏBno_w|CmΏRQ|~9xCH4G4};'ton~,o}qnt/X':P=ܧ)ooh͇';ŵǣ\9yLϝXtSk}O}:cտˋ-<Þ6=Wˋ'0i(0\GJFH g4Tȹj麸*,1CcqqhNNNճlfq1Q-slNY#\VE<)$șUL(^n].qGzMNk鎶ϭ]klڙ|?n+յfя=3cj:o9+sNޭn_1lSkW/m[DMl2?72z'a?uᓪS[m 3W.i]Ɋ]&f&eJ̑.Lqj\-MJ J3)]«tKƐٌg*_9qقJ`w'qF -q++#u=84wV|GO;]L]ڞ2NmΛŽٹ:o6|3m1"$ iju3F>y|aLLhr-l~*`*MEa!>q8! ={1|Bof56|,$AP+řB5"9rљ.1rL/fa̓]I;A&Y˕E\56|*~lgX9 lL[TT$Οije 8"s+ZZH:N}4Jμj:&3ܕ-&A Ҏ+yW1].cUJr_i_c=$qU|*'Sf{;{s*LSҙ6Fm^庯.;Gn~>|N1Rm}I{#Ԕ8:gwul~C={Gr~>~O[}kmo_ӏ:Vb'&lZusǃ;Zϵӽ;ug5Oq>cخ|&Ky^almL80^kF-nMePuʾO<,VLg!cޣST2x&2|r%Ӥ79v{rRlOZOZm|\{ &t)4k%lzN2..bvP%CpL&2JHe;R*9Ɉ#c6徳89sfȦOL?G-? ɞ)n,Ӫ{N'~r=_tڽGo}._IzҼ!1-M3ͫcfWӽ/nG^qs5Όɋ3lKQÏ<Λl}kTiɺb46/;2wU8E",ܓR.v-Cd# $; )!yTZծ"Tj҈EJ0Yf2QrlU)b&rItr2 9ɝyX9cCTJrŕ2٘w$HUnr5IN T\^\E\W]yٞzO6Se5=Ux>kj:ml|=0嵼{vzoKGMi.-N|OZtަI˿N|z״ef*kiˎjk6 艹\O^uޠ}6r $m5i*|$gY:$R7z\W-9/I-KXQᱜ Ej$cp5[8zXq8-pwK_cXû1'?%ӻվŧf|>?aΤvzs>I=3ԓV&|?ծ0>jryqKomgkqp Fj+B0AGIe ߋ|xTp E OY1L$ӨpPqɕi)gdn,g!:vßM=ɻ;{1G{ {ji]H"۪ю*'nJ&^S=dr_LgC&.{<(3gqc8> >|gk8ī>r"?Tɗ ?b#2̓ y1}L~i|>c|__Aߵ;KY`8]e޿e޾~T~|_khv|K7R!_7XCx?K3g=}avEL$`T4Csܤ}5~ wl7#,JZ:ؒ*%% ͜vaD[R9slazrf/"}v6 LM+^oOk61e+}ŗwL}s[<'g7`iÓKH^&Q䞮/dU>LGPJyY&!{Ɍ|(L*S&L`@ wzS뎜St1r\'7K{W,|6VlƮ?51c͎b{3ԜHs_Rp49~#kޞ?Ŗuxydɋ$M/0+;_emf!%(Ub<(˒=۔H݇Eb(lb2ڙYBO_JjP8 D)\3|d!Gn9Jr!˃ SJb Sc83qg|wcsy(˷{'1$5E9 9䵣:2fdz]ỽAMoFPV^38ֱ3뾖Dhg ;gÞaj4yo읳ŘS0,wpD<#6IOdM3`Dt_P x~}\5Gņnm1KOrlzqa{x5۫~::>'&Kya'6kS_[ gL+_1f0kWP$#d;D|~1S9LߠHܺўJAUM;Iɹ{,̥~AԴRroT?ztu32*s=qܐ.0\uc#}t7<%i1]ΠgSgrR*FcWS:yY͗&{o]aܽZ&ڼ'&8+85ql<݈NQ9LGg%]63 T'g|g&3ϏqEak/zʫٮ)QYQɐs)q9}u6v6&#_lߓqc;Ems˟g_36|X~62VG>{˻vq%sv{sٕY%QG=rR?_Î?\6J hS\`>Vp94aǒmW̵{FKKiٕMO[0ulȒ>0rM"Y×LI%:MR$lurT7Oqwv+fycÇ/%1Zҳ3>!5x lۛu45.}ŃtLr޴+6#摎Hw7m@"rj;4hzW[ ƾse_ڈ= nu~ ѭ=C<A&q'Vj95m#H~ej߈zntkID]kZƕMU?ptQsT_%JNz"&Qcdx;ӝFӷUs"]ڬ9ZȪx9V&z0jYnt]$rS&r8pᆭó=_TuGw>MwsjܟRjӦ :]ŞeG{9{[=A^zw:w=ҸoL~|{9vW=8+e |x+: {BRulg b(h;F e;0>"+ fymUxN2t%uԎ-ՂgXr:ݴ)+TO> ŔHZSb0MB0!T rnAnлF/I4NI^"H 태t2p\c6tY>P>STP./ٓ:'vϮ+':~_fчN^o|7#|͏mlsXɡ={AtY_/'8Y{GKM`ɏ}<֍kЦ:bl_sZ#c^g99ƅs ˱EEe>,cl`h7s_Vn6G,Lw4{ lvg)[.{R2S?͆{L}#/rأKe3}}W5-,GGswd]7|>g`툷ϠmeHڬx%dsuL?Buۏ9Pg4wuFf/$&T;j|=;sjwJũ>hC(R_՛ =F.r9~:`-[Ӌ,wG3Ostqc]K|'g쉯唀%?_:?j,wX=[[u5Z>"J6A $7ycP6S.g*c`>3~׷D5=}  *܈RȯhM_һ3ޟ辛؏ſ_elYp8:,yO՜l8rc c\,sg9ϟ9s#>)ySUBgJlCWڸErߐSlG0n!ӻ*"t<ٶM}ֲ.('öh&YX×8p]|U;pCq|im=C^kܪGTe67'͔"db˗popI>ӚKXEIWyS'{u3 Lٓ$D{LVO1:&9KjYa VS9/iJlT)rc Ϧo&m&i)m]eUۆUγe2eMuèŴƦ٩gn: lSs{&JQ*`,))2}ȶ.QI~'5IS&|w FS;j蝸axM!1-tPy);DDA&lrDJn{MlɖqnjTwsk?k#'T@iڮzoTrF uCD1=GZgz1M|cwAZ:ؒ*%% ͜vaD[R9slazrf// /[N[76MG*[) DSîY{emmsf/A9TC1fǤ+]4ܷf}V*Քͅ|`~MIR-ؓQjWJw}mhRqyr;pEYR||dIMei1y*\Z\Ɗ-#18AEHbt7nRPiMfҺ_sx{/:=5tQtSt%f[tkp<+jxprJ0ɏ%1=3g֏k{79'8>\tŹ:<nhjlsh}s|tKٯk⛟~1mN)Ys,gYYw68uW7yxnU2<=˶.tcQKql~tUq=6G`kf&dp|&8c1|Rl|e)!Um0^+ 6Dl+"Ŋa\()'6Vd%'$ތl/x̐;ɤ針{%0EG8GpK7oozcwGWC_+l{z0k_5=7x~;|\t 6 Ӷ.OkKKgKg:;Kmҷ6ij\ xH-bdʴvJA0n|tXb&|㧻L~Jגbr_XXǛLDDGh7&)_Tk31X33{kڬ|rU:nc9.peHyqprc8=;| }`d7?hw% Y@8a޾~e~>J>#~`v|Ko1P% y}_&= }=Xfh]ăl奚?d^"6kQ\;Y<66{JpFלnՓ@cSbgR}XI2Rjv(aK):<⿹' qWsFeδ3@q83gqg8<3>3_t]\.MR? kW*$RASwn')H1~*g:a;굢Jj u&вNH3TpێҜ!d&L:g1s wӳ<{whǫt7nbsDz拾5h֛Wӱ_.)WEGxލ>\<|lL)?lLLجEX2ǓSbAblj,;Z&$657ɊcU{qT**3}w?jڶƔZFezuD!1{:1JDɓaELS\圅q鶥8J~BFF3lsu$x"+ʿ{OUٜܨ!1F^wy>~+.r-g&}./X#ϱiԦ#8pxÇ8t_$ڼw M;8ym G/NnOÃ6|1|Q{hc˗vRhpwt+mnrq*ݾƕ9 ݖlꉝcώR:362EW~'H:hmə&"*$~U^2i:5(2;cd\3O0v]o6xW[ ~wߐcO5iiL= mΉrj:)>8pWSnJlƵ4kiHkCe@[`n8Ͷ\jfL_.`1ZܝI;.sa,lY(0{W]^>_:c!T9XE8]r7YpLEI*ȡ r=tp+/l}7ԼG+m mV5gFv0|>?|pzbgYғ5u\[+~0n{o8Q,+LNi&_HYvʌ :bNNt!CMm]m pWZl7{37 >71詧((jGldu漦RHtWzt!{1s2PF2Ncg:d+ogk13WvԱʭKUyɜ7PU]߆%d_0ou/BvS5onN^+dé`D4aNͧu[ךx^L\ls9Q~Z|`6 o(m]G56RNuq yQ]*frLwXgL89Kyǽ}$VR1G3\\6X~TMD/n{8&[C;c(ɉTڸ۵UHRk]:=9&<)c )9C?tu m-IRŶ<9</>Ɵ#ƌfk,ۯ3npئwxRԯ1L[<~l8660z TPic<Ra`9gVZܓYxYxL ¨.Ãc9 ES1PL.wh2ubHMc),׈l"YI l: &4lK4̡X=ʈ!!4w~e4V9Z;g !_ ݓ):hgq83g))C*e%B } |'Tq'/O5u#k&2ڳ`\vm bo5ˏ4k/Ӽ#7=66kcM][O7m{d_Ǔ䪉-ТJTͲ*!Jb%1glόJɚBuNu9QC(sd9Ϝ91rl9s[ze6-jzu*d^!_;D&,MVɼoV]U۽톞Svg3˭{' 2ѲrW%햘bTNk[Yc88gcnc%|zlvk&hR%4t5m}Hu&ye`p90vEz+xRf+I4WrȊG9z{Z:;jih-}m|v͟6[˜b^k3?skkgÓckk>-ml7˛>|Ň:2diJִD|ۅtX+k &6gbsB+Dϟh\g[SY0z]Q5i>5tF2S9W"7]r9\M:S&9rssoW[{ֽg1zN]\y>TG99v8:,6Q­ڷn{A$rf \2+d19GBW޶z犑͛LUU>pR1) cG=>jlخ)OIs:Y#&)sis6;K|S|ԯTMΚILq1*馲*dV!ITUU5 j9)r!˜3D:Ov÷RӿThSLniLNo9KgϜg"E@:ґ\d&X# ^pˌ; w{SJl3f]'GnܠSI3.0[%ʉLc9Hl`;d}VT3ݹ<ɤD Oݛ QWYb=;qSq1xHǛ6;;{@wVd Vc4.ArI2NS/a{M5(Mc[=F%bg8#r`m #W&[}`mVv(egK,Px˅N!a3vhCѝ!{9|V)iSZ_gϏ56ޞ֞*وHA"q.1J~भH1>JzJ{c=TtR~T3Z=1VvckcLfR"LC\l޼2v&xLr@^ȍۂw3yNw$E'QL|'ަ*asے@ʭTAn1K6z]AwkOK50]=bb=74{cW4_{k5lޜ5. K`M΢sƒ_N^UéRʉ9htA0Ъ:$wP+*r?EۮZMIF21.Fm2wH`>Gxv2u9?C֯ҴWPBO t3Gr4JE `] e)r\@iԩOdjEu̫u2vX`fDErL"S9qׂP=;w~7wzs:gLs_,8JsrDɎs⯹Kj~}u}ޞ/SSޠѶq[!sTϛ&jF!L~Ӿ<<{3fəE2k+|C7>qLɇR.{.3۔O@/ӜOp\~Z;KpjkaW,X򈏍i&KZn[-cNGc&I˱ޫ{~ֱ"kJְgwLb' +iS kf.<.!c0Sc$Uw"|dot5)&fX:gV>z~LԣnSxV)rvTDUZYO8,ެv-[G׆7䥿]}:C7Nv)ǵ\7/_NH5鋋h,oa^^?ـ!>1ۖꤿFW&/^#AO9L\9on>q8ȳ+v*Q8s}v?3"_u\gJ7#S@NzFzFo}xQ9_K<6?g`$a ߃A>j(馲+&tERDIB&gHj9)ld.rSc8p4S?ǼH䵦D5W7RZ(S9aRT'j6Ɍ1CJ/Y{k:6JF7Y5]Rv֛CW52%$TD2g/P{+|y+]W 1XkqqR&/leZnr5Ë&=AnqxnzrfkIۛcyrZb)9kM)ɏf@*ۭ.: BpK;AJ#^GH>HG2dEB v|T]vA}}|zjaű5ҹp.\㵩iİǟm\p˓ƾ|wśl7ypxŒLwoKkh3\-sm(g㫐, 3\wkas$7(l댕oѵ6 uj"jxR8D+9 ٸ=~.mS.+fվ[e; [oZ~]=Llq=7 9hbW~6,8W-l ^8W^\Gqn6/ f+Dlb jVDI.K^|S$a9q<^۳?qk~'7NAG3xN¸h1`ਿ~b$[5z]͍ċ7T沴&FGv֠+7<1#DPFJ&l;z2>=~ݭ:&=m/t ɹմiׯO]1b;/ٻZ7;Qnn)?ResfjsS59;nal~J1(I/Dl&iB&֓:dJfMXʯsujۂ$ʶIiY\#^;YѼ[uF`xy<ck]+C=NUU9W|~wUtOkmOOLE|DQ^x㒜n^Ps's,MFWo$ŬS4peJ6l^&|XVnggӽo^)t%;ŷ"طx}˱dL[-ֽ#uJs#Rmstޱ[,rn~/tvכyg_1>j&OwN֭p}!u6ɋl8QèiZUGՕDG;r4 # c蛶o /[^-Y7W{1gngb__w5s˓={n.ל;fy3VnCO$ʹ-+#na+x3Wب](l?з'ܸEAT1%Lv;$mo孶؊ۖwF1v)b;>1/EYUy[lOcJ& S$ṅrxQ*R'Q$޳Xkj~ _@NGe_!f̝]E,Mݮȹt6ߝ^ߪR)6Jggό{CZΞ={yq6ϒ-vgcrKW[fm5&+&6yi毊']L4Oqv ̨8Z&TRd7gnH|y|}6>gggAF*TH!˞g.~s͑z%eˤ2g Y2β%&6?c1ٌvclc1WHG?a)өJ_OBOl6p;@U$IDM5Y3*$J$Q5>2EPNCc%1ssLLOLL|'&"bbcOb~SdO?ǼH䵦D5W7RZ(S9aRT'j6Ɍ1CJ/Yk:6JF7Y5]Rv֛CW52%$TD2g/o4{nX7 ¥,(yy""ɓY .sEPzu._~5;^7ܤHjjI$}'XԸ͏JӒ??-\zb91٭uh辨s?c%6b|rΞ 6Ɨ%ݹ վCց[m]蒄LKYPrюɉ gfKo7n0lJrr\sb (^Oۏ9zO?͏>KE1\հs!s2=.>i'ϟ7b~~7 r_o{hw/_8~ hy@N?o;.?> %7_;~?> %7_K3y_Pz"$C7;Aj̊ѯFU9 Xs qJsQ* rɉ_w\CZ#{M6ꋄdU)볲hvLP.9'rJhO:rd?.ZD&>Ҁ;[DCG ;X[(TP|dFV.T2kUCLroٗ>N{o)mrZfǒՎGϮl}8׽k_Ͻe O^hjuVB]`LVKH&1;hitݩ.{>+,W\z_{Zލ?nO{?SQ<^8>GqMpluJϦsiWխ3֞l[@S` g 9%4[-w"o!gʬ r-Vgh˶2fp(M͒?=<Kq{b&k/E<1ͲZ4UuSAYe"H DM2c'QE.2c8)q,69{ܩem3\w oq a7PtiOHI;?{Kq=xpY wx=b%!=qu7TH\&aZ5.ᙥtb[nzO>f6Ok6!k^-6O=;C>9gk٥_[Kg>G=}ūk[4-.;boál8/Zfͱc6~VOVU$62F$sam9 L8BV)c lLx>s_Gkx[w#pma1?1-.;_Z_Kys^ hr\W'SGoe/%'KkJ&;S%+hw#6υTnVp:sԯ)C9rTVs;EؾyCwniimT"٢.eS?j*m'АeT3xM$Yx;aE0m`kk2>/=KQQLFFF4ml#3DdͱnѣF馃f&("H! \r{|eGN{i=75cR"0 Lq-Lvky1;ԛko~jkcd3NrMm/P3*?G@6P vs)J9W&+2mldyi#2"B=RIIs% $Sd 5&ޅ63='>Rkoݵ{y7Y;btU  (u.¦\-VT+x TWȓI:zn5Wl:ĖTllq4I)d;iȹB0_9ɳ7~i^?Hs?m e~NNX[%k_nhLW1-Wf:[0uG r=>oމszٲ}Z[ݏ&2m;haeS . 9似+h\=x)T[M8F̙1Ǔ.\ŋ-.\1Jͯ%1ZRiֱ33-.JbK˒Ǐ:d+JRkLVLf""f]H^(qpb5kU foM%JYLD1f!4Arqcd:rۭCDvZ&S&3WDŽњ ,Ɩc*6V5S{?95#ZZU. SeTZg;TԤZBfezO/;wT),C۝!к9 ;&}{k{$՜33OC&M ;lyFꎱ绅ҝ)[c^3=g_q5ayceݮ=SjjMrs ou\vq9-#ǔJɥpBQH,a`˧Y00sR?;\3meyܳgok5Wɒզ:EqZbJb)\Gqz˶&<Õ.>ϓ?opRs1 \v1 a;ʏN^r\)ß͓|/ΎiJܝ‹ΪoRv&0_63}{ HzmUZ5⑈ʧ!kB}rU1Nt*7R!\91+.uGDqpT@U ]O~z9Vspܦp\¾]Si2b1 9 xs&';=]mx{f7m1~GVxұ5eZF [>$ꦂ (DE"EUUC`dN8)\d6pR902$+o܋\e*#$1ȶ]Yd.ɛ 14_6K|gm7[l m˸t(Ǚ) !단੿j2Drq5"ѯaw n]f56OP15:7śG}s8_TrdމܶM- ٬Nݧyuux>;=U`ˇCy_^{ǧeXmVv69{ܩk3^8&H>ݰ/+l&>IH8,a7}^UuvZxYN+szhq/kMbgvr;o-ݲKtLMk3\'#"Z&|y8/RokEM̂MLcG˟1s69zX{T˟8wD?;3;H9Ho?avdn{ \dɕaG9901 \c2S͌P:f1)r9rS?P1gg? ݫja&Ȩ7/g`8⡅VHYl&Eg #))|/tlg#*O%ZHT'g}>;2gBd.{dRK RJ\c116161I&dE4. B)qc9s9s!ԿC/;B^r}OK2|_PT)/_޾~vv}[> "^}~_hsC_y|_QH7l_k(JOaozڀ=󈼍UU*gVRÊ]G'6MᏥJ{`R!2fqf: r/s;9-3n+-8>l9-{[z&a}?.ޡḾs-kMLE,H\'[DK^M~uĂ^A\QNOs7*"=XO 1Ro%PTnM*3ۋ}Sc:,)R'x*cL6r'W ]~g893DG1hkogﱳrɝr=zK?$xo335rnja+:D~4@W*q+x2"Ml1QqHc|=˂>ncJ~E2r_e1ج#K{{=pm@v_mhK 78૚k? ߾)/qη}\zgLZz/1cҦHH-f>}$8GVg'ljXY%E Y4c*`],Mb䕋1lF3iڲ`ź-lpD[j܉4R!LJ\cN뮳:˪yަۤdy=Ez>[`>#\xqGHN5)ړҽ;tWl_ɾ\8k$92䟮 ~3.CG7tjzm%r&mQcf!sd؋i81LR5 гflT|)ɧkl$+Vo^d> ƝpDw0_^u jqtw [ wg/UV;ۯ-lYќ/xېDDVyn>5"Z}joS:3STeDbs]\c>l?˳+ܯxQ+NY^6p"{<16 ms1er'cg5ū"~U!=͖rcṽZL:(?(9}_?WwY_NCJF,rdq55O"Y7\}[z' donT ULLc:0 &-.)fb@Q]Qmxrju2Vk8:oWm-i>&|ս=ˏgS8s=I|Mft]:&&[Ϫsfk˒^3fe9k[Wml,tNj::V""bD@ZW֞c>m9C g(2EE# S>0lV 9vt0g\:r`\9Z1d&jypk˭ζz[}}T̓6;Njcˋ%m%- R|&&:"pbFKJc*Ti:{qBqhdnY" 00|VTHSLdQf&\ʒ!f[$ˑ8St{6q/mxqw1VI%s:{|DDx> G7}#Թl'fӛi4^:fg3m;O>u[W.JエvE;5{>r5+c8ǟs<⹭{TqZ J5ة 4eRȦq],gV>~,\Oclkt|?ŠbM{;Xɓ涩ϸ\qL}:5x٢~j΂|p,ٛ'jC%ʑщk8 lx!; vg&2n%]1}ǘF}QMD­bGrH.H\;c&/al߽}=/:y;Ϫe>Z1he4]f#z|Hj>Gu~ֳ&r_m?/Hqc%60bqc838ϛ8njr)rnoiO}:>r7UȧpP c\ o.(~B+?s)'`9pU1ʗwG2?g>Y4k. ԙSu^T1{v` O"5W[#MW<{[K 91o }/[V?Ǯ  {3ٔs'E?:Agu/ UTc(Uv'g9Qns,x`TU +=S{z"fZ[prZZ#W<[Ģwi.]ngw4ٹ EN/g}_o?T?cLeC*c?yX,F"91ܗY{MHpJO԰2J%;o&K8?w-"hTT)׫Y!pwx׫;2s]0fM. 4g_&+|-7gx8mb˞/鿪> =;39=e1jm3钳q~oY5,3I4b[6ьGGA61nFl"\Z"h7A"cMD.0R09@{Z֙iZִZgZֵkXkZֱZ#V"""""" ME[|M>f3oZx{Ӷ y }܋-*_q/N[9~|1$Lc':_w?+M6#^*~>%g~>y@&A$&>&B\c?W9#qs6>/Ms}L}Odb}.{ ?|BI/|/@8[_hs@_hsC_y|_y޾~TSS7}ߨ=iǓT1A*b)?I|=I/|/CO"cs*t__޾ѾvvqKo1~/>{~s?qG?E8,K#/PQRq/ ִE\Y=ly&՘E-iL<>:;sdެc M`y/͊LZ;YHV"&&%Z0˨$ +gj(7xFHC.fnں*JIdkEȻd T}E/MenK-Y|r91,` $Yqf -DLy@O&}9Oٗ#ghPSIht2z/1Uss9Oxnwflݲ(ϡR9B1l)K1`.191c9{~|]H"8l$n 0K"y2jf)P1C`Kd}@G~/??Xgrq7:IQ? xD'V]DL STG@)U){*T1xIb$HeW*hd 1 U/V9/XrI8zx]A\&iL(E"1KH9VK!Peegcɖ21vIlm- $%$r-ػ3Cl.qxu=s[7y Nt!J5E(ϐKw(o%fb$XM nm4ז^q1Ұ/]X,ne#8D˨Dh9O%P5єHI6jw#62Md["ߺ]&]t):)?\5Քn`CPO^ ٫ wg,R'`ǽ}*ngR,p|$ּk)s85Ch/o67 0lɰB9vg=uoJpux ;:[ܷ/FM<}<`إ<ر_%p_p=;]Nz3ԜXulfc\Xy6)//.JҹqM?n5~m\aۍ_GhwKYP߆gd׺?w@j-ۍ_G{|6Wvo;ܟgd׺?w@j-ۍ_G{|6Wvo;ܟgd׺?w@j-ۍ_G{|6Wvo;ܟgd׺?w@j-ۍ_G{|6Wvo;ܟgd׺?w@j-ۍ_G{|6Wvo;ܟgd׺?w@j-ۍ_G{|6Wvo;ܟgd׺?w@j-ۍ_G{|6Wvo;ܟgd׺?w@j-ۍ_G{|6Wvo;ܟgd׺?w@j-ۍ_G{|6Wvo;ܟgd׺?w@j-ۍ_G{|6Wvo;ܟgd׺?w@j-ۍ_G{|6Wvo;ܟgd׺?w@j-ۍ_G{|6Wvo;ܟgd׺?wY)ֱjGh0 \ s%UF,L!Du2lX% p[oB=yLX_ቃt#wӧX37nB$[>N\ ŴYb yn ͂IwOU|EYy7(WM82]G9L32YZfpc>ii(;3{.E '-AGp6=T팼kM)$D0iѧxXW)$ij">ڢMF=Ul1|+9mp\tx:+Vޖ1ָ50ָJKƟn[?,@`@~t,}l?ۖ !KƟn[?,@`@~t1ۖ !=l?d i`@~tn[?,@,}l?ۖ !KƟn[?,@`@~t1ۖ !=l?d i`@~tn[?,@,}l?ۖ !KƟn[?,@`@~t1ۖ !=l?d i`@~tn[?,@,}l?ۖ !KƟn[?,@`@~t1ۖ !=l?d i`@~tn[?,@,}l?ۖ !KƟn[?,@`@~t1ۖ !=l?d i`@~tn[?,@,}l?ۖ !KƟn[?,@`@~t1ۖ !=l?d i`@~tn[?,@,}l?ۖ !KƟn[?,@`@~t1ۖ !1lv=ci g|i`]&ޕ=e TnSDD)8"MBg'. @62b18˂q`rdϟ9 ^}Mg1cs :zI=[v`ݓ"ɤr;tfK7nd"DSd ]|Q)'dd]8}! ޾zctQw.8pYeu9c!/deiEm0L-z#DA.'^k =n-UT*MגuTR)Tu'0͚+VuT~Z #wX"` dP\BN`&5UVXV '7?(|-t\/+E-2_uiT$]ujqSбs^ekbosF,n:R $ܙ}d|ekqbkJmfƽ[®;WjEЫ&XԘiObk;ܢ f8ƫ3y-5kz}޺l<{Ih,6>~M^3G.c޴z*$QY' $ EYDIB骒Ɉj9Cd.pb82SӥtU5YU81oTfȸE'DlS7QVECK-Coԙ[ɬÿ6)W"U?xa\_GdϜ%>TZ&,(-mdvr~G4*JuIF*gUdIeq:>^rXiAzIieshsOd6wϗlų $vm%yOSo1&CɝC̳'n:FN¹MBn((ecIEtuUQ~[n Y&9@F=W`t40wpWfV}?)~gYnaNEYpx[rFF>Ii~]G_V۷6[H6˹y8OP6w35?숵TXG)^ ԡxxۢ7 jYH]sn,:l6͢ n&r Y6\ݤT@ɓ-GgxlQ%.ee+.K2,{(UE(Ju1 JED.Q1CN9D-A o#$O&ۅ,t42R+ES*1x6=kKg4δm,B<16hKchlj%.;7,7ؑe@u)q3`:?61>)|8Svg\gv~>x--͞7R9wvs< ͻcniMͱіn=^t?V{]Osz7p~tcϱ_ja׶ [ ~v z<֍Q?GZѾ$Nc.KEOִo z<֍7~Hz v_~ z<֍Q?GZѾ__НY7?/_>Q?GZѾ܁'kZ7`"}+?1_qk"܁'kZ7`{=DkFO~Bug;Kb/MZ@=DkFrhYwNi]HrhY@y0n>[ ՟s/񋸿5i@y0=~?}f ߀?'޿k:n~1w_- }~?}fOִoDWo'Vc.KEOִo z<֍7~Hz v_~ z<֍Q?GZѾ__НY7?/_>Q?GZѾ܁'kZ7`"}+?1_qk"܁'kZ7`{=DkFO~Bug;Kb/M^u[Jl>lm[*SPmB+' 4DFp^%1 .9tV09EWMq=>eyWNۚ9'{ZE/h= Ύ59U;q#+[*'đ>v,ʹ3&^)86~cv'Iƫ.8I5TMRqg=rnǏSzNo܆*aכ^1bp@WG\6] AK[mgAW(FEaI|-\x[dɓ%JR;}uˏ |>|oŇ,qlr佫Lx[^V31  Pzmrk(mnIh!$묃|pIfAd6Z_ew?Ś-ҫ0GXvtNxZ59!hя1.WNrIM̾ny ݮrO捾.7qy6wLj#}+|i=lt'Gny.ySs}I[ǯCgūK,}#_Ѯ~XW^ؗew?Dm ~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<=OGx@~W'#<1 %ُsZ y**D!$'\'I[L7GgŠc+,u\`Bd'|=͞|)Gu] Xi4:TAtη>MٵLΤU|馉36#c1b.Ls8)JR91l)Kg9scs{!#]:C!T YpɪvLO5Y\PE N:Id½$&ɔGm^"z}D}XC=v~K2G4{4XEkW5]_#d*[7<=L55)ڢ>ϜŋIyw^­\,!]jn:vJ*dXЍ+HA Oثi)YN`nNRϪ޽xfমPF粤q$FIiP&eܙUR|Fdk Jy_`0W:҆M=Zf_]ILvNhuhS:hX6 z$ͥq##ҭTy7 iTlEj6EO;6LW]ȬcgdyQQ'~< /N#?cU~ _~@o \TrO?#pP/WQ6Y3aثWn 2.SdGh'(3p6]ErW.Vgͼ|dd{t1`ŢEEF)A!SM4R1؀!V =y,ߺxV&J4t,p7g0 mdY|$1`NEXbUc tv1@4ͣQ&)rD1S1rr;n,o>TL:+W_Pՙ+$֏:xgW3UCg9qd/[.1^Rk㩍Ǹv2f>5e;Z.5$aY`K9lQM }|+"+eI<*"I|#2( \K`0 缹wj"^rd-V/ru.\BQ6}̊Go$ xoy7.׺Tٶl]]Tl'e#'ErdCGn}l['2E&Y$,#t-4+: ޝS%ى1w؂L".n1t,srq$SIw!nn>冭&7-MT.3>2orv^F^E&&:1Q4-;e <ռ.ᦾ:{k;*kVlQ̣V^ /[M#M>T m(3 %$2'`0i%rбY,1 y*|UYfɢᲊⷾOC9_U'`]p(~OlOc(J-YΪQojAe)#ȨhՌFϙi{**+a뗚|(lZ~*wxr12 mrVE%Jr*<]Yr^zu6J̓E\NUYTrf1\ % 1%ō_HP]N[llE& dN%W8T'Ǻrk+f\|VuV_+K3o11^hgXF- t&tɒgJ&wمB&_ R7mnr-`ݙJ=5ЕH_05pX eC`箠ؼ:jgYڒ~\0vYR42)MUY(#3ZWQQVǮvbu9]rOw&g̞GG;AtK9h{2e5Ow@P?etƸ͟egQ6{ezVu3;.X3pSH.PIUM3h/ZGw9Exܚ w ^3H aab[}^ݟl%ݰwP=6Q5fCg`+PډkwۗuOl*UN|+=.|&jMIdK\XcšNdDכKthhXw:7^cb7ڷ#I̠ƭZǼ])C㫏`_ww0. C&ZY;*J*i_C T5jR']@%P[ug7 yM3 c%vsZc(ʶ.X\-~F0ruRcد*IB'h<F#o1FL$)ʴs)1So)ZUY(J3UVISW1=C-Q'\kFꝫQX"I=Wb8U. ŢY 쀺:QxևKtL"aj KUiHƞQ"g); f5)F_ф!0$7cGD*ĿK?)8$ǁV%_0uM9cRrO?#pyQQ?plc?SsHnQvedY UD)䢝tߺ1E7|@!$:j$U4wxaoQ+#c8=1plJHMb!onMo* iphY9W尙_%79]Dk?a=SJ&uK6s#cۜvY.~g9^6nnhѐDΐy\2etPrQIl*&:ɔ"lePVڿ#59sWew4xMUsqogqOxlt3׈BD4He\CDҍ%bd9 e?yzsk܊I4S)uZ۱om:V۾rѡW38 YYe !"Q:>"S:$S! 0dj@TT),͢vS/f1ƍ}N:iSr?/BaGF6SrX" L|H3C$^ Za֫+:Cr Dq Vr;zi-` R*X&+)d3V+Ƒg-%-֐G!*K- yd/ XGѣa S ١*Ԉ(b9wa3xMQ퍝5rkrx nJtEddIB51r3߱ClގwocˬW%"{,VwԪ2f$S::!Cw= 7(%%vomǺNz6Le ENU5um "ՠs<K疚L_)S [;Wol#'ԮYEV:=9:\~qԬ5V$":gFZ,|w]GmZ(kmY$e-b]vu"x엉H=P&tK/Gmިノ0sj~[Bn:#ٳuddݺ8+ǨE(i$Fr21 x?8׵/Lkn$~!D=Acghy)C,=?gUrߨα)JV#)P{߱eíOrѭ MPrѳqݦ.{k'uΧt[۪(X21/2铧U3|&٣t_$Bc\znQ zXAvfqk۬uo1 ҵ }Qᵞjh͈RWɷnAXَvgǎߏ|4{]$uClZ4s/w{W "oQI=U"Qb1`͡O6m\cIh,mf 2:ԎX\QuM )u9K(|u޿'5RQiīVX,qMC#I#al4Dk]sW~YZ]*JY(*C1+ a%p\aT1֞Rx=Ds:jwpsԭ"+Be>yl\K^b38˲IVn N(Yד_ZFQ@i]AΞ,Tī;ַIޢ_xxFmuݥ \cv\+lsd#mʎݭzivq6u:먖Uh8łR 7h쫶V;݋-8V'ᬽRWdUgS=yv˝ԩ&L#T3A[r"Lzukń窯ջs94Qj9C/q'vI7 5R!fP7E~W_f͉Lju6||"kc ᣤzfwh,qao*p+߂2'0~PܔE}~kv lmԖw^rlL?+rHGɵYXKUP9uaYԷM˥PwZN\-RY"d{ML*Rཝ6WɔK. VH)~DZ7IG{%gMtAӧ\U+\.0u4juƅo;F%X|zئ)e~M];5$p f&j-tfU^J3fw,VJ/A(/nn1 fj^O޼,ԓtw jEcVG0ʓлX%aeڑꜬ')|k5[)U̼yeigGq+WjWJ=t3˛}[q}Cpϋvs λkWkzO"Uᓦ(0V4"Jҕe7a^+WЍnWoulܼFnʻ-Cgv6 6zZ|K?l[ɨЉӡc!'obP]~_{Uy۴>ջUfDT^182G1ji2 %f6vR &VrƠZ5gy]nH{F۔Tqw(v Mp635uָ ^O(E>Ve7U35Pr $ b)l8:oK[A{5濸-={C`3*s۴MhkʻqDzjΟ:gh9궸y{ؒf˕Vw#{##f$zhh)\3 ޜ%5սo1-jȹ*jÈka3~}I}XԳ:<ռ-s7͎?⤢6}cH!Йܶ8k M. {9Pw3S z1Zz\XZOvӷgwJdKnY;dԎixϓ'1V>ܰ5fUpN*R &rEڽf.[L"\v6^Wk4Mwy:-[;\XN 3MGzK: |%멥c^ \th9v句t]Î7R]eO9UC6|1h?Tx&ZFlW_[ٯbg]2gsn5Y&%=62̣W>,Y6IrR+jj`ڧD֧#b+iN f&n*ɣr;:kV>F%裏xFxq 0yZ~.5gח[1OF$WI5Y%P=tlӆmIt$}OVttۤ$;2]۵t\*.eVTQC!spOޒ^JĚKeRX4UTwM 9IW|dxQ)rXعv|X/ŌcTq;c 'Nmii6TF Wh+FEڈ";AG EEW߹m.dS؛uw>2+,mʾ,#wj/ɵWpGeeڟEkK6{u]:I-:Dt+&b 2dЍf+xf1ݼrZc]~s2/}p[}4t$c.WL-ԅ= QQ&nl5wN}cofd#zu3н<:xiU?"8mQ/dT$[MF!{),ӼZ6RwaL/)ڦI;عn$ey3RnzNj .ԯ@:pi+U.ٯg$ZHK/DՓ6B 4%T;O/yˡE'ԉi/lezLMB'J+Sb[[z3ݍvijc(zbf *X+ Ų~9ivmYog/Q^Ef~L@R~Hr(Br9C`9 )63qg{2?@ʎ#?cU~RqIK`98?r_~GyGQFahO7Ō1ۜ~>Fx1|, 6/f hEF)dKt{ɊIS[8:CS %'lP._Ձ5J_ưmN_>I̛Ed&Y?u؟w]V8&Z?IyKOx"-#Jw87BFMNؓ#}cq95֌GkXqc3ܜsJcfx2uY?R۸J|A]4&4K0#y)DټUٴkgPvpbQ3"/uԟEJ]˒{iVII[lh\A{P[4Ä#SAme7%RVA]+]]jzՖ&{[آ?}VE̍$dM,"Q+Q6=66T6MA;]RA5 z^%*TWe5"E_E:MB)(aL9Mqw^3 Ͼ#xm=[al-m=Gfd)uJ1p[YH8s&W|)㮱>bX)䢈8Ⱦu3d]7Agl32Gnٳ4VwY6h}dӚbGmy Țd5L H B*7l"V+xԥ])xʭsɾ\u2]!I$+ںhurr}8[ Uc$껮zpYA\h_?63d,i5UkOcҟYوV=^cW3*Ée,hUUrHۊ)JuBR>iJuֈbl5oݒo'x3Vel]6bU^L^a*ֲչׯZ[vӸw08- ц7VCUsZ{jJ-{d$uzY = {`&w>,EcIa$﹛ oӣYhHQ}vz뵥*Sӭe¸hH9Mf]|.ANf@ܗA~kI]?- yh'jډLƧ&51=ٟdM>MxIw)}BSR}ENf`a/Zσx+2x պڏ\!5ro-x &iz+G֩6"Z,*bUjQMdb\w'@\onnDwv 7ZtE56>جhW,kESk<@$|gГ%Sɹdy<+-k&_ۛBȧ6vXTE&N}"Z˻8~jt~s#x/xx2Z&gUq3HQTe %!iVv8L@#95]FiC:KXPDҦ]Ĕ:FJF~)0FcH5}$v<K=5_NC_`lk4m'Uؓv]!'g/aZjQ2ap?YM{{oќ4ګCjnؚBR) m5sey^1 rG{#_bEl"轧tɝc-kʲ4&MT_;Y 03QSZ;)-,f g=IC*Br C7,(RWZ섵̏WqvYAS Bn˖Zjjb "‹X] jm[P]sKٵP c$nJ4FVTeBdTܲ;P&ǒ\c! ӻ]"Bx$)"~rYȶT@(ld{N<ྰ%ߘ)m[(ȨwzVxLKX?{YMV}?5 A%ʜ&EQ ='8x\q:WlQIPouY^ʈagXjp仴ͷ3P+nk&$oq'[㬻ma*17lVh;I,;-1U7+zG]Sˆ[6f!W ':u0^ONAUqچ W琭iɣ%Jlj|aR[[\*To>xqZްW;^3 C_r W/v,~ƾ QO=Wo*@C]N-o~dtٺ#_lmahzꇆG֯q3NsNs徭gZj4{lLog f]f;`+I|$}'WYyaBWL9R:Dm*kxAόl:=yE0NY_1FݭOJ>Y/-lsz1ū1)wşb)N@sŭѾIj/o=zrKYCk ;g ZV#<:ߡ}ѭ8դ(h۪b/KGǦƞcr^vwI,rdd}_EWvL%MHfv׹voen6pdp}^hr̉TMw&n \P=0}VulR|6K{2R.Ylm.Z+lX{\{A8q ܙԯoe?O^xgX0\zLZ )AԌmTbNHX+7&^'5.͜Tv,М`EϥMe?Kq׋Y]NwE?sq31k(DŶF%͛ "H ]|_ݘepRbYYsTkvƊuݪz^zmƹoyIwjFMg`Xխ;jvNUG26',A>-Dδtqe̫l ebX\ 6SOwjۭk8cuDkPb.aj1u`Zo.yffFz+.V+JuQY;O>Hqmѽ豚 ̨j Ef~djmG%ׄV Lw,$b.K2kB:iͶ45 nKDVY.Im4ζR{xiMڎXZc(j0qљטpӨO%&:8W6oyl${.b:Ɓ^c d>9u"sQdG3O#xnߑUv>_sjZ# zk{?wZ.&^ԙJSZQk*vfO=?xO+txçtTF;3LpGh¯4b(um ЍM; "i5Z27TՈT]s (Qɹ~U>pFm**`.@?tqEmvH6CwYJFVY.L۔6Y<紹dϓl}_1<bFݴ͟vdӻҖlw]g3(c* w݆)Sf߼F;P`rŗ]9ӓ+ ~>\(~12SB 9)"eew9VL)0KAH “ TgD>,v~<?dyuNR|YS3}Wi˲){QO+[P) 2ti% 0LPSNF#跎[dʡz یL':-7~3zt-iUەz)7WY\Ѥ6G.d1EU$0ye.Sp:aoWw/ozvTv ڃkwo(G.eR><_GJ6=Hjhmٚxi83k%L[LX76$)/S*`,1S:tڳIʿku!Lx랣?xsܦ]?'.~A8rsc+wϤdwϤd=n>O@'}n>O@q\OK>Kq\OK>sO@'}n>O@q\OK>Kq\OK>sO@'}n>O@q\OK>Kq\OK>sO@'}n>O@q\OK>Kq\OK>sO@'}n>O@q\OK>Kq\OK>sO@'}n>O@q\OK>Kq\OK>sO@'}n>O@q\OK>Kq\OK>sO@'}n>O@q\OK>Kq\OK>sO@'}n>O@q\OK>Kq\OK>sO@'}n>O@q\OK>Kq\OK>sO@'}n>O@q\OK>Kq\OK>sO@'}n>O@q\OK>Kq\OK>sO@'}n>O@q\OK>Kq\OK>sO@'}n>O@q\OK>Kq\OK>sO@'}n>O@q\OK>Kq\OK>sËG+ErGm۳/cL1LFɑ$FD3,lcvq9-fC(jjtmk dxwDy6{;뷪r7n^Gb43AȤ:ͻ7Lc?lݲ]1ۏs~~/qُd>?w?w`:xۏ0F7of>8*2{|ǟ;>/c6 ?辚w|"OJiM[)1\ɹr0c%lU+QJidZg91113xc‡ER"qH|`oC4W;qݠh yQ2doqcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLxcxYŎf`:z1瓏DNj<}~@~>Ǐ%XioN>qcy8XLbǞŏ<\ǟˏ}/1.\LLcG$&фt{箕I6Q× )C=s :r66DA )%N1 U%Yc n;1Zyrzc&eэp_ Z3k~)8dQi*jJV2W;2)Ce”U]Jv41n8ؘMc#"\3I[L`IB)qvuгqpmg%.ɴdE,,uIDWID\.q؀ n2\l{ͩud4sURkG&ܪ**)\S,'c ӨI* o]Ue<|D<{艈d8a%'FM'L2t4rn8IDLǨ'#kk[3RU2֟V*xO$s$W7|V*e]i' ?n1|cN =~?G-&k LDʤSwSLvy3iGi cs,n岙y/=JRKc>1˝<q{"ze+RTe,e4CCb1MdJlg3?k8`,wHo\goPs?2~KcU?Xoő~<&>SY#oSzKMTضn8)֬q+5e̩֔~Xol5.[+,Igf:^oM>]m ]2a lS-h8^.j-~T'ț&]w,]Mp&8)(IvY| .Vhc lr)4]dg!E3ܜ)Z,=zzYm٧Ӓ{C{`,SNm:Yٌ{.+un`'Sbs >qe55bֿbv[[T*;*YlyXşH-p$\6nB)*TKj~##YiTC\}q立i7֣6 u'REX $Z\&-V`Rq/j޻VRݷ晫5b+F!,6<8eTglR܄4;\K߻*)5GL |.6O-5PIw <AKo)hV*2u!nڌSYsάq_Ei&CEGC30vfxf1jQ[c_pt4ӳv˨oI}y5Z<e\avt)0{xH&H-2/wafc:uG.b8 /%w(en+|I:}6ibbC I6dKIXb_ q>掽Z{!9;5'hoܑ-ԄiϠUd1Ewѩ(wMUL U̹jfѾS9YW֫t[#V6ƚZ5fٮxYebUWܨ<]:zs[먗UnLoUЮ+vW{BðdDMk%se% u255һr˨Qfr+=:(]sm bʃCIND;)BvfKa~u4%#idžIjLaAW?6 Dus;e͏j/")ib;۝Ta1SICvr8{wGS7& ST_,or0L`rZa^Px? HwJ!H;<~ܚ'v5RCc;6B0`6aYlF*+2#dzjp/O /shM#jQ87%5*If0Fw/c" K b9>s"ę3ҍ}ZesjT%7lvV!&k 'OUX)]U:SnK4Ig*<73ps/bKIXruCUTaTKSrw&p#'Pz;>[2ҍI4,C`qq,[1!2(?z8Jw{q nh( avіrX썧2vļ(;0lT[6$"kԜt=VڔSx %an::‹>S13l#gPKF*WGG6[Ψ=vAĊ*]aIfٜB_^M/U^*6(uvIAE3;PX$ )Fhڠt+6?jw [VgeM˸x0MSf#kZ#D,K򃨇Qvs,UsUMbz2.̫L2>ݺJƺj>!9SZ &NnN:Wsƾl=?s%4YuWVWkxKKIx4JJ0E%C5X1JFOb>O ;`DҪ~ߋ#y`L}* =OkAӧ_Xēuc/tg)7ηy"*J 8mGW$ )WN*Z̋bͳ-w'5lG#Ca Nhz~вEp)=5;_j/twRR2;S)ܞJұ8Q$Y8Eai;w#[k#>B0gR΢YgVM.I,ţԡg E b2:Gq˗Z/79)x]ag`V"K*a6H$SjŨVaX [v|-C.lef|䅮,S]QW*pRJ0a)Ӗx"ǼqGVէ};!yU8yǎ*jjӏSqm,6=>F^XN=TQY gϗ$ :q#T^Jrct]\33nGr"stVlw&ifIՒIMDI! G6_lW9 xZ(7ޑ]f7p͔eWQ-'Ki-M]36Xc–ږaýuNߪnr*ѵ`e:}[M\He)Qoٺm Z2Φ(\(uD5Ϝ2 xP)1&sv8rCg.s읿I|:cPIW>:|螢zXnjsKZ}od"JHU7 $5P|ܭecd ImM ˀۗ.m/b֬ZQ흃 U$z1ɒյܵj՚/dB6}WMn@HƽydU+阒Z$CC:}<ʒV(E!zLceFWJ9cfsC{[J┛<֩YʸaSXi9+biMetٕH݃,Th:޴AvIP#\?n~AZ^6l0c2W^P4E>I&hV˅kZWX郞ys39`Jּ7%kݣ 9uanVj6rm)[NļRKUff'Wns$Yߊn-z#]UQZMְf5NQf n{UbBYN'//9WN];¾"kn ^oQ,Z[+oZ cc@]wߥq-!YT!+y;g^aQft.Z_Gh0U@'RCKr5G!6fmښiھk\BK>oZ{Lڊ DJR4PcY:<PssP!zXvyW:>Otj=ޓCٕfd8JeE9]')Q,l*:wWJī9e"lR#?*xrWz"o!|WemW] XJ":&1uǕҍs1 :=ۦI0dQ=S&>KcU?Xoő~<&>SYP߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-[r֟(toퟭ>P߅W (oliF-91|ǕSY<&~<1_Q/uJ~,S17?/Q/uJ~,S17?Y &2u]$.2cWn۪]"^U効⬕Y 9YD9y6ps6rrdUIB]}al7^|ZS<%NY7)8]rr:Y_.ILEC+ &r)r!l`9 \)ds83d~E,:tN6"`6sTZ9թݍ-TAfY bҶmdCʹm89i#dԓU"$}SY2*LC&lB|7sv)3@g.|^Y ˚gRjSYcU?Xoő~:+k8^F.{譫`:]Ǎ ѫ7hR|[Ƽ"͘Ҿl^wO_'r\r];ēZkֈ򲓂.:UvE]XɳHEɌVKwM˔#uyEkIjfG f [-3 3Snǝ2בx[rkI)hk3YEƔaZdum$UCGշYo2=܍13RIi;D(A29:ǀaF9N//%MUwa1[OмvmJʛ )[IfYݏ`J?DQ mVQ!^vȯC[ё穧P RpK/2QӏДJR *u̪uaHTI\lBN>;RX~W߹.wY64>+ G*opv`ZIT=d!,;nE"p~H*T\(|fG" V+vB6J?0̤#߳X>bIGm\&휷Q5Y2*r؝1lO?oGЅ%6Cykt-HbmEW/;{KRPnhֱgjH6X`"?Dx"<}gpa_QIwyo=ʽ6å~5v(Y$#|)ʄK%c!wn]"2|f ~oM>F-m]j:XK0Ifg㺤vGxDLr_N 7(v'(BJ{g\䖫evv #hVderVm s&V#\"`~rUpUN9Q)- E2|4}5 9v2ͫ]JbGY^zԴMg\ZwGyZɞlMl+|od1}ýh7%*OOw9\k=y/jZ5/a٫xLM23"MNao |[׼c۝T[+UoO>ܛ^1e&AFyR#SoqAzg]nn5OVl'u//VH{N֤<"f5w24':NpRVSYSYSYSY0Jӆ\9=;nr(jJtEE=M1ŒV ̂$XLN`!}K;1A7bjF~PcLRKp:xK6^#7]w)Up}rJyKԜF?"m3L'xΡ|Q|һ;+ V12--kZ:IsQ6pH*R]0coKlhZ;RSMҚlJՆIuÝD^2Z5_d2S$`z!(i&uU9I"EP"iB9l! 6pRs`k}/L!dZyxY4KR*2N|#g.ٺWVb$D""S뺅u67M}yҜМ]=}8![.P}~8O/$D3@M `|GعQDSl6GZS)_zҬ8YnWaOA h,W"9 IR)BR)ˌ9pnc60lgqQ|rnP]ka2ߺMFBo!m8vR r+ZPsA ɮ9q^Mg`+hk dJϮGJ5J@(:wݪ=Hmz;pԹ8lS"wVNNIC JŮI+ xTL7'|V:x궐[2%F@Ggӵø(聕Bzdr?m:Uı/Dk=M}.ʧBx]^EΡ%rZʹnU8iLV" ܼ}TKDU f!#ٰGu$6,y%&zѿvj]aԴɸGe!6-lT%Wg! t]2ze[nk"9M~sKLErB[y+cUٚvpuwI*mLu-rlUg)d"vDk}U`%h" HE]r%.sD)%n/|auuQ o):_nĮN])`cRP]5i$9/w]63Qc\Mxܚ6{t^k[5he{]);֕_mN*M lϻwjQӬ^>ls~9|3?vZ4ʒfr'Q ^AFɓtJ AmpIn|EQkgQ4ڄt|rQQj0MJ/g-#:6՜o!,Ɖ/W1ܗbۓ^9Jpl>WmS%)mXgaG#PCoZ7h'u=!"HU25WLHnٜ`f3d%=OMJn-F.2/*IĪe| /wl˨ ܷUP`SY4b?GɚN2ׂNm3/^:sۄYXvzTc[Z[<`Gѓ dM)-[A߳z> tmLؼpZ'^^sc Rf:JJ*r0NYւÈY?4|j#䙷jENV#[ТI%FטӤ C/9(We}/ %0%.Vv:?(88"{",lX8H;l311JUZ57Zr2U8t!=fdL<Ȳ27UtqZȚ<-&I vUD%$6.UCLշnۍZ-6/$XٻuF,s8UY^~ne3-vFnr +FW1Pr隻}zghYhJǻA#h<. 9G؇'y`3:hJ7Kd>sF3;8z4#g)JuRL0.#*ͰU?pO&A5+x,cb̮ԽM+G g(n rxnAtې1}xu3j4;dQttyN0dٰJe58¹.<@mckͮCn'>jE%̞´T~3la:S" esry~^c0u(C2B6.=(bv6 ([73E|Zu-bxjm$黷͑͟qOkgcfo3cPMgyxo lzUgLW I-E;Y/tLͅo0ɨ%yٱXMxifN9*UhaOӡeN++,3)guUڐpvW [Eyk<4Kwph3,;9 }!6uok`z='58gݵlc$ek`bӜ3ə5@#ѹٺ9֏9S{|U 3'T>-?rx1[2>)DYaU-9H6$]ǹM0,;V{}T߬,pjndVsT&gɞD;, \Iڰ,j߱m|>h]ev7o4]q4lZ2Mg"OIW/l7u湥qGg^֚طRj"/kŝŬq"lR٩# .֜v}Qϲ?Gt=UOW[AOO.HG]__j xV6f>)WVqqpw >߈Е'I5v)8M 5;WuZGJxQO-\4ouzFq8YUɿ!,:1ZUJ`&!XBj|0c8pK œ8LڠɄ{V옲jjћTfOME$R& B0X~:#&QCmy>J[j8z?ZK[KC)/7>w,Nb|W uN-X񿊻w\m^®I7h _:T$EJhi(g'iܶQS[+"$&9Aij%&hIz,ΦR5_iHjĢ,\50yg.1JKTذȺ?fN8t_UȲ*fQ/tl9Îw^˜ꩄ|[ܐ6F5$lg 5m>s(y (2\JXb$1/=(U *.sMMdCc.p,yEЧuw#b phʥ G6tKete${/Ӏ\k7~ a<BFϩU`Ŋټ;nko?.f_;lԩd8 .bc)M.sfyzqW ǧ5!l7n J(\J8pl=j~ PWlJ]?Yl;bkS1OxV+-qc4ru$h+$!ӳZkHІ0E2=B8 Brm[T$18zѕvv\&tTUWET{ PsO:^ƟFXgX$/nK`Yccڧ!+fkdEmw2I@{&to(Buj_ 8"5 +_qTh}y:@ 2-cvW)rSrRl8^_+ӜVgֺ`uBb_=v J$\;II25Annqz* -u6ksL7@a}IYbX;IߒSGYG.;E?]n8Nd퐜jJ]s &{E!^.SnX;lk6_seW^ Va(,San:SanUOdz, TaG 3ǞD4;ͅ]ו;W6kJ4" m2jl5̡OѬ!#DE1k1PM( ZVlYI&Z7I4h!Kpw\c㳹~㞈o ش<Ӻ_'v&j9Z1Uziv&QH!c+I7-zvL52A uwzuE'M GE־RkDPwNa6iQnYFە ? Y9)Dm9tԺZeFQА01lEjm2Q&ULBr(4f[agn-bXol5IMllFms3d[4I6/[&DR!KCi=Q'}ڞ$?xyO^-ѽ}Njg+˝"RͅQ^rr֦Z8ɚM} 3]Y<KہS (6~jsgiH8{fҚ累 ^ *'nJY2!CʋmJ޾ȡY$H֡ D] u )if=jH?d$6A QLڃSh+ޟzI/WRkZFIL-" N2&z6e]Ҙ‹1xq8<&suWѩt]xRgVn޴|MVDĎH}mj.Uzusz7廫+SMqw]V+G-IVpmL^EܴŖD9*( CXJ4F9Τnь.$#[Xcߒ6C.W<I `ֹuJWxCm}'ndz=NPVӺ6Y^Žjsf*7Dʀfxަ'M@hF$.ji3:c=Iy,2;]gu.ⓢs.ZT53dq :&)i#Z:Qkź˝&;1xG|oې~ӛ1aVs} SLXiط%S*Kn=72B:#Ri8Vea&G̊ncY;U} *I."f)qb xƝh7/4fۺғA*mfZ RIڧYZ)҈)B#Os(@,W3W6ۮ!a6m"rBARa%_Bqb,pTjvΖrLԺNjmCkZf́=VHJ3F^QOde ۅܻQeP l1ztZNn> Ff餤%hnr>U|װM9rsc98:[>Sm0%igSRV2de:~*ۥpLEU1ٜ~D4O'Րh^M#)Jfn:yEc2X].IAu~QwqV(xifT`w-dx˷̌檵I6l N{8 jAdePoqS2 ˃v|7(ʽǒxwu~e"*A%/u&f]IF%f&gXr $MitqR@I9 Ď1:ߗVKګ+rf{_Pޞ(!FEg &\e&, ]Gyp3vZ]-:|Tw;[xnէf,Z{ Σ&LTυ1߈TBvFjNvNai]sC s~YN*ճji ~a{L\,fJ+Mw'9:tz:oިu&;f\q]{lkK=AdQ3aFAN3w 6FN"5+̵':r!}'v3 pvVHYKsMbkmCMw8*`5MxI/rۗ}5r=^/c- +#Yy7˘GNQLzqC8˘v @S VUG]W\8]SdꬺYUܝE1sg=1*ǩ~{pQ6%8liivrk;I-~eZxAΰvs%UH$|W.2RkU qیfs߃9P]OyS jDZJu̪6&ޱ :2lDE+>Yw.K%)j*i&^8Pqc( ^ =D:ɭ\,2ylfξfud2H92UѤQ)IeXQ+Zf'ӮՂeLu)\q1⪎u-WF:]nO|,6~NtㄎuzBP?ҩD?ҩL}* =OǖҪ~ߋ#u/wm?C|b?W8uRh%pt۷E"ꮺ)E2:9HRϓ7ю)klw7j%Ow݇J|IFcl;-h%Ҁ3ykbmH'IqY'=uE岧)1 qʽyKu;_rv.ƴN!cKGR)lV/cf I(]fq=M-wAԞҏ:HښƝy2Wvv*QAɣ8VQ:2c%aeU:}/y)QPxj%Vr\f?U侢k NBV~Qd絻|sݝQ.$F/d2&Y%f‘iӧ3 RLnI߈$#gcOrn~??;{;1_?NW@=՛?j3Y>{p"W:"kY:DPFJq'y 'n\->-ˬ'̩݌sꭋ>1 Ft?%Ћ<ΚqF:WBSej^9 B׹e&T]ҝ >>QҘh/frsJJ`6z웺WTĔOPJϵmhNr&ԲnptdB霥Qt|%ljo}6FschmQv> z g;ԋoHˇR.]'\hUx NvGڛUxksR4$Вj٣Ndge^̟Mz?ݍ#fg?iPѿ.zt/hEէ5FU_&A)h 2KZ`HFxx%LѪZ֍w'/Iuj;Rȍ%GyR ͜$٫ V3SӍvVqLm]y#._-C9m+s~-ulSg#Ozkٞa\n,k}cPn,%T4S;̒Q"'QjKJͺb]mF-f1KCSsׁ]V=,Wr#_]7[m_IQ֪9 U[կgSW/Mj)uٴS5.#bXk2h7ÆKyv \!l`a8vDz)Erz^o^7ru伃JJT+踈s2/uy%;rS1t8p fSYC`ʛfh1TYdL}]"1VFPIwGk{̬[\1Jg9s61y^b}l+GoR΋@&wS-OV頦w#* mnyM חda@u[dP`̈́ԾHg9gӺt{Jc!mroQҬb7-VY*"8Ff8jV2chBW?/q֛ Ѭ@w|#U^9B׬%,[%($sƭ`sBHhh.Se9aG]E9ӆ;~ݭUumd`ؑu]ƉI]0JrT),XRkIhh?KJ:z8Ym^ƿ5ve`Ħ;Z#YC9hW nNӸUQ!e0Cjյ孛')]Y몑e^4Vy--2n*gdd9[kzUhYwW^N}]y_;y ~mpGVyh!Xغ~ZϥA%#c'VuLU]LW!WcE`~l ceٜݥw&rdݞe!,wړs=Q0[ ʣD;Bman֍-,԰YYtσɱpL%|7|^qeZuݒ|,Lm&eXtW'3wٷ)r™?iS]~qė'51&lL۸!#fRȻP8j.c]Lf>y exub.(= X!싞91ʆ>cʳ/ȜX> l9pl=ۜg$˛LmD[٣YXTqqXw F\mKv.di]G dG*:|u:{b-Mi查u,TD,/KHRix"T/}Eq#1/\պmqŲ9[o"6t^7j򤬃E)"kKq%f3v )?FTTQcX5:-~G,U[F`Jٰ,Q+Rjѻ7)N6|?: 隳QSAOwW1 K)59)(zbQ޿I%c/slRW]Xy/dhZݽv$l)WwrJ3^;׺&uINQdqbc&lwEr!cPta׻]C`o@L1KKkڹHR,eX-]l2"9$*)e|YN:nIF$AGo]|bTlTH$.Es'%:#)KQ&iMOW|oy&Hl.*[[!3EG2m u3JFL7Lae6 T]-U 5BtZ-R^qZ`+0W91`Uh:xd7h9R)_ZRCVEUvaS#(z왎#7)H:H;ַsR-i T~ɲApF3O2uc;ë^ڐ,BnDiT8KFCYݨ]Xgq~N a g{(u'zt|sQEuèG[Ppe}2ot-fKXj5sVL֜1:j2q):ΗjGjrnt̑}pAw~@?,\Sv(Yh5ժłN>=LwZqF3Zvt,|,|Vqɮ t9~po2|VdW,T-Q_¼mHW,)X2찵mC=ey7ULYt%lUbEAnWhhxNQ7M[' q̲=xmAhm8J/2Nk̾}uRLDQ4?Xnu]C!r|:ۺzvk 6&.)J0r-2-qlW+Ā~5:xn'a[eԚelzߢ_KL1"$$ݜ| ) Yo# "F=y#}yl6XMYܡ`-|dhvqvRЈL64~bSeܙc"d)c#0FtyKy˷5&wcLEi6JLMg4cXulmK6vqn+n0PTuJnn*TI 'gwMHy R"iɚpS:lsCvr<׽n{jdזxʽ ˪uV'[ezEɑ6``Řܷ%;¾|z)/9OF+b[Sn-2odZnF0n1TʛF@1̌tꕮzTX7!Y٬ Jʽj5h%vMk>a',lDQF|Q:mnX5)m^oƀ+0yR=n=F6X>˺Qhj| ͞__`7\h=JsmGBD{bo[ݣ!(KK{RtF>69 f)Uo*oy-uԚ51_]LF:zڵ! 9!^3*k\'bْPJ -5;¾AU@jݾ\4"4J@%p%a)FM%Tel&yTtEp h쟸gf v k0k)*NsWDk ZezDuMo6s2 4L[IeX6WES,NkZu A?2.}@=tn_SCRאV*1] F}KJ38ޛG2bjd?dU_Xz6UgO3`j̦:n}tYʉ1ő4Az.@&dVl18#Rp[n' 3K5N V7>RKm.0_?&WT"x^spm oR"#[8,SkYv$+58J7 daRاVo5,Bmm\S3$Xvp]rWoYhHUlzpي5+m0gźdWyoRk5'~}-3ppO8hvq,4^ffet3(taBR۾kk+_QRƞNǩ&\,j]5#a$uKx&jXkIccx }cOo6rVքNciҵq٨ekky߭V"/pi]sSVq2"[px Q_QhZk=uFR G-7 7-[#vq}YeMCŠT%#4v!2^qjjܡ7\unl^7B15یl|zZA#ȶ6VXhj$% ͓io-?ˋ?N^S/ 2Yuôaw7k5!ctgO"LG)S{KZ|/W|VەIqHw\`f#|Y*v|>Pn-ܬZot)l?F#}Z^D{^p㑎+tU?ԧ n~s'*a6:E.ٔ]ʾH;OMBۖQ~gzة#c,J&6=QG\&'x:u[]j1,hu6JBk*\l xYd. IcZl&,&^1X^G$MwW+$:9d|b뭧TwJܲ%2D|pr@/hw5/ ZBڝ:ʔ"x. #9)[ԂE/x!TryuƝrs][}kĖȱhir5JNS)p"B͛G ePCu鱞T3mNLh&aT1U ٤;]TV5x"g=]˖ʮ /{l]AtU41YdIBkd"1r8Ȯ2%:Wpk:6Gv5I: sIj ^t33r/ #9\&˖`~^=[x.޻Η{ԚebzĆi&7k؇ 6~G2QpTڽv ywWk}e#l;f hMۇNwmd}rH8YLCkNnAjh|Mtε1`U* 'wzߧ4 LTlcbzgj+{c4+F+VzʎI2de&=,nQ%MBaпl.kr9ɻgupD9H4$T"+gtw97Nyn.wu['h:j]U㬌 hڒ5Ux8ŴCLĹTXKC*޷Ü@mho#<":tUOcuS.Fw-lv='`1m@k}.F׋jfmirJM5)8%|[% fM$gg \״DcFjg-uvmLtFw-x_Fd dHE$*XXJ,uJ,Q17?XJ~,S'#I=gFTՠ۲!!!Ղt{E$$Qq9vdd5d" 90/[+c&6DBgopu |r'o܍K/PMpg45,y~ ]ţ%.3wF)3ߢJ~J]U Ԯ7EՃ]ܓh< Bz0\֜;dI6h휄TT4t bk0CUz=\.*e5f6[VbĖz ] ]97-g|04Ij! .h=+:ty:yyW+MR1^SP.X5IoIN+HztTjJ_P"uɭO5ch3j]md%~Bo;)E{ahjѲ˥$`XukMt*xquy{IP2agâ^)X*uk:6q~F!bWXNe@2|!@b[DMWvD+\m;_]V pKD,\zZDnfxtݗmNdQشU™D,Nk/Bh,Ⱦ]EI [Þzg8wP<ة R`O䘳hړgnɹ+дɈٔNlϋdsGM6y]z]ճaz;k:4H*-McQ*v a Uyq&R AUcjeYMO&a^5Uڈ"tڦnK2h|`<7M[8뿬:j#Y-hTZuqsJMHxsT3昄]g8QW6J$tm=ˑfLw'4>UQ`l&U'IjTZq3!c%]h^|ߜq1t4/tKf6y8'3R>] iBHNN@-aWBW[~[˩6'FZERWQof>lN[@!^;85i[ۗ3r#NlaL#M:=3kHFM2U!.6tpZ0άpohqyq'w})p87HnÎzwՉ(l+i;ۉag~nGwWZyO>L3IWR8ǯbM/5f֝9"=(/Yo&b :zz(&H#!#ȝfLl2IC$clcL&!3\YX>83m J*%iJ#’]e8Y]CF7+Uo6C Nt?Nd5êR\T5%7`:׵igrXzέ(%ݽ}T{dWcW:leF䈵nu@eHyCDn컬NSZ4G5rݡk䅏*.SOo{7Mr[2sM(n$+MH;Efm%k+pV%^UDKX ټ \w-880=㌐vW+i1x'$N~ K )29YH9+t+MӵI<њ gIdV t%`,Xޣ퍑2骩Xy=vX[#B31/k}mO]w^GuQ.TJ*'1ҭlξIx[BD!Ykpn}-ü^ߓ4y+&Ym%.ɇөqQX$M̃2玄n  Ct- E:_N>8Z-%"iYvkDZp2˻Ca,OjH饡kN_XNX Op;mq4Al}# t֝eY7+Qp>p%a,8X˔mLjRMHm{{HZ!^Rf=W ;~X'Vc-5:ed b;Z)ntd-x3[`ZgP64է%'l[1m"i:e[I T搓< e7v+jQimI͍]kRwp-tV1hhrȾr9>pAě XL7ZM>Uqc:n5ejT%eg\ä=ߛ%VHq2k/<CɸiOS@R*aj:ᖍzI1Y̓5%*&-iVv)YdyV{~=6d=%RPmam}g;fJAJ<jR%F0pv2fR:6QdhǸ~ ]@l#sis|zܰ*VEjFA{[>RRlR̓زRx! k%32:tym֝2Sݍ ^RbǪM9ÇMd+t|*I=~+PK?ti|\-ԗ}W7̥!TdRu&rqӨ5qWCΫZN^.6+4-'YTSS-ro}i Qt4UULǪ:AgqՀq R ef 'X,gxN֊[?^ V+V,M=iru |[{3NVx6G96u?F(5TfW.fnZ5?;exHXz,$4Z}#"Q^Bz}9r?PW=KqI˛ S!ଆxn|;֤XW!v)u3]X>7_QOO)FH%"jm,C&3sKw-X#[$^NkyrǨ'MWk^|:6lk:;Z΍: cyJXC/Uj\a Y 稿 v7ҕZVz6r-k՝PM7#uYPOٰpݛO$::Sqn<#\m6R;~ٴ~ Ͳ.S.e&^ž=Z!,djzY &ZK:RiKm嬮^١wu%ikLvo^WeCHعhɸ xg3WђҪ5GA'9 ZRKe9!guM_Mϫܬi{JE~\K4Iv _qk]ǰuZvII˕n#S*eNhrYg:q7p51[=WnGuSImS:bpFM"Xù7lg\I'Wkpo(v*/ONLRwFkT99 kQlf I.ƻsU#djL|xW?߫gE? nc84WhQ\tg-XxԔ>UC[Ʃo}qt" vB $UHsy- Ng158v̸LH&T2d2𩩒'Lw$!{cKٍ,:0GrsW: }/*_<ÓX6{ʶIĩG)f/+eg94K|9MkDޭsв1ғ3fXJPsYofTqYL@ٽA:iV']풁^!IU,E*1-9.<ݦC&'Kԃ_:_k*cv-SSV'墪SykVmD;*=I7.< ä;Lm 56ڲg6u)Wlɚ` dX=i-GI'L^$G dN\"&qp{6 Zo5v- '"{_bb{8MFi#ps6fDiK7ƞuý5cКW~[}_^K1$bAW31%r@f ͂a8{7jHNB4[ bW]5tTXo245е3ςhW.=_剱)-M#k""H(fIG,bZH.|쬺Pi5#7U~k@H8ee4:l3dks:rsݶ'19GUjm37t'ɯ"apmKkmZoUN2KV܉Y#;'.na#~Ҙ68v4sx"Q;#W~F›wXH5fsl; F͆OY͒!j9eGSy/z7u}CQLr+Z\m%l3.02y`C* ;qC* ;pDҪ~ߋ#y`L}* =OCQoewG~y}%v-ڣsU9x6 S;t]Vp넟#UM;~)@_gյGW{Fl2^Vmμw_;&u6Z2h4qpU «5?Y>}+>'|?[~?tG~r3oZVNFҷ},Yب4:bV_CN*tf$S:@Y<>5\ɪtb.H)I&̝NIR T]}XgfXU<5¯]go #?g?<oy>_~쟳^kqyT_{ıyuSӔi CFsRKTR梗^*j[Iq$:JEgFv2:7Ѥ?||?uNN]g*&<*i֕oa»_Q58j"q/EU#lK~^ 8x巶?-*M'{>?xPJw9GWΈ:]uKh\$e,ۿ |ڛ=徽T)/Z*JNxEX\.qQ},xhj"r[Sqib=kNbb-ExCT`Ğ,,VS,Qxgt$]$s(CL ruIWyfWtkJeiR, V).F9jUJ1d-|(!?a`<ӧ Cy3H cIϵ^Tn /Ml-'];:x@4-=6Ak!|wk#xW{Jߺ.$zLyF§U--ϛA%YT:j'6FMp#nI-Cuy/.TP391-/d6tXō-V$Za eI  A'xkN9=u5U$IM3v4eK&/s7{ʗ9QSS,K !?E^=uMj#W5lDYyV tf1cH#$$e U3#)3qH[6j =~U$˭_`$˿MZEDԐrf,˅lA; 87o\eiEWX\H /N"n>^2^?'Z_ʿl.xۿX>" 7ž-GF-ʡrL9pbEC`2Cg;3wqgPNvr>{3kwHӹ{_{姒dTHymLs xon2g#x.=IoںsC䷶mz9Gg9sns簻fX.1c1ć1:~+x}x?d_"f8U?`v㨇U?`v:TaGUOdzat;իދZ\H+̕_kcLNѨEdcn ESYSYrDNM{Zt^bl}mJMXvIMJJe Ѐ|[c7@ B2)erۂlTcw?u;s 'W -֍AX" Tr@$v1\$Oݧp͠2ťԨ6Irh3Izܺ)Ϋl$\%M21FmP7n:۳mSӽ<^=[|.9fӟNe %SeO$;x{ȮHT࡬=1Wz{I#UrUt/{2\Elt:f\ub-`o"̃V稭,FA\,)NKx qT+o 5=s}Yօo]XF; mkLx*˺$K3q)8!28y`C* ;qC* ;pLҪџᇩUO30>m:_:SӴj;m]f@Hfk§Qȶrh6K Rr|f7v߲n>-u}qZ$Ϧc8=YtII;H6fl$xC mޏu4[oB@oi÷fݼbQװm&(F3| 6M"TC)0O0Rn mmێ$íU ֆl"Dt2vi>q2K xX8Hyoꮬ9+9 9sU{\2n-ҡBnvuLJhIK];ԆDF(P{.VsNx{@]Pܼl]z cXv(ReJ:T1d!TpgcCP4$g쮫+/!tUUJV&6^wZd\hfT\Rќ]W1G5d^7׭oW])ʾۚaZ,25iTZlŜ2E#c'.S*sȢ9Φ!ꋯc]vrA<]LQGI96S&TغvM=$qR#g*Kq::%-D+5"C#ݧ"ɓ*6CX$nPUl mlm4ە}nTHwN1MZaZN/U+×N8HWGD@ɗϬFuZ >-M$+,EGklo2i^ b*,V3+`K0R1c1161605C| \2W7bDl1й\lZ42fhHJ5S_42l዗μYUۜRƇNjD\vg$nk:RJK^"lhG*@[i˼lx)]uJ~AG;KL9OWܻ@$*ڧMM"~?)^d 5x.\DR'_[Q:'HSv.h4Y5uXk՗ɆRPJlC"%|6&bH=I>E]x; Kߪ(T:Hw][5v5, )vx"O!r<'/13{~xW}qƪqֹ A*jy?gbW^YM">)ELI޾v>jrJk\Dimtev \-\"1 52e"fLz8M2$R0[OE6S|k XB<~&"xS'm*J' G>Nj7-/ T)>}2 4–tu62$WOwaԧ i Se%iRo$WpGu7%.7s։Us;4󊂭kRi-NN),ةUv)g$f eQZ6,J$⫮>18(9.דmu͛v+#8g]9 rlGS@{ФnΌm&CS'P"Rh3vd)jݥ,ܑ7,aVRMtTLMMUT"I%˝b4&҆:HB1l.3r8U_ئ;:Ctpc&o5> 9*HDRǛ#"dƓm.Eɰ9}Ա+I\*5|Γ1Ujptː=.ˤ $9_+ jH%iʖ-ɘ>NJQ8 & \=];zٷ).uO~gZ!ir6m)dՓ=4H݄WakЇCϡ7 qG H22IV]V/[8;:K"_.2xtlSG<8+oL{e!3Gv%bh[Oٗ22wp8nCErֳ)֦UI u]כ%Md592f}=vu/qFq~"WFq'j}eR3XULTųGĹx#>5j ,आa:|Ju,mukt]'aD\+{GZMXunu6QZsгV9ؕ$^S%,yuUiLh^u+ V gc!\u;7bPf?{b褜.U5T-=~W덗$"`BuFFuP2bO2a8Ia,-UbE\빦֛ޖ.U㆏Ng!qnӺ^WZIשG:mJZ%"wn[8M(tTvmQP JKǾ2R*Iddᚽ~i:fl飄]騊ɑBKbŮNqd- x[EN4Z`k&'qsA8סqjF<hpTʺY?AG}U|rORkKnfT{%9],hFcHIr^05-ͱY[k6f!--M?+ RXQ'JNpKMŗٚ"(Z-E>؎wdwe~wG2kbcaJPsA/Y? ei6i;^Hbˋl.)rNYnwKfOulXkuv=V4U:.`.ЮסmLceb?;ne:gSnjfћyk&qSeq[v ,&j{YV5N:gR0,ŒtYf4@~vȝǧN⧱\/g=95N3K$TH&IUb,{qbMhY[b c6ΎM_4ےNi{FeS-z2&aOUdFeAxʈ(qg}sD3w^6ڇ`Hч7΍RV-V$)wDC8{fg֗}w 7{(r;F5!L7CGQV)؞ggߚGImd?QIGY.扻깙RHUR688-t-1v\8NE $Btm7~anz~bUI RlZtqN6M}bc_̫Xk*`Mmuϫ~Ӑt۝ L봶-̤-LI`U89nJO6`{[--?x3w Em`r7E]KY9MgO`ŗU+93vPAHOF[W3y)ݡ?ҩD?ҩ*z,T?Snvjmk+g坥TrU2S(5.>PMOMBkꭶI)Wj2 ڰr*2ѫE3,˿3t("4Yє9t'!NM iVq_ןN{rkr5C^5FX?yuc?68g:ΞHyLeƱ|阶J1c7u"6: 1th1#e@8s G$ɳیP`1ی9~w˻~N};9-~Kbx=Ov-8kfŧg<5gKR)y1E-l?Jl4l^)r&՛&b'njYfXbcb~ܗ!&Sp\]Ȯs$j&l`1 V6´91 Ws$UPESg'ytRȦLv)PHʯf;ݮ\iN:䴫hs~5]9ִڥ&?f];4O7aǏ{IjA\x{RMr+mw: Md Px\Ĵr2y#\VMqq[61c󱦋_,728>Oˬ8 E}(I@B #SN#diX<غ9N?scf%]k%6Q)&q܃X0g!SJ,^89Q\&:Fs`-_tZʻp\Tw;65dDyE棱cQ67#1{Fz (͝%iIF,Q#2(6:FBkW˙I Xh6 Kb .Upi2nPy=Ň[VmaEo)[լ[VY)ɭS)4h] 9Y$ 񟨪dkLr:q[eVcĭŁ|9 NX;0}̞Y+@7n{r93qֱ7ye[+ոXŸ+TۖkflkXh#eXIJ +MmZVW+[ &e6kvO*/SAC*x.N':fTbX!+Nnfl2!bb7lE$6h.h U)YB$ s՚n:gѝTSYHvMk#9)Y7ڝ$& aM~+d]9d]K u lEj*M|y%***ꥌnɑ2N6j94h6?vtIfjrȪ+&bSc92\5:_8iբaя5gSNa9c2|/u}|y_z8n%XxP1={:MҥaC)]t4VA=dwq*nE1ЇMcimQ|9&ήdL!lI3iVBeӗwߤW [kfz-Bq^YFY%fRPT:H] 'd׷g5+8IoVOk;en&-f:|T[ _tҫ3]Dc"Ut͠u SxBN9.XON=V?el%s-L;GRSYl (ֈ>o2RY}^M#a-M07c=T3v;X[YjVSz4urb+H`Z- G١Y6#w8y`.^n5g^ǫ{Wnna~FxlsJ[LPM-4ubXፎ?e{)Ǹ3`EgnD5Ag.VIf( DPAIYeTSI$)1HB&6p\g#Mz :qH{EcS_U,rV}#,*(Rj**X[,g597NռCՋ Ӕ@VX<ˈVX]Iě75DEכϹAI$d{k 'xsO.^0Z4)^)z.}Ծ),lg/n;륧B?ft%FjIiUt%%L׶ hNb+ !6b=̑Tb-m̉t{405#whM[^,O\,~ nYZEpB%U&˽MYGFQ{Bg.:}i-uxcż),P.<0;eZuʫ|1LZ )VGbɊd9scn%lk~kTH6%?TФ.WZ־ <\jOŵzHXodK7w6LZE[{n|C~4T1/mwV!N[gw4LG7ioN6k۬p5XdE9x8pn&B,̮6|QS=}}^ۛZH:E6ac4YÅMUS=f,Z˶`-S)srYܑ}e;vL%0j6.\kilQ.kjSlovƁVݟީ̩[]Ve‡I,N28IꉜSc;'4vB>AwpOY;HvQ-\k7pIdE9l:&X:Gmf_WVb2.ݔlT\s4h:=fͪ)7l$E2&B)o'׊TRpZ:UK B)GZRd"uDQpeHߨd[jN&jyhFmEu>7u2Qy$B1#Vzr a Uw!Z7h \b#o{],<Mjm]bY$۲T/2rddNBh=6ض8*i*eqCeU~jAL#ێ };E}quƾ#qs]9anyq&wfv}],Vy#A{u6LRksV+0ݫx' >̒Rgk6[Kхh[WJ-"$+RRmX!TX6ls^ PY˕nٺJ.AeEVYU2TI$cRɍҳi_\qӕ>7̉uO-+Lҙȵ4FZrZ-{T;+ KLɦvL397-)܀x%찻/i7o#$k7r 4x7VIYט#uNk]lac76hS8)S!\|,Sc%2Yg2^v 5KN~K֌5]JKl}m1xМŁVC6m_{"R[ۣI oݞX۔.R+,v:](LWb\f$Ru*\|J:7N(-FVL4j{bT(H",fv\S'˜ʅ11+eW$cIl2r탢`rtP63FNw|N7>m{WYmjzp~NS_NgUlЏYЛ֢I6nJmm3mԞn5vߋ_z,:!jR6lhY+\ӎ`"א Ƽ;/ML;6.vM^j4d =6ič̞#Z{ $P2N0"9o{ >nr<%t}cY#QkJ!SZIUmjm= \t{} 4lG1qm6Cei5 ÷Pmm.`!2%Bl[=HwLug]Stmm_2Dl:c6RĝB9Use/V*R1h񓲧>z 3'4gEBFQqɉ椖MČomZIw]Y$MEP!Jlҫ;/dWe6-T;j.[h~P5fJx)  HQIHJ-H(txCɄ]vgl]P/+|#fQj2xbr,gAXO֦b0Rd9hpW $X,ᛴ Y'8dj gW?Ǹdu>~O*3rUݝeUkKAIlWARZ%WEBS4:Ohb]UߣvJO7Ao돲cbB~ Ս鈲H: kq/RpqMRfjATLkD;/A6]ɤNwFJ}D16Y$-s*w|śږܗd+2~cy%uF՟/ 嚡^4У7# 2 ^'M]]:;ߪ7gGUѨ;ZԦ[Nu-Jn#W/dzk;jЭvȤ'ߵlk I Ŗ!d|g>Ю/}?Ybx{=qU?`v㨇U?`v:T?S/ga|#m]rr 7Ӽ* Tv IBc 62l(U)Wf(-[^'N\39413?ab#ȏi{vXf&-[oݕ$Irc1l>Lcg9r1"=/;5zv}]8gpf_w㙭M LN-ٞɿov1Lֵx?VūY_3 X\9rǘk{&F|SQz>91Wdqw]Ҹqc>|cй,JbSm:˜w’Y~Mvc͌9ǜi]j퀆J5Z)˃/d4kC$BN Wcw:qV&!5]UmL ^BY, DvOH*,yI(>ogMDocyku|zvs?:wc=(ލӴRŖrGU[8=ݴcJNjjNM*Z53HkV')iq; VT̵vAf*O tGQ&G18rs%uudS*MGkcPO+6'۞j=hgH2oY]lR"Y2Y"S7oYE&ҩ)|ˎNujO1;|zUgm?nxvט6˹M[ɛئs^)2ڱ똏3?Fj^>.6%–1a:GؕMMiCxGͪ季tlf&[*%ZE/flZ>Wjm 4!zvc-UC{`b!Ye̤MΓ=s{ǁ?qӇO^>qs{vjPSj~jTYvl+f]M zNԚʥ}G`ƨ:zYgTk^]װTZm^!ӘQeŷZEv1xul#t&HORwU3.7OOI4ԩoVIk|SB&)2wLKWT~n}m7IAAJ7#2Q3$u9s>tV"k&eŦw uNnDWȥ!u \de]#vt2~-"e4jR)9k{~-EfsύOl/:Ѵ ; !9`}Y6tZs|K,TEʮA$:rWUly]`\opYsߍw-no_l7uSNqj*x,\qA7M0*&h;BKU5iW[S5uZN9~¹"*)Æ1":)̩GD@}G<ۛ]Zu K׶v1H&-aXgv9F5DȊ!a#M7)mfCZkV5! [r`Dvh3L꺥C9}۫IP^{;Z㳹FꚑFZ1I6R˙ [e@tBB6J9<6dmasa?_R@ ҎjVmQS-rȷ3BUSML%d!^13ҷWl>t6sK͈nm F'oplTZŭ-E"C$\|u%4jaN`V=]yGj$nCl#j7헬#]tc]VQTrnQn̉1Գ|UnXܼ[4ua\b!ULȹżV]gό`Wf*kNIɘ39}=F)a46N䕥$_R (w؛Fx9陊]ŗ$'̙Y˕2]rNg[){qّ\@Oþ*n6h*~ hP9H! T٥qq$]f 7%Es7f ԞƳUw5rη9Xo?V׭"D+/XDb+88=3pQl[W!Ryz&7k)ݬW;~f;bygoI8h״.,^)."^H'%-(sɨFYKţfH\a;b6h,6}fJ>s ;w Ts3\%)H_#z:s\ətrTrjG2LZ!q[e`JEg*QҬ$6RJGKG\ݓ@qwWvqoBmv1U{ 0YIg aiy)-4FYӧz?--COam@[ںcb!{1~|A;PFIlBsATSHRkv%= ݳ#7\xXV9y}{Xwk 仢JP2,#^0H.ގPw<]3OZBмؓ\>a X(vU| tPdsVݑDϙlm? ;Hĭ|e{5rM$利G.YZ1iRIݛmo^~O3a!2sX.ڹ*jK>Oa< h9)[f*:3;LP[9oY;h̪Ml1l"l,3IrOzF~]yi?H*82RHìHU_,Ĭq0v=bIF^{[Yntc6䯡&>M}#ǽfֺd°l{ff;g$" /i$QbRkWQQ,?]5IA'[Ot$S]-1t鹶6}Nx2y:=9tV"lj3&nΤk)=mf.#c8鯢mɞ&c&ũXR'i&v$/qK$I֘ U]X*"+t#'L++p>G֦|eOs$_l2l4TϜ4]w*a!U\:"/x<'mVxf:ݾm ϓzc'`"S¶3F8JS$5VֹINa|ӽH**GQNS,.=M&N4KbHv,e,Mm]dWe6-T1ǔR=vPcY 6B!+9w%u}ڃVu:BMptY-lƴ\ʯ\e۳!_}*NW*̹Ƽؘ)K3ޞ7=V7]ݹM;r}(y1p/7nI$C3k`Ѭl=eAzG:8ZսJѬRΌVI=}~)al3Ƈ"Fo/X]C}1k5qk_"BӪFfvrM6ڦ!xb۔jtRmo!UYU LB5DRBMJMOuGuy׌ゃm8Y7^g)=*I%mSnH+QAK 4|LZdb.VƟ\m1΢cW\d۶paɖ/yx9=Vf)V5gK5'%}i8x^Yͽ13&|Ϗ338??0֙(GG7\_|,? }iJYcemv2Z=DkƵtt[C5®$Yä].DMA5W*]NgCz{})s\^o܎H؊Zς/R/iǖ+1ڷmMKS6Pr[:4yd>-/TS0U`\}6H-1"ga7 B>lUį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-4\*W랿%\J~@nI|u_%~n?_!Uį-|#I'^ϟNR2H~)9Mybz&/Ì(˜\Tn~r];$;H旫ڲ*1 EY=sYIj=b%]~]0tc6AoN:Ŭ䪭׎oԍdbvR>cI7 ٦|wJd{'m td[s=3&l%:G&3EL| $]yNkw.\6ɸx"dp>҄{w*%N>cɸK>{&9*ݦbbtv3ǰq/S298$?`<;wMX62bcwtF\5`O`_$Ns,w;c !W̚MYI.ћCc970!YǷ\D˧m{K $vZ\b5v)8djF1Me1;8ӋHpfĕ7-#T^5ɹpT&UrJzkR4`~x μ.C@Gn1`厪'=S'1ڀ&>SYcU?Xoő~\t5WV?G5tVr'fXx~ёsM>JjvH+_tՌƼG^rL2ŒuU\kp"s˥gydSc͜|3+tw\w?zjJsVJ!NI/\xmH0vr0v~Lbvl:iu|:[lnN_9UZ.֠PDŠMl~Jt%sT,;]J!h2Osl Qn)l./0Q^% H#Ӻ4gksFڜ5H]AP]2,kh$6;:zI#c+HsaX8ܐ|tկz˧-aunWY4{sؒ w,|ɤNӟ>b9.:im; a/` ښɶnEw [1W\xk9%$5^NIdcOD^Zϖ;/Aw˖\tMo*Bk4[ۜXg[*z=&Qq!%%p Dr{Cym-=exgBm5UfѰJ:#ujyUsfMgXnQoat|m3wg9lPq뤶PX2+a3)*\ggOgρvsg/':yg'U\M߬_E{DR/d\>lm}%MHYxly#iy ^]w]I&!zJT /ڸlij)9I<]Ta|3vOboYf;j)5MGpM)Dʉ`ߥ\gڏiؤ#[躄+ F2 x8r1YaN5ӋW j\W١b!<S7^4_ϓ< üwª;*,7r|ڟiK{,[U *qXJG ɶ>tU]dH!p@ָ]9cK[ yQl6UU[ݳJ+uiH&i(w+s+ u}Wvꭦ6׎;;M6ŵjHQUܪ2r-YhlhmVo(2W\XFw8-Lױ6Xo{ h{SUi$O1H9yf#bOG?(N[YEMXX-%‡ ; Vҳө֏$LWpL۴-JMw.Q#52=#@u.\X1Dg91aO{3/f4<?.V&\O Hca<)ܘ3d6>1B1HB&9͜)q6s391g9`v8pwh&)Wjn1 $c9.| یّFY:c!PM|m(m1×%JG!M}2G[L%vOO@q}tevQUn\˹U/zGjZܞMmf6$JNZU g:F "#P^zDJ\5K2JP BA%OZxӺY9Sòշzf |6lDb"2g b]6j4\ |n.zǔ.N_yY_\AKWٯԚe ڏoP<9$]KӜz37qύ6􏉻{ o{r]ūUG_v{dYjr$delIet]rqwnTV_Xe?w|m7H+w]ZRjQ.j{W$i" $q,c18gx+ѷt8DZjQ5u5h9ޱLIF1 HF,] %SQhu9cx^䥢vߑ&jGaʝBnJ ȓ'q`Y\(XX,ul8uu$L_$sE 5o}֊pJ옮'ּ4XmZ@U!'ePr "ֶ[neQυ<8H|̍Qw#o14 U66H`iDVA61NδVMlGì l>j (ꦊ)'UUNTLiJB|1>r57g#h,r ۪8 א](8AbaDAB*7MDbǟ)YUIYuSE*i&BQC!K>Llǟ9pXӋow^%m.-jzb{emnhƓ*@:vr.ܷ2p3'̕yRݝeotO8^;G4qkTɵ\4̓t^)ga Y9AF4͝gCnF[^n5t/tipNf+ͻm">ʔ-O8gz73%.ouF-'W vcܴ/z넜wQ3E 5}Ћ7:ݲMqOWno#6֦d|kѓfOw GbdeiKb  PZEF0lL$ٔ|{$hɣtTlH!K`[-znrY>,LIHQ>$t1]Q9ʹH&C^>z~A+)|k굲$bbؚ!vҬTYs URQ̍˥!8GtZj1pH$5!A#NB5YB`MҖvdX 2oPLh.Qtm׏n+Q \̕tN#򸀰$e G!$m&ȫM1̜a;3ڬ޽Z$z&FFdJ˶BFiБJ236L $Bv(MkqT6ꞣ؎=m]LkBv٣7 [jx`ɦI.xjͳr 78{'ڛV/98ݗI4O 7VKc:uj*Qn4Yy5B4^IUA*5Hb Pa ٔTD[$TZGǴnѲE*hB7l>pmOv߰vto~$ J@8w2'󤤪 N`1`!Le3s5Y\WOq{{KZHݓv+# ke,/~;gaOaۯiQ$ddl$sxh11mh݄tsjM4lvMR!SL!qPzLi#35FPV+}XQjdfL1Hrv)qͽEy'm j{WB\^3ft95X+wvV.٫w*2-3.g6ZshMc=_|B#gg$HRN=e )3Z|Dڧ[u'\==j-_;E:T:٫`f/62W0fT9ѳ@hCWPo;-eel{8G>HRk,7u½;jGӉ;g6Zͷ+jSڻHliǶ1h<$JG]]&Ѭ+37:im\]wɰ:Uyk{V6t;ɦF1w,dpR Ȯ缔*]Kb/N9 E[ӕw9=zx*tq_AĜ- )XF:YFekC52e#Y}ۗn_ۗ&V+ 3qB"(Eqheh8`X"Yv@uß,*Z}W^YZڵeck1O mM[kUY)7!P^GsHl14',|o㹪sؗfqk sN7 enXeZV]+,S'Žuj1 \uJ~,S17?/Q/uJ~,S175Sd#0S}`(qqoZ`ygc%?|WK~jY坏`^\;.媽fv?]Uzp@[,$YIv-U0oZ`ygc%?|WK~jY坏`^\;.媽fv?]Uzp@[,$YIv-U0oZ`ygc%?|WK~jY坏`^\;.媽fv?]Uzp@[,$YIv-U0oZ`ygc%?|WK~jY坏`^\;.媽fv?]Uzp@[,$YIv-U0oZ`ygc%?|WK~jY坏`^\;.媽fv?]Uzp@[,$YIv-U0oZ`ygc%?|WK~jY坏`^\;.媽fv?]Uzp@[,$YIv-U0oZ`ygc%?|WK~jY坏`^\;.媽fv?]Uzp@[,$YIv-U0oZ`ygc%?|WK~jY坏`^\;.媽fv?]Uzp@[,$YIv-U0oZ`ygc%?|WK~jY坏`^\;.媽fv?]Uzp@[,$YIv-U0oZ`ygc%?|WK~jY坏`^\;.媽fv?]Uzp@[,$YIv-U0oZ`ygc%?|WK~jY坏`^\;.媽fv?]Uzp@[,$YIv-U0oZ`ygc%?|WK~jY坏`^\;.媽fv?]Uzp@[,$YIv-U0oZ`ygc%?|WK~jY坏`^\;.媽fv?]Uzp@[,$YIv-U0oZ`ygc%?|WK~jY坏`^\;.媽fv?]Uzp@[,$YIv-U0oZ`ygc%?|WK~jY坏`^\;.媽fv?]Uzp@[,$YIv-U0oZ`ygc%?|WK~jY坏`^\;.媽fv?]Uzp@[,$?EXl:Lg=9ufJ_eݟ.sy* ;qC* ;pDǙ0o͟?XJ~,SXv6>?#D?ҩL}* =OǖҪ~ߋ#?ҩD?ҩL}* =OǖҪ~ߋ#b%&7s9k;"WTxgϠ̖TcnɲDuU Hw0T.WBefAvpmHhxYnHo?_EFwl.a[ꦓgTKD)r1NC))SKgq8n6wz/W|# k"I{wyxoi 1xRV îtM>l;l5a˓qD#&sR*d*1 89 9\N=@ 6]Ë3W^˯&-rUida#̵qqdc&Ծ# V%.0f HiN&jf'\ cdӕrRnb?,i w PĈZDz*Č\ \sAjԫ/"7T=iO K.u5wFl[6-($cvn8$jC ݨ|'$[$O!NpPb5J?tnegi2!)KI3p1Ut$$#Ȱn!}Y:Zg't^icaGK]$vfJQi~ݳlLqt 7v\_׍bsC{`kLYH.WƨrO5m5E r>60y dҹetdMKd R 04T )yAwey(frŽ % 4u {OkEg#}l!|k_+ϑ7*< ==~K@X^TngFOZFiד~T_T>OAx~_K^SF)= ?~Nxjz '*nZ+;Wa6[$p0P+/-$DZ0dΞ;rhGQC@w cpys2I}kdX9-x!+au $j_4pjf1w+%lǞEi~Vj:؍Uqd{jKFH Z v%JbV5GAD -zP,X]Cz}MrEK\ Rœ;YfRXB3l|R+u;hn( qkk)٪R&T o9$VA96Z$q"}n퓵*<$9|g\f貋nT)P1.̭iƽX*"6:'s3]Xf]GF1Ojqt)!ϵë'M`G?\?7㿙'/Ӵu,Ԉ NIL2ĵtwRUznbL-F:2Mgʊ8oj _?lڇlO/}3??6~?{}m)TͽAr+ I(Hc9F#^3\69QTL\.Ӝصǎ 4Z[kobal]3-nBJ=;ub]2l&v=3&c~o"d9 fL^zT;FkOF)ضŶgpf02t^4p7X)s2/ONIfQjLXkfŃu]xNJnښjѢ%:ΜJ7AH* gW.tjt;޽M^/]ME{JɆhl Feti;ud"RI2ae],Gޗ~Jݡ7jzַGi[II2|E xCLH1Vnro&Q&E׍[5\DZ f#Y[b׀>'tؽ=mCvfw'3׷g%dեDp(;3!ld^E DluèGvZ H;qXj;3\$١&EtbUXjbI f$llNbu/!-1fl5)T6ٹEgltuqcVjI[:tAՍf޳ (wըy \`l)FzS)mDLv>6l]Z.ݜJ$GdXՐ:dHV{8?w=1 ?.N[Ce6U{r1-'KqS=񕹺C@x[XƯMd\$4s>*?:ǎVmsy6 x%jӵtmEk[d\,o&kXJ_g-Jv+Z'Ҵ5I$93Yo\3L7ufx\ ệJEE6N5[/^iM[!HZ,G45 -J(̶I$E&Kd @~&بO==ݗ<г#'mVhnwpcvɫRSH豭㕗Sޤ{cFqxuy,\yL:Az5DV֯)bͰJR7v4qPKQkXcwY'Yʖ&+[EBoӓΚ[>źBK88_BWߛ'eǔFMY&iM6F=tB7Kd{uǮѶu<Խ9y/ŝy,o4%b&M1)GПoCæ+-vB amk=ȾƚgQSGrJEs#Ӯƚ)c$ey.SrC%RW60lg;9WM^p(2}J7%'5?K^MScO4JL4pd<3 W#eaݑ tF^t^<)ƮopXXt%x7w6٘V5]`A'k*LWAYf.[1gcʆ:gkk*m3_nMWIG3QZI%gaI=#]L}Ϫ_+A}Aj{zS4vîMTʇ{(,y񫺎d`bW6?$w )b*HMۭ6Y&m [FZQRr*DEd-ncS,|j2vzMp VYp3c%37u!$%w&bdGר=ܣk4Ca°K&M<͊ 96rplU) 3GLΙcGd]nn/{XNM-##E&LS#&tA۹&tD].=.G2/!464*MNï+ Y)y6Gn6  l'tt|ESLKqqQ}EvtllsdGGl͋mf6I67M4A2$ \l57YFujqsWI%%,'ɭ)\Fֲ:l4%JfYH@/ʩOX.2l3ԟNS_O^ T4kwtڒ8bt`*T=khxyxFAf)3>"yEQЇsN(~4Hr*:*s\h4z*ikyr619J8T156.r^A2@;r5 ӓRx։(l-Gt([&i7u]fRdi(#/ZE1ezЋYCǾ)n79.&kY5.YBy≁vztndW1%>FO,b<V]Oާ>q S}5n fἶU_?K8.RxL{D}fӽZV&s} lgTiM`5tҚYÂJo0φg89.CZZi4}rm{a4\,l(Svvu^ͱۣA&'U#ݑ +0TqR@Z6ÎT-i[[ЯoFlnf CWeagԁNIƟmHhǘ=;cb͜y3Ìg ^tΞ,fͺ%8]B"#](*I$Lu9B19:]\EI`g/<(0qYrZECYY t\%h)hIN1pNM-V܄.a5#]g2v=U\a/UlrbF 0ƿxŔ2{~?'"oϩ_-桭qXm36kľ/-('H_[dfsake'DdNBiH?H0d =?-<ʣ}nݵȊ6u3aA&N´RA2.~>.6.<Ѭv*Nd"X!)Vץ"}rEh6t4rzW}R ĎHlNAuwTmIxkzz4oڢDŽGY{=!O-GQ+Pl[^f3]+\)㎮C9edƳJj+QE{#{)!u˴EteQ%1υ>qzw Gv{6ưgdl YuukZCmD,0 =}N^EG誅RaWCڽ?ÌjU[aا_>HJ@ =4BXzf l8"&t0DƠگebގ܏۔uG-k>o57Fs{RO#4`kyW{c`R"Y%H04PJQ]<]FTv~6mII5g+#eoPN[u b)t{ěٞ͸~yP-vGµ3ĭm#$ַ꺆a%c8Rk{7YA៷DL۱AJwy?ɞ]y{,_5ԖsuMyx`@*޵fYdzdjN[937pYZR+"y2jf)P1CKdI'T:"Z _׶:V5ڌ^R*4@A!n(JNWkL3'Թ=oZc榉dsckh(ԓuf7DlnIGLU|Tp|&ʘ9~GWt0lZ`L0Xf&M!m#.4 2|ܷnF6[g)Og,$n$t~٧ZQnzpX-R!'kTGn,lzĥt"ĺ IB'?PL"l:ҒDMc'QC4) lGB/GK nzp;Xs,6vNo0:cc0ĸdpŔuFfqKJ8FRIU7ǔRf03SmPhUgHZ) ~'UƝ`knJb/-ًjzXPAxT1\73[e5橮ADZ8`(%!hUE{(<9F%FY3:Y݀.:zh-vPѴ.W+mpȎuOm,ŒoeU|ݛ${cjkS\XNg+>j0ВڎV:&gv[F!͔J,VhGP;@C nijʭm7dwZk*|UZ-S1ԖnfERb#A\=MjP3-qt]e]-Z'tg!(2V5 `R$,m,#I09t}ӓil fͲm^LmmYlk*zKI敖i&E3g^¦9u|1rsI3[qz+LYdp.J'Vn1wpQ&}4G1vtm䬯4t-FA\Q'[h/tnLĽX$QwMvO#Q8V&xZMq;8f>Fq^[~_AlVgi., K]H. #K-"x%]U#s_5뾳QM v%Uk&GRVSգ"VHKF7H) ,&e :EDk&n*r9Hj*)&Et*!n3b89 c8c.q2.m7lK`F5,e J6l5Ȭ}j~lvcU| 1:Mu?l}Wܴ8{i5ZJj"\嫇Poσ8qc (Lbu83o'n; 9U?Ƌ){=U9ϒ;sR`116Lpnk[}w5:5ل$eiv禨)'Idq̃n- $(VGvj[l".udAtU)Y1U% b(C.K!"9\vJ4$cM"Vo̼LJ2+JGmeH|ާO7K h Z6%EkKIW+ڼG N-7j㉎t nx [p]?G{'zum܄4Ľ*uu~9i\y-u;ObU7'K WlcݏfP:*U9@Z MDZ.D82䌬ڹ@~[㉺lskKS&mθ?F*ɝT՝a2UWê'+ e;TX_ŁێTX_ŁۀeS =O Ҫџᇩ$J iɝ%TQ%RP"(Jr)3ch}-߱jM)cikNVJIJGGTόj_1 VIK>WtYݷWRns|[k>n0cJ- ]acwDMʱi ţ**i#ibi=&f\v\i=Ҕ_\uħF2)8J*QY)$$]9g 1r 'I|)+$#6T366=oV=qv ^=*vYD\9pFaT(|=愇rEe+]EdK/ R❪Ɛrutmgfs.jYC<)V5Ю zEfnz&.zao(BZvj-gtoR;j> lV0[?N6Vjw6;\rl_$d*iB"%<9p椦e".?).|ANUʅ"uF凒vJՂ=>cneݕI<Ԍ*m^EF==:ѭ6ŽG ]o+d\u+U kRIV$ʯ/1/$f\.%d^.R(Pq*_<`s8m}^XێK%T;"լК9W0iU9<76ww}ﴯ{n# l-߻gwgw ގpJQx?]oxG/iʣ9vwf:*x2:1WҎSgz{pwq>J_R0OzivxG|{pΤ;~amn:FhiOk^V{cnƝ۽8'wrԃw ϋ==Awk/|Q%Gڗ=%svK@F?S^gn?ihBUdž{^ayY|%|ˊ?|7ǝgquvI8}C8 q[; rEhς˯vyq&7|,c&$D]G;96Y5'EcnK'~Ӑwk4nhVԳ6 ڷfU!XKHVfd-< pc''IY eN#Vu^'w' xz(e%ՉK%,Y ̉˥#.-=wφw!$kRRZv׸_|3x 45xOh/&sʟkl5G'k;O)ܿ#Wf]io_`[i) sJ%!^GGfvy(\6(#/7Nd'×mt8ȊEEviTE@Ԗ# kb̪YW*|=Bzi΢+:gk=JXX^uvҦk)uu w \#&n1 &c3kb͝3_7NPuJMgLUDž1 ٶQvM7`!-RI)i@QCK8GX3nߓFyG) c_ߎ<[ /Ȏ?jTiMZJ۬6|D1U #e"ߡ8e;(=6f9䱓 uk] = ǮfŸEU;k֤R_F^۫"-Kǵ FeO ==tRZ?Mve9YW^vi-[nw dыeG 5.o?whzUr1t6b+*RAb++:QHGb<^"Z-3P)M?6 S \d~ csv_F<}oE5V V{gV)xQ?ٞDŷ0cwi1U\d,ɦLc91Իs2a7@KFܷ̌{ViEˊ~TLR'm!VC3-мGҪ3ɔ.AR rSM$2w+2IgjTTf%̌soKKw)//(9I9 ;%"tK,۷JӅT]e|-;ˏ_8c8?ygn><~~Ⱥ㣜8[fr[%Y޹S‹NթU c4Cqq$5Y#tyNO.2Oq|ܾ(oe9>MGSWҘ27s/uܛsٛ/קUv/lc|J._mNS)s|Zr>>32Hxtlئ" 28MIJ{P$xm> m{)!v :&Hbvڵf#dIu̓$B^%% +uMi(&Ef[)w!f3_E.JXk{ϝWYJΩi]õ,VSWSnp͔U|6Uw#cUR)wlcfyF3Vm_]$:>s۷kx#^qeUA -%ںLHY6q.1 b'1 9SfYUS8MzukUxV\נzśwVfoTW8W02^3ӻ-#-ەt6 3_ |VuKHX\^6gM*d$T̚}-="wglᲫqҖOcfs4΃=en7?TQBjVf*l!Q3 fݿ@^T=I\պrGod=eA_Vng%hg\[ <,MݖBztܓ궞JKn0ڞiߔDin*"©py`L$?Xq8^ As+^jjHz.r)URp {m}'^ c+夜[2/;n< vbwӜ4nA](69[\s܃}c mi9/{ev#%ֶMS89\]aTJPR&}ro.s&"LIeΛit G7۝J٬+F>]׫eQQth.1 6ͺq5dM%d%\\s?`E1BbѾ n$'orBA[,ڗ-ՖBVv2F2RIF"OF5v(c Ӄ)uUa;nZ,T0-HotNk"5{;8feZ(g'I'>0W Od|UG<.s׎Z߹Or ISEQ֙MB;Vij\axr"x.{-tW{JIj\w*ffY<$R+jy/&FQ+IάQw2?ox ߣ3Pk}KP˺o[k, d9H3Deb"07}64 U4ޜ][̊6ڽU9.u/V21-nd*~J㎚`S`S; LJ<ႝ_ZdUϑ >&NLzJH v K7 {pdV'0ܐ}B;MRvfʏw&].ڕaufR%bIjS˖H".AZoPm͠N葶F:n,S%2iPvȊc|G1 bW.']q8ߠ.֨FucڿYtq?V5Ce]C*tvș;co-ևOCHs?*,UWZ2nQɜsdjŊ2 *YzVL+O2ӽr8wzeAѷ 3Nٹ@h(% '-ܴf}qEBJMSbk˧z蕋 ]:%kbuU^&_)Ij`H L\U>JvꍙwH[#)+_(ѺJty[HTY(9ywM9l;n/p]j}_v?)TwSf=Hs;AgN/Qo/!/-lMElɻFmUld q (T`jIeGS e]skFnc=c7ۅt:X)|33+O7cG4\>أ1DC43_A%Z$tͷthYҲnGl9_^serFmRY) Rĝ?Z2M7 UҝZAɟ70hS؆&]oFSJU0 !F2Ìqs/`/tr2M(%1{3|;\wl4pDj騃EXIR1q} h0C[\MnHi\{4U] 9x ii&lT!O+.3zc`]Z횩XM>1JCHͩg9'hˍxH(&y"d݂#;Nt=05>ѻ^bd3uc59de@*?5vVUM]PNAMiIνm ٍR?6Vdr>ɾM,~\:JܦYZ"FqIh\`3cɶm\$6tPE2)I")q1cTY>yͩK:{?dmjZ&qOe,.1'1fpE&Zõsec2|fu$$E3GQddnʣNIcw\6zbv]<5 ~F}JٿQd`+U:Eb & &n1Q̋7dEgϲ㼸pT? qQ9]#zl B]EOe<ؗ jUK4 tW^VV"AF3t&!(n9˶p{r Am:AJ0ũ-N*~Bb-HotN䲵l22p3֊+k>{r @_xQA_\l[ Ƣ>.t]5YV[*tWAtNUY1TIT)N1NC)lc#Y-.}gNXޢ[$zY91PMă 1R)B # ݺeE{>a2jsRRǦlMoF1HB2.3㲞x.Qh}?5ƾh?s0n.[-jsH];\qRq2?j(UNuUTQE11s91sg&1s9~ɊR:{Dpa%2BdN)rlggP9/^v/ t;M$`X>_C#9;ݘtl1gGz֙:ثz&K|~gz| џ؎~eNIeQMN϶b2p}ȎP}N_)cZN)'RyL(fRI]^$搹ÞdWMB1LCc)ld.q%3qg3CILbg!Sc1slg| ε5%4%Y)l­9(ς8q'm\~#oR<}w״?6<>~ ? )nevS.es!nӹ1P \F9Ycc =<Y-ܵTc!\$Tˆ*(RԵ~qR sVr-<=Q~Vt>|g=~;dFk39\9ˆ}ɝ8)q(qdg+crdK]tS>3g,ٱkɟ5,u^DGLDLCg;Jc1r=)B\a2d!0I#`mK>yȺ3X4hc&ɿar{KtNse, ഭ3nu36ݺ?u紩{{%ے%E%O6{L<;to_~3FNJmN'qDXf8E1r<iLYh%}DI™+ڳp\cW1S&]u1qELDljĹ1eɇ%rά՘&?>SO5݂LȚF,|IwoaS>{.L>1rn•f e)YkS`f~q|J1޴XpEPɋy b:g)9iӻigI="b} oJO3.s>JW-rf2 6T\?_D5G^1%'f DT]e2DPKYB&\G(Mx؝?QBceY?j,ss2+:d&t=le.o1sv͡=faJbdU'JB;Xi=Swu6'Cpַ'?O\>}f9ؤ,fKBr(N̕DVOY1Y,Q#;K뒖^RՙV՟111ĥrau0q)=d"Zpc`)َD\c*1gǻ6[(^M ^ܑ̮c咸)re0P#RH qg|xIccҦi>bᒱW%f/cϦ\ǬS &^[o6 $:p1.2l{17Jh Pɭ;&ч}*|g9pTfٺǟ%sdfU>وu7cSOggÆ}Ho5w=1%0LE뗋ɋ,uLTc%D>J}i`p:Cvk^6mkOff|24dkC;lY[4Gų>+'֦ :l'K{v-[Zk-Yh>&<}T*騑r35 b!!Sc\ miŲ7˻fR=3 Mc%)"%.{61dV3OZ*X;k$ܦ#\~618rcdp毚 d?Tt-3x|C|_|oQLq~?S =~ꎪH@L?y UȨwH8Io/otDPL㳳63ճ?(Plb!j-8La19pǛ*42`o{[~ư^]olG(#>Oz'k5+l޻gwY 6NJDML|.ϋlZyi\[4ZШ9~1WGWђVkk5yڿ2ů']xge&<ɏ1](WwV}wޔ{H歫o>|BRx}ͲVmHyO8x37:` ㄂/5|K&W>1 T0cvc=w4ZKgW ؗ)s(r_.̑?^qo'd?E\q_>oșq?ٛqې~Wt?f3U~Frsny_Es|FQS>ogcϥ,3,_vʯ3lF4;pcI>~, _&on;&)x<98}\~gn@|M([L\z&P3c t̲US$R*(c>s콵_w41#QڬEkDV͒""""-$^OMH/]YPff?3X_9>|#~P9͌Ro/Y Zb6?3|U˽t4vyGJ"峔̊,NCc81 0刈DG c&\f'.L&#NKDg}:)5pSŽo^rc w~LJgXDogHD蘹${;ɼݽ2O[x?>t+<>3f)3e—gvwŸi—|?ő%Y$`GGS?G>|gWSόc۶ )q%F+! YqdT/n|پG1S)DC!˒ S S8 \={qv8bCc v0f͊~k>>Dfqg8;3< aUPJw+R.g11)9UKٞw઩r|l(w|L|"J͊2Ò=91^ei7OjTMm1%eh3NKY6ٕ;|'$kޜu>,e26T>sN{+Mb֛Ek*&g>f3U<1W| -&q> %z3X1"KGijknr\k;OYlc8E3=IkF&ՃT \cIEL6qc&6 =o~3V#7ͻhLX˗b&'t/þGg񎍶<ߋ{Gx;1y$4G~I.?g~qO6qgg;{kq;ϟ|߹_> \4SX! 6,Vb1)HSEZv{$äR.Ts_n><\ d~tSy>,}>, Z#ĤlI/ H&|Gk,;Wa'?Gآ:y-z]V>>"">3DVmiXkO2.YŽJv63u lc+nsH1tL`sgn?|8"$[RAI& i!JRlcff SkCl^c<{0;ٌ>7'W1>=oCk%یv~?<cǏSS|ݿn߷(ɸM\z'M.X:j|v&{|{qg.{ \qpO83݃tn3>oo &"bbb&&&&&<&&'11𘟚E}q>+9OXrGWf*#3lc9!\&M.;bgsVմ՚ڳ15LZ&>q1>&&>+8T7IUT"HUCiP3ܐ1\g"tLJE'dFX=_.; Y<1*\;mj;ON8+DZךW|8+d;?ٌ`-- >[ƷzBL.HYM3 3g>nbgtJY1ր28{pLQ;{{;;qH,&øf/n W63+7 Q{|oٟ01~{s3OO;L~֙b?7u>?cϋZ>cԸ x,Lj(+'vt6s[*-g9{ KL n?}_?sRk?>.-s}_~qLf|*,xic,uV~j"#871;>~n|ýl۳=vcroW7H#o;d>'I.7c۷搿1|yo!~?}168d| ^Ϸp(3pC}\w'8O>~ afo?gU3c;;~gÌ}QW gg_8Go_o7Ì)}LEdv?s1? ) ~>܏}~s23}{?c?ŜJ?Sc>oˁM|ݘ> Wvq9k7Ҥ}ϵgώvh۳{~m7|a}OIϵqؤggی}}}1vc9'oُns;01| O}_gϏ?.3\d1y)ge>.qXoP.3q:73>?P?K}_7̎wpo?O~_a,cc>)>?g?.>.~~0Lc?aJٿ{K0߳~c92{oLnj.Hs`I5TL(x2D˛i-}hV"RuϏB?q >?У}\H:N+ʠE"-\1[>V,J\%#) "i9bbN&ad\Wɓ7s%1 dMB$G:Jr(Csٌv>lcs^ڎZPEףYY'k%D#RIG]<4&pj!s?M{I=u7/eA*,1ELGr&.1+x$QEJBŲ`]_:O55{ Y$.Sfpv: !vT/nRpqnѲ0̥q7Unin(*(pWG 9U$̖JnÀ;6eb"By.u9K61A} 1;;r#Izj/Y[I÷ EuVPBdZcg$A5]8rS/a{QCvv~q6*gxӛdlRhʰFDEVw"ȩѦMeQ9„ɋx4'?{MLlF]4WR,99JRBEs2sj6s.;1`bWO˃d J ,Üj)`5E3Y#G SUuG͉f?݊#䑖Oሶ&O*=9Սp5lʫT6{O`#e5hf2MvTdV?fq]fqt-u8U4E;JcT[MKOͤ*U ˝ VKLccLvV9*y WNr3$qwRh"M5'xF&ȡøRv"|'j'+re%oۃ 2}_&XL -K7g*8zP7p(oܑԔ~^3K„n|v&l2E\l9T"I\ ֿQ7Đo'c,8$骟)fDo $3n+c󦩧`+~9ryh 峄̚ȬE g)ggn3y^ 5O^S"ϋ/h6YV.r&c$%$Ye;w.PD6q1?`]^WO˃]d̽ V5Nv7M#glc91=f{1T~U(S8L[8P/B'gg`ΞEį+p܆WIJ E)G*19dn L$#L# C5j.?1ĬIT_`,VtS(SM~#:Xze:fu)LwWpXpGPL;7fb_w] w=|_龇 Jz^:OJ9%rSgJc{yN;p|t=37pEUôRL ګ5K>pTσ+v1m5'ȆM\b.(U -f1u26;[SmIDO~/|I䋇 ǘ1of<á΋Z&N:QHe_4@c9L3p|%6I\3=|Hj A C%'\xȐO>&Lȝ `TC-)4lnu9TEtT:K$3UQ<9sd)b2+/ixۿHМ9$V!7iX??pv*/2R&\c*l8khn;AF>>"fq`n3FGy7#h?G$b|26SBLcS7ud;͌9$7YbXͦ{46ZĜG6JG͜'WU 6B4Đo~ߤ ;<); feSJ|]p Ee#|Iަ+/aI#XluJ_6Sh&I> VQS?|6K];x ydKMC({c&*(c8[$&UYCM<&(DLIȵz|50wMܨCc)d;H 謙ɝ3@fTy>muppf͌*]1ʺ)͞Hew {׉&ggowvwq3-ܟbF궥D8]ٻHY9ȋTUAw .ݙSZj*\e3b,ĜiHS*tl.1$/aA"SSI2&Rhrb)89qo5\2JcDˆ,UWT!P̪%-ͰLcj 1?K ,uXT|hU/S42<6pݛF$EE*o #߰u;pbinwiederhier-ntfy-5ad2431/.github/images/screenshot-web-detail.png000066400000000000000000016616321517171047500253670ustar00rootroot00000000000000PNG  IHDRk|bKGD pHYs  tIME 6ڕ IDATxg@ov*(U)JQDKkbKĘvKGD4Q@P@z;s " (Iٙ33gf)t+z VF,KYN~@['}Uw)'&h8\hV=]N޾;c3'AVQdc Y6Dz+.!_^˵CѬ.}:[Ok&"sAHPu՗|H1 ^<հJBٞFm6yT?nga&EbQ f]щ_vǷ17wl?S…m] ^ϢϙX}eق{w?JZ/5~K;knohsX"J:0)˳SxY?#sshX[z|IѮCΊ<6^Ŭv uRspz]Tݸϯ#Y X]HS[KzTmwۿO^ޘ᳗w}ڿr=F8WWBlnv7Wڃw O֤Ɗ<6ĉ<^dɥMԕGg1 69 ď_oDHzXZ Ϭ x /(//OO0:\y\SχI6 15UЯIzM;vb.&iFaϟN>rXAF*'U^ ßܑˌ9y<8#PoXy>QOʈ7l(KD. e+ރQUgg%,do:˞GVj'}WjA9'JKs>%hhVVF޲<~=URt+&"=?}7%RnUژ$Or;$_J ƒ1Jޱ׈-=l/&"6vlg\Cf4ttWdXb #/{f ߠ}繳Og2m&Q~nf).t+} och}UGj5T[NiY:\Iy9KdV UμK+n- W0Ш4kG=hott`8GEZ&Bkљ5Fm/LTȪZ܂! ;r 9"VhmWKi;RM%? ,YCД#j6nܓFQ5p"y{.80DDB% mK8MAY'rhFf^Vy[աfTo^|ݫ:^e@J+.0$!*HPԸmP󰔒1j؊ozy,Tr.363&~{'缗O.Ulcef;Ě=W't);oי@qљ:e\?Lـ?-=C5YԘ_Sj;szd<>**k'6luT^][QLz\_z{{]M 7nVoFVNIC+ΉxY4$xoØLSV۠Ok+s-w)|x{ c%آ}I~.: okh2MA޽AR\ZV.C.\.k6A0i_Sr|b" JKZNj^vtZJLZ ?hn JIN.5/'8).81.81.%/ HP58w Gq5VAOHPHPHPHPHPHPHPHPHPHPS\\\RRR^^.88e58C5!==]UU'BePʨO@VVa@ % W! PD |i=e_ORu'(Ǎa".|DTu@}"A|"!J ##86CUF&'zE=| |>ai^z .B!'EDxx<@|@z$T{ JkU)!0 [Ӂ6(FHPhDk A A A A A A@S'(8-k^0o붟cu} fXֈ&_ݰt;YIb3(Ga#}wDz%\y@2o|39+~umM{}3{2 &)\{|՜yzȫjhj(qs|tAbE9 Q/ m兩4xO]9tMgiif5ʨ8_; "$0%9ԘKGwT[INGmK{qQ^[mz\!*Ow؅r9msc9$;1OGϋf΃w֓߷dwq'ȠBk~0hq%Ww`t5qH;uZNA1_,=z6nl_KպrI]TF<,sN)wqii$$~|3j3f$w s(L\sֈH`>l $Z_ uoYzg`@xSogv wTb8;aSAAI Jd0CfׂG:GRPm OL) ʷ]Jz`DD|j1d-Nǭ&($ASN[{c}m-~70i )#bmǭZ>^HDdٽ7NX>Ǖϼ)1Dq,G<5_뿈' OYO o@q a:˽6K+a~(5XӉwbp74w n'<|SY/F()'H\R"""bEUWZRWhiQ?ǽ:?gy] ܋%e]=%{4#"$ܮ尿iWV*}&UӄT OSGSBO+HW0nݺu֦ZBMmE"\I$R ZȱiqҡOeO?[I+Dq &jR\58{khлՇlܒbϋMirh+.:ݪ,_GڕI~(A+/;\J0AQ- e]EF`fwkbGp[qr={i(ÒvvRx.8nV^^"SpI̱o7H?Dmmms A46xW@@s'@|0I |>t NU@S3QHPg|H$DZ,Vvx |a8kn! cO,ˊb> ##jH$*))D5$>%HEE >D222***D$aW$(*>I$XX,L@&O?E"ZC'###XHPUBUG@,,6(hZVoq.|A@@@@$($($($($($(@@@@n'Ofgg7h+ #GCmP'Nhh|"'OJP999o[fHXEHPP7q҅5#]m,,PHPGrsi'_*;XPRPzwmFJg^y[2upk6ؤÓ]]F4@jK  IDATggIJ:q'ZZN9"Xu`Hq/tu1YȼYt]$Q6qfR- H8x0vQn.9|z{ڹwJlEÖTD*J/O-}ogz/7u i ]874xxola$1Y>se~66.?w\Y-uqjk6t1Vw2w\qJֶKW%X9+e"\[w]$&I^V^]KFwoW_4osvuhkѶG" 8b5ޢOEjf8 Ih;‹^\Qڶj>?^ĕ_Yhc9q#ٷmk>O+۵s7;K k>ݻ%$~࿕{V())ٽ{wJJ T¦_;iҹoWGGK^:]yٮ4c\Z1nV3}{p/\jiؔ^=t}(?.b}o=o|"Ι YڶmP}u0Dn2}ؔ.sZ 3kZH߳{2CՒ1dsKDh qUzn:@cIhqVgFgX 7V/^ı'V<"< {?X5ʛ寖@QRȨ5jtSZxAg&5N& k]gy?MqZ8KAC@foWkQQ\o\UO*[q;ŐUV&ŋ3||~f5{{"22E'od0t(nEx&O,mbڽ{Yŧ}}ɟXf%It.ӳHs?7ċBV#gd/M<q&'8S9 G&^P;4Ո"CMu3zTx-l|fE'YbMНߧ޾=qҒ7Ks/ SkWG)z+Q_؋J+J_c44ՙ" yl:y+y1c>ۦ >ASȹf鮌|ҫ|Ql@|'qa'6ZRJyk%U05̮Qmk|%gB_0KO{TRYNGE!ϫ 'yVu!XTC1I㓌Ӂ>>j>>ɨ9)ji⌢ KU_C3 F&-TDEO=xc`Zgs -هΔיfv^ӓ|6yآRa٭M =&DDD::8X~JMm˫&K25MKm̲4*"QB-1˵:G[C#>[e߹+9L4wl]@UpAnm2CS^`ԵԒ,dӃT5_OBD HH02,!!zذݻ?2%!GݽOhS!O<>Q'ytCHk_ľ^wWPxUuU*)'z1Ή+*eU!X UT(^);y:=FHR*d<5uUg^(6;3i*yvcVZm2kgn4CA~b8hNbZ}>GeB( v#"VHZ,U!Ӭ _tcx>ebjY^S)*Q5ԕ5E3%IYl[{y)Mnb;9"N?0:8"Ӡ{ "bʾ{=ـ/婶k{7(0Kc><(0ŰC74DS-[$㝊CCt=eɦM/ZT5Jx+:-,t[=DUv#O9>Qso;'trx|sw?w}gg+ϭeӮ_ f]"bcڡO`V&֝-sյ"UfDFD/0 C[CF֭ˁSGH^{$wwh z.gƄ?*g4]"#'/qWںت2q 6prxǖU-Q1ko.- U7׺_9Kؒ"F[g=I~ÝT_x}ŪٷRq0 N:Rhb/mbf:۪r}<[Vԇ ifMLRlyc|oÕԼԼmJƝ M-Qx|zW.9w1I)_4f |9<jҢ«kfpëg:d8s>1 J_1:giyުC=.1](B.d#,[{_gF[V\"!"ijQߙb_=13jgn]޻dζ ի ںXn[~Wz$BF;xN+ 7rW}UK lߞIk۾ zrtXR8 _ " pvH7ZAu SocTlLsCK9[ĊH$08DN$n{e D$kddmã'*ݺIIX(b~ի_~ 7-GGUK.jSWm]rwP$/$I8+N"(8H(>0NK^2%Ss5k'$YcckUUS_mu˜ܴи}z}bO qoC-[&ѱ!#q,˖噚6 |Q|.{'=<9Tk?sŞOwԽ?~=}>6նF0o 8m呰߯ xDD\g8ZƽpYn\s1WUw_6.{׎l}?LIRՉ%09T"ڹ%fd$fgo'yPPJrC&v; E\m˹b <<O•= o!dD).g$SAKYմLm{B;¤sǯ t:wP:8rs/Nvp'FUU[-J޽PRK V}%)-3.4]|ڟx6('O8q^Sg6iv?wh!OKƘ˼ulrPR-T~>n}XI(ZFGPjӾk'.+JyKŤf-/^1 M ~n7Ґ_zڵ7;q.(f~iFYS1u*[1…<5ƒ3-J}|T-R_Vc!O_Ud"5X@9tPmNq~СٳgB_nTdAU8|^:]k\͠V]VNsf9w277#b*sq'OF/%%kɵ+))9t8($($~#R!~Ɣ)1<3<44kѢқ7UU㊦*O >>ruϫT) =㩩) Z5G A A A A A AW5ʺjOo(RNb| o+l @]a$VKzs555ݲe C"4W۝ҥKolVZ5iҤK.)++mذo߾u!!!ZBBB ܹ1ݳ?NMMNKK;{IJT_|tLZJfai))djWIG@] `*# !y=%&''߽{,{QF5*طo߱cʕ+Gq\ttO?tΝӧ_|YCCwgϞ?݌3;t1ݵnnn?)$+Q .L/K/Ȼ!?ɝ#G|rQi*Q~QbJS(7\ޢSNq7rׯř5ᗗ w,ȑ#D4k֬SJ0 ciigϞ?vX}ݽ^|ۼ/zճZ|~"@sI(GVbK\śً8IӧOO=)((h̙VVV}ݺukqqq嫞G9rd۶m'L`jjjjjCD355>}tg̝;&''}IOHHtɊ+LMM95zh[[[++C:u5:޻wӧO/,,ܰaʕ+srrOff7|ӱcGKKݻEEE۷755ȨOSSjy###c͚5ݺu3fW}.Pxx… tbiilٲW5kVNڶm۵kիWTOIIYreΝ---֭[WTTDDӦMk߾}۶m{k.-Ik>JMgX@}֔6{\+ǗjXN9~֠"޽3GGGw端gϞ_~8mm-Zo޼ƍw&O,455?3"-((pppյ'miiivvvzJLLebbbVZUujYlj1"&&F[[[^^>##<8sLSRRFJDzzz;wrC/{||1c233̲ݻO?ձcǾ;XijjtԩK.۷es-[,jkk&$$H3={&= ?x`РA}0%%%qqq6lHNN>\h6+QO!JT( @s%oX%q*mq>>ׯWTTܳg7_naaiӦkfggw7 ?ޱcǎ;ZhADӧO߱cٳ+ϛ7o[n->є)S[~~~՗ddd޽{Ϝ9qӧOo޼a}U,xuGX=w0Ldd[*YbEjjs޽t-3nݺ=z]x ;v׷;e׮]ѣG-\[l 6mwޅ FYPP0gΜe&$$ݾ};""Ã۾}޹s'""b֬Yy#sM~{C7SMٷ_d~~+W JDC}:mذV\٫W/##_~N8Q^^^֭[sHVݻwL2eΜ9Dcǎ;Ν;˫aêV }4eKڟg'NP("233}jcliҚڵ۾}{~~իWoܸqūW~7'O~wB%%F4Eפ$"j۶mcř3g9rnnnul%'M8Uׯ_~ҟ⤡q_)--+*錅b˲ͪ&#ЄmP1i)-㊟Im)24`K$)yZ=djfjU#m[(++xMii)I|TTTm۶wN0A,҆:TƏ36"illFD]v2dHAAǿK?}M*4*((Qrnn_I[[[;aC$| Jj *YbtZ5tCOe\~=*k$bʼF.Uq[ \Wiɍ7seD"@PC]]PK IDATONN>|kT?!//)>lצMM6D;w?/^;s挴=aKug=6aUUoUo Χ/:@{|_'٘Ȑu$Eu琳gk҈U#\{m׮]qtt_u"" g-k<>r﨤$555++ddd/^| {{jaTՕ>%&&V{)---***33*ND-[|' 7$7RR~@ȸXgkE{ZP$^ׯ_QPPvkxbmڵkŲΝ;]m Z?y>EuܹwU' ҃m>ߥK":vX,X0p@tVVV"СCV;rIjĚO:A=|mJ2s߮60ͅ8|j|K 7>C“&q~mK#Āj}o߾EEE/dddݻȑ#qܵkƏ?|𲲲7.ݿr׹t],O8ɓӦ_D4bĈ\pa"bƍI+/[rZBŋ7;jhhZ(66ˋllljp|>̙3ǎ8֯_շo_iВϟ񴱒իWjhhL>}4bM-Ays:7 I˒eޢN0Eyj~l"R}`Ev ƽo߾MD#GpP8lذ8qZ4a„^zƍiiiBo}}r͛?h֭'O¥I5dɒW._|ʕ:::b8++8af͚5p/vjٲerrtٳgK?ѣ'OO__4;;1KuSPPزeˌ3N}ZPPs޽{֭NHH(**RUUݶm[cޛƪI4>q]ݫcSM*2h.)Ƿ'Lvu}ۤ݇Z>}eYSS:"ѣojjZ:}]׮]>|XMMaÆM>sO3ӧgϞ-))|yi:BŮ]޽qqߧO]۷/<\`izܹ+Ws턄%%%Ç>AJǏ޳gOPPǏutt 6{jO ^|CCC?~߭[/wEgnNdɒAf5Y׀u]"fW]YӮY6꺮1'Q|if\P3}t>:Nu1\cM:g6m$s:{}ԣ~cmБOa?-.kN""EQ]]^,}Վh1u{gҤIӦM1W_g}KVLrt8-|IEEEJ)"jӎw^z˧?lonE=GGjݶƔ?~vA{^u{8HP*a\*I޻wogt8m;aȧd v2jDYǢLJSv.Ss^:'Lv>k] U*O~>}'d:&/9\M:VPѶì9]ۜ6eQ) ȏp|W ?E8_~κK;tpd߽ksjp8ioNcAwvR MY"H)ӽϩ;qa'Y>/Ϛq^jѻM/ZI;Fn=xn.~  G-YMgAʊ5/K_˙6jQ;v6Js!8K'0z׼9&l=w7xgQ W=ño;cM4:YhĈ3f̸HIpl4dmr&ߟAkhwzpS^wJu ^|'8q@ؼ+CN~Pۯl9d:"|uƔc(sQZ?3O>澙j5uyS M6y+/< gܿk.N\prY0n8;O~roc64:s/wqڴi?$?i\M:QPj3?<Y#+-#`|/G ;kw1w+`H%}b3oDEVhwq}>ՙw'v@L+6DҦ[ͫ %4?mK[i7.XLp8p8}B~Q JUo9 杋 &;O;h Myl)s4=7;~TiV鵋Vln9&z <\s8p8rM M=3~%غ[Mq؈V3_ŧȺH`7X}M_z:'{"p8SPrE|3w;xfߛ=p@Uk8*.)!NWӲׯ(^'ie<]~i(p8'ŏ߄\Cɿo|鉗>II{3|óTp/Zi]0p[vy5KP""4>y"[vn^p8wAo_YUgeϟU|qU}5gpZA˿z;Y$^LVPҽs/?-[ߊOqcjMu4eW27э: uKn/0sEuuuݺu^C9Ϝ'WI<7=s_:p9O~`۵ M3v5omߞ^NOmo,k/ܲOV6[6WvS>̋vg03'޼֥&)v d}3{UqM=ȑp8|'A(~<'ai,ǟq]}Uܾ{":kl *^{+ؾs^Xd^|3aۯ']'|Tk1=*"';棣ݿa6ۏo{k^ʌ/yev{p8N'o鏿p86~oʹϽSov/&,^aONÿᰝo.Gɯ6*ߤ}_9mNrKp^cV;L=͸iQ{J~*,{ կwߡ;6eU̗O_w' ݲWc<ƹEث羷~q{㆏[a}{m\0ܷkỎЧ>3zJ!پ{.df}~x/{=E\{?⁖5&w£a}QkZ/z~dye-.k*}yNҷqq]&YC0먿>#@JӴ$p jIyBv^Ⱦzmvxټ^jƻ}Ƞ x}'xN?o-GO軝Οuu<›t1CV>xƤs_cy_AI_y1Ci7sߧn5mnߧ2+BjٳC{zΙێ워s蹶ulͽ+@9O|Q3_c?N{(37_/]>iҌ2}ۉ2>'Uv^>u[~O-O?azZz{J;o A5-*l1魹ee3g/1[2/_î|~_{9L?yagciA7oc.qk]e짿sn^7x2FMꆙ?C;xS׼'>puλ>菗?_S#K~b^j%WϘ:ѾHlޣG;m{;faS,ٿ~=䝗_ {0/1^ϞqT })^]@mvם:#/uN?k>il1!-~,{~9`&W#0_N>χ}^ntp$ONWc],}_=vt+Us׽|-=~4%#:aAUu\VNo9x,PCEt됼"454m|حKnj*QuЯw1[4xK_m.Ѩ.u!9taG޻su^xqY6*,Dwm׾sވy x} ^*ysa݇ɋ~zH}#5vm6$S uK^~3 yz'Yv//4rT+Ͼv|GaFCz7 nۆ(.$ۣQ{_{wjmm>xc^qܶ}BkRoq1<fwp$֑ñ.tro}yΣGuҠV#Fw9|;/Okiڿczu+멺U*pemFP:WެvEX:Wmw?m鿯aԺ }Fˋ#z^6˵}fɯR/}T5\_[ܥߕ-]mLäJYhբǬ0kƯ߇Xp plM/=w[:9o3dp' @vO^Lm ZITݼK8Ǜg^}!C<2>>GV:ʓ~UEWV+o+4^vO\8u2 fKR5`>C/tyڥG2ro^b'c'rr; k"R7vUJ6"ddZşoQ 𭪗?Kvc~4|P.5l۝%!m]T9am|2f!|KP՘AcmLئr-?2f"(4qf ynj6` ˟kc-W_5_~Tv ¬W8/w(p8p8֟C{G-D:j2{F&OGu}O}p>?p퇍3|R^}9;ʜGoη~oݶ5佳e5j_>uIQ_=m?י'p_d2ժm+,s=+O·=Wr4sVǎj)G_/yO'OݮG>{ӎAv;oUs`"5n1%R0>ϊ nj&)}GH;z߻i~#Ͽ4/.;b^vʩ} 3.zIn>M~5)ufM"~3O2p8NA9 M4N fĪȧҭF tӓy=&p/=v!^섋n8~кR#Hk1g6oC~3YoyWO~':fSSi{igRPTyם2N=33Wv/9lH7Lٞ~KV?s/8?3ܵWMn]z5w\?zєGuA'2ԭJVrmyت[:/<_=aבR0qn~qejȶ+GU??O=#V#mwϽڼ0C'pny%#ON8WLZ{lѵfM"|Zvpx65Zp8 uKn/0sEuuuݺuW=ywnɦf?+q{TTV3u{zW=wN%''|RQQRT2I8`Oo{ო|ڴºgW|н~Aj9uvm$ IDATyqp8NA9 w$޴ǯn c47\EkG u7M{( nڰ?̼z;hW6+լTMy$Ҿ"6lC2)IY?CFH""BIY!"@|(@E s F*% b!DF, 쓤}J [FX:2"BlZE}^yur5^D }ahGE%uيE UUR_UK &QB$ZHWL-?۵EVo/H)_)BTa ڿ H I2YI%AȂ"Q KqiH4%B((`VJݨԲjYЫ7)]7¸آfehQ>2[ۇA }@A`@0iaRlH"e@8 yeۢLQk5[9T)FY_Q ,¬XP(%՘O;8v@ÀΟTߣ3KYFC #ۼ{mA빟U,̶K\m)Չ4#dY^LM}+GVAPט0J+R faaj6)Y@iylPZύR_CͣR]V S ei !/d(ْ!"+,",̒PPDhFE'0ЈhA؃R-Ls*@D/"",AZ\R  so~0^9fRD9ԏq{zoxd߼t}yXzı_eu+ӷ;?;38yI(c=ϮPwwtZ2>.At].+7\ѺQrHk`f)M8 Ce?"HgRm9-c\YkZHN5Cul806!x&LQMCu)o?\e9y DO3%-Dl)+lG(Jmk ^X5T˼ؤ>\T;)WT BDYI\o5C"PImUu;ez"XR@ 㜱XViii9plj&{]u?\ڌZL$ۮ2ө2YEC҆te"d"+Hi(("I qʛ;'@D;4 4aۤ +`a1I8l` 1Lbitb2ОRB"`80'YX+҉u$Pü~i}Po%_QKBZxЅdN#ʳZ IņlrdF`4)QZ%́yi[(<+Zl::Tesb|hY#I" A}϶KelYʨbF l Q ᐴO)3++[^٣Ғ:0UJm6(]A%wj[mhYk)uZޭCSjaa ŤHi6 aVvY2ժČbMמEHHեk0a.E+:e[߇4 IkI4Mha@n "X)1 +ז#a$3(>CNQE>APk)B@$L,Tp1$`I*l@քp66"ڨ 3qpH*=I(E&LΘȊ%%J)R%}?G> nٷWcې3-|vjF_m~>yfp^}oo7jWL}  ?~㰙7w`x|)#3>|H={ "ѣ'}%Λ-{oG|vFի߈]Bg;RZ˛ 9~* J\:h,ilSئ<՘BeXll8$960%f j "H(D[C&a-Y,)18$ (QVdR؀HU ^@N Kik+ bc؈lH*2f_LJ@`!ٯi ~ ѯI`/ˎDbHN_$IaARa>4Z{%B"$؀#pa3b8nƍ6n8#&+& cb+b!T7pPj!(op+V)pQl$ӹ֭j BxVe_X؋=(n`R5_ Z;k}‖*# @{i &Ul3AYL ;V,ۢV̗:E9B/.Vn_nZ-J-,R*f"F.X5eK{umܼ}S +_^V\^ZT ag8kLh9Y%t:UTTN ZqEQqlbߓdNǐV{!񸋀 3V [a+Z+EPA*Vek~DV(RIXAZ~~} ]6??' z0zΧ\dzl_N|Z*sunym%Os֍8?~.}ӟjYشs.v|ɓ>wSf~6~ZܿV{\t9L9n[WO>vW\qMv¡s6c{VO %Om3u?$bO [Z(i,O /g5,,Kʒ 9p65 # bP A$"!VD"!1bY&$E$r`h p^>!$ꇉX(11/ RhDBXi2I"9aXXcM0ȃQVFN$O ժ̔VZdY---)Da.&}%Y֕rp[^XVL_iԑYb0PB!aYiέwXBĈ~>zY0xJWAL$PL `DUV+wԔQTO1l3x*JC<"b0W^J/B:.JW^k/lڣ3(ҊlYX<*o$CdfQ4Ddl,1BhZ^/*u'/Oc~EV0UO71QH*(RdD {$D(}$kbQ-Ŕ2J%~q_P% c6Xb*XJb8G6K6+Fm܆L<ǹqXk:7ظ 65Je%)g(̙85y /Hd"&!8ɳx^+-0lMUȨC-F*4pѕA7__{)"MVObsG:G_?ow>{̠@~ѭO('`v_<{_gFoIt^wB/*^y?ɞS+ž{Ts|یA \!`3}MrHg.{폻7&1D-zy'4겳'X'ΜbU cɧ5tsBo }c@_mDZ9چՉh)^TEA.d /CLY lVaEca |< (G,yyBd-LV?bYbX` RD Fl1b$i6o_e˖E#(|}xǢ Al3F| DX`!)X%䫾šZ{UsS! a22a a%O+NI$JR$?U2W`H4ayIܣF*֗R@J1=mŒݹcF_*9C4KmJXX둯@`sM)]Sf/OX* Wi]S(ih=!lhbI|SD"E1WkXlo"5HqȴkEUe,Xe!lm'E:!Gzdoj5ч9ՎmU~}tmŨq{w ifЮ3ۏ}Ql|[Ik+dbPttN8&6*4d(sO %Imn)8WdI4!UHUΕL.7J4`<'Pc 1y/4) <+$-bH!UQqXY/hYe IDAT"H1)-~ߥgU9+EIJXa aiEAHK* ELi6'ncH k9+&6'6+QM6 ҁ1YX["y|\P)X# -DuU]ePSfK|- "0D Ҟc̹LKTEGmbiAs]MY]6uKvi. !fm"C/B1S+UgxI,YE"&eE7|Y^f,"nc me%++0+%9ؐM{AQ`D 3"@iMF[Fi296HS>P bg2XEdSce2wTr$E9Y5;XP̻5VRJי$Ae%hoܔ+ʕmjJ2/\|Ф8t >=T]Jv_=%w_a$=UZFF`UIWyv)NVpU&9&)ZZ'b)^U!#DcY)"  8YIv +bCHsm{Ae̋1SHP27^ #bD7m1\t}5z $Y4F;(PJP\C"Z&`p08vRheɆ"*p *ʉ1&zzt[k9Ɨ?>]=d8s{=/8Q$aAEV@BMD jQJ8<4tfKX͵϶-l5M$!&;ɗ%~ $\'Hy)&I|dɌQEhI4AhBUT ,K T(JgLAlKee(y]ƍbbIchEcRkmփ(Q$QȎ8KhL)2޹vAQӬda%6v[tYʐӬ_uOڹ?ɍ(}+^H6LiPJYXCݳ7{o]3g'7A^|ۛK+)r#F8 dtyEm =AN֔&Gk5 Js}A"֤"$FӼh8u%Lb:ruw?#ߝ-8oMn\zn;i7#Sj1D Pe 8y4" $ E4Umr¦ g(e]288AR:v;kwã@ŗ/AgtT7h\T ;Ԅ84uHeIU{kTaƏ2UNqpn,\0_GO/ۿ9^Oo[Ww|߿s?.;-7'\XǙygw~y_O>|.cB$5}deGPU~daՙ܎S7v*Cne nVX\`!;J=K j~=IA1* !Vq&W "APQ X S6&-^+u;GtCC^Ƙ5rweYt)uCY{(z.pA("̌1|`FLjBk mZFtTa"nWO>w~>)fp66ʚi/RF/CCDj V%4k@{J\ZZkZkʏD(Օa EQTIGTBE!^ ͻkR$DVWg\;:P>/^/ !5Y d{o:oc:7kRݜ d6=.K#"*4B4eB2-+o۟pk2no/s@>_^f٧'fNmNQ : źڅ*ཛྷ.ǯo\9yoeǵURQ",SAKNecs|:d,kr.}'M}f{od,G Kb&I Y}'VcJEqW)6!RڀpԎ c6%SR%3@ewWEݰڞ]*lqX~eu"~T O?[p:>/bl7;מ |"{/O|]{ޟ#g|?S?;]|')9=QwDzya/?G⓮+V?֯_So|uܗ.TPui4}??~!fn=m17dڄ:iQ k& G$$2Q&(E+@;bD&vi1 1:jO eljHD;Dh#QD10`.֐J4t4KlUJyc, B˔Xr`\( pD-}CFٰᅖFk{St`%J Aw1un\; kO(MU1-QtucD/?5hCz2@ TQ6fj/-tHEVFj$]Y Ā@=f s6H UH)ӽo7o|<5]OFL;۸C;չ@Әiг{AՂS,ǎ^} mN}Jl&w:X/SFj`$c` ZlL#AL65 ZxKl.z S6h3*IKnߵt{yJcE~o{^)YbյW=ȸP e7GU]0vԀ2$ /0OÜ<~57Vj=Z6$14$3.,Zth >dɈ rDOV>xy\R3,`$OŬZiD,ڋß:VT t~Ջ%EDP/}d׉y1/k :Qk4VzJTE%GfjjnƳ՝;Ǘ w__};oW\`?m_~ío7^=tS; ?Wݗ=16`i3w/?wY_?oz^O{K{~o/{4=񹟵w?xϾavWc?_zoO̟_o'Ϻ}Mn>vzg߽_ڄ˺Kvy>J֣,7٤kJjd*ߙu) 5XDZ(+d(Ԋg3P!&]Z.4h L@! ".pF b*]2~uqhI&xN PN%"D`1SV&I+I 0o1k#`xʃwɀN/v.좷|(O(1+4I n.-ePz)%L2Q1!FƧep;>qU^"\B3h ɐHHf6izk4Kg)U齵W#PGOf:FdĄ28$*c7g埿_M-kC;}uxx~ڗ#ZU@J"DXN>tKNOŽ{/7ͺ?0ENFVe jBC $Ja#TP1XBH$MhF"RۚE?1(5tV%S?븾O}_ռ!{o}6K(3 `:y[ųίjzh.(&tSȖb5H^s۞5̭{ӻR~i`Z7WHhλP)R4JFE|0(cD}k#;$7*#*R̬޷ "ޗW_ռR՚M;?達ۗޖ/~1)K3wPe"@^o(*2;>?^//|/O|ғ??y>G>|2ei [7'^o{w֟?Oy+~Oȏo'?o39қ_Ko o?>Coo޿7Wm~O/+? ?[?sȍ/;7??7}ܼ]֥칼_aJ\n8룝:K(mwf n2/qqQU D8AZh@@R+T 0dA(.pdn϶2p'c6Κ@%Z&aMIZR<Xڡ5qWYmkN)ކGOi2u>x?QRҪ&*̊,m9ݯ|qkx{ zj7ǢْHm2hј,W\0z ݚ{-9/4rUcE2c` t5#؄' U6Dj*rX,tj= k%ՃY, QSwBSX߉*3[a .=5gȣW>iӧ45 H@ ɷkoq>^ݲwPl/vF !P%ZnuŻ9е+@ay)Q7׌-!( 㺉!`& d>k}4Q=pP%kP7(@f)YdFGJ8}*3 APA%^$I{Ev@M#mUL8 N"Gnr wgE 4t͔@e,3G Hfₒ vFH,7ŏ]tU.#m=tg^lWԹ:U(h,)}jL BS>zI B+$>oJ>i8OL h|EfBD{> \jqJbPen_^A |GEDIf ܂+MSRg)y gG7yÇ?_{i"M5iJyg2Y#v7in훇O/O"lެ,YhlXȲ;zng 9"nj0+2tw!Եl,kgݬx-=J)%Lwx@h KL{G0ԝP3yyn=2ܤV)*I 1I*@Qf}eώfL;.WI0 Qٚuih24BU^7ޣOztwoӹup <{xq1*Rх B2pZy>_#ytw/S/BB4%"޶؛,mgg.Yv=xI5vX5SQ:*/;B BPPhRk,auR >$j%U8Aem - ҝ^Q]Yau-C!??wԇ_>n_ß/$YwH3|]O?rÃdi>NOh ,՛ڦZo{U]ys m^NΥH_8aT&AFÉ)s*BЀT)]kef]a(I˂[ײJY#4&zfK{z}źW_>|y47̀$.  ,Qs Q O6ݷ)Nœ/6\޷v[R?z[f"nDza.,yi1LbLXM"R* nJVg׮NEJȔ"5b살w& Pb0E&>e'RJM+iiL҈FU$ QKVRS)%%2A&mjUR8ȄljZ-Wv-sBRAG|O˺HW}Do~l(P0P[ ]JWN5^;/rj3=J0]PjD7,C Ƌ"aIXBJ44]ܣ(p:?QMN&CnJJǔ Q8զLBC"]b@GuמaNS\ylm>E M"BDmX`ˣju8$$"j6ʧ3OϙW1.˴f޲ԁˆp 5hH+C7[2IBG$W0%|`2o#,#E9%L۵Q9oZ+eztZcz e2@#@&"D}>ߜ8ɽAgʙJ'L:[JqoZ8S>kw{ɴ}v~,4i:fo@ DvP}!QO >lXRN#Rc=]{6"*DPUϛ^JV;<ꛈ.y;(X}KW0r`LѸQ7XvxOk7jwA"B֮KgdiU=-OVQ AGZUPbt&cP`:S͂PRd8#Y8֤We[&!OS2ekW;(:52SY82/Gꕏ\>[A72"PZ[aR= II0s =i, J#TRNVzlѤ~uqՀ BUp/̮][iL AHD;j"ޯ{86h 5+F`0ML^=7>4,ϫ+i֐ӲҊq1s[xAJݴ1F_zYd^!r?牊B"UlwW׮ͻਪUKbX`$Iٝ!u’`stAPMP"^o+U/fTD⪪8nK)ۮ;fɵ|%MbEΛa`Pcv=xv˘Ncf`ͥ}˺?^|cW|wF/Rukqcn1p[8\; fuںuc (w9VE"47((cAv8-gLYaj%9RFF֚RV%X%<"|.N#q@I׉"yH *6N(2 F6Ƶ2mw;UURkP[Xf*x>yla9'vUI+Ԣ"t'#O¥^ I!(IbӲ=ALu"BnV(J$-e&6P-\S6u#( DaLmND8Qe<4E.^ =An &Jg.H&FgS^,hϷާ5 P@P սz&gӤ{*m(, 5 4M9(pR(0#)̞}P*b1z` fP@A -ZσIr1$]CGW=2h&E55pJ U$ƶmۜU ZkDa8hF~aD(ݢ-\k{%6Q6b Dd/l&F)FsգS UZ IPK-Ë\iǏ=oVOm^seJbwQ(lbh#{1зcq^⼔W1m@\ije1&;:=:\\~tޢUIMBD0DUvqQvyˑ;HTDM객ϖ<\Ri۶y6fd];iRJ*hfJe,vXf=xaԤDsx2"E(K*e]e}4W;O_ԋα>So̦G6߼rvxp6-;6IadMqzz"x~͎Lq␵@'08pY5@!,pNhf%eU1L3o["`X`NL5XUV>D )F! Y:ZM0Ksܮƃzس@,M&uu]wcoQ5,! dp@12Af":fuR$PT~}ahq7mbZ3hvw z](*UHYJ% #o#o4D9 {J:XF7{b6Q?& "DUه=Jg=yh#}K+˓1*NȈ-alϣx>),Oe|T}QQ5vwׯݼq7)Bw0Xr8KK)^!M~M@)d"Dl-{xzhٵ{Ԟ5:4Z .p$1J 1 k0Qng7p IwJpn<GG,WX1 uX>ƘRQ3}G{K[th 9NL"8J1.}$M&Rh2M h`}ֺ$!2QVѩSys>aϼ!`*} HkT *ZtD&3X$rUS /%"cĈķWy<-iK^F١TEm0j%)`JБ%MQ#T#*KEY7̘pwzA`Q ACDaAa'*LDMr.Q" z~OO 1˧3/pmoh/G% (wQ(rč>>\?;ZthZR]0GTt=ݾx;@. q0qx9.ٵ#,S͆Sy] Su7uuAY^M4LQjBMQCpbҴM$RHEVD*IHfzp }ɃT11E*/BU=5뽽vJht÷ț2ԧ !Bt+B5ѮIG~?%"@Tʡ!Bp8r3p^<|K| 9턒Q"uR"5/H*OYfgl>^&K@<ģ*(cZ;&F4iӚ4"){^Y:o9WDdާ޺a?0 Y#` O!AIIުウ~X)BN;#3#XcoT!9&q!Qޯ^4,alywuwdfЍ(\flUz\mVf˨jԒyXj9ׇn  -Qo챓S] D"V)}PNk[;!B4 S)%QnLPlDW2 Pv)Y.D ?y˿|/f,]i]y1ዟ߳~wG|'0fe~.}s0(L8zq f8T-ڊ86H5xZVc(TU3$A>Ůzz$ӞWF5#[Sʙ"' '}$T3PvT*MgHatɌ>zO X:N4VY"S )C!Pz af.ab'=Ma097BRx;bn׾K,07ͮĥզ`ymgF fIqQǶ~jCd4ʗ)V:nng~ Eke^.ku][]; [̬#@/W\F4@QrFޢi]WL9(dy9 u<-!) 9顚25_e^i4&$3ИF4s3'z=]Ai?!J^W>}o\߿}ݍL[Z `X*d L%}}BP2P p}xy R5 saRtA:Lۨ@gx԰R%\pkH'<¢\ZTeN%Q" 8#Q߬]ͱV@;]y~{}_Rd"d=CD:ѸUKbΘf媬kbmfs 4]zQ[U $jC)$R,VmIVH5su9+^T4Wfpzd^s jEwyPa^zk,6-~W˿ys^__)EcOOƾ M̐$I: Θ0 󥂭1C͘ Wtt۫pZ0hUhF:鋗 shBM!X|gqΆ}bWh(00Lɤ5UA94@n}²j$ὣ̬F@b"cAT'%w:c HeJ|HJ ovh1bx 72ʥ"Mll|bh7m>F`Kֹe$RX!F2x"IT*+tmU=.z:g' +ˇ'F&ԺyYǻֹ߈_[Pt3af^Jq33PH-Zv\eq].U! (f]@b4zDkMYHJzate{P"3a0}I-3 \SIA=֓Pn n6_E"b١~VN_O?{n?rh\Bl7B+ wֿ7;< jRR-g~|ȷxĹa5ԩ߰G/Q q&t-o5VRFO#e!-[IMhUa)_|/˳G( J4%!7xaira#0]> Pz0[߷KMZi=0;_qdr: . F45bSP^eԈZkf'hb+mͬ٢OyQGe OitNaHE[^,!D\b|%HN֔NʆM}x^T[K֟h~pf,ஔ8GW m篞ovtZ_x{,?4źX@# "Te's3 RCYfvF"Ɋ0ow c)f̈q!2i=0p`G!!.Ѕ>MMI5͑;(DCD@[ s" :0l­kE̠S U+3g6d֩ l0$n(7֕:)`E/徭nnldžHrowgC\cY%S[?zuV3Z˄B6L>a8~i 4/vip?dw"M=jӅhdfZx\yt9L#Ϋ1Tbmy*3Ry uͮ]7u| :SP2SYf'eLZ>yPOi=TrO=ӕ/Q= !_L7?zu7i4 B5+(3"EYQ  \[/qͻ]3`/ <v#ݎG^:zD̤ة gj.|qgnYIujuՄ8`>KV7 B"I"rhURKh$ : *2+*l}\ԠTFdF5\>"Ed-X%lg:8)]nP;re%ƘPPHVLƐڀ2^>h8w  [IQhq]D1GL4zWI2*!@-V }㙉-b;[vG: nM$Cڭ\wGOKV=ǒ*ŭ8(1ȡ$hPC qr=ЖX2.BMED(H/>i?oq7ow8IMH IDAT tK NкᲜ׶b3Ʒ̮P#=-ֺ.K[<_LJXk~Bh(ˊ Fs@u82"- P?[ۀPEJo2”)zZOTLK]Eȕh1^W8~gwZC7qiT&VaZud}^tEA-Pl2a^t>}ȷO;<̘2k4t z@X0@6Lm G""ag2hgϞ/y)E2l0b*h< . Qwsi%jdmk-$9@e/_E1G=zzY3@?~Ψ-.2H 2>U$zrS,bV C)f0Tʈs5sUԬk5%ۂ\5)|4HsnuSBnS CB},JnhdMS-mo68سs;^.g^݇uo_8reu1Ej D(b3!e,0>[/ÎAV࣬ wS ?&tXW"v?N4M*Hv [nز+Veʕ f5ͩPT cW.3; ?6=)A|pޒgr<}6.z״x e].KDҕ/dPk2Nr-wTV)h0 n{;nn(\{^dmvNrRGhSO٦N5>U3 o޾9=ZZ)Qavh:\ FXW0mն#>CEr m(>bt}"zRPOi=g FFڄ^ G3Iٴ|^~W_>6+XiUf6*2ېd$)Z>zdd _V{8>?~7'o#.X+,T0$UsbuD ~[ PYҊ D*N|__Xl(€|`&&RtlUKDX]in~~.9/5S]l Iin^TfX%%%# !"3##F> g߆w9e!3ڶ6F.vևBk˺*;l=i2YI9quia 5"wh [ڈ̧rdp{31xɗo>?=߻7\w?xWwpHۼިn%Z8ܝ~:j>ьٸYRbH˔Cm@"jeJsZjKeoh#|$V`8@nCm "hbfka]0sDfYAfڌb$hD@aTewuh3#8CI3tq\On'1c>O>>']޷V>q/D E*"ЄKff"Nm=>Xj3b n(7Î3jƢη|̧Zώ &!ŽbnNu7o˥ >n@+УC=2[[VN~z$UE ysgs3IgSl-F3BsSٓzZOi=ɞ[:gb (d=b_>ǟO/e3(W FTl`DF"Bh6cHcyib[K~ XL% fG-&%eAHW/OxIJm9ٺm}73PWmζ@'8dWJ(67*A¶sn ,cfFTr"e]k=d %"M"hKj EG hye誥@PT`s-RX#~#}ٱC5k]t>ݻPKEy)7n^L—E߾oK?zzu'cFHSN cfZ2MX#y4С%[K&L 2e#3 T\sQ5j % w2bJjSn*z*4Xܼ:'g;S(fV#w#M] ";CTf$&SA@G՘zihRFԌYX-&Id,2Q\ε=E;1^H` ̈’2lcksFȤ "*-[v`W W `fb0O~nE Hх5*ix KmyiF6⒣k?ߙ~p;ݼqNamçi3M,Iqb6ƍYWIMuɡD+!YBlsdnQ``ؖtPвIqi@6+T5 NVcq(3@D%k04A13%Da8d.-PzMBJ]5h@u3G& ec*3־ݖô''c=.)KMc]]m(R&.@.RE6`1^|ʡa78PTp64Nmik[BՌ^{)e(nR eulٱzFenSuz'3Eaё󣎅n d'@oB&tFz_Iqi?x zZO2ȏ:S7^ߴ^}aX9XHBU1%9g4[ %zΨӱ_~7}ۏ;x%XidږcrzXtDbtI6;@M~K3 T0/hǹ}:s&'E֟[ Bwu\Q>/ٿ>祴`/ӍZ.Zgn$TfƚJYkFfdz ($T QMR87F\B!* Z­Nu=C9EN q# z(S eR,ղL4^F0kh3L|\4v2,+7xaۿ='n5J֟W#JfkDZu߷13C-#a$pӬW+HR5͌-Ca1 l_1s+Yn]f2t6\ju@\z?va5kV0\/Հct X@ORf CXe.|ixaz,Yb=M2<ӥ*SsAe[+a]BZB4n4h' zl^8@d0aqzSmǻwu*Dl tY&p^s5uo\N~JUoySJ<`3ۏLn,G~<4']_>IxW;'Wq[v933F徽|D AgAD豖o'ȥk`뼉x>{o;|:Ҹ5Q2z mˬiN:K7Hjؘ`)$k~OfCSFX㊏g|8Jdxz*ܹrձ}d+H#Fpv̝:xq̵ZMk%-ojBm\jj}lMUeͶf&l9?`!oT[?.w5))IZȍi&D2FjU: 6!*:*,"E[J:#W7"@2M͔ktv(~W pY2TV<6 k7??ǿt!>ZVEvI]͂19M C)cjgABwP &`H(ѯ>)DWeP},dGFEhY aeoh3&`(\y-=h'HZ TgPtLF΢#LUZ@=)Goy{tMM99А67&l;(C0:?7?%2.twlR0ݣUPOx4,QtL5\KzӔel*OQ~KYt=A$YV`vm~߿ld! nG7V2ϭ6^CX\]:~28w]WA&zBo>ymu7E!3[k⃉)nzZX DtF;#HuWrC-m'4РQ(KfZipp 0ע\AWk(Il=M qOyY5PJILHkZtEt;5mC, YP@^ND׀#Uy>._={GT m;V 3 X2dA 9]4$KZqcb*~s3].eV.>IfVTq>`Hj*ՈEVS>z&J7`NeDN1:cQ4ejY+¬5DŒ9+ ٠@@TkDcdd 9s T {5]qԛ& >];gx(Hb2Ec읓6 ЍYҪSKz.DAs\tiF%Et"5sͬR&"rf]"d,xsÑ-XvEru\X&V2I2e#= )z{h!GVHJ6i;NeR!Ua[x j>P @뼴/L}|)].Ki~WlKU -6YO Dkfc>_&vƝ,"kT&ADD0(M)Їt.z)=KیF",]mĀUNrcn{&{v;Riga;aE@i3`0fJnb˝m5}ܧb{X͒u]0ȭ ŭ{xa-s]<"X6rY٥Tcyw%m~YGA)h dl#0jO Dnt!}U![*iҝio۱Ûo|gw/ba{xԫӐID1S9%{TS݂<ӈºK[駮3}RPOi=/_w{(ؗri6pt4'"ԧ7Z/ݚn.\zYchH(:zG7wδ4l%6vqduT$7PBiF܎d*)#`tQgŋ>%e]f# 0Xe5?4z`\•Z23R PRS6dn=Fʽ1#/cm?ka}fʝrJ-Aŵg +)HE֐85V+2#G޺Ed2zhO!Pw{?!/47R,ljx?}~~gߛmg8-(M =%2TcH$# ǫv*ɻE(WEVH-5tA#‹eDm>[ `nќ07ۍeƛ <y2'V)Xc]NTfefJ2mрkΗӼ'U,n,|`|iq յ^N zMҢJJ"a* m|ܶg=f$}vzl}zqhFAFlƚ`A1J4K ЧɞdmX-3:-Y#к ;Kƛt]Gk"38lRhTy^U9MzY}~Ozgڝ 8>zrݖrd&XqZfF\ rFۛ 2A%Wߢvzˣ֢x2mIPK̝V9LCF? ^|FI-@9 "EFyHgCm6]tYgC JFm#4& a~1/w[?:P%I!=?R H>_ rRZ6d˥xmr Riݝea6ui2}̋Re.o9 IDATwôCn=yY[]/m]8b(ŀhiPYívqze}4c2ݍ`3Cf%I}DjCe:̮"J'zr6_ԃWe[e PT|ǫڗ#Ua,K#zpD",iE5Bn`zG >HuvkDa?g?$QlRg{q P+Gx43z͊%7be0hXm+Z2&mseؗ20kyVŜeDfhM Wj\2BgoB`тn}rlKE^t ` #HuB\s-E\V!guLFwG32He5q={Ms&)m}{yi B`fP3Ci280@!"W/Cm̩o7G:e>&r3E-oUk{UO}^n4s&f挔p N.swt_"!n!M4 8P0Z{߿E: ١"KId6Eb{hfR ܶ85*QC|L?LOʹ3;zyuY/u9ҝpӋW/v6|۝7?z9GrD4mo1olUsL=rse[Qaۏ1dC^i=/f<0}]SE??%tfHSfH,޻#SwXFx^k Ь.4!իQ}!yFTzV1#Ys؏L S!(j[j :539M_j<֍J /@ۣW?2 D:ʃ1n'QVELF0Afm FU%4[2J$5˖K4z|NnBV(Yۚ!*Ǚ6m!n/K5Zb o/;|Ǜ q}ߑ)("ܭ`ej5E kGZu5C?r1Vmẳ$PluTfhguhZEFc:j#1'Z0lH!$3RP*B.=N\Y-bQYmw=c R4RbWe={X/vYbLf본x}q`I|`۝M(nGYS/?~ⳏ_q'ieC5KYZ뱴u C<+̬nK`_~zWOc_xӳj3h3f~z\ǛhnssMROKv^X}I us'id!08ZSdZ` >xJ08>Dս5 ~ݯq_SPM2gͅPnn;Y9۫}i[;?mb;CE \ƃ_ߔׯU-5GFNסG{lAK)nA+?Yn5 C4fn֏ a&L Yl#`z$ S%VA34Sج0عY i>FnX29Ϙ)ń!L~N]9̌ci5Xr[ w :r+i+mB4"&)-IgV3HjQ wɖ4mj50 TwJ[&T3rVKvtM9/[>=h6ý3)su3ft{sԥ)E#8JHI̳52"WjC;Rv Fg9#Y-cw"xgݯ ^:ӠGǬ ɂ,ØhuNg۝mmΧg\f_8A1Q2Zlܔ8ԢGCl64.US\x+M iP('&(͑ ^|s~>A{_oo.w7f|q)sG^]ǀxM}[0gDD*XXݙ 6\?0됈4#tvHT[}IŢn⨧!jaK_+6_ph9hs_oi"UG}^X ]ɧ|I}Iy>"0P)ǫUc;D>"/68Ln5_KKF,/quÈHIQ:x+}YX.dBwBA}Y9 Y$s X"[JBp9ЊH ԠHV+*"Ь_ޠ~v$fUZ!z؊"pI/%\|D(XG>_6OB4H(T4{LLH0`Xjw؜՗^)gE#`eueKЊQFN VZ0F@R <h٣aYA۔A.,6_^};?}>}ն=܆mMG"JiBKV[U"^N[:gB`"by}F '2A"C}&C4]0"mkTd ]RBH*ⰥkU3[K_$h `rdU#lYM<&%͈#+-L)f0aVͳ ܴ8N7,8 ݜ(ђ*2\ w\lNu<ӗ_| OQëq[uken5TF5 :\z1䀖shhN,=Y8r}v>D/3̏$x jM7uF^!6 d C&dzk!K!]a&h|8\~o~ iI9nYXq07ZNhZDHa0xCI2|M"inG;GmJ "%8_?g۽dPynnzox{p|K4xt> &|Lq&FQn0Er^us`yb, 1 JRE6atwZmf2"i|s?sU.l*VjVŲ\l^L&dCA!I$ ta!ྭ>yUxch-?z7ynBut?L#% %qWH_$>NԽzd`+["\]Tjx9@ڤZcsvgh6FzŪV7Hכ|^+P\|aމz{tC5dS|tqx;<0.q>XL)4-#;ߠD@ee6.n,і9["͘4P (ۉin$:6Cm4)M8R5|(O/wxwݴq-K9f6M^0R_#PKTYNBn YJKIcǸy͛Kř|%KKB9iG{ O,%rBs D' KT*%9IZ4uXX#<͈aWxy$EтPoł!q+fN+PaOA- !DATSFNcʆ0Rc$B 86[}PPRH S, ^rD:2,^ś06N ^A v,6l:߃Hn6V<<;;^ǜu[,4~u?wxl e}=uCe#l* vH]|}KfXfKj`ˌ4Kj֝YEp :ih;عQ=q#*yk\?'=kMy4rJq BټK d6a<\\?ٛߵxț19O)(V19B5P/Ԣ!Mnm]}>kA Mi"wo g 7͗{ʧg{́dV4ՕɖC;\gZU\ֿ?LQy+57iko}b5W7yo^vӣQJZOR ջɎ`0죿R_~| (Yr|XoWΞ\*C@%ܞQaLmPU,Gǯ`nnyqn|Ì6kW{ƚnl/s.S:=/ Вv}98\gM:F7~p9_)_Ds.DSwHRSvus;Wm puE9\m2z2>!"$)KxcQl]"H(5nj8@D IVp-ouy{֖)}Z-Xc~ {$9n^_ g<==q䱵c3Fd(Hn0B^.RLD]s3Mm3 wO e$hJȻc\>D'Ц֠PȊt+oo79_͇}|0Wi?aԱ ZUo}?xYяX̺QrǂڀH-s.eII#cf=X*]Z)k bOmӜ#mG ~ݯh^WUkveڕK9, 45AiTq^iiPF6㈧0cgڒwle0}+Wn9K~FvuZyO{׉l~xRQ(}L)Ƕ\}[zbffN̰aC>ԫ}p4Xf!G vH`eJP20AADuKbA0M6Log櫛m9njZ݌m*_^g/|zx}W9so= g3 g̣FyItudn fu|};PJn^7!vcxZD+m̶gg<[) 6- 42OЎ\:3{=?ĝw{˥OQJd'.b*ebH9?UT' Mͽ Hxo,SbRt[z3t!5+>;6>MioQ߸h}XjPh)3퉹+ˋJEY# =yXÄy)b3VKjTd&Mp/W/}[tȖ%[x񰜟Ts;2f Jx|58y 3cagRŠhivi'Hfq~Ӝft' XY*")uj14Y`;؜bwα2-'uNJ$xOyy3u6A n*.>L9!dn*$D#P&JhGp`ҎsMރzfN'[tXt3 >U:'bQ4C℥ҒDX wf2 ́0K"B&1chڑ0q{ySq}hI8)pZ^+XܪyT$ZD@A!vH{ff7" UZPĩE";X~{bK5qn_?iG̗q8hm7! JJ!JjeZuWَ|?{{Vv9֯⌌TJin옛a۲g7[KOxj#@Z.u[LFyNVoSd&% :іӡ y(Ћ[My)̀ơ K.pĬo lU;i<쿤PK԰߃):/q*1LǷ/ mj:!c32!!sw+ 2`P RwtS,Ϸ\ъӬXziҔʎQ&ڜ g WOή~+/>zYZ\2cD6yyߞЎmspgЫw<\[zi$%v}g- ^guxy:QCrcu袙*BJ 8v#q:L3z\EeBQ#o֋/~ӿW?_?~']͇Q?A k=zr~w#,[b-84zKr)MQ_|&rO3py˛4MdLcq$ IDATGX}$l?B ^YPPf?3Zod]\TݠdDqԂZX܋%V  LhisQb@Skٯ i\JI1SKgNn:_ )cB'_=Z=z䆺@,蝼:ABX bxp CbWA)z7 ;4Sݝ3nԝy,ifפ؜9cc:bs57^<1,KfTԁX4v衆 Ѹxs"3 "Ra&!~`w+W7fo/Ms`uzyX~Os=E!YǦhWy&ɬW/eP/Jffչڦ 2 %c݌hӑ;J߮ԏZ7_|/^o~zooo~K߯?م?Tʤ?._w~?{_CX(?O3HClf%XUn-" ! ΰp?ċz10UX&vZ|,'D ݍf}˝;maRPb͸d@6匜08v\;^E,z*Xc:kN'p8H$nx}ૃ>5pcjZwРu`' VޓD-Z9ʵ j#ùQx]w?|lx+绋U#lX6Ӌ>N]qxJ}̓/|i1HMఓv+;ө|v8yBr O[iPpBF;FNj`*OJ-SLg ,9ޔPW$_#S%$v]ZX10,bd$@E=:74&S Q *E}TX$JŰ{R =M-m4'yi>M *Ble$)Vshoqw/g^/ĝq ljtx] !Mr0ml _7ϮG/{Ä$1dА9;8жɍ[%a Ť-d%î,i]3`Ɩe؏|8^N؎$jBfy5/z~Φis}O?=~>}yG/dn",bfp̘ESx}i l0eP.g& $v~+#QL~6,w97qV<'+6[$2y6h6ZI%@*L[5`UT˓TB\dPjOڪr?5u9b SJ[4-0ɒnhpC9a91PVDW 0NG+S)D3WjL-ʄ/[.;RX4ENq4ba3ZSITPPJ!K5/"FrY[6Oӛ< !M̺ (hUy|-//>{ᰙ|im\vNjviMWWǛîP0 rnl$R1O֢L3m|?& |)JbH^*(D$.5 7gus:c'Br3PN6Hl'i~_gk}+_?C!$F}[[o}k_P? 9TRп}>H8tm{B.٨bh)v䲣5"?y38iѕ[D=7Z18 Ut3]Hy 0 ,T9n~󶿼*/~T9)RjL6gI&]fI[$K)CT3=H%B0EBŘ18'(7!{__g3bk(pۏ% M,Q:m!207;r{?~WO}")S9P% h)>7B/2Ԗmr~p: ܮU"P &1_@̓>Y2h4+XY84JSvݳK_={?[oo/6 A6,u7{XK O,lN:Zm-go뽠iw-!a"@(d̻-@K0+L!}1}E(+d Z dk]'v)Cj%[r4&\ӔDTÜ>3 Dr f@b(^qL.U":d֠fQ@[2`ȤXI$6Ef*chD DB*2# -(Dq+nY+菭4#bxG?psܶy,&Z5wr,o\Wg/_xk3t}Eւp \Yv6a߮}ڞ[%~bl~;Nep~:bZY`^~@#F,%AY)p';1$Ye[fs"oe_e,C[ ~ݯUD!{uo܋Q?}e43g(T) ln:~Z'aa P֖(/Ʊ>AmAY?fCș$ȁ\Ǩ[N{ ZVYQp&a`$AuDD1&6x-$ua}W K),ā@CPclTSyx g$S&~uPT'jAnuWop=ȥx t-3_h֗6/o.qb FaGtj3UVll"K,ӗh'sP?oWƿ9Lo Qp~7ooo7ͯ~O?xi?xe+iv30#S2#M櫤 2L ffi'0 6>Y* ]{9b!L5~w~j3mZiuɦ0RpIHm* #ShقrJv7~?|jVXr6~|Gfp.UH)N7dN TE>]p7:0yR Zғtgvu^G:r@`1-=ekyz:v}ZyKl_%@I^ۥN-TyRi{{89:֏0XTJ- * 8< Q8O9ۿsNׯ5{l;MǫsȆaW/.`zHCV~J4s;yHd}Eb20HR$< eR-[10춻6_MQ9u?g_ռ|R_u_/~BiVD,]P*2C }r3ܼvKPH yPQ1e4I l6֐H[Yil'BX~v; oZ7X;/Y'n [<5i)6E߬豎@$3ڴq<vo ޽h=bD"T˻2X8^K'\'tyn9`Ba"m@!؉[<~ȷؗ/cyaְum՚>bb6$4GhRFq.=[SR/^?qڏ8{B,5P(TYpq]&i"#1w uBu%En(@ Ԥ~m` LPe?>x<ȳ2^<0 x=0oB7WΦ`InK-jqGU׭][ϧ)^kCXцx!sJ fcNU&#%aivKMEmzO,]1W_vK/-3Oq>kcA:b8 [.ڵ OS9Y2Y- ti TICvv7:>dm4+}u745"j 9#PRZODӠr 9iudZzք.x{y'qOeYWP'?_5C?ny5?/?^|g__ ~_gX>O?x_==?k[?*^Au'7GGKD ox'~~ᾂP{PuͻNJ/%AB5&I,Z3ͳq`U%X"0h]KA]A$eNilmo.Ї_("2x6^6n(aC(a[ЅHJ:S]XGԝQJqV:PPTERm98\ꥃ/cqwvNLf=0*:Ln,ɇ u4OU r* n\[o/}@o^+Wxp4Y?XY""fkO/1bK:xU'x6tɓ+k&&a5RDD zcJb0JaQEHL((h4G8~ڠ8T5jcީiyϟ>x=Zժ/.bحleN.[CG sΊLQƓT?{~z܍Xw8Usw~}=p"**pPɭ/)hzL&ւGE"D:Bw{Q@ڨ pRqsTMgxj_u6 uȹLfQę6~a+{hMN;߮kC=Y0(75'${lj/`)}PхžJ׏>zOcw:Z&֭]nՅH޹3BБ;;L}*^Z sE_0^ ȠХ~J]=;NzQ+[;#lQHK2`pBM`RP#^=rV}%i^绢"7]znӟP(=~z ^_uO/xvuG>k^Kw?O^_3/__>+?|eB[z\Znݺ8֭[軿^M TQO^Z'wf>e4A[6ɢ*,ʂp| ;|Rb ġ* IƚjOs4?ċ`u$Q$0$T!PUQF*DUa @TkXEj7޻dHY( BLdYyߕ}.86{A IDAT*-\pOdýV k# <# R L|ý Z1qn|VtPy.P' *}:b,gN"$ ERZe{NRmFg}IbSi9y~˯=xpL}έ\A>PU"mN4NEݥZC*m7z-Ң-,e;H/l}ɽ\7ge7p&www`ֺ"s[[PRj HR|NT5EW)$[6.ȧ=og|}/ާ>'?{dI/yc/I ?>vE~3G~~']{cG_R鯽61qkq\(] X.oIAN;Dcve |^R##GH8FRea3e"Y*N$HHTs#~}#J&ǁ0YM=o *R_24m B!QiTQ qXj]@ I\lB-/+WxSS)aByN3O(85J&FB 5MFtуi7CE,-.j*if_p,m Yfٰlc:sD:KMG^$hAkhն/ ^ٯW~U{!o=N`u1peڬe {Bvhs;sV@R 0 +8Ȧ9t/K NwrAXŁp&YapVhe.`8X/e/e=hb12bq(4ЀhV$w LZLՠ635ALDU5`t& 9Z\wOGWZx%Ѻ61ER@ $h*QE+00óC4! Cͪ!$8m<4F -zȍa2 VwPHռZ^ʋǺwYS#י_-lq{E|?^!ʻmg#'6W/]~="an""7>s@-oEN ̢-gTQ2AH0jDWI ^) })O~~hA^YsR@p &{0hyTڴYo,%iHl\ed?IjD&5+Ll-`D"P4 _%'1PYŧ Ȫ9%>3C؂q?d"FiΖ4) zI2T=*ɴ(D.0YGc\>Mw7Oo+G1z :TZ^L:lDV'X+$F7:lmYj]94HԜT.ݲY^wLHILbCsHɜ-,SU")U./òJ>>'fo#[AW^[|??]~S?|?~Kto/PyQ5{MY^ˮq SVP6W4:ms5bP%v3/'(H1U.|JU4 p A xObU9ס"տ݇ fx.p:DRksiI*@$ ZƤamJB"Z#uJya`瞖zp$ukGj=wggp}È"@%ԌLq˫tݵ+\l~eA=ȱҚIL-CV1Qz#!{ p4Lh+qՓ'~*!id)`(g¬͜P). <\3QkL*>XGto*u--FzDTATJ ,k~۟,OuyZ}NFI[+׺gvgwCxM%Z$`"4!wRb7 ~g/ zp{{GzSs.%hJe7!"ILjUEQ4&ɢKR%$N V3N$͎Y-^Sղp 40ch5#X AHPIjM-τoe8LT 5@RTƒB1Q{1AK4yH0hSPaAAMEB]cݲjsuG IVq˘`NTPp$$ Qj0! .^GB.^;}vvkӛzvRN޽gk<6 *Y-ayH %_KG^=e\\VdJrfF0lVBL"Gʸҗ),̑fbjgPI)U...ζ}*D Dz}!A7ů1½u:MȦ*JaCN$ D4emA<MH6Ph9]TB*1l[/elFܾ~_B(wiԱP+׻nQݸnVuI2YEEkO_󶓓҇ o9_c㮎~ڝ̦o&J;Q5N-Ӑ b&}@LdzM%Mj A1TDtOޛafQK:j {>FP_ i׈"mGT/T.>_'McqR_t{Mw94"1Q_H$3@2\LU5"܃R D@CΒD2.ÐBO*tGZ؁ࡣ%z}&ccH`/C'*!\`bZçNJiaEsH$ɢ&5Y`90}t[ '^2ii)tֹbRH˦Fe?`^do/>?z'?G?oypn7,{̓EGc_EUvD2군Hg#U>uJT >u˺oFb+Ar Xhl\fSR ͪK;]TV/ԕȽ*sht0 yS۩lK0Ƀԡ2am\px+'gI VA IA@#OL43w2OUq7f;w۷S}9[Ƃ4d ׏/\j+x0] _/WMU#)L(.T]mXzE!=pun.$/ҖSI4 &nH0Iꆱu3:Y&E*E2 #q5ͼtmqt}4]'S܇FC%(^rFzЮRZAYTת*3J7\K\GD/ap!4*&K>Z{dmƅ(=o3߇~'~o~P Ox+gtO|'\ݾ⥟ *u<~+^_7>m[Oby3xFЏ{?z^y}@/~Wg)h^ Ƽ:D`\v@"[p F"`0ܩtKG$C 5m<]?m (CQ)I]|P C%Dՙ68sj) ):l&͓tuAj"^^Yr#H:&#eɌqn$8TTl'],t%r`Hi`'LUsNקÃt|9<ȹgpuK'[C2%Y#q43-3$Wz_l8z=ljsgW\K)1YKNSN8|v؜-epa4#M7cPu2Z)˜l(HbӱDTG۴bF&RNf9(nˆ$ դX0"L0J ~|z/~C\_y[W(TʁvPyŜ̲T>)Z;/O?˓;w|Ͼox앗K]kn3ciاP :Q'@1HElm !QCxdն/an:iZNy`hh~R2@QM5#@\ΌH$eHDFT/` bJo]Nw:}=I$,IpB ,:n.Rt:7rNB 4aiL, & 2:0‘SIbideE'iBȢxTdΏZ5+٢E֩p2 AV>$i{PV+g/Kty_eG?竾͟~_O}w|Wo~O9^fW|?/_~?#/7MFu_DzO%4floL1(zaA)| ""iC@iAN;@w`'0x4oa M :M ڦb 4Sc | Z)}{PP4&$˳( ourtݐ]ֳ^OU]NtEZzT'p)6x*QEd6"PmE]N@0"k "-["ZIS&S[4 'dʨFQE$lj]w;|f}aΤ;ۥRzʲ̲;#e;'m<}9)۝ ܝ%ܑ5~q)B%""g;uu"Qz{Ǘ8G_ݽ:MQ=V6ՙYJ (p.GeeLJ&R~m?^7O͇Wn,aURi;hgόPb-T+# ]=]/W|???s3C'~O~ ~4t  lA/,wɒվ4QyJ)t.P(ˤZ.vwN#JRD-KLw5 a+, R:Iqxyxe2zTDV>rs鯕y,XٕuiyǓ;:=q 9y25)C-xt(\NÀ) ˤ""tRļ*= skn8 g}j2wڕuWPho~_kZG/4_]S|ꟼuc_Eԇ'܅4"YgQ"JX1#4m1j{ ]╕Q>2&p'31]C"ɭDX+xj*B)Rzſ*9Qd/)?TrH T*"czw2>u8Lqm):r\PFv8T_DEt^؝NTJTAX H\lFb1kB,\2E YhML=-چC-@рe:R*!GY Xzdtw|Z/m@Н SQeKmHZb̾\(S}Y{38a( NFќgg1h1# lH,FN)i ]L!=snV}ǂᵎ0‚,Gqh$tkNJB=̬XΖ_ڗz6M XBNɡWvtOr̸[OuI:GC$%N>c7eQ>B,{?^?zj~i,hDuاYdQj *,!#UAoCjʦl IDAT˲#dKyhb{gڌW41f?)^Q6%fn#6{,EXk,Yg9]]f`{ Ŭ+ 1QjC:N-Uh Q2baHڹu!sHW˜;3&eswZ2hH _Z/wOv"(p3}a8XV>,z-"N_ѕ Z UaC࡛7jmG_;'^: gcDd4#{wY.Rs>8tzSwlj"s#X| %B ad)a솳ݰS#d/GF3̟+~u[Oܹsr_{&L CDXRde:JPB D>舢,¨uI5& %5D(F"DF.^ۿ,x~u_}.YbUSe ^ۺ[I0(+e1tCn}zl<ƲvIJQ>9R5[2b!Y2K"JClGI3XI ЉIF$Ѭ!ZLƔ Q`Mf%*T4if 'KxPNφxopԝ׾Fr,qlM0X3y @G6ʙ6'߬_DEl5M!c`-=_W%ܸzn\>j)(ڂ4*۳vSg[wָ;\dC`+̺'Ge5S?gwo^9z˖}we.T:2$煦t㴜cܩzWWF5Z_{γw]ֈuƿťK*b)TGUbC>֑ZLYSw5!j4ݚh3HQduQЃf5h+Nнb ɮxh9lJ/s*fd=V%\:LWoﮞWƲʺՏz\I)W]SĺI;DQ`WxRCS"@ $P(" $e%$$hf Jkȹ5!Z BJAFGӳ;w.O񶗚L3X-HWm6qqwC5d&Q=hkA0pd4j[=KBRTn\Oz+>e׏z>|uVKYrk.:UQ6ukQ0]ܗqwml3v]<{{zO}fwѫU("jIԚv-XGe!bIQy>@4d<%}7D76?.-=!ʽ? A/%pCkz9vqP^GkH,X&8::&5%3` H etŢ. sj95uswmMWΔ"i+#E'9B;nON|b6XH U"YJjd/JD;] a# #|Ue&lrÅ-TΙuۑ%\j ! R03f)/WY)AAG %E23AuwgitpAVF;Q |>7k^MD_/nuKsLP<22OX.-CG"^>˼Y. #B& #R2@Os^S_WWOou50:IE@ԗsh* M5d87CB yEFH1jUP L@0%KIis@ 2\0H@⯶NS+U ϰ(kn\ g8곿@~CX+@zյj} "i0.h`#(%8tRp!6y KֻfY:;h9 jQ$i(2V1PƂ:B4fPeBL,*(#U%LIh2[yMU\PcYX$iҚMZre[s䂈M6*¤ dTK̠3[I h'LaBEU$B/Ѩ Km1MzN&; Є!lU,"(0X߼6߽^@_eNw&0Tmm('&ր*0h4 c~o[~|{o~w~=;߼y{?￴$%n  <\V%n᧣/91|ޣ_lpw_/Z)V2KvV-ޘѝE )jLD@}*%$VOZG$EQ =FיwGDI%&\yӻO^ImRGϷ*b}-ih)u%VcP2;*h^WRDϢ^B4%X* Ga0.SWI.t $ECS,vj S41jR |TX (`'E B%`0yՕ #F1G}UHٕn%"onxs1!4)aR+7ʐbA4b5eh:Dj2X)IY"m>̧ҧ#[#~9|-2t_*`7ԛzSotTĴ'[Q( OHB@ݦC2|Boo&E*6mp'9jjCZI 3)HfKh Y6CU2Ւ0gƙ1 fN+EVԪcpgt,KJ.PW\kJ $l_! Qbh!E\RM<,X#~!'Lϧ#n<^IK X5l!HB4&ZG+CjRIWq" D)H%P6 ""PS|vD ~/jG4ݸx{>ӭ üظa43dq}H*=W(R檺}\]|lnO?Ϟ}mo?]3~4<,?*y[+TBUE"F'?i&bj3pǏK_g/wD>?zMR}R!>"ZLbVqQ0:ٖnFfUG *H"bKfQI -}K~:lust@p\vA뛻OArh%a$CHx*u]dPL)6Z丮^M.Ryu{,녯wy*L2j9ODbZu#W0,=Lq,Mdb zRpRqɊA"ǩNr8=ULn2VSȴZɃPG*і͙ t]#ݏ CsF=N` pdipqgmiE%UҬ,]9)) Qe *UQ5aƛM|k>! Dwui,;K~!tPoMz&1HYu~" R22 @:OD,8,):6^t6hZ h=mQTdARl`.HA DtdC̈~B,gRr0z`|mc\XxzM+ù(  RVfpAĽ\bz UO!u|YR[I1r \GBb 7բ ypمTAh Y*!K`0w[Ș6_9'U)U0VJdԊ&.U(4H,RC0ٕH "JSSI"lRUMt\xw|qbò}P0UQ)-JJ@BE̤(e0 Ѵ dFHZQ+*C)\B4.YRF+:nwprx)ۭeZU@a'D!`R8Z4n<__o}o|wn_?_on󍿘ng{<(FO-e_,m;Ԋef )zx{ja?W{{f"ٱP}@PS$L]gpV`X1nh EL5Wq*%1_ .L\^KվpE-4'N)r%KtxځSoBluIP:5׫}1 ^^wOd0j*cW~L"s5=D3ޙ< vaZt{gdI&:4SU;}m 0 pk}5"r} eAxrw5^]:픟A +C*C^L}4/z i˲ ?AK$^@}%\Z+ PmT=qVv_nToR ^@=Tqz%$0LRT1A)V`Y9)Ųoz+NNtim Onlb^62MXlSadi&du]7Rt #&%i\w'U&MsXZێv\W|y'vWԱH Ed,:fQ*ЁZa`:AчC| 3ҘsqS0^1·܌z}mT#b0% ]T[ZBriַ[WW~?~{ws e>vSw< )I%UiPZK]Pѱmo˿|;~}9??>x=x'B4kL)sd+PZj-'YbbӺ^!Ej8(PjEsWK($a] .Ŀ.C6*z]UoLJj6tRmm6)*Ty6oV:;3Ad0S:zFk6DFv˘}EGl" fA$5eu)z'T+Os)|xmo=" )%<>gbjAx5v$rv[Kf[V HB)~&RIC:&f{ޣx?G;>n7O|6?]Ǔᵔ 0@~+V(֩@lRv#! .If뗒ue}X+@8DPZ&_R01C Sa2@+ETmjL^MP".|`pH{UyaSј֚M&/nOjP Uvr]/1Ly֦i:|gߚ}_zXtHN}#h%W.hIZTi@W!2,b{'YD0TtX2\OPԌ2MaZ;!ČLĪp.KUEzSoMAių#}$HPMDGX작RtwZJteu/eb! r')cJ_biG9:BE8ﲽ9Y,n!d 6B/(} 8)F^% Vt['qkx{Ox~(> l`yyc }@m.^QrGP!$JiZ:.%S/2r|$Ës;.vІ CڤsFWꐨ Θn@Y\iA-" W_dM+ @eO Ngg9O4ŕdmuaP3kY<|<y7>2NEYV6f#hԾglf"=ӽs֬3mIf Icrd6wH_zv> ֢tplPle;ŋiFnghe1"P%&:2U3D%i?ۿ/7>?gϾ4ώ/Ƿ~Xfa-e&aL0ʮ`k8L|?7n"oygOQGZ՜JPIQ\LM-1!CmSTQy_6d.$hh$ [U&]j]*i$sk{Ak]+jy㮝)QG#0aUh*C)*dX.S+/f5XVxD V_' ~ K>_BJO4flByC[wժ !Dpy僖!;Hd@2ŒXYQ|yTdF>mx3}zec݌l1;izyonwz/au2QꄦdXh~~r1t0)N5@,{akؒi?؟ͣ8 ./q;KFIzUn}w]MHHzkf_f9e>/-VD휱D,$`P.rV2gOpwFЄ}/o}o?ܽU6y䌢ԁHo":^ ֢x9c}}>o)o}t7_~og|ځ ] Eajkn/׵IdT5IR+ iM{sʈp5wF Izy:,oP,+emRX%l!-UKK "=O6srzN Qٕ D ewY5"(r$>\0HNh9/#A*My6rT^\h ԇPmۢOv~;69ÑP:ZMK ۽meGn,wXNP8:Z %|ɔ*}<܎#,&N E T<}~!"PBN˒J)uϧMiL8={3{ J8dDL+ gыdҔMԛ.Xx4,IɄM[~IF2@QkTE9`Lc~mke>Lg3`R@Ѥ&3ێ.m]1sVsԣVmge_HD2U;7q1'XhgF*)Zt!_stX-]kȉqΘ0D1m.!DM9h7DCq/I.!T\rv|3CT!ZE h,s&1@w!]I"m:S_nx~xaS7@IXx̛OmsD'au13T'ld.ig󣏣jV nnrwfҎ~~V$| 5K}9E;D[e:ej-K ̅ 2bZ J1+P!= mN6 [eTk (菞9᣺s5m<IUR$ZakVN'"fjU  R"n7b-03dB`ƍH;Cs11 @:h5Zm|a)vf9̘uDh184=͇ߴgo鷾T)Lj jdCSW}ɼ6n~70G+BN"1=d("[R#)*TLLM2E%}nMHgpV,W}90U}nd WZ@g" dDjA]a_jU;b* I-Wdp]9 uVWUJDv:Hr/0듨ܚmǴ?Gaa_Y<0qp˫0lL@fdЃ7cNG dcݔbwoH!ua_wwj$zKdFRq\0yR5ޚi΄.٪^5%VKJMLL ZbX ̍~`"\>ѐuexYtSo:7-o)y/VL3\x!pP2 He ޥX Bؐ Gđ~ڍS9ɴKhB!PM8+4ȉ.~L?6Sm7DJaF:!3"Xe=@#J*%')}#E49&7¼k#u=؇вJ93c)Dva33ICr`6f=^QSۊMV@%d[—hSm>t8ZN%4Ms\Zd\\I\M/RzuwacT K2CƓ+yNmK)۲mq3E"f?殔n0"PS!pu9>}q則;=˧7nZf-0;ZJ&D6)v~9ykZn"[qvvf={i j-ZK&0:D%U$%[6 *%UIJ';_y׶_R(T CGC\3m;"2d l-& :LrX)K5u3G˅8Lm{^2CKӈEy6;~'Xk11ϥoo/O>z0%o0$( LjDbEmsUi2{Lr5CdM#}VK;W*9ҙ XIr\V9d˚cmj;L~I& RE`2׬p"E*` (yɤxb+E (YQ )[ ݑLD"C'⺤\. lB_,R#o>]hciH)k2@̌p9{:aEscK!eq|ӍH_׌"eHoǟ3Ifܿ"3BM0 lCyp ;ga:e3lvRJGFEs6d.hV askcW;͒ Z07ԛzSo2u[ /6饨Z,8}!LɈAI1hL-X RbQ09yBnj6#3<#2J ZdhTj11iYfBR\Zj6M!5\j"R@M 1!2;YHg~h(Rq1 ̥EpV\&Fg:9cJ?G;d;f;33;+L'iV+EuUxe7cNIY;\{,#Ha0Cr֜Hwy:NǗَ6%,KFJM:=ѥhl\9'5ghj$NXXrDʉ8"Τhzhc$N N8qfbYzwoS/̷3׏wşyd KU MAIͨEI3ts4Q(!~JةUR2[ǁA&Qkٓ c&sCsET;Q<ޭSLTU^1<TAHmm UdIj{,bϋWH&*)#KtZ^va{MKA-h'#vM淽*ܤ9杄K`[7|OF/~|v}88q4a X:0qTRzrW:GzcSV£yI& @-Vo틗^ $KmAQtj0ILvOܧO OKV_}bǾV77JFp("jE)QDg9*Ct Q7z}^:C,9!LmQ[A\ESͩfE%EJL4qb=ގZ}VU= Eov Ycm6G9պVZA %dO%s\[H 1Zrrl \3+2c8mnm!Q "6獊Ws+4e_z=iknraC4F _.^QQ<"Hu7pjv % bĽA-cwP D-4V D!PEQz20?==?nǻK+xU0ͽZm!H4 /ne}|< X3y+|9l$,m9{hUڷY$CԬњILң`~^=ŸXNzݥWޘ?{œ/sXmuK1'i7ڄ1BIKHTF) >])iߐ*h9*A^@Q5.>[F)q:TC Aaǣ(SDRPsSսykޯy7F!YËZ36ImzYiIq2ƔlsC@BHp+cXKєM,IIʨbSV{u-wwvu"m:{=yk7 S͉P-uuL"ՒKD_*~tD@ KU0 XRW,2  )b(D%JSԇ(ǏOxxYnr*Q}H EB23n͋Kڰ`ħۓ78KD`U 2=2 Uxoc4QiIaD Upa+. 2 ѭgX%Ⱥ5-{X{Bk~)ME9KJHY1c4 ,K2nZn'O~"Γ'8`+~UeC([QU&NDh㸛&w# x뼔i̻8,( 9&.!J(ͣBFNc]<~0 h?(Z j 0 7Yˇ徦SlYOX~W?cVr~?o<[$pV ^azDdBq.,pM*KJT3Q XBclyHܲ}_c [*U6?7xlY9UMP(!ѸBM5-#"TعB*TMF*3'ݼKڮ#t[ ycx+Bhdmh "E4Fq´:]տH9YO$+?8ZW2^x:Et̖F#;9jE])8jN$+@[1djw:׈pPMSRw}AJ<#\TTGN &Mqzx|O\tx(R&sSק㱶x,0d w6twP"# y>Fy=y}~܏7ue\$DC(ѡIf [O`є E<'iːsJ9|n}1ṙX4 ºG)mp]nH!Sy 65Hȏ,"<`AdIvk߿ ~SqTwFKsoOy֓g7d>z(4/BwO~v;v{'Ks96l4z# DUW0#Rc{]A>DѐD}K,0 BSPEt4*"V$KM[N&) + ( j*xSU*TZZL"I4e3I& ÃRUPE24`jyJZ_ 9xj롵ZB6<&.;Ȏ2$I.)tU醷{T#Ivih4B[ChNBD bDTވڱe9sDP ׶UԨJSJQq:7_€oToeI~hCrF=ҒI|o g4DS0 34MGlͣ :>X[[d_Vq(mJc7>cg"_%[z6$:kP˩.aIޖv)BvY.ޒX6jWq.WouJmw wߨٷ%P,jfI*@[BDD`ݥ/UyچaMkdm$W` rDz!ͷiT;OsA:b1*fbUa'V z-ުZB0"V@1,;[ ܬݺ"DU?caۚDxqRC#DtnQLVv"Tco^Whjmƭ$\ _}n/i=RJE1h 늶 =)MT!sP$ Wot0` Aeb:{`m(UF: [J_>zW;D {ZFWHtQQ&h#V?߷Ӟ=sgzp} 3>8 AUz/N=Gm:lfI!.h`PS_K/N1 gѓ\dV`RKJֺtl FDsT2MBpSv@M$ W{Fv[@:%XI>~Q5 s~{)F}Yڴ.x\N ` L9&gSW."v6UlKIé jxḐ[Dd7_::eX~|<˜ŐZےT*zkm0cAi". h-鶞ںA t钒Ք[k5h!Qh)|BIy?>^,eI*Ërx\$Dje]sӇw/^QIK !/77^<o^|_/Ϟ< D9d`>נSLh&jNKӮHH[3s:ĩ2QBu ϩPgQt li[rj\%bG@@DB&.EgnzSђhX.5ք`rN& Ԏ뼾͐.sQA@m nm%\4RZC ANSډX{WUg/PB%@cx|/E3ӋyFz\!I^dX`'#ؼ #M%_, 9Z:)0QMhFJi|S>5>y..2LOK}8?~qӀ'zhYR;V)i[@mCnchP*U~R#xf+"ش`Sl{iFu>_vrN*J$S" P'Ez$ \A}m]aN%*IAJLYR HDelj\|HjY%T,ZbCx֪!8@6Nyܽkbk#[dQswA }҆ϼ%O/uOx(@ҺfM#"aL"tW0] Ҏ:" a6h `CΖ-gQ o]d[QOUo|G/|~qir#iv;KvAF$ܯ<@ԂT?-2h'v0z]-+  .]ޫݖm;KӔd1~QZKR^92P,nh,eeMW h+XXmǷ[\ҦÔL|jceo}|[͍0LQJC I1ʰ}m14oIERbC)ң:$ILij6@ ɛ$Id'h#@C3}[,I`9hmTqn~DN9ly : $iaB+Xk *x@ vUOu!T[e:nnpd\CgA 1" 4$!DuPsy~k kx/K\rIsA="±f M!fS`Zŋ6Ws##C5 B#]?j#_?_w>~_/<1/wWW㔅/tזH/tO ƛG2ڕ/|6c?|'<`s4Զ=s!k $#%:)G{;@DBUH^q>nKۍ}3bV0@'r)t@yKoFHĠܓWkFEE9HZT*lpUEwyI҆K].i*ˁnqv)OfiaE%HxlscJ5DFD% ;;p#{֠ 方{Q$ 3{['Th .V(Y?_j=6 Cs5IYexpe5)P4Q$P_t}c  @odհLP?td;ۘgfۂ='Ps`s)[? Sԥ>O.TC%t׾[^dY(i6%TɦI%,,5Jm'D!55@2D*!z [=gkXV} 7,{48}JBKF# &v=Vֶv2Li7 Ѹxx F˪*>EԺz2#z匢M BR: c7ÄH&Ȫ&fixσ^jTx$x|b˩J*u1  j# $bd$e$ZUh9%2!snzȷXK#?hCExAQ$4hލI>{dT0/֯ŢH58 L?$,' B; I胻 3OԈ=14-awGӐUxPz3XCD8yU /#zK_q~ZmY,Y= I[4x5]"0Mp|5^P<@l3AUJCJb-o׿~Ouٍjq)5$ɉx(3Q %(nGC&I ;Քl?Hvf{>~mm}N;#DG־xrɞ>?VQdWlD'GU6l`OKq#DLM5Df %kslQaJ {|([{5R# нpl(}vC6 1Da 8SnWAΨh+]#-NmD8X|/<ؕ] Qnz{8p _jc-- I}e2ԋץsYm-Ȯ8’)I/sBn2 "I L.hw>zq/|WH"FeZ[UR "+Y(K"S-}SFdOo~}ӥ$onk߻wNw)n>^w/oa` 4PEB75U6 A2O9-Z(`>E8aS2HCf/yز[aun ^}R|R9ɹ։m($_@DnA. qxXA% mʣ4Xj(4|9%Ai?A,juz%gn> Dh}NU=Gk<"./wbSQvҿqτs(C8-t//M|jL᝟ B vaQ ׊6y 4/pL7k~RTU}"h>?TDv!`Qʆ6 Pz t6C^?uىi+O#hNOL42U" \AuZ T:q 6)8^X: ih.,RDCDT Fi؍4l)GLkt۩F /H M]@GWFɆ+JS> Hl?-] IDAT~WM"uI:Y$VnSVR9G()AD@hZOe9R :;{B>nHS1 0u)}X))=%㖸Y%Z՟Dxs(K],e]TwFnhR8%}mɞ>_bη7$a3Nf!7?~>\n}/6}?ܿX/<6 < x>~{G~·&LPQ NJL ]FK9ڊST]$$,R i,'$ VrFALKjֿ gY]0bG:zZA1^^ q9>D8V.Ka&ӘRVUH~/4dKN'JI.2Tt`!dxXNwqXZC\.ZaHC&׹%bΨ. Ӌ!D j⥞QSmUItQK+KcdX魷/X?Gӷsh04I-12tAq ihPZ$L)hmHȦBfhڰq";%<?tm.=( ڙb@DcS(<$<PGTF8ؼI(U\qlljb($6 k%dl/(׹-ҟ;2I!?elڶ OUH&H;(B U/Rz$招4M>ԙ`98 ْu_P TR˱S ^5 jg$N"Bֈ{}jD ed͛SjT4&e$AHD#˩cZX$>Fԥ.u=2{ѵ]/y{TUg[4b*"ɻ*b eg=p8frK)eނ] ZuYe^"BD܂#r&}iH&R@jPA#5IzTt8=m7|.e IO:<ɄJH-J!JhT:3ämԇד ĆBO=ګ}I|?rkqq۱`HL|?m_;yzeLHUuT"^}U⇟]EQ(xbGA6Qj TRʔ F5 GO}~__n Xv**ByT<="{12Η_싸Vǯ'HZS HDpcsRI†X hô:.agYp `JE \22.MH ,QdJXl̖JCtJD`Dt{W5"RT'IlbNT=slϾ?풾ƒ%}b9U11om{S5 dǨ9)M4|B*A2x(E$:n x&W^ r*(b8{bR3{LLCD-1C7"Rr )Յ? vm5m3ш `a4fFXfmgX{JssV c:e) Qx'l`u\GHfk0(qD͘h2џ| S33[ʩОOw$w QF/I$#2"'R :ڌaK]ss,v^-<^f2ĆtFv&u }Kow/|okwGݟq*AD(Ȥ@$TJj]l:5_פLeP|tF:YZlaޣV!rs7Da=(nPcN!GLg$]` LI8(>Su=)t9q158"|4ǽŘ[ xRD8@t 5rV3_ŸhXUDLO޶ ߵI?S^ 9tVL9MzB 4s !)pHQ)23O|oWysᆵWnWWl+uH #Y ]r]&IФt8z /{G3R$/FQ)mȸ92`@PıĄASv [b `2M`#cϐ6[]j])fjjͦUEɤwfe%+04=}Kxx{Bl]!]$I R#7ƚ}fjIDI [DNfS)'+j̞yxSz zR䖘UoV߯7nt=$ 3"ӓ4D CqyrEi[]Ё\&-ULGȠB&8gRLӾNl7DT^†Ɣvw![.PRX "'=ʪ9~nǞ.2]4Lo-޺PMDI)PBǔi4vvA2$PGaL-evY Ke1Z!ҭ_T6R4ʺwxo~t"u vn>=?~zٟtIT"@f쩆bi"Eޥ%7:CkZa #>PS-4ԟlӯ8uS3$%Q_/"K&#M |B1z,\S5\Z5l1+_{~C+jŵ$jSh${xCXQ0G ʴ(;RH` V/B9UhNz:4 ##v^uG9zyv??l[o4{t}ž]JKsK LvQ8T y<2E**S:ň()U٤Z]ı;2 ɄDPje%jO'0(+o~gnCȍ|eyA%@%29ddY d~:6P-*f@ (zEn躙S-*Udd{D(`9T#o.+cE40^P.6lK^`{$@t ݣ2)Rͥk#j!gٯ?om} ,ZŴ&) "z=zCv;8n瘙wdx)%"5 5VK&5h 5X)GtŰ Y)e滻}^q\7j6 >KLfTGA1HBeI42ԟi{㈫MVg;2R"Z2H*,?AD"ҙL^R&P*:I~`9ZZA^fn9&Ǎ:p2ap3P{ֳD1DymzAyx5-|y>;vg&jIAAf62{52M0HP*&(1,\<-Ϟo3Em6""Jxd-Rv$i?hʽW/LE+\%#S)iٯڗW__zxGlS ˜օT뼨Mf"FԹE.yN~%7J;ª΋Ms~>pX@qX~{ @o9a :.CY?x(TJya*hIQk8Fj=ѺbAB'٤l0Oh.1n;Vqw/W,$ZxZh%C$ HRǫ[H77uDzw]Y nEImww@j)Tb*s=ZFO" *dG7K7O7xþ"f뺹u}P;B'L_ͺh< s(UP4+$$%RIUJIVVtNJܶ6"02̯k[]]{{ޯwzG*U8t`|mSdH8T)iX!9x_HE@ ]"_.r$.8rrRB$젫$2)G/e__I8]5MSUElǾ?z{vaAȈ 0iM !-oO pѓ\4-e1Gm_}HJY~Y0߳D HbX~ٶwm{oO7fg Sd1+'K |C߃eJfxFOODI&M)f;쪮fQ SdU@pHQZIޝN׭^\Ԥnf35 ֥5Qocb(( )b3}o+m;zQvH/rX7 >0:nJ ;:pko<ݗRDx<4RLU@-UĊZQJ1Th|`ˌ/L ` S!%K32#Lu4UA@d+˩۟ߵmϞ(&EԚs*v%ܦӾ\b^VHd!a6WvuD=2$U%t"Y*6VS]g72LR+&[>XmwwϲLR43`P S-o[e_CRJ,!o~կLuy\A$ɀtgf8R5 P*[9@C7c,U/׿3?r~lm%xH4O{[SlY="h"TtWSzpW"*C#%'^ޱc-i{ !b\/986hJWӴ4]շQx_A_S*fHwII0"/E"q; C,/_(GuBx8QݩGTep™̔i$BMMMžldݯWۗ,Sd]K4DCl𕙄1C@uRye$ I`%>i)Y=ej2 Dh(Zz'm߶֎ * .#ֶ=oۻ}}l 3ݙL0.fy>Z ݨfZzn.PqBVKY8ṇ~:x1Q5r쎓_jV%mObֹ֩h1+"DOjQ`!UPQf,'b$*eQծՂ6p3i,UGV&#>4BC @UPphωXz/̑St2j:N6h ,qX¨#c y /&c!$}I~?Ʒ^;;lӴЛ(NHQӽMN>?S#yꨘ_ǩ8i=wvT2pEge l)mzeMx..grϓVHmJ*dB @t+ʄtyZ^qr*37h7~??/le9ϱn:X "Z{^^TdfR$.*ҁ jH p=T!Vt*[*BL v9 |FJAk6O"r<dB;$T`UXHaU7_eBOZՑwX ӺL:M8a' F) hB_4)HRP*"r~UPhW%F+$ (== S\/r'_8 0 "3A MC7po$l,`  d" c]ȾEۗPQ}lumgFH2ٶn=Ͱz^lah|W"A]Mw)#J b@[nͧW$ Dx@d$)d 9${#l9^=]_3.x zޯ/]LR7}GNjPH$T!gӒd=/x10Y j-ffP I dRa޹ +}E-nuRC_{{$ fBof0E&EZBlڜZCm*3Lh}oL]@6-bme[}ev%3GEh)L V*TL1UԀ %yUö=NfޘȰjl+uCFI@詘_5UQ/;f]$DDSD30rJF^5Tzl/i(23QD6{,JI":-B#4(&&8*Dv-:VJ)L'3yċDA@zDG$ӷ \ IDAT*-;o /w{~_g\L KLҏ^XlbNgI Ej r4_H#ךlSfZI 䘲-X]O2b01%z̎PKBaY AdfWj)gZO6B$t.u*oGw?;_O,d5kvm߽p&bEJu9om}*S$"F-$dLfmӎiRέ]é Ivær5\Q_Qt BԷūȐJ t=t{l,,ʤQ.%lkwS @2 4TWIO݆ zk-""IN.ZO O+1Q _x#NBD>?k"BRP#;GNrR{5D3#- hQM$Z{ m]umW{ Ǹ*&:ON׭GN+YI u҇z*Pt Fԑ1HlOl#hؚ&R+ v-L{(fv:/[4|w羵q߫ޯ]&&WHG@%#2#Fژt& =NP@B@h_h}D'UajQ-se Pt^!2X-DvϽ&\]2VآoA0;IDiV'-B-SU|Gv*!afJ9H I5##J4*bB 3=;h=T;1$bd]};\@<zC!j)M:'(陈<S!;20̈슮W}ZrIjSNffZdIPc>%*)bu6 R3]¡"aV uĠDQl0х)bl$\\$Gdr}t5ԠbL6)G_=$v X$n|Տ[V V:-N rKIhD0,FNvƞܑ Ȑ_8ĭ#: !Qe"=]C,O޼kQs "T-2cp"@Fh|PNe.9 LE`e< ٴOTadK2MLbTmj1@[[!KE)j(1؊G~lBF@SU)CIUHU2M|2O:]__㯝0&*n",z#IKYzaA嗄;Z1)Z[#LB>_8vaY?H0B0ۯx2qRtrɀ|~{ݗG@W$Xs9r*edleDB gG(T v&ݚ,MUR&ASRDG:Mcd,Btx'S Z^Z>Cύp}u TTB:#)EKAT0Rr#H0)#{)Qr~y.{0|2t*mKn,INMSQCPĪΧRNrD$.őK!:5|~$xa J!j!#Dئ ǧyTkeifG_u$ zޯtB-4͗x 8%!e>`|O,x CqI""/g1RaHAJ# EG/ %C٩Z"IT̆_3vlۨ-9 e\ҷ]b?|P C"`^vQ1Dw=?MHMxa+eVS`c5{9'#3wq2VRLX)Z lVU*(=c\+pbTc926M^J6{RDTxG%=so^zkP&I0XXZ)ɐ8չNZ^4UDmok]LlXL?B$S= %ey褎U~vcF!+*Umii˲iRL0n|x=ɦV-!pIg^ف>ƿոEQRAn>É)LjjFw_ş} I1ShC#!.E꽙ֺ/yyǗ3A-G (Te+֊̯&LJXJ{>}K\zxTl2SlMCHfFyTHRN}ۯVcP&=U|;~~nJ(hEjUS]ۻJDVg9t:{۪) L((GL8czӝߣYf 9|A4ʆ( ffPP/O T) /z?}~8σ&`@wOO.5 GHe}ϦsAd"yƑOhpd fwdZ~|Ddz/yy} hwPE@kr)T0 *,1r GԞ ŹT} h=_="MX'y9R7.uʩˤ̵"A"y:Մxf9C)0;]'{"RBB Yc+>(Dp_/oSw`aQ35 BޯK4AFx PEbj07/3 VD!mQ!@Rd Yn#(R#G{Ld2"@XdDdO$$f^U@I6e̞d"P037ё]ґ)lHAK}@0H209@G.[<&2ŽlVJf\FGm07XǍ%JDԪUYIT __".WrsE:O6-uRTR̔E [t1\3cLbK{zڞޭOz&(]$7bU%'d}@EUKek$eS#Y2<>8b@*:M/\8D{$#_KI)Ќl N 23:P$z[^K\vheyuL;X# I"FҮr©B<o.]-;#be9iu{^TZ1[j!G6HLK9ݗs %xHMd$R$"Yzw(Ow?b@(_#ԫU=C &O\)z7WP~.UR !S:)?nx2+ &d dHI&T/ #oF7_-=%kBՊ׌ޝ>h)(GM m걕@OZA^powg|o.ٻ֑aA <]*@Ƹcʕ~yƄ)H1,SYy$2` PҙQ: KtT8 h|1R!gKD3=A+9b0P 8 .":<5Hro] /QA CK ;r ٙ]$DspRŠE#b8FTyl01RX woMW۟uFIiN'I湔i<]/[`<=eәZFF Do@ 2$Jڶ7OO׾}7x ǠXy|x=[Bgw96Q{36eo:x+z~"z$6⋑DG*.nCc#f"ʜYPXrLiKr 7CD8#5%d7K LPlq[^ʢA UJl[ q0;g=1|+cHi$ar]{_@)!{h\oO8-=*)Byx}TTnH]Kzm2 v/hloҁ,[U1Jv \T335&݆2^O:e;~ [L(fpnHHaqx[t7yѺeW` B>vn=\,=T ^h@YWݹ9MhE[SX5=0{ƀR(zhsuu׷/o~O'EEeT7w;CpW/}6nzng 63X*5GxOτ"P\>/&^2.d١S6L"R2c6fo jf~} JLU03A۠?/:H pU6M4X3%әR7|Bf!+#3s\˼$/.ca2Ȥ@va$(Tm˦B"S TE%[ralHm -~]ƥ*%6)vϘ+C)#lhl =T:1#[tuCֵfEd$5R"@k9<5b0%NSJkǡhƛXWe=pa(E:'JIh_(HַK^0=e)a#.aKLQGL;Pwa nCFKB,sl ur0;`,*fDZÌLJ Q2qк:@(-*/~/߿yRE $Z-[\(ri:2m)<`ᔓ<է`lw.q, E&ͥ)L U:"Z̩TU阛^L#6( T'ר1DXq(]S.7Ni,XLNފuqZw_?=fMES-1@5kvza3#T<̘(xtpmeL B0Dnh 7%E:;Pzy#8 ^PfA\O˧~"!a9}pH \"BaMk̔ b Gk!Z^So$5=tmY#@) 6vgO&3BFRŊmD~**[bfřHi4"tXHd+ =Q=Em"aL6"!tl@H-uqoTD<|C)ClԬLZ `A B2Af˶GX"ϫܝ=?{xq+- S=4p7~e֯Ucx}Q$и4\{2\T*QA=xcuJf*y<LSZKDP#4$rɾ_O;c-u•2= Ib4(O(PQ5ZE&6U@2@˹}g0THeѯҀ\NK!6,C}#eH~-Le{j%Sd "b e)˥E6 H0c;;RnNOel-$Ģ@>+N2DjbjfeNbd88P Ŷ.M+} kf2DRm6EMNC4 U`qTC}$H0El zR{#5(W메"i@l̙AsSvEMS53jQM%5 ȭPݚdRL;z2<]]vi7Ty9Td4w*o12=Pd.,uX SRRl[b_kۊCPyo?nT^30"`{p}gD\WewSXGx83zRUBAHo[zWѢ-DўP 貫uts9^/ɩ (*UK+2#=@*ҳRk;pL}1qC"..q7 wW弬 {X]K{Plz;|0Ѣu;ӚXBTL/ [-$)o0':aEcPE$︺SP`8|w^B48 !K1Wu6# TtʽOMutQ0T# @r%LN9{ҙ -K6 vڛ`c}%/:``HVQ`dE= j%2I9I_bR *(R50#QB iX0^["Iz̭)"R2KsedR C-Ȳ}KDjV IDATaѬEsu]p! ah5J_x^k_O__گ?㧷zlPDJ("4)7G??o]ڼr~dXL~kQ=gKtTHdg yt=x~O\+'Ief.":ZS,g6O2 V%@BMԊnL#qٮl$*LHQm{0BD.`E 3ҝ]Ht:0W*ѳRJKNM?vr3@{n[r_aH%[0SVp̾iṊdds6$d2{KPU̬f(*` (ZFPuSzhkuu237Dxlu(6Jj/QX(x%L)jz$E "6R lni"*v/`%b.@c"EU@I4kPSU+"Hq݀Ty[DZZc?9<}z:v8f h4FܚUŴ QV.*zϧC8_}k JRDX`dKuEnd=pn/>y??}f.䪃 V;IٲUNXEaJ(s21E鞚4BV-3<"HOx0eAwq3L[Zeu6[oҀ4;CʮWt;:֘xOܪLl(Nz \5WaNF_j:9wqQnΧ{{zxquU&3{;DQ!x՛&}vU|,̔X`uj߯al6}0ԒfQ -Q͊JW`:`E8,u}r6()p)`iUH8Ҽl)4b&_n x'7E1.7^ê"Ta2pLeJG,*ݍ:ȰaWT魅n,1p3Xbmr{r7bov'Uj o~`wzBNN˵~Ȥ>y<7tU8-|.B PNHT% ]v mRff*#ȗޠgp|_3HHp),31g>?zw*T.˨º{HoɄKOnA@z1ky HU!EҷCaOܬ|%C>Qb*ң ᄊd*XTZgA +@`v^Eu"HwDt jYF*zò ZF[5 v,${h 4c)fVg 5z "A2[Dc.P A0{WZg9XOR~QBca!$s&8a,TO77O8bQft#3߻zC,% V߼bW/~⋗џ=ӛrX-y>Ny{w3O xwZO`; {xx뭧ĝ MP5Dw rEСn&bYyv"B-IVҶe(01Lrz5a4}`vBJU݋̧hlT g5F%B3Ϋd}lu󛺷ysʗhdX-#y<3bSrŴ/<%QWy)!3@Êݼ*ʎ襫AoEЮqH5{B$37Hζhf7AoB u86x݃!"MjKy CR m" )"e{$*sf%P=,÷c=uˠT?;ٗW_`:\d1U0P'HVeD+u\ޞ?ٕ]w(Pv\b#SjSQ5ݗ/x-. 雛.LQzW+\lmJ pẆvSJ".Nmtaf1(93WX(./"[l;RaSYWnt{ [V,nR z1/=[lC'ATV06ieWu*5i(#^X >-SۉTvK !IME [G_ A@ C8hME_n% *RTAVUM$ssgD0KJ[𕂵z֌>=wl,:o^uOq:W[P3ӨϞ$%²w J *D럁Gx ==1n'c\S[q&#{%)5o I ezlok*}t""Jr8ыj`FuSW'EE+$llg'hQ5x[SBﷰ%Wt "_SΪORg) =C&:X6}„fn W~>ߕLw-P!r`fhS)f4^UpL32J`FWYd"S2I0UDDvӸ+ EUs%IMTZK :: z^1pim],{v5kkKk[ˈ_xϙTZj@G/Jlc+hp pvӴX`8CA Ie]s|r[[SPX?"BrB^R|(oOWŗ䠔TxUVei-EV7noƫg?{zu/{7z IQLU,Wz&3j)zO\goʠSbqnWzdN2caU*rnדTrk"\!e-H=e[.Dz/Y~w߳~yyZ tP'vzFDS~^Ηm¯p 7q,Ɠc4xғ+pLk"!Vd͊+"IX )VuL860{(@Ws1ymeYNm9`;*m2a\ AZu]__]_8 Z)Zתњ/r<OvG?y%if}cDrԬlZn'P{߾yyoO7Wkeh)UaauO>_>W_|_{x Hw&)EQ #& ZP$R4R02-tJx`v@D0Xw-zמѓAe0 P2Aizf(հۏlSZ>dW}U˼mnCBؖ-{6 6' )vŦVp^nGhd!M.R4KfIL鮠$$m<"k63LպU8laD<" q: ul24s-67FI*hzfnbilZg7k lO|-}wmWuhZCV*,C+v#}rZ~ef_qIf\<r-M/nTs)-s4S6s% 'b=򝚜]}XQTB6Lh&}-2$)Ld@x,FLJ: #3V\(w>{Hs+1)"0XUך\DE n`=)p U2 ʯ|Ү7}eLGBlA%T2m{,Ԋ& 1Fpt "DSz `#wCJ'OA#.-H{8R *]WǬV2.޽>Ϯt%à?j>W9RA$q*piK*zrEn˜ :8EsV=n A1WJW<~*Rjη''o_}qmkj(W^~o`v/|}wه?4ۇg 6e iAbi!!L$)E U%Ed [,'>"&]ӓ-:Ze|dʠ*֧7A W7[;cB-0 v2+rǺ z:NX~yvyq+fRz17 $R!r }k($7WP^8ERFx%Wi>4 @UdF`]ZL)nIMS$^w)J@c87kIG89ol: Ii#Kߔh " ɠP sCn̩hRœ0VԊړah+h?]}#- 3; C,^u;-b3&(e?-Q`5+jA5fkr PR00RP$X/]: os(59X-\_՛{[Lۿ?MVߙ~Ç-ɪW - t^bRƬ{WLoV9k:wϠIv$ض <zHy%UB [;l0MhOI$K*^VD D\n.y^+ r!ꪣLx7Yt)}|KBC% ujj^_=&̸xz_=#[ E){ zqҭ)qBIH@$"YT! 0aqJw{QQ5EdneRtZVJrk2,< tUdqqnұLaX׶TMe9i6YVddWGfKB [=lY84ԪVDu8n?^]M4CŊ0bS,||>a=KslI,Tm?CMG|>=0Ud&XM}7/?{5XKQǩRm?N|pwgG[PnY/_(?w;Ϗ{,]ْlaYSvdEE DM5|vaTK0wz'F*X:\z8!E!uow^B%zZ^ɓ>}"+8/̦sŋ }VF0's'I 4P&2W?~[bj8PYSG,"l6 Z̋ nwC2qU R+JX*qL[&φ,QvE*`ՆQMpaiqȢ S`S6 IDATCD~-H8u d nBΕiqqkU0 RGa0eDX|>ݽ~q>{Ơ(MmCw~QYEiqZhwc x-֟Moٷ~r }뗷_>@u!W 洬>/UþԦQOzz{==H3֖-֊ WR› GgZ'qr]rҌY*-*$"!T.:X Xըl7R!I'{7OE_}z8NV{2雧(z8ƈ75–զ%J)μnj?9u躻B^5"EA6Dld8uųc÷:2]=-uRa MK'E^RjF5,uM|x%i)4g$6B ް$u(cԐs3ڸ:e?W 3s +"P ;JJ2<̤"hH(`P`k4R&{qၖA@D()'SCZu( e_l,D󸏸 sha*Z?dzjMB" P pI,Q*DDJQ cubڕRGP->/5 jEL-%uml7&%,+XpLƓ'7z뱔cO?GoPTSӷߩϯ'{w )d'xD)0Q1ɸCA쎧x; xi=zTP<x WwB35\杗X4uL!$YĹk[}(_4˞B@Vds%nkpvé v_fnU"ZR,-#<#rYJ:8M=BҁfϓB8ֈؙ4yx/Ү[ЩUaf*Zj-CqXb1ju(`@'3eY:kk}]22;YM:=ѩʎc5* GeuRK"r69%UX!Ѡ!ZUKbynvd 4j٩TE:ϭYӀlUL N'ygf+&UMRLR KvL5Kzcs>=L3Ѓ QI*ILZbR#h! !?JSFG"hQ3IdeIT!C 0}9}gǽ}xVsNzu~"! ˦JޏE,M,Zh q E w_t ݚ\xL5\o yujGLhѠ(gnrYz}sBigG}Y"upU/nsk_whۚ|{h¡9"l<,y:DΊ@A#L7+MU6o<G/ ׂjϸݭO}W}ad(y옾KJ(DPmܻ>E7rtISt=]O׿ j uFzD) r4(ESa""өHz[G ''zJ@:E Q7PbvF4*%m|~yt1bJQfS2+\R))fEv_͓zgPFQe&= B'02nđO 4%sJÈ1ʾOA,D҃"CTJ!<4DjRTg1O%6.pCt4S+i.61P O$ RVU2ێd M/,p8u:^ᓭS0&yl=9逫T!OdUmK[:EUZw>zc}7׈=z)jYсƤ"0d)ӯx@> a% @[=IQՄ5d[ R'ކPTtNxZ)G대~~q Tb0 Izdou+bfj.HSJ1fxKû{hY լMSl|eԳj:F(dAwpa(QD)=2)=1v! ՔM6[Q`~Hn(']wQD{km]xX֥L&1coIWxHdٱ>V,~8hL5-S.}iv5(J HN|_[o4m}m.F6oeRdY~)2A*t2W?x<"Z)ph}zAڽ :azFDF>\9QU7S m.BLjb:׎~(͑g,T5Ӄ*SQ$27 8x8oe.q*jOGj(೩&n~t9s?pl!AFaEVPzhY􎞭'lР9]vcqZ4tG3Pd!$GEP&,&RLbPwFcS󓈁A 8h\&ʘW $7BFH)*; '+Y*=7^v\cYu䁄Hs8lzl0n JVF5iNXAQ$!)Nxݡ"ZU\Wo+=8?o(0*yB*Ξ^ A-bB`YcY)/ߵߟZ ~4 R{T|U~޸ƍ |Ye9z~T7ChY hjF F.TB;|E,CHdo~״āɶTA~;Ot^wؚ0`Rtd*v-hkQ߼q1c0} Qruoс!p*X^k'#(ԿPßOtSP8b4OT&[oO޾ LHTZHUtce.u*uSʸ<-DdH"==ҕ<A$$t8y?: དk08 }ކ$̆J8n{~z1Դe /_"LH3:‰4*eѤi)N̳363Se)4  {* "wTjb zROHF&TEN!*%q4AD)$^?<7uQS둭SE&>TY(DEeZZu-rbR igG4 lʱqd;oBo'.ꐻn7(pCY2JRm1)4#ˍ-Y-=ZG l!mhW,f=ulM=柍$.護~#]zzVʼSo\n@vmo;4M!\f1Ol aYV7 V;ia3kgtVtHRnsz⡒/éVJq:q I2`ޖna&K DKewIdv|A/Ў1SY;1SZB&g a d i.ҡ݄0r3Ep&&b}tݟ*l+|~/+O_y啗_~=yÇ?}{nI x2RM'mا"dObZVJ9bs\q)jz0yNe̳ci+uSe:I5޹mĎ!ICah~r0@xhõq 2%8UUMXb0J) ;G8ѝu#u;9YrSDm ic'*')]PC<4&dH| IDAT$+𘮅ȪV7qdw@hQ 2:+ϣt(U- ae3kzi}mfn7Ru|ű5LELV筫{QRQ=d=҅4DwZTdF>e׷|˷<|ۿ߿o|ҟxGy/۾CoK _/K|/_S<$?]OO >OǽDFbAM:Okb6%g¸DM{pW/{۩_~vw%xaQ =ePCUٚz)[C#$d+Fx;SI\=j7}YTx MMVhDG! P}s#?_ߝ T+f.wֵ{պ7ZCqU'+eR @0,Ԫh1Ѽa"V፶UQB'-B׌ղ'9t-ftwuL3#vX\in')eD1Punewwb+.CxaW{="Z'QiGݞ:t.ͥZVRv :ۆ)nα DOk@N(a Zn -VLAz&t&ĝnN ,(Swkˢ],aP8 5t2H7cTMGrTnb ٴLp%\QfGZH'[σiVENr n(wLfgij@N{ 1z$0Ȇ3UP#>|zsH& 5` Ԣe͹;}w{vx[#te|3ILݹ7}؏~_p31DCVsg~wݙֽhKa&!( H?W`P5l&EPUixq?mDVu_z饟 ~?wU}/ٛ? }&~|o_~g 9瞿sT>=]OO~'D&KWA[ +!bHĦ S3&"#I#14 QvRvv2u>ݲ_;& L{ٺ1@.dO{0nqsgIIDX#$d F[D|RGY(0^QFv]d("j2zXh>Ct4RM(LH`'p5@#[8Qwdwi-'}x@sJ6X$[C%4̳Ws`Czp3iV4Onח)jZUKL ԙ|o?|Ov֪kܔ:GtT4oK[ -Vfb'-vFJb*ݽӉd԰Gyf]hXiŊذa;+ ej5 ZL(:գ5!x:SR-օ"P}ɑ^{~UsUd3]T`9E`Hu2z1Qvz./28+!N*aQ=ZK6膘9dFmw9V7/@lڻbL 5:N"=;_KԵ[oe΂.@I9i*"Mɴ4$#S!mE5<.V,kG#Ax'ٙ5ь$kuc\=6u$JuuP^=DGៈeonL PDZKÝCJX)/׫Km=Cr:wR60hnl~xRjyWggN&&tbY~IJ܇uUZ!ŴRѱLzgW݄Nu8>W_?>993s/W?G.~Sz?DM9DZc>6٣zxOSg[~)c81h Z51NobR N 9hl$Vw&cy T sx iR!..YX=20 z%ڣu-0*"9f6/;U# AMDZck7gnwʴ)0`&ӦlwϏGªBbZ:BE,7LAΎ 銵MXb(3IKmbjBK(RS8O'^1K? S?ɼi}6%HG7|k7 ~/x%?wOugW:?~?_{KmWlC䋾Wc{cǿw/Ϳ/k? o?j=]?CuɿtCc{BD)*[q'@)hzDϕ8ΦQ(U*ʤTsLu!أH*9+,D%J->R~7F蹩 ABX4Tǐv+jyJ$z{p8m$UZ!g >MlKF R̊:M&)ՕXbFx6_I)PYF@W&O|'N[up{xt@n{?> 480S$ut&b̛ͼ7ݼ~۩fU, &Aד;_EL-6XЋ\p=0ѺУws~YigvsKDHDҥtl0 )ƑPt:$hWsmUU5}h=k08W+{^b3m&_qt}&n !tıcv>@V4;Hm<ߟ %nND2r]TEB#}vHwϡVF~OvUNQ*̷=7_<۞)]KP *bD*w=zFj)օRզ"W8>z1m&Bd.u b&l4Rd%ޣw8eno7o|g_^?߷|ۯk_~/~/7|ۿwяӿqWpIM[~Ww ?oݿOK~gW[?ҽ&Ӭ$4hpc7:6i =~kb !L@0fyr 1dZ C|&jC?x DA>?TX)hj-VEmQJ ![F bFՐT'; ɬa"Nv\CoeCɪrO%"N+66n7mlLnԪjF8&2ޚ/RLtX.yS L'+*<_*(lTPW%$˲,{aC!#tY z܂$bEG[)]|V|-jU]ì٦me5L6K-K; /emjz|C{,>M6M4JAoE pmmw^;k P ! Eg\Q66oHD!$"n&}3fAdk̶CE-Tr^~|B:zӃ; T*%"I,Bw-6Ӕ۽X›/ە:½ ono-ZTˇ} $jz\=]ԢAy}qwNթI/y nS>aշ]?~/[țX~>RwYgf}{wN[,'s{JZHi$2q hsE4kHNoB8@|UO3TQ5QEл\CYDI@+|! [ ɸ+\&, wrJ`Uh-Y!6yQRNOmVD,^/]+>cϽݜ J*BGڎ2@+6AѠLeGa@.*IV+!!xMznlbe+F6{wuL P كmeY{z ꟴ}{_2{*^z&_կ/_;|ޛ[]Zk}ޔ/*JR(4$0J@3a1CDuӀqжBX mC̓FTRU*+7{9{}2dGGEx^sg}/z;_ondeW^ewܱ<m;nK~͛LgqͲnjy}Y>{oW˯{Os)7Ʒcw //)̘ɟ?a[]_UߺiǧqGwmw\ bn ;;9+܌*v|z\*P+S#)HF82Wr!_ÿkam 2C1[AQw#X'8Y0fgh*vq2\`!0 a#hiXS cpk^ֹoZa'Tg.eu 2WLe غ Ha)rsAψcOz>=tLjiRiWLb pT-5Ԙ2S3"j(]SRV2ifCX8l8ꪝfФaEA0E.QO#]PVJ'KjЈ"_9D ^ =co8618Jɽ$ ^5sI8q V\ս8"Lŋ;q=aS؊m7-1lM2Y\]YM$ xvzm8ݞmS3mtLRpNqnɮs"ꄜKml&b*v[?x7>ٸayTw-7?q9O9{ ^zJh .=A3370qiɄp3x(Nfn" aDfKgu5(_ - Lw]W##qV%տXrU-j"I 0IXGwA0b^ى`dLnnʾ*vMJD,.f*0lF ^L8EkчkJ~o gmj8^a놦+Bض7n_Vcp` l&Lo}+{L!@&tB8V.W񖳼3&/emC͌&sIS9)1Vű. =V׷_?ڿo?WǿΩ]|~էn{ѭo~~Bov;KzK?Nu{K^+w|/uG\[뿆djgU65](V|ᮮ*)Tvut09 YJ~aA(*ŋ`\bnT7} O9}?tC):r G2eFS(!J Mv_: r.1׈ ޵LG'UkClr*z;-qS0w3HY 3&\r)\Db mXae(06PzU=c Pi{$68-eȫNȁ|yK$0YA%hsIQ,8 qQEgZJ4FO$Vfa,@@ AC BRzr(-GaeOy+i9f*Fj;}^$JW8z l޴ӄЙfWU ]enS)l=/ih¤w^|/q|bymWK/ n43be&qq fSDb\lwV*%Bd r6Nqv$r4Z\q E q]EOzhdZ0x1ˆAWPOw"8H\$ (ًV.I fbd(y1˵5XF_A ^JT=瞓_ם;w# _M߿wow_~Y/۷SٳW|qSZU~_}osѥAٵC,* ceSڒjq-36vz[`jɡ.3Ex?:v1:"D.pz#'qb!,;$BPTP .GYT $E  '*"`bSLGuphfwK-Mٽ!N8',OI>~mO<+*H1"=`AYͮp nas )07#ITNu$mp(KBɄ76lc:C{{{??T V׾8w~w~,=oO@v}|γO_|K JN?MH_x+~0=;|uKZ;&XCкWL`#YIXlz|"#NUf5ÓjVL LWCsɱYzU1"5$̨̳@b$)씝 Q%YEB;΂+/ģ(1.QX{jڣ2}]Ue8t5 ,\k0b%*T3l_=h_J 'czlc:wt^n;Yw$hUt+3Ta  }}΄ib$A5Wh #蕫N4qҴQHKOT}mHzńD]86! aU*PU^Gъj A.c:j rJʛ DBYQVm82b7*C} ͠Dw)YBS`y0gdpnڌh)APjoIm0ɮ?G/]Nޝ\hpx6&%ۂE s=yMo{iw^xxɰWac'lxUbB{{~׹|ܩ.q(٥% \`UWgrcP45" 22mՊF">Q'n1N[KƦ\!1O:Qm d5;%Ȯ+dx.6 n+À5\'J񒑁B &no϶NT OơۖIS~|b|:{> ϊ;޿Gﺷή/EԎW23@ļ:ڽjK캹k4 j;H$ꆻ=+A6LZ`&r@LAޑL"H@5GińJ> Q8cF8B(&w/k\`hehbYȆsˈE HDTͽI: L$#ҍj$ H`nVx(ITj+8\覠0BNVN}46!\kj"0bLcH)b MMRj%F!b9T]#Uu 2*JuE.Wղ_ }w~wRJf9@p:a͈S_4t:͛ѶmM,FHUp/9j\UX-VjJVRNFQ#8bfQ͊^sd>9btZh_LW%{['g=sB2%'b$3a屗 @uBB@Rŵ-P3 (d~ʇ.QsmJ)"Nl%;̖ٙVl^<@4cjyNu$ CHES a"u"2po! Yn6NWO,ڝwnFD16\2G2ȘXf1-639d<87iZoMab[mI7_>7]whw{Gڜn]VDxg{ks"HYm^@oyhu(o9s&>t.^iq]'.\~^8iޡсF SSg'.Y祗lRD< L]+{ mCb07S3VÑ"4Zv%mpqV$%A3Jv+ꅥ}5 4kA%0Q͇)bS<}/CTp9s+M S6)9gk1hu?@)80S>?}!{Sa8$))KvbcrkNsOd9dMX%dH Rlu(MgrjGnYIesޟ{_뮻sX 鮻ʠkK~Om.O~<}?¯ݻϾc?;ȧm3L^{e]{͟>s^|׋o~䓾櫟?<oxO>Oxn?}?l틟3kW׏6F4UI 'µo8i= T] UaaXy[jQn1xQ"%jG\/NwRhJl:A#e Pl9VRq(& c8D DP}a08lq^{]+Y񱕸ȕؙFA>@Һ [5rp5hE kC{1j zZPQudvpڍF 0y u`N,Ӧ4icRjbJ!S 1XxĵW<۩kc]LUsZ.nC,S+X r[0yCKgu*q[gy:Ku(xrΫeXVj5^UUQ[oֶڭ\JjVKm'1Q޼>CTI JU tL״;Q .!/s7&&zJ!d6XC@4pxx}Ɣ[ɅCf^Usb6fW6 T@\h&IJ סt{bCܝ5[4a1-N1d^^. B|t3{ 19jܬvŵLT) ͰEՍx`dEZYRtd}ˠrqs DQc@Vq ILSUG[Э{LY̤d;#z\h>Ïymz-i{GI=qEpǢrn[ez쏹ꑪ^\\Qy[xU-`!/[Ʀ)A6IÃ=vo^V$<0Яl4ׅH\T~qz0?ʐŒDOZiӈ5+Ҫ*T.>5/ũLP <^m@eZT}ݚ3(&`@ 2f&3PԲsbHdFV֗?8L\WZOO@*psfg]=8>\Ͳy64D:PS͒$,lC?tq޹ap,zjȝ Ht f+nqCdC0DxEx "D[\Ba)_?mo۫U}CZ'_Wpno?G>?~+^_p+O_??]vշϿS7|=4w|^aNPHw~?;^O/ԻWn}{s?[_}_GAF5;NkW*xdʷD.aRT"n>l\[\&"3R D Z'Z<\D4cBA|s:?}vgqϋpbY@FZi\aPaCpe  U nrs˘{^$T!,LP9F|DRꜬWY%V 0w@BN[:N>8 WFWŷ֍FPN&gk ԨILY;Im۶m1B !&j( ֫S>TsC߭V0 `%c#cZtr" =,Bɋz>s65mjXKbuXt]7^]G^ZJ)0bc`\(OueSRJRjhDb%$']|7ܴsq*`zvm`rN܈(M"wޯ\{yJAZ!뛁~$ fϤJ]6Cs Lh: M#$:p8dɩ9Of͙6Mˢ]Ų Q^ J df /l!@ 8yQ%X5dk0&X! nŬd)iCM<(%)'Y. a% 2VN<0 W*L7ڍM G+X(qO^@-MI4Jaq'eF N?!vrp; #zϻ%x[/o^.ۋ>};vG{΍G =CWJ ӻ9,J3k{K{]qX#ew/HSg>)re}J_M`02Ӭ^-r|.ˣ{M;k LcBV|bPEoBݳ8XЛV}b?I]YGdNݘx>}unCv܃ޯ |pJ(ܽʍqŪx8W}'WCFme!lѲ?X O;#s՜N "fҺLln/5.=v3v'ŋ~.iא*^04(bh oൃz,mP-T)Wx W(_ϟ?lgg9jgg˿o׿waP>+U_3?eE7|S~-_cE?㾯O'k_/=/_\7_*suNjwsᄒľ~|P:R6SwZ`" $@!zH 1w+rRbDiRE<YIC ZzWZ:3Μiv즛l:^R[C}@plw2 ^")A "$h,h/ ^׋ia8Q)05g)ɢ'_Gj0D+tg1Z;Y)5]3U'DS-"%K͚QhQ:Sm{>FƫIf_}pJ!cc P!TX^'2w;k2y(@+sݭ 9CCef:kkdx 7  '`3*ٻaMsS :}Y~pRe3T2Cqr5"AVP:wY&B- r 4ǗCZ1b4pd BDLB,5V.[M:{:m|x{G.>ztŌ8[ IDATlC1qHm5qu|w1=+v˰]<ƴ7+{}ӿ3UJ Kf?;<( ٹ[nk~ppuYO/ya <ww֬{ oeA& HR͜) K(IMwߏ[.5 t [ "Q'+2 zJvNJLF pP\fkX 3;!-j-4V$̒.R;qs٢?:Z+e"4si3 ͠n q`R Lܽ9TKLr;ЂwS܆쇞}i&Qa3j(/d>/'~+o=ŷw?]sut $a譂aJJ0%Xztv$"%4-7-B;\! p B0ixc*Mp/ `g7nniOmFb Q;T(^*"b #R#9׈ҨՐ^E(DaT%"1)@n䣻+R3j1GpFFyKZa:14L̠9aE|}7,lb"&bj ׂ-ZC+̊{)ju,rn-Wݪ˵a5>"zx֖71`~25pN)s\ETy;IHiԊ5d*ʣp&bVԵ̵@ V]ɜ(0BbIҌ$v}^8x41xfWG^W%桥tP|Hf:ZI]gq nd`ռW^\5)P^m35ӘR+;zM0cJf; CH[`!|k]-rC"P:H+7QE6!)`#5RUSB \Φ;q8./,G!1ܜcHaZ+D#BpMtr6 pÕE^5)Ѣφc+3O{|Ͽ#O.S6]=tcvG \YwBrY ى81>PxѺ%6'l{/MZޞMQwx*FӢvg:ƅ'GzcK:lS٭'MH_t;ޗBWXX2E跶)G|ܤrR%} rNV,o #;$E}p dq!FV*;qW@KJgn ly@vg&`aXذrv DBsڈ[k:K z7Q[Q T}{G]W&8uSݤ7G[D}Vs ᇻ#o++@)6]4%1u, c ZX'`:Q!m9 hN0ppLzW/G"I 7v~Wп~-=b T$6ȕjw"a+bL9xjiCrӆ((fi3{ 6bI9Nmsg~rjRVx&yD dXq\-7MU><v6[䨛^>n.&gr> AJh҄PCW'B¦qr$n%֦`9$AAK)DIQ،Úmqm?j-Z'ᣑZpꧨ \s].!2h]};*Q0S_hS831cj&67eVCcsAbJIiR3 12+wdDEu};ʹ\ 3‹{ǣS禬8+9;Q1(# 5[hD) 7i,I􎪚ٽ >Ę9Teh6($?%W" B9EfDf\}EBIJDdLy i9}ӟ\!ֽ ~&,mMNoǟ_?g|B$ f8UӃݜľ_=nzdzΙL5%=/^!4}q F}<߆9Ӹڮܾ+2Kr;!t%䩓?ut}vwrvs{7ʀHp^|S^_p8Pn_Z|`XY"* {8eise^ZdЀh:C1:3NN: :ؙ浶G9b3,#! DN*\Ʃ:tk?O'I9dwzK{+i"_^ɿ}R 5 Ǝ>{cX!;Y_pE^g\|f0B~`nZ\Mric ±J}=7DhpdeBd#cc">HM Z%hF0rOK-^۪3H TGZ80Cqk"L77B̾p$ȭ$4m؊k/P "!j-%G555j)eiڃY|Q(Xt5Bsߛ;AI[s3/?[ &*)DF"YpPQ&B}Z8S3ZqZQ AQ53i^>8lg^/nVyZR6c U]HA+99!]2 1K- RƈwnqH[ mDVMbE- \kpb9Xvn'OS$F?Y] A7T#`"VNccH+R2J᪻~5+v:t-[1u."(X#ۼ?_^ߝ8=y"}_I8tN֏g!=uHpSE]ywg'/_xB!K+m'{|>%<L-ݴN;RDpQt-67XԡKx5IPJ6[;bL!WC5Tp@wԑlUH(!xY: T.p1p(C.~apeLn6'[ ax$dSWߌȧ?xx8܈1Zva"v, m[ 'A*ɳ}th詑ta5.DUUky`7;M-z?A?zk$It2(Knvv8Qv60 I@"א8Q:E؅t)UA '~𝓏ɺͦK MխZP:Yb^IV)2,~|Yx(u_mZY-VLV̬1A榀11r$A(tĎ@ jV" uXۛ) (!f5\!09AN @I[lgG%&,3_LlbM䄪j+S .A-`UU$F59{3KLiKUI+G%KDf#Tu<쪁V7AW以-AFn"Q1[b_@\7ɮEHI`p X-30fl@2-C3yU*Z0'" ! T0ЩԱx{8RR\:e0ȪbIPeKHÐ}V*g5109TI:Iy5鹩mlAp]0"ɘј:ut̠09~ '=RJNOtF~EzwrIZLwӛi!.f"k](ݤU У`Ck`b>WMh=Q=Ӈ]Sw.tmyMu$PNO~?O^4^仛'gW0w?|?|xc^}׿K<֔WS'_MwowQhs.f"$!v[u^~}WUB؃e0O^wOywIR_\jԥ ':>ۏK?`K_z}s3;'ǟ<_|<?3GǏ;+ P8=Vv{颥IP>^ RٙTJpl:05D:x8i oV\.\M5߆ $\&S<Lfuo HT L6ڂNjw4״YmD^]mm ,*vT9>NMAδĜ`AZ#ɘHTI.͚yL.֢Ƌ'  @"G"qfJ\ [̠jZBR>f 3-9;Jj095-zVӨ8"3@P89YFtfg&fkWkly+j;nk6B5:--f؉I 9ܴWVeӪVD!Хck5Z_>J]jӛO؈CdA+.%'W f bD$jjG36kܴ1Q*p[D3q|&oDlSXYR(<\<=! Hi}@6*̻Q(›'.ͻi,$C͞ &7ogr;'c Ɉ!"YAJhugk>›1-֦R:9tVQ7''^ٿ?yt{φn͗_O=;|}z߬~Wns/u7Λ?fkUWٓ˛o\raH.SnT-Ԋf04^]_k\<[xzy{gNjo/U]KBƉ~~guHճ:yoQ>oQ"ӬQ9c5(2{:TUGCܲ"&, ԩ)(\H(R3՚,*}u3fQX|;q^DxF &H}PԜ "[oThՈKaܼj3ѧf8jm<?_JىCq7~/n6BnxY^[g3gs7&il#ok Vzq%(bGdw}ZW,2*TPɨ*VG(SvEG"8KuGRbD@p^c0~茷ш|_dpA}YRAH[ƂH.Xn"I!.O^fF-!*@L,(,931XDm y71U#&>5F{+q1`FB#4Nw Z3T8ΰfY*Hȱ@ mk;1+4T+aA8)@T:j@)y+WU IDATi] 1j)ADRj)4O1OV]J$C{ ]LJR/j3s fff&ոݎLu1#9QS)δّT8ґ Gb42[ZHhSnUUv$f"CģpЇ~u)ęvDo^G_L͘) [UOVJ Q!q {CSbXV&郠bev]{'@`_nF% ND, g";+JVa1DxdHYzWpH@$H$$ɩhjŊ 3Jq38|f+^n.l"Wo?SӶta( I"3չPM/_|_)?|0y?zˋo^N||IT_޽-< wW%;nw0V~G0yOS.A#QKQ0󍍇á:S/TMV MXj-Pv,"{{=P?շ|RU<8jynXU7B2'?ޭ/w;0:baKf=e256D6Pį˅_ݲOj Ύ4hA}O@ #΄ >]snr3fvP, UJErL^n>Ո¼֊u0Aݻu؜S8CYa[ y{yqsk|$7+QB崿y?V'tr:|׸}nFEzZC!.dRr5v_Ͽt}-n!mWa=Rb\Lս x~S|->|:ޟ,!% 7ΘOu7O3! &w@#:(]Bb?x0|,R`ߴlXhfu#HwIZ|0|c VcȝZ@nmbޡ U` FFT{[w YKx{䀘bĉ(qtkI ]܈DxT9jS"ªKY9iy.\.ڎ;bnE[ 䖖 j VjbX]XAqn rTh"xјKnFB]]ffLY5I "mgriwzmCn];dDֱ{X:}x` RVC 3*\u E׶0f"v2e'"J5X-]GҙQ#j0wUhEdܼvw8}׼JH\nlWx)ubג͛:%ZT M}͆C&r8M]g*QP$G&p5JUb1HTJu@P'|~$5,!(D(S8I:B l[ +M%2I+u;wֱ3R#bՉA2X "Y6{($LfGI.0)v.u{MO~?O[?Ꮮ|qyZxf~уś{;6q&̥X$8}=:/Ǻ'Č 3r)+\f4b (Ӝt6uXbFH1X. plC:%rEn${|ޟ+6~?C Gbf#\-y8f(fz[1/`m02u-P]T|x^˙tqO+g#PP&- Я9)JQ9)}Y^*\az5'i6bo)+cɋy[9ox3*RD5Ui2zǻkys]N\?ϯ剝0ռjKӋ -AX=Sg)zI,5;<< <OpuGL ¬>@zpr9)@Pj^ ܎1@3 7n1SHt wYӴ#W@`mr54BS|ᙱ ㅞ4 \h?V!67|1Oȴ]Z@(KL#6A?}K@a1Q đ8zH& @ppa&RKpE,C B )VR W7m67Ȏ؉v(,e_coj4MZUZ ԫ`bRE5fis"&(@$=%ykj!!ތ@qDz3ۗ/$h^NQ9PuB#N([@H3H  cX6o$cV(vraN -G/Ik.qIΌ,L@'yu*"ɫɅKp-:.bp^ÂJvabhT %;P8KRL1Iك>y_ywE}&_򺏃U*uXЅYoƩ홪M)&C `YC.29pXNs=E9;˫*nRu2IkU5#RȜS2fʭ:i*y}Ͽݮ諗q5+Cr?]mO^^n/WS!sV L,sk ٪Bglm +b  3< ,z8QC=R3Bu$:B2'93K92'R%s٩8}M o^۰2VE-\ͪV ( QW7[,˒ ,7Ӵ+6["J5ުxGSnᧇ +ʁZ鞄Fse%-F[u< W쑮cYwJ\\ۣSz$kb 'HS)F?GZBrZP2JZPZkJ0"(DpԠ:4-Bv'Ga{8vv4HE6 $|W@j`Y:Zۅ#n űuv()86p̝jp31n&Qgc3niɀv_T;iA Kkmx ZE &|ZG8;p"r[m~i ZMǘT+^jq_ꄛ%HJŔxcR+2[B&:ŔjiV5' j!P`A$s3'/M9Lٯ"Q3v=S+hccNN-nTA05loP4gR &mTC׽t1.BLz&.Ey&tPDVCۖWn?HJm tv(J]8̍0#Lfŷɛ^hF{ XuR|Ͷ:9鑀D6n-az ״b]:D ĤZQ=ckBs4& V !0EVKxmJEoªTXUWROd6vǏno<tM8֩j{r:WyV)j t٬UU}{5> 1GQ6%oh} N *h 3/@mlru4v91PruUwG/Ag*A@C@zP `8H\.vt9Is (gV{1#)*H@ݖԩ:ԛ8 ak1 EC#ʄ@^^z͛ 9It_nx`&faN$؈jd0mӸ9OrWW{7s')|FX:QqXq3zqkW{M ?ϯqر=g %C+ZQ)QT?%OR3 Ydlzzt7q,H_ ݭ >-ULHb9G7;Zꋑ w@3hV<" 1% (D=@on gUT6e32W8-*ߠ]kuk-XduZK1DDE|ݴx&,TyӨlj~Z)7Zgks]A X[%. {#hff mtKO/k3LdYKiY`0/El[r_X( ꋟHMc罣lit"3eJ"'uTX p XfNjKX Dki2Vt`Xmb\$U#IDr0TPW{5ijW|7_S~2R)r'/* AM@,Hأ r$o$svQ PjAg2]x7Uƴ0#vЩ(M^7d%$˻y:9~NU΀0ª!>X(bc 'FfxpdܞGD Ep-R͗u}ss٣}Rw~W?<}v~uq7"ä8d~voӫ;.F.snZJ1O xu}B;rraA֫d]J>9gJB@ƹQQ0\4bs5rK9X\Ch@rl/xU N}nZjhYw7}o'E qB]Gҙ)F#6+9m 0j#"Yt(p3 g, wZ& lE+E񠷗ׯ.56!iֹHUHAbs?ndJPW38@`U3rb&s[(d"AeJ2zAZEs\@~nO?H?WoW襚i5531oSOS^ӫ+xwɬ@fZt2sCgk>YEbZÌaOPڞ2|3(JF(Z-ΛրH"$ Ą<%ĤACM8Y!C0U PT$DLɫ@)0vZ>@L8& *$] `'!D#>6N\GjVanō5qẄmqUsͥb%7ܛWMb̽jSݙ|}μ\m-Bj\= 2oxQZ,ֶd/n._nD0gm_,e6e.忶ڌ KTx)^.*X.|l Hf[ؘFXt[d+Zd.J[|""g‰Zm٦.o"x:Fnf_󧏆uxG2q?yHoc!#EVUu.F\fsj_u}TػZ`ՈasH{no!Q_8c ѥ['Ԛdc"Ù@I`VU2]*w%m&յ ܽY=a_c->i!Rr:[:w${ӕ֜kpgbJ5rQ:11$P:W-dL͔'b~g J5ݝ|5V >jM)8}l/~qy3~X:+oj)1oܞfsugSðNN9O@A4VtX8г幔l1+5٬0yy9M:f&2-L\j5bUplZE]:tk, RF$6Ơ6$skvLiL8uLmYg=!=Kp}qS߼7o|y9^_#uW9~S'8d ag(V9kQdzvWbK):N5h 8BO'yg|jBk*[m>$:^Nc.q{_K[kEDf{"%f?͋d_X<ėAR [NF5KRdx%Sdn]yq uWSM,z۵uwr%nЮxY8D Q$46ɗ(\]jQUk{/_!#H]ɗv|D_b IDAT `SSW>Do)^샶O~X2S9 EkE2wb NRaQ |TjJpcXw{ǛIo2ihʎVԟ+J'"bA|w=N%>v;ݍ-W"b19bZ):|׽]ax#1{_R9Ĥs*I_'o^V8޼s.UB \ Rx甉L.,Ihrvj SmdsG܁6B=A$#%WU{$TTp._'QO|P @h F^p3rE*ɋ[V4\nxPH}fB=r2rg+< )I ey*ә';x.5;C IUl;Mx>{QeXm[j?s>t> :9F8c0 W}Nw?{@8sB(! +,Z\XzE:}TPq& !@Z]T Sk[pBXcʹ_0$fb8O]iDMS I,{pb3T |_Y>ؕų/bν{r\_<^"f 5qTs(toً[USx ,:X9]00pcHt9ߌ㛓V'{Q;T!3P3~Cnʋz(kb55j>X# +v!m .l‚!'aay5W\s0'BtHj8y`DH+J+ZkE0dUAB(DbixbjAq(JbЯ[EyuSqr8B1&3V%/+tu/)+gM' >_1GYZڊ.-$ 7j&x,-)\7ȔK_PWgx&paH;Άx!_z``}_;}paNVGĴ@Լ W"@"Iϼb&<^#&g P\Zdq9RT 5RZQeI<sg7'Ac5Kq]N?Q扨Ց ξ|RߛD]\R` `g2l*p+K.PѲa" ]Kb&rbr1S|M_ݿgtK:nW~iϧy|xjMWWգ]%y+srS%su_O\|.9QR2U0QM&-`B1 015ʠu>x5ZߴXp0? 79{]ܬ [%'s'S ʛ>u01 $A:1 8MkG]H+3iCܳ^K;=~M<ߝwi|oU%g~Z4|eL=qaU[77NГQ rj]Jjlt~}wlƳO#g=<g w`w9/4_ZnIUQjtwR% _T`̫sFF`bZaUB-Y͏cEX4}߾Ӝ,r!l.H}$ r%cF>AY$3Hh%xH4;;LZԴjJ@9x xaW,ʪfF #+p|` s"3ߠH`*6A=Bxӌѻ[yǷFV|V6в bWŌF}ܝ*iE)ވOYA= AN+ܹx+[@`Ўr!S.̾ f2Kb3 o-(mh[*`J꥚;@́C&b!J0 êR'QZ0jRj4\rи֮>P9/۲A%@d872!mՂNpmY sWƣMZ~-I|UKn˔qz}χCz|7$R2-4 ,+]哩XYZ_Sd?B $,h1?㖥FN0psP;=>0t<l.y*80jz 4DbN@XHM{uz>2ٚ ~X9>A5Pԯv]ɪT&ٖf6!5?rvkUGX޿|kv=wp߽՞>_y/wwTJGu.^W192w~Cr)լK.!AK⵨01 KV>LFbj:e44jjιR; sTp={|u9B>C&$p]yHlW0nVa=k5j cʕrD !B/g߼߽?";ލW DWUx .V k {cdZa9D@=qG rı]U*.2OqR4<he -޸Kɚ塹 @ɪ,0 CdY=JqKjD hj`cVTfGw> \k*~_ S3c~򔱥Q[BLa bZQ3Ý ++y3]/ɢ\y,,HP?'䠜\@ P+X(8ABK Bد*ɧ3;y\ȠfxT{BPBZhZ*mfh njoBbqjMOED.nfd^C}/nCx{,ct ,bh@ӄ2P}Y7[}:r5Y F=LZa! xE/p?]}<ۧM `u#5!빙턘XN:tQSgZa EcAլ.7|*>4:_Rf0%j%gVE1RbrV%maIժAvV|DMx\sJKs2jW䂬l]g% o̻ϞR?kgG?ß\ͷe@އu8|,eyவuZœ 99TsZsVgf9π sǹKKR<c nUsWv.yrZK>qRŎ$m+!ϧY-@rG>0[iꎐµU߬'oo~{~n?7_n~ۍYO8 !kFqDA pmV U! {0.=#Q!*~V͔Ԡ Ntz/pgNlZi{$%P @*xexqr",8W9_HzPr8<&FT?Ͱ_b0pj jpVbeF/ډ:_w6$냉|Qm;=|j+qBԜKJpBhX6F]3g5 m ` LJFMX.V4&4kEl 8F IB08↎ZݝZ -AAu!-䞙;feXm @J}\Snb !r$)c?tER7pXZ& 1\U7Y_,N$ns<f]O:6 -i्J֢%m ]h|^ ;рU}s:ܼ?ğ|ӫ8zqݰbkQNfcrv|:` m@`eЛ5Ay=ۯ3䈀Zdiqo^ALUwr43&bDDiA1XrR/?m4 =xiXRf>(UXv:zJ &\f'I gh6@ zȡ?xǟ>=㯾>VϿTky^F:VffuyJhRg ̼ t>4v<9JX] 1)?yDXAF X8y6f:zN1VyRxy}{Et&0xV\t *%qtr-9J8'´͵Ր$pJieSU&}=j4#՗;u'خ]okQHdɽE đ#Z&8ţJy7M.Yȏc=MrV"ک/v‹#k@zn~fpAU?Nl,@e N3QO{߬e>b X-82X'Ɉ B)@+''V+մ\"5w=s"x$ڑDmf飂>뿺9U@Ԁm'bRqjZ"l#b1{6CU5u1'( 8GV.UVu-Z}u6ڔbk%= ]kdP'V\mv .]UGnl;zQ1W͡ ^ w \x BЎ[j۝~p-o@KI1`Fl ^SJ٢QpVJpY(<fk26v"7[p : tZF-8in)!IuZaUR@"$EXRb 1n0bg M/Z)ZZ[#HjE`^.ԦBr@] .vD"-a,d3hm5KiiĜM98xn?|g/7Yϯown_ҊYVc[P7R5Iׇwjjf8\vo^ւH$Q88{e0"ߛuiV3d IDAT7""6Oa8][rĩ:C 0YiZvZ,w ~D䢕s.Yvê_zeȁȊ iJHlRk%LnKjP&<@({v:UrM> Wo^7_=ůú~>.ɧpe<+uH"8trwx7M~c`o>yUKD)Mnn^UCTM<ןmTю3N35q-MD[ZҼ9{k<{.bNn Ą~'> g[}fY]܊FC{/>Ct̅!A`10wCNbKUMkZg3RE+r[)W!taTc !6#$6@}SߌS9Yߝ*Tٸ?sA+7>SP3TIIL8&H؂W&'W;}“+z/#" Yěbe S6pPe抃ML:%zɈM80P pS&k۸1 mॺՐlE9@=ج@g 66s ڂr[!3z[҇I38Nm?iF24~1S`!Uw8D( R=wZ56-"9]P٨.i uuZ\ݸfHDH]maVUJ].b0s! 1P ff7b(IJ]cC2kJ6f*M6/exX2& 3s_@n.H U]X!,ӯ-݉A *"d Ja-!޽㯿)>9SѦ~:ߝk"OAdWˌáLr'UD]L]B'1 5730iyk" ș8Zx:r8 11wNQ*V4o·ZΠ`D L%"Sp$`< m"-A\JK\G# )EqZK]L'J5{2!EոZ=M .<>hƿ;j2UW_ |~R\ fo*LДA.}&-9#H\'g/5}߾.}|vc\N~i]f`6KjPk6R*ono͏lNW=VX|2gӫznx%Gblޮ|uIǵia>! ~w:w}: }ZwwΠ46=zwWq_w݌O?LuyuSܪH(٠=Q R1:2]Z_nqߍMIbv/m>&PF㔐"څ, sGSS\h.^:=6Oh- 3 sZ܃D&oyËG!Xfj0g04L:3@fj!bHز^KE@+)zZR7 ͩl%l9ϡԧ $RD3,7;W2QB-f  Icq}\*` XP'i uw5+ ] x-77 T7!ZkS4D!rx_F\I@,',RFLZy9x`b[TUYHm_ޒ+ֈmz՚E$DֺXa/MKjV}j*Yv=i-)eJ AHҰ~إ~U.@94 %EELDʩk~ R"c$7o*8@M%VȈȕ/#V `{ړxS-ë78Y5"$&hZkVxT=nhy1_^LR1HIOǜR  ?xΒy*$J]7ƌ~,|.+ra8nu-C.2ݡE\]yͼ QBK=Q!ª^.ÉDKˏ n/Lz,Cϟ>=77XS2 sS.]|{;_mx.)L_ooNwwj4vO>tsƓr٧H~f}>y6Z=ܟ):4j<7L]oC,w3.9 5(YpL6.Í΁ցXiZ ؜H20Hb\6W'rfs8!X+Yk3.+pswUb$):pO-tVh8 `Z[l)|oJR ZzqH@VK=DUg|GH}NB)BQsՎU}DZڡ:s1.0K3H2wɺ8?nBcBԥ>t]QA}\{ LJܗ\g=c˗G ~Ѧ+(j Il?]+z/Mlo" F#W2pq +nbYFnނR-5ԨB RCl p3Z@9'ޯ|'O黐|{7@3NDp (mI<ʭ:.1epg_UѺ4u3|U̗"j\Drb,;]R 1qJ,Ҟh ZUo>:xU쵡QUUU75Z:8lnþ6]$ư DāH!5DO (pl Le<ǔU7oJ@^c]ڢYB0\]顽C.3o̼Zѳ1ϪfC5F;tίgO?S-wsV'Bs6oE2pjslq:Hy]RaiJ;0x `Qpl#BpNO7U=߽;nJf,yRTKPb'Dbx(0)\k5U.ƞ|ι*8 wJͣmGU3 Tcaͭ>W?z'&!קTw-ɮƜ3"est7$E&mRdH``'7? %[[%fם{"bΩX;(S?}<YbIY6<{a+aZSgE~~~x8LK-BL܉)ԓcSR}nџ|?7g'[-yZ;q^pWv8ѳS~+S?LS=&IZrÿ;?>`7Ɲh8/~p|9>wzB yys$r&Z]Tq:1v bw Uӱ$i ٫|.|ܤmvq5ZkLE`P&uDfV#ƴMVR ʬeb}z2;%jMPE?VjK1wbIPZZ!zikg g nZ-f0/w@2kQ8lZZKl0GG ]H$}G1iFsT [p7!`PR K$pB; q$?-ZsBBps(HЧnx?A_s1dnn\uxD~B |}t 3zպ6" h,62Lֆm&+UP%T : 6z ::ʜO1]O] u)B"'vcͶ%t.laz +⠆%>{OIce㕘P53mOp[v=Dܔ^aq_%)uH1q.K%zm"bc`ͼEȴAٍJQwrZ#!cM?ln7ð1JX;KV" "Bh.xZ7*11Ev)uMUD2q7S3>L&b1ŔGb33ZU6Wf7##TU|u4!4AN8wol3U7+:_:J=%|y?pU]|;ў=EH"CUK)9k-|d6b{~,LC=([l;W6ԌNXFӃH±'öO|@9*W'j)F!&ɝJ'3,^|J?5i|Q Q 0id-c)e_7Çg_⫷^^<}ǯo߽Hf`Y8a*雷71uڏIkwq0`nI1h%7Emop{6+e6C 7onn뜱dfZ53aflfj%ZJա +* N-${DfkVMR/؍a~ݐRBfh|tW^iQw\W9 AD$,75 f !P߇n!$;p63ͺ,䪪oGS `GG:d0Pk _XWkd-Zqr6x ~ȯ}/|;CDo|Wl5;\z]یQ"@œkEK67fh)#Ѣey:Ļ)^tmJ .dZօFi X{9Ϻ7x%x0Ʋ<>nj+ 7#X>z'UAr)Im)!X{0Pၾ]7Vo_]C:.Qo{PTp(ꇥTu~/jGfsP TLeIQ8DVlY%֍ݰojWw/!뜱q:/StH}cs6LWwqs!&]wٓ}훯G gO.׷7ݰ݌ƑEn2nc IR2?ΏǥVzŰ <\鶛2׻l HD)ɲԯvCpuH?!Oq$b4! #T1PpLMoVPtRH$@Qfkvp&&cZ-^L NVŝx 7+ZkbD(z=(Ju9Rxl\4jցM3GI)f я4nHq Zk}x\%̶T[*WA@pD< | wOW!ghp9j.%͹ޯ9]FCZCڪBb“K|Oֆ]=$ s@ݹE{|N3 +͍ڡJ?sTQf(OY'Ⱦې?|ƻi6y|kMfflp"{BDf&Bf~Br!beZ\)*ͤvJR&p|#bPк1ʀVw㓝zɜFTk-`FJ!vmg|}?4&^9uD:z~03i-k?NL`# DMcff<= N6Ü8i g&v܄6RTVr/'?Hol ߶5 7.-TTDM1/~|^l&LaUv3"bBns2iҦCJ1`!(b1]BZN84l;mh;HYTw'r'B['n"5`&}./e+ӃzExTh L[ S#E74FT@8/mRtVQR 4j4sw_?G?zb~g^ij>1?06.u: @:e'"g"IXrAL>,j@C#B'q &D!H2cհl@n9>iX廣1ۓ T A}m.8f?$]w{tBr}psuJqs?]<jI@$.nri8:׊fB2ٹR6]y.U<rOGWo*ه~'}'dN ;W7,,^ ug@ĥV rxW̰;'ɪhIza%*g7]k̉Wlz66RAYJgxሳe0X`tJ f=HafgtSjpyCfB 1K֜k-4"<}E0 3PURZr=x$vCW[:f^ibJ jCY &(#Nkf# 1;K D B%E'FuІu1iOo]ԾD6?;vR?`quPm›|\;!!f`ݪ9׶3]r)$QHbiI4ݣfBRN-JΆΉ9\UjWD;~l&) ff8f9u8y97 ǿw7^廇e=sC-NH LTZHs%>mV3"%bf!A̵JO6*^؍]ׇYW)pU2Ͻ<쿙21u??wos~s^?!I8zy}] l6s>r/7C?n%gsu6׊L쥽7p+ÉAb i=rc^+\=s-1>݋ 0CTM)BlhD6z9j5K4ȌZ;Ԫ7jY˒k2R4ug]GZd>=]UZZŭq* ۘR"Z.hh  D#!&hj5 <0q߅S6 /Kv{~_? Fp\C7qއ]86HD Y$1G&@@4hEoS՜P`dc0x;wG)PVY3(rgvvID,D^յyNA j.BOy.ZL [" b?r T{ >a Mc is3s3Jyĉt̪lU9N@0D`MY';>_6S5`] nPuYWX0˳ll~8]Ajߚ&?x zD17Uql5ӎFdfw>nv8v!Jb75fybFmwDop8_({)N |AlP56Tw~}"o|J*߈T!p3S"!rB'ZeYtYj-psr8F$LPKá*3!>{]Jc<]7 }lfd4jծF,Ody7,J捨BA 6r% !o'ƣBPԦ1āPx`e6-V޿~/7O?ݰ?7(x?ǯnl*iHQhV! LTbг4v q;9I+YE WdHٮ74.N8q^YkL<^;j Rj!ه]V]޾;<Ͷ, <{~~ٍWo}&⧗-_>϶g,nqcn{jż' ps}/ηa@ZUǪ s"9[; \j Eȧ2G~,,3+(H$ZͲl'0[g~9 '};$>Ls:-6id nC]9OnY)erRيA Dp2'ƧG_㲂A&،OIUײEn6p-؎y:5@p\X<ª9 f؜p$\\;Uxx " C˴ĐC@&)ء0ZOP~? $8uo 63+jI`W 80'3N0 $]ʸK1U!%*cşy. R*nB&o]胐>Dh[I!l`kwXDH]~V\dK4{EXc!/ƵrrJb&.IJ2.L* j8OG3z($($NζNFzb;;{=ݾ>o4[_Z4 ë;MjU[?nO-[U}L>DA ÈqdWwoҨyٗχ?b ާO~뇿rslɥջ%SZ[ZʒS7C_JfyG8r^R߿|v a3,y|m6Vu8֛Y͉} /:H﷛ݫN؇V3 bc9.n"~/ObѼx.a|/ˋ/ϋtb϶Mn:/6l6oDKZ @kUa9;;c:Oqap~6X컟^rq P *v,X gWJ.KtcP=X7vOI[΀JZHP"rӪj4#_j*n; '=RZD)LN!$4SC;5U:#ȝe ݌j^̋"W_$؞_$ĪfLՊku2G bXufX{-fE18pwzu]#ȫ)Ip:Ls zޯ ZMR c]%Y2S5HňݽrJ9Sc ̍T.Ҍ@" 5PX DPu5Qnd!h&M2ZДAs$$ho(!&oY0܋qolZ@"!Rbn1vsp;'C` Fֶ"AN j_ 6Lś$=0V?u"5;DN>"&8$ 1;FQdj9 b c/$Ƚ)]p3;92X/ 壚'枯qSh"׺'n1`mM!n6!$7(1Bln7mDŽJF ᫯yW$no?_!zKpk6vW EҠ)F3X KtVge)uU,]Ղy("Rcb롃#Ar/ճ|qe5Ȕu.QǨN) w-w* s@Q1n7'g˽M>ei&f7fnW 9qͬ/qrSW)b{6&87qO*_ϿywwdY%ϔ~>4Eގf78ȑ=%ajDC CrUIUJ!7nϟ>?۫!W%' LA,%v`iؽ{wwyпA|{H'˒saG36nb &1_}on//ᡚ.>mDFQt_c5cJ>?@:D.}?y?&U5wP+Ŷ(]8 ]8t1`3t"~]g "3^rrЊ{K`"b08h֫?b ~WE%j6+j3je&}$j(@mJ8+;1p1pX3 C/^~7Wog~4{ZRwCJȕ.1p`8U"0gwc5?ǻ}6TTeϟ]]t 8ɴR ^?l?ן,bVg-ӯ/~3~/^۷WӋ'O^~xqsugo$8N%q׍- cgSzkZpJ)ϒ@OvwnG-fT5{!&oZ汏Fq` cF Z.RE+q\+#UfY\#Y$JLd([ΖD&w@b{ZT[_G"Ŋ$ o,;9@1L1P ,I d򄈤rHH9+$ q$ ԑ<-Uŧlrk{{7G8Td sf24OˈO&??я~t}}O<__|+}ޯb&PLreh]0?qӨ|Y+؈0B cXu-_EIՋB!OrWJl:TLZT2*}g;zD> q3kc (9H|VΧ0 O5-N]>Ndm|et?L7Gge `4>A wDJIBpR ,NVZ$L"$mD5XU5uG\ȈX\'@j|R]DmJ5jsUuZ+g޿EyhoѠN6y1Bq> Q"+֪+bUNS̱KU$jeHӜf!H"%+S ,. nam Q!9= SovIVZ`-r~?ir{҈ WPEjJ/7?}dnk{LL˜l i4`!ph1 r3Em J̠!;bD ұUͳ.SX`d&ř#cJR.`>gg52؀ٞdX?ټܦF2ݸ|aTbeb'A Թ/#O;YmxJَ/DޏG]BJh.z?l%U-}DdF"DOeQWt}n U]2Tʱ\wQ96w9j-J㝃*(E*QH QfʄsgKf T-J6ҝ|oohbVղh- Lj0CŲBkzB>6iBoC sLё(J/V[ 'Q &s GL;}9)Xjҩ,RGz ( G/>) }E g~?篯]~R5EլG̀g;<ߡb:EBbbW&^PiYQ||;~?z߼~S96x>_< n1Tac&f[C5g4jXuC[ ;aluiw֯=g˛kTzCI(u!PNAh̫ b(!4M hZ#[6"rFJ(iE{}Zqf~K99KWp9NF6R5+BbO&mq7> I]LUkŹ&%n>&]Ej%'"a^eq5Ij#Q b: l6f;a]߅HȡjUxh>:,VWGֻ~y{m4LMlRc"~;G;>Hb@ӠjSy.Cf1J=p!DݠnXڄB ' "CHɵԼZ4:t䑜c1D RlY ʊȑFZӽq&MOx 9EMZ/o`1>m۫C>j)J1*4֜cҸd%T]BR,Q/[{- =ݞ]w8?{sa{Kl8˳˴894-:RbuSE7!sR*S^àwWn|VH AdOEqۇ/w? ~w-\͝cgؿ\^:v|zy9l߼=<yo߼zxd/78T=yZL]nHQnnr^RCceZH@s7i^JўPK JBeҀ芺.цw+(C";tRG{6[>Ռ$erNffûm؍@lN<\ TP5<ʲ*9wzC 9Tf YU @ c![ m h& 57n! @ 6mLӴ ,d#5ʪʡ2327ᜳ?}eYؘ+VVEfD!޻|gSe oH 2` Gz±P{2Fꌧ\ "Xs zALmۻ7˕i_L!% @gmib8:jX^k9GGkD-E3Q'uy l1VP'O'"q t0: 5T5D&R1L]w\y^3a DlWOsU"dBΒ+8U`0Md ,1\WGMWo=Xn""5}1lݥ Ξ5úCQ/$5)Ǒ΍j&0fqR C#y^ڇ+7xL1L9PTCsO+T1EPLEau8Ž=/oeBR\X9+y%Hw; D3!c `A $aXy. %S0D&VX4L5bI\;X; `+wԩ~1[t{(`jfl٬d` P@̠"cd"2`Z[Tl5']t O7iZW8~UCGZRG1 2,&#ĪЇ!jD@>ؐ™;/vսヅ9}\7. '?z =rtfǮ^nxDx=p{bjN&Srap$5umESDj&M3n~'@C2UB.himN^8=cVL#ZAU0:t)QQfX*2W1idq|ћO&BCS/A(JVU'.;S0drm͠@#&45PIIU3ƤIA)CRTzDyֿI#zx$Oi5HF h f|NhA@sylc'g5S-ƚT2|F9,(kΩ4{eHsM!gQ v1׾__W'_o}p|=WěcʿO|M/|#4;?o?/WE!H6up=wi;{ϾL\z2F 4r@j2M *tK;O7G‡>&'5Jo"ĀL0Y0X-=9R(6撎N6рAp+qD*bd'3&c$I):mi sRIMIDD-GO=y}K*-Ųm#`䖏8VpK:(TMdJr>|R7UYpD{ۿ (JrAä0 )V.֡Qe3QYY5L)2Wr|0-QTouSO8\zR+uR6u3 jF 0Ey;~¹3g-t@RD%SThLX+j.߷_鰊KC8P:t ޣ4Jt333EѨH)˜u^E,"H0* c H*OrZXX%Y ɒ1gc8 ) rC T{(=L5g`BOwLFWYz6[g~w|_XdȣRS3$Xub zKqA=G[`a[ۓ>gB 4$j.RHȭVCʢH"ITܷΤ,]vC&OwKh7=k'eY1בwݩe\}8w;GE'(d.,)3㣶OG3 @uS g7Nrmsc$E06;q3Y%GD@EBaҏ[!f1IT2`X DmHCM"R )y₡tX8r'jL! ٩*ySO7elZݪX9aGƘ`*= ,Ouj<d D]8؇^WLIIa1pzF Z`gpf ,CJ`@5 0$MNkb}es5%,'U^I@^87Ev LL|hE oj(D4%14b5Fۘ 0ԥ̙3Zg5Q_ن@fv+o_:Մ[l{2O&ĹؕTn9i%Sn}eTM|a223CV=k]jVu]B )nM&|k2USjgt譲 5Ga"Y8 45䱚 r[1RnRqd SCp͵C{܅ fgQw Bdׅ=đ:bqݰN2{H9'sCvLcG%5P@vI)&pS1gbb$`ꀽ#tR[hcC EAX2 sqU@ GhPWl^4j7_W_ؚEpJtuɋHRp\shqHm3o؝ΫŵC dGCAAtqaۧY=ALӦFb/@,I1wNE/DT$uU־GtVM'[C~=1sVEtЅag\fVʲr8ZB;Ο~r/Bl[xͮ^[V%y]+Wۈ́{4߿~8tA!Zu%TMgvjg }nܼlb ɗRģsgw` QD jRMNtrt^)%-BLU[7| 1q ~G縨}So4]lg[)FtЁ!\$[2?=B@Ħ3+N ̧0`!^-H轤Ė1:'I1"!`@%_* Mm= U/w׽{Ox^~ |󟼸Hzg}[?'[{o?^{~kOܤ3z7*/o֏Ww<_WgL 7<?y#?w<%WxH|K?ƛ{u|\/}޷o0BYlڝ̷ͬ+fM֊)h 7K<ʗ1S[|#ǝF sh@dHH`Ϊ*ϳvV} A$d`EYLd֔UQdz!P~2AA-oATE4C$yYs"T'" IIU'ljrTUJ?[NW755L,"eAOEEI C)j2  O䘲HE2́61$VJ@ f0A1ULPTtX6*BJ7 '˴Ҳ Cɗ SH:JB".'E1bZPpX8p  (v<n5?;]ް:rC)X/" / Ew{S;xmo5pۯ‘9@ěXEhtuͬIV BrW5jG9Ss`vz8:]Q=[Eub)ŘdgwSLJ(}?w(_w1EsźZ飠MwfuU LӪkKb*dom$AΤ냥MkO08Đp34:<^$ps>^K? }4MDͮQ.&|ͳ1a`Jŝ3#5KFh@-F5(4 3 $hZ 8F\d,k3,HƎwS:3`4 MɣB%8y CgL.hDB`Q>fHDrSԨр 1b>]Fn6>3k=hnحhA5+t?{U>^ֽ_z_;~g;o/uk7+7|q_~;&>o׿/4C~兏}*CW_/}}ro~g {ſgW~3>My ~_^W>xݗ}OO_|}h/M/9o>wO_/0OQannU՘RUڙ]|}ۚt brdXY()3 *ÈQlš|+pN0Gc '(6vhM> LɔQkX IT$E9(` !hr@nH"8lAy-b> mPt%2aA*!"ycHht$@d^VP@cTnklwϺg}6:a 'B#~=|+!Z-wD`ɴڞnmMgi=IPܟ|;8$Y@Q4gObQ^_SS4 =աHT`HID{K_ W8DK  $w0 yۤN:2"3BDRx+4-rJD\4=[M-JRR4Bj9e3$3dh̥ Cb$*2g"&@E$ 6<8),wmjҍz8\tE%Q]PV],S#qc4'SDȹG!t@!U1~Pّ C\땴m2흹)?S>GnkpQjYL/_?:kwN+7{b^|]LC3)êmcJ\UUvO : ]8=a)CqWh&3S۰D)ư=ݞMV*uAV'eF-0!(!pA~}ۊGzq Eϻ5 #1B'yy2 F$0pXμ;,K'(YJJ;&$Y, (,IY sXq%aĞDWJV@sH6g"5QHPIB7sؼDLQX05s7e i6gf#/kXʗ:Dt Ǿ #l]?>: !j 7PrPmgG~{ww~Yk|˟{~?'^{/^.|Z÷|'zv}߽n=soK`==_U^Ͽssoo7}t8/;9ß1g>k˯wp׷= >pIi*PpxtVRԤEgˠ!EխrH޹iq^\W>>qhypR]֬؞uw\`jHCL<64Kh0o A vKJ4g`;F3zAU2e34d Ř<kqC'Ir%u.%2m$aܢ ! %ܮ1UsW!D%AN ΂SP0f)+/-فS34$9U|cts |Q6"M_7C[G;xÏ\ I"‰46COzgQtտ×{qӟ̑8;/|/,nBp3ŭ-k) c} PEd0 t\&fBϲvU?hGcWpa"#e(2zɾ\ '#c-"$8DGŒh#. QҠ"h(]hޕH`F@ء+(ypIbr*Dxٌ/ @sݨBJ*IUf3;QӤqMŨ}XdduC"#EѰ.zև$η~B5[U9TT^H*97pwaWXϥoוۿ>ppRlͪ[wNDԩcwc~ߥBM'8BC;@[44pZDE06t F9Oƕb]zl$8@F'4a ) T 0%Bg`8IҔ4%ID5lz6 Npڍe}6b&"3( QD+j6ζdZUY]fTeOz#<ʳ6Q㦬FՑ<z ⦂   IL1:H5G7X'pS% m]aRfRVv~BFC̒\ef$~lXj$ Uzw}L?3rtܯ7B4bQf!X {4JQ< sK2H^y2:5tr5,WpZ(\Rx@:VN7 }?/U@V_:3a"I9p:ٳ?~k{*vTT 8:jM}soٶ>}Zb8LiP5Ȕ`*BJ ¢x`Cz+ LЛ")>;^'ä&S IEh;5 @[TT( `21 `&C@%V5sЁ*(}б2h\ mۇh踜zVH)85g#HQU@@D|bC4\d6'QW zUVK=@H AEEIF rD6Y2`3C P,zj+(( x"t:a%%]r3AL)D`OVU0n<>&&gfz! $QCXĪˢ8DpGG(UlIQZwpʲ9uzw=q 1@YQa)d:g˖opt^\v ɮIuen9ǽzk\,N'I o:-kr:5];8*%_CJQe_uU0sY:.WV! ΦfLQw~-̘X @4d :ƳRˁy 9BY$A%?{okٖ}59w Uk6t "B‰CD&Bb0D$+-$0 !@@uo7ԫVL{khb ة^{Ͻ{׹}/yRT `bLLl,Yُys0C`CiRRTLX2# 4e-fDƒ S_m݅owp-S9wS{g&*4!Acd Z.Dn X@(~I|/˯+fT}.4{=;Ɵ*/9)[=?w~/{1w~>&_~\?+-+Gg<x{eSŌ>zYkWqy'|y'Zam6OO%ݒ01"Wtt 3?%HaLaBPA"hO4o"hI(Ŷ}tRzs|99rĨNij0vW_R&d6LCR.h@Ғ{pLelܴ:`OhT!-/ 8] fRDA;'&5\Zq@DUQc54kŽ[3bf3bj|#tńjMŒO\y6Y &\6y7_ty;0NP]Q#8d5&Un_X'^(Rk`b WeMk !XUG(Ȕ('`,*Z$r\[SND1cN0Ɣ< Tƪ*I wE%xOMmG b!Ϝ~~ٝ/""0Q )RkO:U)(y8IϪZ6]Oѹ y#*DWhWqUv{l|nޚ]yzIp.E{hND/w~ƫc|02,7Vl䪚Kq1+?9y\qUbo6[4ˋ~!@A7[~oostyxwWk۸^<F^ [84l/7؏IciO,ubB6 LIDr[o$˕f i@ oߎnaκZn=dzGlt|ËĮ"㐆oݼӋQヽvئrtP:W}2W,?zelcBtamq7xߚB*egVFTu#-TRDR L!Ll (_efh: jB\9YQL@3 @>x1YŶ0bq-g8tZK15/* F<('FZ*]7mW_j~K_c?85}o_WWOd~ǿ#=57o{o_}֭/::y=_}ҏ~'w';O^n {~:N_KKCO/vO/te-EpcXLYFR @b#<)Z|UHq}^`3/HBB j2Rj v9hfi"倭ǪM\qDd9PL`b"2B>7'8`܀MmpMI6e8Vh?˕nV(#S$jF s 9Z%LDOFT>*>؜9NoiɳUfT v\UԂM'ݜ >/B.6]cp+wb&^ |'O2}R8O֦o*}U=WG31 DTDD/nQMIrR~Ә=Î^C\j ;=\a0 O[d v5! _'81W\m?/620*1ڌPcbʄW>ɔJ)X[G%m4]zVns "slv\T #DK!*;#_kxf!%1С.mXuo/Ce%Uy dhɧ|hGo8}}m32rx{A0ky/eQ:>lo\?X=R͚p~~ixنcLpl68sqڢiJY{ܾO|'g_흢(=<99=3MɾK<ܝG'/-Kݼ+ۼ{*n޸utmvѣȇ_zUʩ0F<&7֭[lGzHۜK8N/k4}lll^~`V6ur 㽃W&Fwv1 r^^l 7\=iߟ}vm) vSUԧjY(4FaCt %'"0Z.nzd.8>_&ݚ7eǭSbaGu`7!bMBԲQRM)(TG m]چ|=Pa#g Q8sL [rsvR^y'>u׶=6 BA 7u~ rdl ꟻ䝿{~_"/}7v) c?p#e?ӟnwi'x|wf=';~o~o8)}o?ow_Cߟo^O7˯_?uzR}~ IDATK)q$9󶗜Yb;8UM^JY(#g JA*~35]n [m1-Uԣ䞜Ȝ@ldDp#R#b].u{VKidP*R2| EPZ[]`@pD0fbH-0HBCd,D%xrD漉efƻ"anvΛIE9wʛ"WU"%ZzTwmuS 4m̔f T v5XH3 FuboowY76zLj.5iI&N &M8`2̬v5'G|٠PU a +reVMa2xnn],µGMムQprտJ7r==8c=|U..W@r8GͥY"I$G{q}1em#?r |ॣ~|h(c mO?Xӳsr(/O֋AG+Y6Ŷ{v+b[M8-c4_VÓEf &^vowSZ]0j9.ft5JM./H>88[xyxre=C.{%ӳ٬[golq yp˓r~o/ٗ޾=`jN R3rWTjcv>b& CYB `*r}@(w}.t1@S d$vpܐyF-D3n1-Zgo{LE<<6[x \cK&}ꕳ9X#Mp.HF.LH-5vVvLLPr)7Hd?WbM5}qt|\o7?3UM)]^^~=B}U9=CU*xXvc7dQ'"h&ޘr[땸Kں~ ?SmUxX 7 U19Uz60)+=(:y۟3;͗oC*8Evs9+Q 1hQG<(ww}l+(b2r`1"zxcf b1IUV1T r՘K4m4 LDTVӁVcy | y0sa,V$)&a6_[4'3`kV ʣ~Þ|} L'?>uew#Tg8vR3YS dd%4v^o.Ζ=<[}.| 1D4s.*&hQR"h&K-}Cc`'(%˿c/P-Er3MYCjŜ:h OmU`_6L,02Q%g<@&OL0s=CFPEH)Pl5׏ ]6"2/|brλr8:>GNYl@ d›6]mP>FKϮ6lK/EԤaB_oXggg윿8O޹&jiƹPq1F?M9]ctg'Mn~fy=WH\~s:9S1vRL Dеfnax.4nɏfBPĬ p6rWەXy߹햧#Q77,54 zE8i0S 01*͡G{]αX .Z#} oD%f/W%g?8؛p a"BTU"v11[/ݮo"N8[GZ΢f XJ"8zj"w[pHCmI)Q*8ߺ|?y= gQLI3jFfN'̩-2eo?_ro?{Ǖ׭qH2M&I]ر;b 4W ZTL* ndbP [)gX ,dU(ϛC7v1.4B/E0)4xv%RYϒyaK'z 9?Gjy]w}__|vqƭEk֡-C7s$~~׫ެk cټ%`ҔrMP츝5M)ˋ&9vMO|{y>pˏ?}xr2/b|5d:w*0n7pGWrHMiDS.6&=փEۃf|vz\;$͘bႩ$v=跛2Ιd4tyӋ9 nlOױf?rXR%a)Nq|$vEΙ8,۷_㱏PUj\-qGA N3߹(Sxpo/b* cZD 9<:. ޛ'(P*4."SK"MfGG7f -+ $Ӛ("Gp6E . cNjAn*k„tL  rgPLLL\tZqՎ onq6 Ad3&Y5%,jZ1>|/~c/?~[hDڿgdJ ~BV$)Hbȫo|W~kڍ -[O:J#*΅x"M[pyvʪ& iزou\"#iV-d\{@%MsXѬ{7w9bLL!>:0[TӼ7^lα'J$C НOϿs54ąr|5G{{'6жMV Yr+CmZt~σp.=L1v@]dvܶ޻w˿low9]ӽwUj5شc*;T;Fƃc3s}Mi=A42fqԬ֛uHSި"ǎ6.so39]7Go׫Qr2:m֩gخW͌{ry~KvmChѣba="{ѵGgg/~E-m6H)\r%Co.Ɣ)]r]_=_~ֵnܒq02@왜Ș6E,[)j bB@MJNIqC[xOċ,e4JMK8"ɢqlu #+L*`5ꋬ|9V%Amx BFjҡ;Ei6@hpP)fJF,,Ҙ!X~soYZ>QosE?e6cRU&{b`RU%*U\~$~ KK~OO xSzxݥEfa楴~b{F<(*[>py'vA!gMvd9MexFqj쁰Ut ":!_?a"cBMlۦ qMJ ]|ouװCJL ū2L;ē2nB%fjkӫ{lc4u>UT)%Ɯ6c~cb6FJD,q  ` &*MnA3Cvg3բ I!-S`Hy~B~#'|s{{+w䫔R 23 @A5*RT :Ie64r,A!N\a,R7`1qhW i\Ef|``VpVT j("3@fbxo>L>j!hy_hl֗y¼[>6-ي _|l޶}vfvv9~,λ4Yz3#%t3 |y~,7͈zYNb/}xt˷y/tt歋c{p:[ϞN֦Ȏ_kZKBIZ*%Ʀ35YmHf\AG{h4Q(!4jYo!acg٦tL"aG>~dyyٗ?szq} (taqvŢmg19^>چv^^0,|;xN~$oL$x0\G?dʗ)6?s30F<dnE$ cbFQ!ڮBG9fӱ!!9ێCPRe5͖CJ]N(]tF`u[IeLEPĊ{Ml:-B$Gp E/TƒKab~DJqۭ]lO~rm{k!Yގlc om캸` 3u}aq;ժRTjQҢRĊDr؁*)Qiץ 3ڹ&N>i3 \EfT;=Sj^H)"\U?zRWov79c.̜Ehd䜫*wNZ];!O0lEE535Re-\2I1Ւ8# .ITFvyO|Wŵ_x`?:@難"•_gJ*9|]lj**jR<9λƑsV%o1f"͑W2V+ lѹJtRIr ,#=' [Ȕ뤊{rs n%1% 4 X&jV$ (4vxvo]3ϟT{y-ƆJ/yש6yX*,u]5eSA&^U;~8Y}v!2H.9btM1fhOoBdb[te !H ǑE2pY.GeH5:>[;7_cYrqy!^C("Q5aHs] >bb Y}Fg gSԴasj0C #$#Yֵp}Z~ *<{'0&ݦSYTNC%^>[IKl H !Op~;6-!stX2|!:QRL}D("Ȭe+,%B7=UPOtטH%7}xfm99۾sw,ݾeց=oǝ5> D(ȶg7}l0brd:D" UhEFd|5]6isI&@ekUe5el 5&#& /"g[*<OOv@z1l0i"#&*5lƆclJ\MHTTpUo3YMMW]O6vj;GUD s6r* |}ۆ8HQIVό++w-8U; NW+/qkD:l#.^*Z&EIDLp&ONywߪ#Loղ_^v&+Bk b|;,"{n -Wv< *\LB!r<9bTx` 9dS9Z)p}.Dán-uv㚿kc$* Y2EGՌ:@ 9N1ǔ 1:0ZAf*bWpB`Jb5 (@ DpXs,;K3h}}sі:o1oE/t󽳷aQlF;ߛ/UH*g fm~ݚ9s8J]R.c1~ PEr.>rh66kym>qכ7f<.qβW Y'* nJ>67xr%%`1v*ay9㨆ngvZS cJ̎D՜a^bƢhBT Rf!KoFykѬ4Zdb:߶s;:LIDvEl Ml[ƕ$=8};<<ܮVqU ^igHJ7{o#I\kQU3%\.Vn$ fwd7y"7[TUDA-3<өnzT-A<Nj/Wo>! PBu7|Vւr R Db0jEcCY&+Es]Re#76 SeLDjT`K~0d9 ѲPp'z9v@VK5Bgj6n3 VԢټ/a3WM3Ut)t]Gµ\ i%3/ͺR(HZI;("%di9Ka}TPq2AԫZ&WR*-;0`6kwAˢs}{ڿEaj \9;_jA6.Od32u~vgASS9I~D̽k&UDYl(=nhahu;lZz0.3W];aR ov]?Hwr3j5d+d)Dc捡L`vp57~Y*0[q+IA*2B5` )}bINbhDFl559d2_) $@vϤr]Z㖰ik `vrʹ<.x<~kP2)9DRԪj.$lL8jZY+Oӕe ú/żUZjBFuM귱y.^5,wx>߽%00H]K)΍2k$iM!D:.rY):#7 DVيYC<P+n0Eȫ{蔄$U]cOt׻7S>ӥNm 8/|8_ů?\?eKbۇCAȦ6zwD>=Ev^~|`7i^tn3|>wȪ#FE%tn^sR#{U8DDXɪ:H ժxUvW-EK'MOCG]pvbl`(qr0Z@NP1s$bnI'oC*<:TrVx%+0jYִW傐l{˷6]}s&~JlVUbi).Oc6)FJк4S0D1E.K>]F iq+V^^twEMN:0MT*Dl3g<xyAXnv>;3 `?C_7>pm0><(J@ Q9fl%*U:P1*.m`C W,`d4['!jҵ wovizUOL[=P 8`h" *{%pudp7 :ĈABڧCS}7 C1&H$xqQQ YoPY?AANIIakԓpO]OO^5J곞nH""Cd &JRԮxͷ}n`j4J1VN,\ + "A=8 =XH\:L]ɉ1@E1yU]v)9WNBu(j$v1qUwP?9T_Ի۫;coO|&zļجٖj. )nb/>^^4\fx͸ݦsf6;˼D3 |_mK4ʹ9W~86݋w8%~r:OZb^@!ݶ֚./)sהB1jf]aاy6`sV~n4\o¦IHܳ;RG vnV[Iىke겠D$tGJ@ WbsQmAq'%B5*ln̵\Mt5J*vɉ*)jx<9-߾G?.(Sڦ4;HKsΥf6j5{JΤ]($1,x %>U-f^4e >?E Sd` \_\O知_ھoН7Gy'@*8@ EUTLyV[JL<$L9Úbڟ|'ƐnvަOV<[MsVSkT+(Sgf{"G}<4ҜIV!ڬX%W 1fۮfo@!ZʸmGOj53#UJ67j JkK3UUԲ2E Aw~l>$07^5RѣAܝ+'CR r~Nr5!5s25S5 UڸZ7zJzXsYx-Zrp8?|8>ܟiYS`fȳ u  aa $l\WXqϦRj67DG3➛m7@5S7REF *q$oWߎ/_/%FϋC9H6 ;1 p"pp O$i%t',ǚGeA6 ,PNB&H;\n3" W:ar0n6/÷_~?M/>Oaw~)㬶Y1ي$H"n6K|8 fY]jޞbnHy)c $'Oo߼y8jBq˗wé. ޼ I߾=mws)VK׿ͥjZkK"sf MTCl=H̥jZUǼe}Z̪sZSBf@\roO&ė ~o/dC^]>Ms 2_2X77Ր !T\f7ǰ}χ-՝Bpd_ܤM\UYq\ZSRiGq$vVCe"'8͵OtQ]w!8v_]7u/wmnq3<@b۾oblah5Zjf!\|B$1H̵:|t"4xjZ lR jeS$VYuy˩ `w3;JKudB!eZ ]Hxvۤn>جk+6_ mVV{xb9@|Timȟ gEV9=髕a:L4.wr^ʢn`Ԫ*j%"AH"2 @JlDL&VŪXaJ),d,0ԕyNn_ }Uݪ3v[NYHA܂sӄday/r?{>I7=h`#* 0iȍA#hE$ &H2=.yV j#/LI`R BFMiφST0G!8)c1HL]hۯ/FO|>kJGHڙM4M3R}YU-03E!"uKe圗yf1NeULs´^m7eZTkT2_.Q[f:cS7Ϛ;H!Ұ æn5yicuc.2N'TlGk_?~f?ð `YT\X@V*8ĜĈS6mnՒZ͍$m1]7 (1@WhE^(*ŋ>2׺Xj]AKw20wB)P`p:MZgB4ɝH!nO St2w)P~?3}ay8#%1+ل<ϳ̕\sNZ"OcyڕԅWbxǦv0RbKfi >?TuRsdr( ueEJ%,PՋGB^nr~R'u2g9@؝F/( }? iw8\TeiyANJ we4E?u,BZGge8ø\+eP@Y}ޕ^ffL[k Hקuunou1XDb )BK[5`I1*!ܘe|W%"ZZ/k!HЅ$k79dR+'`"bӊ]''/Z u՞͊0D0Zju5xjRt)uOM,/j]X8jw !u!Z1Ɨ/rVG!H۪`,RkM)*CH!U;"*!cv3eb@nm]t:֪́vqй9zA uc@QI+UE)X rA.TL|9k- rC>Pr1B `^QTmvnnhFp&g616`o]kJ:1Qи{Tyw￞'PH8I!$a񪥖\KVV'8OseLN:r` TҾڼ_5‘72:%>OtY)]`gwU!{67|v6HܱW%GRH1)D-=BM{j#mYd }@a!X{ 8Vֳgcu ᨆi842ZA9Qy0SX+ 225,v8\rb ʬ<+g'8KsNB$Ʈۻ͋&SNHAD=7P[KC#Zf?w% a'5sSuլe.B1ԥKE ў^flz4xr5*ez{Dz~xPzݕah(Kx9<>.SγÞ4B w,ABP`(1r8 1ͪ6pꖩΰ{[53SaXItozq6=CbH;K7wۮ! ȋj)%RTkZ߾? 򳗟C霯wH>ûq)E$͍=<ι9}f TOz|(m8rsۋgTsuwGvA.ycSQ=iͻ*p]v7RQݙndёR@@Ek5%(}סp#uVZs"ʥ"W䂹zy, M#/[I"1rkk)@+׌y颗_v<ጇc4:vl̵ ba~so>CBhBIT4i\^yhgA?l(k ^&BʭH.bd6t!k#kV[i~>Z+tcjԎ[SYNx*N'"? Yk>W}gfUq>/8O2ssÆtZUK5 C@,a)C<8u]_k9Nw/nC!͛iYfC K)a](l6=c WC?ļhZ iњa<4͉p̵^wcG8UC))je#@bn/dz0n%ۿ 4 _:Wwvce @T\]I$ u\Q,FtML nJP QJ\/J:]dW77Rm6W[ m1_`ٽfGvr2Ps1S1WzCLaooN͖%KYj-ֺ{`9[ nkSvo'QU"f.?G 0Cqq}\OwnB~_擗aB" $EQ8PHZS0|  ԬSkq;-o~'䫳 PGV #/<|I`gqQ`Y[8т4cu>%Օ ^+#gӄEOin<8lWvnuæܰuF^SpP>њ{yx| GkZ`7<jlE@d ]@0)hO}m$SQ a31g >ܩT͛nrM$ sC[0\ 0ZJΥe!w"0duvnoVOs`Sn 6lRH'TvNo}/_}e]rcǒ@6;dPCxT.ma ۝lL @́v\E.]L =Rg5+&Cq / [u_`uGܔH]ؑy:_aϖ=ZfNb>-:f[̕ɄA"L4Zxd}7i@ Ek- \x=^Gq}\ן *QVWgWė7eaq##B\IT#8s0R>aEP" 97;s4{KG"Ъðw1R1.GsI !{{{ -Z9"-Q0`ZX& D FOov3l0t.v. BOs"jƶDC;nfm>FXZF9ț~!E F Avn*R~Qط[x؅nlȿu$NՄ̚bQ{B{OSe(PQ11)ܛ j-2iZt:rOq-`try5p #5jVeK!D,`$"KGUܡ c6 (SGtKönۛ]|mxuݦM!z/Vj3TȚSE@F\Y 8d' $dIy*o?|ySRfXJ%F~RJ"b+QEkfu1ĜsϜR+w}O3bL˥VleYRJ1ۛ,yv7uG} v4K3NRq\aQa/%V4SKw{XZ>틲Ta<~XĜ\/dww[_?r}q>WB^C豽 %HANJv(}лĎ`U@/{UbY ݋( wdb#RlQ,sȳ%1ԼuzQVźٻsޟw?~f|S0Y܄ɚޮT̊PEEOygwpV:>l ְAUWܘWꪓk' Gq}\ןBB-^}wE꒧ҷz*ܬҫYr)>e*T 7> B 2Z07ԉHZJfnOP6{Q +8BKfdf}Mp>k-fFd]-EZiR~ ݛhqoPLCv7u^~]/q%b!0,c캮R)7gAmKZÉXdp50 `ayׁS>V*"Oo?dUx)ߏ~\"uۡHHF+ʪhѴk aV?@M>5fXŷO@a4ZqZ)xe5,bZZҚEےIHCCL ʉ{Q=vzz;x!^lﮆmljLRlb[܊b"L8^oOnxdpaA%.>8u\2}88T>K|W7Ş^q7;fs7l Y;7Nj-uUbnn~|JnI=x" m3[lpr2#h0 _/7!/|o]-z>ðuݫW/DÇ]ץqE˗itqj>-f1JarexoVCYf?OF7cN/lsv;tb KD _t_|UZ8*ʓLN==jXqY+C7na@C kӨ.) D'{odW\-w wcNXd5nئ6D7bIq(+r@"bE3ta{k}C6.&̨h<: r5\(+qg c:ߢ@,ps݅q1NCj^or> :6XJ{r5fzqYI v5:T|jjez_3X.L}6G.pɍgBfOBPE*H%^=U<;y3L]@ٙ\ 4Q<Iֿ#!sw{gdIR}!$9xOfu_=^?0aN b/ɪ?ZtGmXU߆3s m۶m3PAa$`P&cDP@{xNqt,m4|wkP>x>X*W0y1PQ'2>7m{b;w˧g_wP;N9 (ܿ'aS)<~sa^")j08^NtVC>a!q 8j sAx?y?8Y?{\tL{ME͓k2K dRH%46u؉lVlNnj|q=dz\ozW^ viyMǝ.2v1 F6#C܍AI#i:ijW@AlhNu26:b@)B b Gp0H+@iڎ. ru=NhuZFJyZ,ۣUZ*J^0C)6~WWWcGOب6n^]z͝* QR~~_|}~n;TYTN>v_?#fq}YTu^OTz'u<'Umv\{C˕\_߈ci>jquuu}s}|tɣmoon{<7W>s)^yNzZ 3A9SO1qä("MVL}cl.}mE.wfD1DZ]ھo6<dCV̥ ١|G?'++ɝ~h%7Fx BɖU$1.xI1"*n xD #MDN'xajŠNbLN:_ A d(ٴBMv;vo߼aWX9٘ ` afjDCʘKR81FtbDR.%f2v4*#ӷU[L9g~{_}VVbpyb"!$L3iȂdHj3癦no91Q\$LJ,5n\ǁ.`h;d;TK_V~7dѮX9 (0k\ 8C@u1D!:[VsXt9>t}cPh=eWmu߬ @L,ADTzN4_ɝ V0aA{p?yXq^OhGKGI8EByv07cmY +*mڊCʹky crz:@<~Ԭ{"NNL>M㘦iv}lvird:pwI9Dqx@dK %B4 !%˾aϏჳ'gdE)ol?9dfQPrm5kW$@Ȝ \b.EŘND.((Fd.nmSkNԄpӇG[ vm9f k(H!RwTFPUɡͯF6HmR,X1˴K7WNSBq✑zPđdDJd˿MşM׻i!O BӈjӋvAիi\xn7ݴ.V+6Niu$GGkO?dț|ܗ[}uɧ|y=ӋG)P.g9NNuɳMs>=kb0ӜYLŽwi(ӔU8"mRJRiRyq&071[V"s^,Ml^|mç>{8%m˾oi^}G>|9'AC3b u RKqe߮W(|wrEQ=z/R "0Z` 93N,//tCI⣇}ފOJ pBwZ2` 73 yCd`tR Qs2`tr%i`nP4Oewwee[^x:tԼ`MaOHNNM,Jh]XFmbvM,Desw$Y,2V]]jidNObov~?>I嫫?9Yoa]Uy.hfmϜK)m6mT Hn/JrGM_ތprrDDz|^.Ţjbi@۵zXRR) F5BR=1% 3$){"[y=ȲFy* s!viqt3b܀:UE$NN$"7hJ?kXAF3bs*ӬiR6YYuBif>e?=윘ܭ)!O¡ݎ/Eh쇱m|wW;~a*)ǬJC?O7,Oni;}їo,x궷fݺ :)~QX2G `9f&fuU9Px>k< /ъRM;֋|~OBf$Mn力FRI]"(^rp2gu:BWbfn 5Rt$vwHz|y:L"Kl;~UU͞ҜRs98 4Ny.n%C}訔]%U'IpH~ lBpd0(P^4̖kgE {_n;Lɴs.:-C[ 4i.A,X!ZZ` 0U5b J@M!`b8[ߤY^< sŌFHHHnL!:HnO075n-X){T>cS`2&eDH (e(:ش h8N9sڥ-9%Q,4xtg˿A Bsqʹ%WBlc qvy^2u18,e^9s7K)w%Ãⓓ'!_Ef~|>_oNen?_'9+35-$z˫իRrI)/>(Z0 CXQιi}]:H(UiXmH㔋)ci4M}?o>}:Os6m^qswk0 ~Ǿ)7QZJnz4-:VyN ]6gZ,>sXT7]DGqFZBs.](@]z!Gwwʟ}>bfmΑȝ]09qaI "E)*/5=Vh֬BŢ:;*Q#JYUUP'G$avuqvɧ-_~W߾ɒaV<  ]vm/ibv͋UG 6MvPMh\&Lcpf'Y}!}XMS"}*Dn>/ߌ'$oyɳT f*J$'K[S9;E r T9WПV5fAӒNn]Cq -uBA#bHD#A[P5beҴwU+fFe)]+L/fiGm]l `5M<9Rݷ 5`W0`هO? "O9E닦ifZ= 13H-^g3u7U!ZZdJ pPa?G}rW3;;pwK4iqa/oé DrPɬkq1t ABb9H(#}|>{zhtm68DFCdNSA.(n@mZL3lIىtz}t= ~(ioqP ʆ4=>FW $05; bVw#-V~X"A{*x ]4YCRJS:LN E QBdnPxU.2jf[ӜL>F:^\*,pRˍyL74Mm^]G66 W֯{gގyfsBn5tC٥d('^~_^_ e9zL'7|.^m~?]_ѴzҞw/)Zf'7՛j}I0MvZ) aT^e]7ͅڶwQ𩪈UeӶeǏg?~6/_lg?߽n78fCvMӶm+"[`9O^0L#"@] bmB,mv'/%̨Ys1ݩ],BwT3u=3;]ПpIt~fǏ}#^a>JHYB 9@!BA øZ?~ R?iV\?r\^m甖TDx_]޽~i-4e;唙)ÔRj{lѸ7gfvyynax'OW|oի㣓iJo޼"muSL< CmZf/..NW_4.c4M4DfHi57nӔ&gZi%=|W7}UE.zqi`Oh?яn~&k]hM$E>D攋46doIqdraI1Y.Hxʞ5];afz={rgoC\0Rtw\pH)5MhLyX]Goo7o^@'W)#fPS‡ÇڏsZy[qpgPՔ{zx'G3rB0G6'hm*Z z14B:: w5i!7bl.tȒlM !0&:b#a 鄚xl4M:~SRJE!D Ef3Mjp3M:y!'4]cq h!]_/~_#ǣ|9l۠k]Q\v&B9ޥys%Q To/fDWW~遰σ\nnoӧ?:KsܾhOsf~n??\=>]Izw}7wwnSPǧFUOO~뛗/_.hj5Su|oGw]hڟZrJvyi4:Պ9;{L/ۮ!V5~ݔҶ8>YjaL|xϷ18.ath2le%F$Y.1^<`wXSqphI#% BkhfW$fD U^FB氃͜ȠN%I#@"Dx&Ϟ,~~w#>!oM2)ZeWj𻐐^98BpA?TResyQEwP}%f/oz_uXE_ VKAXF4-bF *TJ.٣X`Pr:imrwԴ' *;x잫P*pf,<89w^ĉA0`jȇ Pfrg@$ `Vwȕ,{I:~Rk"™;A{?~\q݋^y5ɉßO? YՓ'_r!Y|!ҷ^/vچB1s1y_zcSJˋo_."ryyjuyyu[IuU ڽ.&FӰ璑!}\=G._/\6ftfi)Ɲ8M߶U["{R ۲('rzq8=>X"?Mz2AR}h;i!6 k{lG'xt--V[, ]9Yz . . w{WU[uƓ"zshU!~hopx[Nu}'G1􉢹 K5V;$(gGuudR0POBmSqatͬPKRMyN6Li9OsmݼƱ$U'cp~pJr~kJ!DjN5ر +v&0(*qJH:P޵euI8Df1( 6밀"f:,nj# ZT0Wpʘgaq4OiKJiNXb& RU.@5k`CBԽ/뾂0K|T)zxrg]=yqA"ve@!@"I7fZMcø@QQe;L$U+`2?x1C @UՒex rY4{`[n҂pHdJɖdc<)H$N\}TBBBEPb!8^>xA|? 41P,Clhz}mL~OϖQ!yĮmzT>zW[G~v1|{}?wӿi|tn;=}_JyݚFҬov]Dڦ&v;>`yrxs~|tkChqL咩mry۶Umr˗**6V-!K`&3<`f' !,KBbl%d54eݮUYq{z328b>wqW?և]MU5<$T5GMC }9َ樾|}XHW.>.oU[ZoFrf?bѴFbg''W9quWmn*;^DT M]sڟSGGo};=җwvvk6%އUs{w^onnnB)0 %?mBuO.cʉ0!eC̹i 3OQep$Y JgʲRADDe5Q-Ѵ #tN׷7ԛfY?_*>WC%< .f_z~)<DƑd>MmʰCj'gr@̎&T)HcX!;8]b#x=~gy?,}~)`Ii}<Ԉ4JrJ:GHlC/Ͽ;<|<AĽebMݩkS!aPc5RcI%I 83.;TDM b6MlE!i&i2BrԔ4'I),eK1@ }c9uwPx3.l`Jf幰B _eliS8gWW;/P?ꗏ)d dSfj!'M3&e8I-Aj UfFY[0sMc]9GCf*/.K@=N8ENkl?mhEZZ 4)liLL@*ePJ"0W/Vc6Dbc6ɔ Lj1H_deTo.ۧ_Oۦ<*Us\]ygG{{9n>M~/寝?;?Y޷?[_>}|LTo6uݘ0drǏr] u<::zXfU۶ٌ!Pw0X^;x}GGWWתSNYCN/L.*" sU-<8뫫b13Ggm8RJuYU/sD\1GOwwٲkg:C*.Kj/.ڣvw?d{ݦ0gv}!o~^] >}1]hz,sqf~'.hh¬dUeQ-U4e1!6c` .qQIA񄅰.v%WsB& Ơec&2Ben rwf(QL0}M ONVۿm֑S7r}YtQk3EeªD(/Ȋ̱?O_bT&ed4M! (Wo*7z~Nh:%O ( ˥}G$ϵԱH`_.s١f ˥=1WH`EeBdCP2*Ɋ`}4 2J*5(1*,C_m*H˜brYƔN/`RGƤl[ 'TT$1FICGG4 1Ŝs*OLe,6mGǨZBg_s!\01g*:Na ff0 N>8،'>,+Q@'z{}>9jȘTTP5ytf e.or(Sr.2X2S1dc $#ۺu 9Iq1>]CDS|__YySڽ@%0&8^yQMAs19X9PUr}ؔD %"\U5, v= 281mtVuV{J;n|V-^ޮpكr.6:f1n~#F>Y3;^5$p5_6*k;[Grz5}|ٯgM{}989pOS-)$#@9l6y "8ZѳgϞ11ONN~X,yfHl6b?3~lN\39wttt||LϞ}Xιn8컮mnoۍuu~rZ5QڻO]zuy=Y8vlެ0&0ffdx{׍yGN>}_YnyG m]X\2ø QLQLE%qD2lJz8.&31`tۇ LdR*amLMM%\lB؋c|p7"d__~YӣoͧײQ]I58g% Ng3&BaNH&+A41&>☋+&CϒxSAYo֛OWes R N!b96m$F0dTU^,};*RA*4dҘR@١23L&d "2򙽆7p&>o"Fm3X%vټ3`lJ`4aYV8WE1nsYыxyk# lY ȕ + z54cQ6<-Vxpgd6ӬQ<)qYي+;;JP, x xVTyĦEY1ZDH2ͤA JX.:Rg92"P& JԳU*L0)+e1]:0'qhJ#^hc|7PDM<:'G0ټMlih! %K`NfijM zKnOՅafqe!9abfLL%62DĎɒ)8@Ȃ'ؑj2wݽu͌̔AfsNFed:3;$ tTTb& &dAs #ܡ^.CP@RF&ިL.RƘ,QAl7궛|ӿo{Q7k]ђ:IOiݸxw׋m\d'o=~zbTkW/?K9 &4MO򯜷O?M^>~"v^o}'_iTM뷻xZ.OO~Ol83dhPׁr5bQ CzţG(u0UP_|R^.n5s97UUn4-3}K\\}'yJIUWqw0MӎPUIЧwKbMS&[VYT6lᓏn_n|>Yuv~\/14S}41]oǺrff;b r^䗗/0fIwqh++ń<$\:f25Q D4P$,Ht,*ݺi "ИzwNXpC6!L1!c41h\v|P)䋐Cچv<ȃ!JL|8xS- EFPhM(]g & qz9@YTrc1!ٱwyzެ79a3qzfgĖyHM-O?S2ӈ@pd휛!1 P%ҏ3S@ᘕI9B3'toy]W2B[xǾ|%T(%́9FR թh`rY-GI:Bzyiv3L-" 2$L, dhSλ*kv`r(&.+ױ%x%&0`j%杕H(ȣr DP+(6%s`&vL\r{` "c HēBđx*wLS$Yq~7ڏD E4(FƒkSWEYX /B+w˦9tT(<3WY"&"Qr9IΪYU:}oү=Woo5&YK='Ie^26ᓋՍX?Or9hrϫY"iߙ8)H0Gh}_zss4=b"wp΅f^$3b n]UU9|>ϛ!bH9vf]4~ݾzJUV''GmیP < FdPd]7w^gw\n{=kw֟h۫ǫen̒ 7BuM3#HVaѴx{7>sG-syY[q-Mukb&FX%u;d iNm{ &H60yCH2)Ҙ0S<9xRvD jpo0A*6$Zr"o}{o-=?YΫpu{Uzʻi¤K.rwR3sA̎؜꩖; Dfc1eszެ7t4$`c&{  m6͌}yi'Q*GBJo3KvR/l 8iMZ#8ō"AV(Y8Q|I{}SfrdmΏT `Y) !2A |噉MIY-f31h"~Nq׫;zqg/խmzD$NpF(gHpAHJƼy f9" &1hқ)Ȧ#rFLGle 1MYݽQ)/L($nkbF^afCIz]R(xhayXwŜ%f}6Cܪq+W>0 8SjQ%♾h݃ E M+n׀Dj2UQ  Pi\p~A`uA Զ&Տ?i_zhxVY3KɆQb4Q3Cb”XJ0ڡs@LgrBZKrMWlc!*ɲXlR$u%*dݥl:$7ZV]Ss䜼 IDAT]Q $᠅U yXlH։lQ5B"'5څyXV\ü I]n r_gT_yv!{2A4Lb[o;Z.2?yٜ9R}_}4>|/OY]Tv8],CG?z!1$eH3SM)E\Iއ$Z&n14Uݎ=4x:r jJynHeS׾Vv||t,ƻǫ'm]oEG1ZWƦ@2d XV$5Hȸ ,M=iè" -K* }A-b]uPJÆFZeL6Jbu=1s~tR+?~޿ZRWY MভN#s4ueV0a #%$Ǵv]'مuzެ7t9u LƬqm >]&ƄDWbEb^u6NNӓ4߃*MJf!P"2a YȕMY^#IaQ6Y\`x{b'i(4*4IQwDFN9bԜABH2lrmk{ts%ѕ7D`6USQ& XYc+<8; +Hkž#\ע8eDPdd(j(R0inHqwkEj} u]:(1!$0gTYLU$uQiSAkU*$#jИ,NMIrv8 M vbnU>4!3J}ĖCcUiwFJbS#SoL?6./|euzԸ*CTQ ٜ3QJjYBʧA!{dU -0w@L9 Ks'13; v%r^cDHbZSttGhjӗeTwYG.g_Sj(Ō!~F RVlbΨb걤)e\Xbqy>Z#>WIJLrn*)CV1F4bLɋig fu֪a9pIܓ*]ī[onG\h\V}70f cyΛarplUBwBpØ\HQƘl6ygu>;*qX,V!7 ]\\ P0 `^}1F3=;9iNNyy睳qw˗/q9{FkLEmlAJ4-|6nm֟dzZU.n\4rbJcB*\#;nM&@osִ,CMVZy*ͪB@ZĀL 3Q:M0W"G'?Zngؘ8^JB)ϛ<=5R2Vk LJ Tt)TFi 9N>4jqbK7GZ͘i2f'K 7 sIZd\f"2MaRfvn7C› zެ@d<ꀺP@'b386<`L`#bѪ:=WZy,rG0S1"r|-f~FW\N00S;cFj`r-&v"k< *uUDM*܀~ț^םmG DZ) dj +p5R@4Ag=>_~~{H s>]^EܣiRLaeþ `ҎIh>ѼeHmFQH=c&K&PMM%3o2C<#y6 [QQTGRLU ІZx_(*)[*ze36N rc!3ӈ Pczf6#k ) Ԉ+͆,/.7øbVM0e!D`,ufNLN)(n Kj`MLҚR##S*s8eOEJh&*: 2؇3)x3g¦\%-e3eSGRub. A Gp(:wLF&,"v/fw/Ow>?p]}ֻ1,eJ uMS;#Sڏ ɺ<^(ni?ǏOyx/_ޥ7QuԹ줝#:%(Lڶ53c4頻|]W9KـqW/ogfDD$Q4yVHGH]뜫zX4M4]%*b֎C]!Fk6jHIbLUULS͎%5kg&1;b\SVj/6'gCuDn "H cWOݚronKɆj׽N*Klb`:%D՜ \M1qE:uʋv}U f ^y+&c:Ӌb\!Tff&XdZ:,dzZBȂ2LLHό8u~FG #_k3xe;#sP"*"#R*$d-PPXXZ^@;O,mX7? fYWP 3{W9 4 zԼ@ &ܣXENj>6;2*!H*f4%NC"f⧹M>yoRa  H-F%5uiYXՀ)Qe1UD;`50dڍd;h Eoo:V׆r%*)%E0:Xօ7|8Or>Z)v+el z> Zq9'qQ}? u6Ki;J5ds&F$ҼBV.-BlT55cRvp:2ȘIMJ f^,=uۄ8df14)FɹƂ&Oaϩ Iv}BD+Ф HyTuh LF>I Qٍ7MzgS74E5fBA-;P5ldA4I*9 AtUpaCnt%,I-fL afϥ^NB /rp>P"-07ޘ{G+XAِ͒H*X4U;a1"c5o7"I19UgH /dS}j~gW( R$$V(Y6f/C5kc!dw[ΝΟ?Vgt}xvyWnn׏qs~z_6^!Mrw98wɉsw٭׻aYX.]?rTfaZ~v)"+myJ5v_꺞fr)D 7M`qu݈Uu]WbX@U_.)y II>ŽTlicKַwwyx}CSʪW׍2.Xͫvܭ;ifVh2$&ˇ& 9Z&"yyH&=bJGٚ!c2d!1g.scF hRvWs*DS_R2b.qmVy4UI$)Qs.'* jW}3i*88W3 \(DF 3"^4B%F(6Pej0L M~?3Ϳ /+_$__3NJv{? x^?'?˗~/?߬N2<ئOA) cS&r7f yY@Lj':Mu@dBM¡9|Gv@ 0LYK6שִۀr>OEb1WU"`^gۏ~݀>!ꔲSbdˠ|W@PFp1c9{o5kVOxų}SPXHEq٧Cѡ(BB1,G U.SN1kF֜5e頻CEinyTҌbp'vƎ'#D7FE8Sr꺕zf^fVf؛R0bV֯C s&UH9(Zu0IIg)8 #q娵o<:9fw\ICxZzU!R,yn}gs:;;v稪BS]7|4o㦡,c)ε!|yyy|X~~n:^k?r[>mU}*fQ3I'{oe[V~svwΉv'$ d b)E@|AIKlDi ;(DE@,EZ"OF$y޼]tj?>qz5+#qN8^/x{&lX}$!*sS͚,#|1|ssijcy\fCwR)I۴*jI)y0s H]c1yUєYw ϊGWǕv4+2?}v|m,Fm,rHk 6.˙9ƾfC!t-2"C~w{(pxbϑDm[H2k$ ;PU{n*e82[%^/.q8h@@AkLUֱ:+3&f[ d2]f<#"R֤ZATCBZM1x_ Q%U4&% "^%$M)DNpKiSO-δe9u Q&b!@beE%^zg!&JD2(11C4sj w o{};n.+Thn}Ky<X{!ec:2k3S&)J[fE39hTMϝ3"eRv{v<̖yheGgw.,33um<=w&UǎTavkUI(Q I(ԟrRJ0tLKDㆨUSlRvA߰.3R/#:%0Y6lS"DLĆ0[n+A` $A$$TMH-KdHJ' &C - ̲);*=(հju˲<0)TPb]ogGU??}?ߧğ_Ҭ^'pup~S;X⁏K󾞿~~O?|[]\|Gsqݯ}-}5#~?o.Þ?i_tݷ>yOK\)|g5 IDATw=^~W}GMo}= t=?vO.n+J{_w^_M??ػw;/Z*8AIS^1%]:"Leg7(uB^ѩ£<ۜdٙ-wt]h*=pR8h0 }ZHè5S}RNbK;hT\".ޫ\r1"[2$$0U庡B3O9M~4 e8oUXg =k214*CrF. Xa&>?BEb)t4M7؞iSIAc4i'MHΧ'%%#gJ^)b7j:Ky Hco J].j Eۉ]DFmmf:]u[=: 2Pdiޗ%Ư?-` JHQ}!&߅nQQrppeYi\ŀ*& -Hnsdsxml2C JMڋa܍ aUH })"Z(MLM 0l[Zd+}[. s뽧|%(F?J70P @o)A3 3"'DR@-8ˮB>޼靷P\l>}|gh4vR*1%%n9P/:gyTT]4!v+GbC [ ѥ:WM5(s{nȭO\N{\re]f7D jmm-űNS/'.t^˲4@HE|s(u"/x}cΜ=?gui8hzshfrU|v6++ ~ǽاʟVW° ƕ- rhJb!kbL}:"Џ٫2=A/LLL`VTYB-\a`8eÇgD:$lj#Ћľ$b0B_UZ&2Ojy0lR4ܒ\ &z.xe =|h(l c2!LF) qO:33벬(j4*K~=eT'U/yvʷ7nOz/\yŵ9>OꥏY?gnU?yƧ.|#}_Rg}wyv^5˾X_Mzs^ }ѯ䳯 7\zԝ, P-B(a,ITKhE"s:ѣBvݢЇP"h|@CIc=K;{1@*=dHU"wեƪka ,8!81a$-j&&8"V@]¬T8_' ͻA?Jw `,*[J7Hثa!i0`{2*(@=tMn6Yܝ3K y:Y+MCH>ѣ)!+S1jdžJ2V}JAᅂ:Ңy@pRb6RԩH01j躮隦]yt)%ߕ3CwO[N/}|P?#Uy(Ұ?aJ>O < L}GJEW,>kn󼪲2F'Nmtɬ *(ȌuD| #R e>]@Ҵ 6e׻ R. :#*fAx}FN,wƐ:#Y &2mVŇ,gB30$Jc:i8N7wg[.Gl>==vv|]+$L)u Aʍ'+Tc>O"e9 i7MBZ,Mf1V zg)BT4Ϝ:XY]@FըmmL&bgwgwg'xs֭y^bV͢^Yzqɪ,[[[l6neuRUt]S>*rk-M֪֋޴9yjYRe%[;[;;{4ye"9KlX֬omlK.ee _r^!C5+VR.U yJB*DHÃ?txId,"0A2 (9Xad04TXKǁew6' #p> t9DkV%*=A ;.M6ujG{Ӻ5͓7 osqJ[ 3/9F 7Q"MT0;UU9Yz>_ԭNW|rt3M㷾-}X?޿3'^b{k__{l_sEG_<+ pc?دdɭ8~w<0pϽ;㇯y޵*&\u˳z_ ۚ>G^}sgD?u/<.ܩ<>#fɈfƣkh)MJYec@R" "5<\WWoӼ >iHUoܰa '} ?CI5 H!rF*wuuKJո䜑N$dЮRUE"&6d90Puks$N[ټ.ٽtj9/jb.P]KJ)"Eh4JCxuQr@,QHVݴ^u ֫i`[ΣZA&p>J,i̻tϽ@ؘ%]v;DL0?O~G Z~#'}~rmZƧ]w ^p{Яʋ\qȅdžw?a_~-<|}/oٯq}O퇦[y=2XrzF[teeZq<`>w|Ӿi_2yt+.|@N:VLPy|^c0-cѣm.VIEkBU F9~9֨M2:ͧkSH<}m TCYFΆ@j@PVr9 #]qa%IՖ%\(7lZ !BKJQ% RP2(!Q4.Y dpct@$i"cR=}Pdv"]u5 mJnxKPVbQ>j dJѮqә=;xz7ɴA'RH>D BSe2T J@)(4$سkɎ)39q1tZhôŬ&YY$KV IڵbΦ|ͧzv] QUXTBDp:/y">cf6p秦98 :χ!tUվlèU.*ˋƒI lTmO`CjY]JSO TƕY[-W&esa6kl`QeI*^c5yQ1j"H#&hlTbzL  }s[% !y2FyJJLltم~_j{(%a~sƔ֌f;{'UC~룵cy=l9̦NO !ըQL!IS+JQIS kʳ禣YgOZm3{gwKG.\CD8yrڌQ/8kbEyAZc94MӤ`"gABt*fjb23gol#@Sw}BLVԧѯ;{uBA:ҩ @Q4E8Ҫntg>3;qEl Z1lq&Ȭ֚<+UUYXfN|<Ml FP(phkU$ީ񅝥yP馷#G5~FoǛ?lyck㟐:Q^9r>ůw/~G}M|N+k+_Oq_bOEx2b:~C/8'rV'bTDPu@cNQ0Yf YM=\绾'!EH`bY}j/<T2`T ީ!HHF u%.=fla1U2x31#S)D(qRB"0LɌT&^:SM4Q bjd!l0&QʢC=C=ZFBi6X.ԯ°KXaol $$H52K>Z'[N.n;N,"zʹ*p aRh+-#.B-ʼ$691lQ$̈́rKD %^gtϚY]'rhzK|q+ xC%b 9s Tя de9gDC=ZSYS_T: ꊞI!0}6F?~ ^e+L6e` D GMQ($I)ѠFkκl!'zw,h^D"cƢ bb#IR צ+Ϟ۴OVz[W~A'>mB4?悋mnnH¹򓟶ƴA]fVJӴ!F%i&nfrxf}@]yֶm,D$3cLqooH{o,d21nmmt:][[˲lwwkU9{:FƘt:~1<ϺΧOFDƘ;Id5f>h=S3@zE4$0+_OI'`"XMQTeǝ +I Qjmǻ[NԟuvL7MSA#2ټ8ʲ҅lFF1S UQ!vT ͍3q{Po}cH/{o~ϳhebuoL>_DduLݢrdtգ~4y7msseS1='^?ş'+1Unh!O6֬ ᝉ1YпTy݃U"&IRdM@ޢ*Tsa!*Uf@Ѯ,Pl($]Z- T)=Ot6 AL9D0Jz J=L]b/8jIt8g8gazeÊq 5(+8`-Ykұ36]XtllJi-ij\>(FpCϑ ^C}:g 0HYm?~>T<%?/g-s[D><( 03DQ@H"1iPDl"lE+'9+ I B^L铉 6.tf|,I$cxIhė7A@>L3ôK hÃv NAV̠AIR QK8nL>7&7ʲ`] v1mEq3T!&JR*]h=9+# T(FStac V+2lsXÙ3 !aMLDlyŲh83V!U(jJU&"5,8,lsY222c!plIUH}8.zX4iV&ClŘQԧXr,Ef=vB[[o \v'yN.N5;Celڵh)I6,흛h@14uc:u|tk.  t1o >t_~%g~߻~r݅㕉sg{ٳ#m'#91\WO>N= //gv6ßj?{|{<'_0/?=}1'~.7@Sys$Y`"EHP ^AAziy)řt&aae8+R2).(& ˙]=sEKLD\JqJLbQ5D ]K .:_i/\?LYSPdp=aHrPW"iފT9&@Sϳ`SBU-hXsHV ޶][idJw~ d$-ɤ:IC A$#PPoy%ҩoi'Mgn oB #Ta0̦Git"LjYI0tC4D=*$mJVDYR* E mvo1_Ե>H"CC K~<-~?K{ye9fMa@e((]2TB"+RyEG֓i Z%EE2S) 31I&LbV]ըH^GJ-EX8tFhEa1% m!@sĦ$0ș2CU$C#aakZ(t]R$"uT"+G,xlҔ%d;@}xM1SfE!>;5c fqs6dI 8"|ZWcG6ugۣ[RMx6uj+| !6W.[oD]䅉a+ؘn{w.ʓXcOOG+pގm+Ov۞**_[]b]ufGIE;ROŘ<jVcRu!xCJj,tec뺪{p_Vםsb-4Ύ=zȑS2_4"z|>?qh40۶NeYرcmm!z4MFLy{bѨd1_67d&*CEtopYq ע*67m''߾ 2Q+sSTN8II$jӧ.Z7m9{#8z7iF Q H HIS$( / 'ƀ30H+d(%I" HՃ]ڬKo/at;9 Uý5J92`GJISN)#3;3C;V'݆80s;6ˠf+ܥTDsl5HE{#$"ܲw~mu9{oZAr<~{^G rc^#?Ww_xֻ־o7ڍo~{&{= ^3/x_+߶A{}Oޫ:w_󋏾܀}w~~>~~v|'a{~˞ckF/y޵/|aĞ?yl?;W=;oR~tP? /gʍGv۟o} ewj;Yj`|GSqFR4b ϥ [a# EpY %r]:~x{vh VQ n"eh0r\3 e;J]j<_ c,ÔL)H|Pp$$CqVjhP2yv{s;$Y;D7134IJ(]q:&*RJ25 h`/-g4Rv!i[HUaP,ySfgLj*T㮬|V )j*(M} D5J !bHɫt|j[4bfż뺘"`zZ<4%C7+?' jX +>"^D%FJDƄ Hj&RI %-SMS; !䣏EC}]&5!Ͼ3ݐU`ˮ0H  TX"kMÀhnQ(AٝM]ըFO .G>z[KۂkkűcNO|JITBtoo>KJ16s!(9/X]]Q.Fq?~b4*:tTY"FUCӧ϶mJAb{{(ޛ汖Y߳zoәkm&`XA !"2( " )Q  Bc J_?HH$A(t{Us {wX+TDصURUǏilX3ry}}Ӷm6EGՂ80@3>>:aji;oKͤZ^Qk?h'mv۝*l6_2B)[6Tν-V^n_sficӬ:A"YMBbF62c&#-ÈrNeKz+B1s’j(]C;#S#*EW%%}H\ b}گn{BnJ%TJF޲KeIxz.ݷNԳz[ώVvXӳo?_V'''ʹ"i#srNȚ? TAhڪkT98 V _/~έomgÿ?_o5?_7?o?Ҽ~K_⫾⿪~o;w?g}~￧ou۷o?{{x?=p??e}4?;dX+s?Go[IQ?S|w{gG?7/q?i jo[rFtѸHb!5c ,X8Fp5e/F>1f}j13申i*D9T±1 Zq8 ޣ[Usu: j+n_a"RD*r-F0!T9L_fqL̤| &SyfkGϭ03dC6o%ɐ@ld,y޺7{QGt;. f NrTAIM=U {z!Y6%v`ʖ-`VdRBɱLj1gpFiV*!f6l)'+M90}߇!98}>c%68۶;S\QĎT69~HP+zU*gu G3$PÄ(T%)c$+RtK9bCF#sbDFĵsЏq0긍6*I6#+ɕFYp\]јx(4J5ö2@hefνog_/NjEhޠN딷ÎD&WC1iE^^,o)ch~;o/{^]owj`O>y*v}Z.2$w^߬nnmWN'1vcj&1e5@f0 ,{OsM\, 0 UUYuk\dҖ$Ӕt꺾{n̼2s۶GGG\Uflιd"lx1ӓZq}]4ơOL6MS;E{w:O+=(v]?N9GUtZUq;Wa&r?ig$^դV!"P)U"#!23}:Fe)BD@2 EsQHD)JLjHـ$ Q名@;"0@9XrEkK`<@%6e;犢1ko"mVz~nnjI΃GߙY ?ޝ} _?}|>=|[w۶n'xq"N(TUcCuOܶm;4K)!~[zo HwoI+ݽy5QǏ#혪Vջ IT~_d(Y-}ſsN6BӰC"0l|Ku?\̰nDܐm?y7>O^`Q2ƪV ^cTFCXT3ۧ;`ɔf #Cӹij[s$Մ*F9ǔ  d;4t4eh4?|18@}Q˫ #G4{O]Z")}wn1=}z~./v>;>:'zQUU\0"ngn4MDrB^DhbLׇDc9Vb1ƓU=??{?LNOOӉn۾'nۅڦ9>:/f޻6l>]׻n>]l771mgD1ugs˜b(pW{}g> xwqbN1HlL.f`ł|[?|wݫW>y8Wx%c FJG%ë!)-%2JYq,]!J\pY$ @1 L\K,PZ`@ܷ߂;'S^ {f25\7k<tmѝGU{x~|~qr^Lg'vBfڶ3_lYo7fX}Lyd]IཟgMS_xo8?_f3=3>䓃1{NoM)QTJXd@M޵4ebD A!v/7+"}nA::S2Z'9>> 9q "2H . ({*vP C߅05"lya7b8PLR60U,@T8`6Ν;9 :ăI,'U5f+&d]2(OXҳ }/"2@\NJ:kʚ=N] fDe (Dsv޴lҴkr( ,fs-#9_?^X獶jDPj@$F$u@1_AAyi ]ߡpp{Ziqr!h޹i욪VS/v).-i8F{!X̎nY6l6U{1n3:箮eJΉ糶,k^oVH !\]_狡+!\^lYa?6m=']>$ĽËgˮM0us`q|hB(O?z^pN6?W/_ˏg~{5V_Z|#;j[lB=!.{9 ut6]y g.S5{rx^m^ (:h_a& Rc( T JHcE WNA bhfEbdՔ(jSw>÷֞˫\]mǡ~Zwtrv`\_^L&n٬6΋ Y|12(,ng \J;gGGL\~O..⍊M7f`)DCD0 BYāo~V%jy)b>rf#!a6G?b0Bdy /m~qQxo[ IDATdEY&uEUE{dSkH \Xbp^Gk+!,Fy -ucIFd\㫛p۝ .\t!*8Gѡ[,hvQvf&t(my2LJȚ(cȫ^nvy;ژJD+ 5Nl(Q%U IIJWbpF\,^ `mݒ(dÐZe?tYqh-o&>K%5#G[PhO 5'縪 .k+oVY7(”Rf;&PI24vɽ{u#ޓ4B!lw! 9@""B&Q]m5ivWŴZKh%*c4J*](v$Je0ez6đAd)=f T2aLEy`uXqy~"Y+XU'p ˦"j j0W8GJ֢r6m3s5oFWW7}iyW7R62f]gH]w}NI y<ׇ/EL֏6&>df)Ŝs9`qyEx}}MD/_,/_cUa2LӇ޿Z-7f:3Uc^j'$uۜ7MI纩ctڄA^-w,qV_^_nK_|tvtzS?;S0&Ǩ={JFٴA]Vf1gy:鄵kU$h!jRS%ɠ"Ʀ{]/ K 6[$F5+@.גef%8cL}%uUMk*YD3nJn 3)`dee?gaQ3Z λ&eBL9j'?dg$?~:)|}pAjslzyyuuw-HIS۶PSU䜽wё~={ǟbumG{dzS>?!Y&LdB o;#CJ4&sNP31;sX V`Q%Iv]f^fK7˰ZauqtRG4QTNJ*T eOD`b#+jg"˨ \C5p;$*MAa-fF8r2 :z^ŋaH߆~RMlmu>8|v{O.n'r{UjӇJ̲`98Gh|Z.;v0_1u"o2]/~6_ܽxիkU Uu|yis<2ë뫛8ƶ1ƱW̰6MsqqJ8fZd9rEFNfR`A0tjjf!*DL@ݺv_w~ѷD:N0̪H)V}c,ۧn7LB8nSUd2=lG_춫6gﱘ7N7MCu1;VP.xf E"1Ɍv\*FVd!C 1jL3>skGlDFALœ+OHjB!f DeȔ1y*m^]SW?'nstݻszr#XL-clĠзM#U}tt2 attrX$irNvO>UNj`1]6MSUoX|oM_ e.D xűA3@H`$ 0 ;<[%T \U8ch:>M_-|Gms}"Ȝ",Ӟ `V:8\>ݧ44ȓSjH ߨ`KTh )*!e)Dc.m y:Z-Dhn!s`rr8{ڜN ijb_P-H%e-TURL -f ֻu1"vm=[1J:vI=kYUMTLl9g5[=o%w"F1Y38ОBCn;J{|~ KJeͤJ{wN= fKH5S %xTw6?+/yvL T$1i^8x!1 (z1ϒc0@UaL KKr0d"XJ#@qebPSQU^$EH,'[YdABY2'11c@,gu^mij:ò%#Na]bed9B X[N3GH};ZM:e礽~z{QP%{j8:]\19StCѽ˫0|=,WY1OoG_ܬI| wO}[8z>+m6ULŹ''Ǜf fzCESXBuv"=0'?|>vY E9XJWMy@r|EU{_t&XDlW]Q͇;@<<:-{wNO]B>]i1QyB)%(&{e<ӔkW[$_yؤAݒL\ %S,TXdO$Lf%̽HPOie0。L 1+YHS1e0I i"A## 3(R!X?WWun^tPL2?yy~MƐs6[1wtRɱ SmA磣yi"5u;NaUU̴O|~zRu-gggggd:qU H~atPoMy6&rbjH[4Њ2)dT*V&veR<*A H_*T V熅v"' VKw[ */M6?(4q\Ds\=@dR8AaJ+ĭgD#HZBE1 m[X  #`].`Hr,ВPjF|͎NjzqIvU 6|N7XeESR#(]LAPxʛbDݮT=$/TdFصR}hE[7 y`қ2R11a!cŀܳ=Q[wn)O^d)TNfќ4'"sR,Ln[kb@jV |%'o;{AzW7ae:lb`6 >` )*(fNRĖd`SW)+eq\Uڣ"9' 9p Y fv)(2sY`q1S)2|嫺۶E(z4*E(kиl-&xV8DV2$Yl__uA=]mطd9djTU-&W2v}ރ}mʉw)gw'SXL"5p~s3Y瓦i˥Mǟ=!3{uN3uX޻NC5via9BJTj&>U5 !*c3999yVU4MrNR6Q5{rNE(saX\P#Go?8;= {fIj9.Y=93, u_GGr !e񄦮5.9SNo;aNo<[6^4ǺJn)s툡y=MhlscԷ> 3^FT@LL&F1 dEpj@*eS%jOgVѐE 5)0aUZYIMVjŔ)$K L7sf_M䪛ZAȴpv||||:99'}8/46I[ۤi@ɼkv٬../˫뛛zu#ml>u3'\z7ԛzSojO"$h^m VIsEm'0yPՎc*fXP9rYR┤JUM49iÈ,wT<4R2W $Utu AF@&pjA"8Ē# c,5яW ńhH df%u(3F>bwU5U)%'YJ-a7b )Yy e 6ia#sk9 0-SdMb(\^4vQ75~ZK[QȓCy/ |4%sS0c~Ԙ([ٰnzė޾ UbfbKTM]9GM R,#JeydC)@Z?6hY)#[JB~tї)o%^Qm6OؼUsq8$ͰLTzkU[)cU+ %cLbPteF&ZJbN9rlYhUAU[l$F"FBD"UhfMHaXƘR5tIF 8P!;˵l!QHQSѬRaG&òer|v)ʼn&;~Nm;d}Vɬi?zdw߾wj~ծKw[oWtҼݪ~f٩ZJb^ Rl6D$a ϟ=c֪r!٬톔`1ga*T[5Z.7s16Ч,T@Ήsv;\__#0 w4Hݮf1Ʈ /P}*?m۶m 2EsN!! ISכի+X2 c.}ˏvaysC/.^<~9M[/0{f|bNgެ;va>춽k&Ttf4$B}ݔ&rJ3 H弇]1S2 ) dE6db}w^ne)@PpR${Fle@JLnf!k̖J. IhCMYzv!fv[\W݅mv\={xn'Sn}l@?Y;뇰vv7L֓ڷtmT;9WMvr7scNv͓'x~َ}|1==9+y,bC}ozSoM,#Lbޅ9vIؘXq76eILoV jQ%DTĔ8).NEӴTc? C=QHieH*"KnLě*g-+ P@}H)I\Y3;lgGijpSY%Z̦Dv´DZbmcK}DU}|$TPڢΊ~~o?SN9ml54H\F{ZpjJsitP9YΖÑ uڤ%Pl5x2qR1Wj.y &9Z?~gƼo,gpxDЯ޷nT:A˿ A*#6*3Jrޫ^gÊ v6oJ9#3JI"e0P,Es63cJKd-eH1c+ϫٝݗ//???;w!M]; ]njɤ|uXLVs"XS}κZm.lf;nB`iæiRM7(⫪|JR׵\BHo:7}ka9% 5oIgC0OpG$B5dybVedLᅜ#爉HaE<5H\I(ِ R-׭AUΒ=dLPXˠN`po5 )ƈt ;Y6\"E ʌDHhdFlƬfP%Q."|r襁98::8>\LmV"ݐGF$Kd\y2])J@wnڤyf\=e3@ b)kp:?a̽V\{2#g.1}a10Ʊ. ]fl%Bc$nU|RY_׏dIw+=dFfjޝAp@> n ;;-Dfpqs`ף{Dn!HQ~}vXƋO }mtnTKE aU계BZZYZ}YLMXFfc_~˟F6&ѐz̔KQ@GD-RldM 8"'YK}L}MTT$%(lFhL= *eA-`jEŏDL@ PDT$zR " -U3b`L=B2Ee1Q `1 Q AA u7࿼nmhz>>͚6?7CNy:͇Tr}^]mo>~x@nݙQwt<|?Lg_| =?Q0~xsz IDATݥ qjx}}5r< 9[ߵrqqGf6Eu,LD1q|*f1DOdm7qvi~Ӈfc;䣊a۴8ڶe{B8A0!)mc0yRJIŒS5y}}h[Bۧ;잷7WW<ۇ<777}tO=뿩 Gq6!8dV P2 Hc 0F<e`j"..9g}1(V^]`C4=x\@jHB P !!VF]-1+JPSƬhHJ\&[lLȎC momz`N9~RzgBPfH/lX&DVDfjV_]>%!T>A9E!p7E߮bskkH͐RDr9qqR*$Ѐ$\chxh3l`JbVeZ),gB dBUZk=2dAjTt H"&E 5*eoۿ;g?{ﲒYQJ@,$*P}XU׊ƆEPH萙:MDQ,ZvT*)𢩈*)W B߬\ *ߒh9YK3HE%{碃hD*ǿ'_`F}80*a;{7>٘1e*4%ö-$%:o;C6ޞ=~7dP0ø;j.xvy%"b{|i<jJJ,?LmxY(蜛HCls38Uv߽qе36YJ _3ABV@k G$ b Q;vaw<>ygڕ#Rs΅]+ gWA"y}~zz>=߽1Os6iiyS=`*E,ϩ4Zn])Gq}\ *Cgxp6ֽeufWΠLa`/{jdd$+h1dPPU(0) ze[p2pFòfz$XP ki쉱V-YXQ`VƢ`jE(%Yةҁ<83"B8DشM׵u{[b:It’Ƭ1jy@FbX JulT&:J(n}6L(0@t%-| Q(]CMM׬nug]i}|9p/tq͐k版h2VӢ_9ƦM6fխ@e,Z*ZL@RաB)Hr6@S ^]HC@$#FrTT̲Ӝ<穤))$ rr@(Zdؐ#1:4b$fD"dDg^mTY,/"qU)239IȬJt <)e6"0B$]dVۅ+pO j&tzT Ȓ сS:P'g 8 0ij=1Wg2=SR5}@ؼb)R>8a"rPݿsjcp<v4hpuW {8%thr]S4ed3;=R] h EleC >E!"P)@MW8>bh)[s P=8BW[=jJ.BɎ:00UDSTfA5^1 \%r)oZDd |A#TEL&RrєaJ0$(THD(&$`Q#'' "3cv̞y 1c&6]@I23+JBx_P<!.DkU1}q9`E0=YB* ]uӬzݬv4& 7=(ƋG@OUPfR"EDT6ibDVHձwڀ/|3UZ,cf }wM׶q.{FTDsyJ)\h iRAQDUlEo/~ސ|Ć cӚ2& @%!(I1V\Iq>0pfF@@L;Gj| E O^vNj'Ze&!c=sXd Z-/ !Ul^ }v]4c@ ǠY|?<3`EL]M?vs4>}|qf J[$ח!})퇔dbv*RX,9 a&9%lڦi8UUU9 QUdI<1q u"Ni~d 9eH{3)9'ccj`L%DCH(s#s=cYw>>P8yjoMKqE8\\_ա- V-G!^9UOso3|m9@訦dXnE 3zUcPBJKG"3#fZX(K Y5w;gȨ՚M&P|0|to?_U7P 6ط %єie- QK*Eäv)XUx(J55&3MEQGcp&cۄw!RR Vfٵ hB9i!f.ŅϱD?YA UpQBhSۆfvvӯf.6pVaѶ2̫h IuUNY1Am%5ø"=(؈MŰ\pcmU1V}ӆMФYRJ84MIDVQuh)&PIKA2 R( lTe8oZr]4*ʌ5E`` Ljc8 2$yL>mI؁gb Ƅ䖝K*ʧS6E9usr&R`gkbӣ:% 4ojy̕h y;̖/@#0#d"Wk  91ñX4YΚ j1V(jEU@"ΚƒǫW  9U%tMӨ̪6͹~1Ţ?|Ôǟo}=m 7}p7~h?{ n׫2'M86}Ͽ8Kݻ{]z3#=RJS*]hPc9Ni~~~jc|!DضDD1Z19"j*Rynǔ={=Y7i2ag}֫o/8-Wz{Y]ܵM8MllJaK*F^M_]lĠX*.AHjŖNKdk+1#2x4FtdSbTʥ3)zLVj LP$.9AVdE&tTEh1tybӟ_Ob(ry4QVa=Uٺm_v)mժ`DHmU M5DH LĂo6 18OO[.IDL]hne;}"!zHR, >"KɕTH{Uӌ]sp <%XI,^-'7,ʽC; j1L`]|vY^J$#Ws*y^x}Ŧ 4=QnЍt(Wj@DfɀHI1;bv`I4%JsgG}ů~}ݬ\՚ sdf!Ъ_uj?=ۧpxzN AIpwpfBXժ%˜pL9KV<rj-@ /J)kGq}\7OKk,CD"„B]\96׀o/gӂ3T(X2+@PgFXiHl< +Ἔ PU134Zwc d(I̳zdp5 c6$Q8f Nb'84[vmk&61D;9v9=">4( .&Phpi& J|Oa1 LADCh]jj}imsv"ظ8+N&Ͷ'SSRL?E  & C1:L\0k^@m:ߝnwydDӒsy88S*E 8ɂ$[@V:}T!Q ;ë3x*|r~:~?y㮯UCPb$%h ,EP05US FȃslEiyDТZUZJQ. @=sp=rkӢf,*8-@SW2-@1 cB"D3EL T ǖx@!(!=vm}( )Y!3A<*Ⱦ?}l4]^@GS "&8.}=wDF޽?Ÿ|חor.f1U]x~_0Y/.󐟟w7ww*l#L6 #yjR&-r88<Gf:;ߤXJju駯^~߫*"HD}_^^w p8UcPa@CL̘2!X޹ڨi"ntLQ./}t0w}@D5!C94S5<ds0<_lCȌPTĨUD/FS\,'0ʨvH%@6r H@:+!NR&,Wk`hr2 (pqWPyvwc:>yu>E_wM6tmGUy'4wۧab!H*2HǶS?n"y̢RL񔐴 bQA}\cSS`Z)uSb mι[AER`\ :)N{D `TAZ2H ,P%Q~B&,V9 PȬ)s9(eM  ʨsN |[{w `g@QBQ&Vjw]״1gO'/ZC0UM*IK&- j$˂%Z& B&Ria)CAʇ#e XH\Բ-~ӯfם mqҡzN;)׻*S z^ln>}1.)SŅ2 j@?P^4x:Zoxs3߮(vER2Iiqqqʩ"R̴ϱƪj[iM1!b9&$?.H IDATW^]u櫳vR`(Uf!ghd QQ.$ eC4XTp!‚44â/JΈɑ"ypA+tƱzO엯)44WDbCaO_iMj {JOY;q+P(BPos h[\߸UY~/>٬7pOs1I8Q.~H ejؽ<͆(u{7펚&']to߾ 2OsE} t޽{zAoS1"l;MJ9aFqlk/qДzryq wwƆط])f`{=@e.kZb&+"t UWu+Le^\ZOGNJJxu}]hg7ϳ;BJۜxO9 ]>JeN"A2aiEdSD)X{,({y2ZeTPqWUTBf !brmU=cpU4ʠ栀fdRډpvj9 PPͲJ2- JBhPi>>;xGsmՠ >b6m]ߴ]״M O)|bzQ.b8gהpL|-ZTZQ-T; @ fc}qVmKMi M)"Es9MM7]߶.;#73DY*˵E?-d)ثy00,Ŧ)cI%J^W}T4i%  2,EUY0Ndf\M6 Zdo:H<4 tHQS4YK>Ƈm`E 1s`D@$$G $)bϓ?}]<=_=ߜ/?74Vt J9)9 ȄF &O+Au`#=9]h{ {`Ll$3T)Ԑzuhi1<bZK eU Ls>LiwaW )#fbA3Jm'q=4AA8olf́_=0ͼIa:N *n7zߪC$o`,i;]uд}=֫, !nֶ^n7\8lј9fac*rND0݊Jyڶ%rӽ?..6]W!x3 Œ~KtIDJɻ狋m~?#vmt;34'Ff*\yhiv[~7ݛp :FDy?ͫ닯x7\D$yh W]pշ]Ϳ_yfve6D<Pd1SP֟_"|-L/Uea"!VOOhz3b dcɻ4SI晤#n-/B{(HYͤbL([؜ۋ/o6߫m`Q _n'l"Jq}\_VPRuT#<].yC\;{N0ÂGM bF˦3@ZD [h o; JQ@P(du#j2Z,V2bHqٶ[|v#Cv@D%B TA{M۵udz}5iwDa|GK,G j2g̃)7&  2sᒩdRJo &((?j4vS.E%KN%'Q3eC&6&>r 8`\J2b&Y,"dij CJ%B>AK)"Z)|MBpggpyλ~&61F"*Ys\< LlպkZ!0 RvmΛy{O)G>]tw-,H]poFޣMir6^7pat]䢗ͦC)y1gȌXk@N J}рƱ,5"h#l־m[&oD+Yxy9@LA":sk(1#E3[l{2Su|t}\>xQں ETET='$8 !"ډ,NgGW H` `FH$ 3Qa A-@Q@I c) #\$t*V r4[Kgg}zЧ 3eѹ(aQd#18 w<{bh.t}l;vM FQ`ڗ(2"sq]ʸ!8nap؈@ RRiyTiUlB.w)8dShZRqY.& \17C+A냱zk_QݳH%Ua 9pvnwc)򒄩`A3:`bTjcs\bH}S.%O_sqcr9󶸃oa?c.TIJ1T%Ub*thA " 10Vj1#U=MpTQ;@4lfF4|WE_ݸ3[awǴ΢&~*^Cu>wb3Wޢ_@4}* l/{H(kӂz\E^J'BLVX-I d3H9S&mV{15^a~-I#lw_rznN=3E IE$QАp=֞͛w=[,nfz87)zgV!+7"N>23V:2bRPrٜn[cv4tNX8>l"Gέ:jԵa8lR6mN\/k~u{{o*g_r9TZM']ۛ^U3_/^$q￷]^^OO77닍w!N]3ls9sn2mbrN9t:-q3:>>^,*ݶu]΅V 0 U 9cI l_N:ơ S]l8⺮|P'mۉ:9=nʇ:TrMjFa`bjo,W뫘Q}CQU'uDU3 xRչkWKehL&JADB*lZZmƪ EA bXO=aT1NL@f̈́PqVݰ֜xGJ#TKAU>`"r(S]H)WjsMY{Y5Gムm:+4E+ &5Om>庩ȕRܬf@*4>HDw}+xxMĪ"Nn[mFd*Ƞ"j "87yr΍ݒA.'.JƠ?63M`f63H *-,vb\lw'0 @01@v9qJ'B$JIH,AQ㠃1VܵN1 dz2G8ԁc諸n&W*VKZNÌS1#V]]GAFooxN*YM!m\Kj6kZHա F=ja7 ,4k%%Q L 3!<*g2mFjNsC1ar0 kc뺒sUr}`B7%L^GD;QA]`Ӊ䈞W<ޟ۬mFBm7mŔLT0ĩEh kfardD`Y4 jTLJqI=8ͥlok&aHqx0cvKɤi&4CwɩHl; ŝeqPMvN)fP7CꚖ IG!_d n/oÀ^jݬXjfynۺNOrkwMSj|:׫rf `GGfݪZ41r3٩sý,iꓓ|rwwwlp|] ~N'}^NO!|s= r~zJjo\wYpʹ^Ic66fZM[ ,j分d֯{̺&opWGTC9\9gd2b ;9FxFYi b%i?a߂LMT:"9dͲ2!zyKQ_1r@UuT ̴JPEDaV})-Raz;G>>8dW19#P0[ތS7;(jN90XC/qYĕ>:M>% H|Pn|PֻnWPE&ZZy@8}+vħZ"(Bw0CL#YH{1mᔚP6\6QG $Sz&Fu-o;632(  (XbĢH#niu}G6&j07a2o=\TϾ~e]AA Rww=|I3݅&K0B*fblx2,P '2UxlGݯ53U\{EjLl6i9Hc5avNSH . 1sYlucn[qEq 5Kv*3HļDȌƼW  8ɪ0˪ \ѭ]8!HJeL "" `H6wty,0|"&IM3Άr6(D0#pztzw8PM`*+x8{#*F/5 T\4vfHWn51Bin3]lh62[ xUUUUEș U*ΑoqhpF3НɁ ܄IMM<$jvqdF#<\joТe1o jD BE !(uYT%9MNiAUU{/~rtxXٰ0\9ʚUa\ZIB03#V<>j"% (S]J &s.8WU;Z`x_ݬ F$drb\()UM{)@i,Y)ѐa\`,=157? l}ݴ&],};4,'oVtVr5TsRu1 g}<w]%OŎNR+v/bO^_^-/߬NٙqssuwǪL*0>vNN *`^/WQy놪!f|ud3IDlVU\. v~~|b1]d۶p,1 )b1{m[@%?x2/__5դe'O~=}4Ï>P߭\W_fi NO3bl9%'?8ϟΚ 5`ƃhoQEna1BDZ~n!'vM+U;b̵"7п_# F鐑!ai)cS5Hh!wr@˧˕^[)12b!e|DβQ^5x2?}2;=ojPrnd&5YSJ]899SΖ$CgCoydZ񴎭$[/460[zWA[ֻ]D$*Xb9 IDATS`,GɹUEc1$RAL~nf;kWM]ւl br7KmWTy 8d.v21È@Hs!9%g f_5f4 >9.fQ:҈/-Ԉ`$j)aH}'s mJ d&$(T{ǵsaZYWuqmEKB*vɦHvƬBឳzPAE16F*N\KzE3ic?l}*9n5Whn4Asii54!֜(Y2Zrwg"j^ P.G5S/s#.0182s *4;/WS`UL/*:=k\3mׯ>t}'5s;{o:{s혘 Q$Gy W|{l/Lf1B/U1`<:(|'h۶߶]M4[1d'f0Hbj>;~t_cB?z;oۻu$qNI6;Hy)iWcw{pン=$zEq1JDƻ zޭ?Uj|oQ 4ټ3Rժ9NyX 'KLjVaN7~} h(;W"(Yԭ.^gφ+PTU<8X<%EG>ndꎎ~=!K͡@g/'Q^ Q[,+?Y4vmھ1g(wD#[7`SJR@9Bp. 2HTsY$fք~A|֤lf=N0<>'ZLqu9@N%d] .n7^篟o_YA̦\|!%L\MNaz*IT%a`JXK PVc1Nۤj76qӧȚ}4Csȹ:蛣m}];"H#<m`dՌyy\Tj1s.y| ?9L؄أ;;FҁrP"mug71luhCV˦Jr## L`a,.~wmPMLCư]tj*޶q]O{O?껗ѣ>=n<&In./77 drjP対mg߽^t"RNK)M&ӳ3YVY~몢j'ًL0\WUyK8vGG _\.ÔfP'|tw^J?g7w_~qv:9綛b1fP?<LJm>y7o/>ɟ04i^|~nwϾ3Eͺs=B!Ei7CUs)EK}XORIdUvS&kps[ "I:k_"9p杘I֔DLNC9߫)Q.7IR)4~!/;!z qPs+ގi1?yTO*829+7B]V˸\}a>w+BE9 A4)h̒sQV|z~vruY?xo_^w, 4WiRv7UBuwޜMf[yL'I':<;<^-cCャg?no.oNO/o^_޼x|P՗_~ ]'ϟcfNjXSҔ7_ǔ!a>omSsS_^^N ;!*;>3"wk&z:'貮*fvΪ 2~25}{_}jnݭǿ;?[v'8ѣͦ|}-YCU/^_ aUNoz!iD,3fI}vy\Ɉ$jT׎/eIQC$JF R0G g)dHUif@u)Y2 pyd"[0r#NrLqnSKV w.v5fU5I}3s \YÁCvnoY7Og^iS41 4s>Fe @wZe/ c?Ad UPֻn.JPq`&+( y3z[@=O'M7?P5w)kקm^qq)_|)70e aU3b!+gFJ賶m>r2-##6}P2;vatB seDZ'^lWXPtZgŴn]بڤ`$Hm pN<"Q) Q؉RV"Ð>(yP+ʢT Ȏ@*g&eߪHb̲7= " gwZ1%&T `Ck *E% *T Rc+~D#FVڨdqF.l &lMT|z>9wgǺfΡ!?kPk"(,Yn%`땻՗/W_'8L"T͠}J]UO9D,GEbND:~ȥbcʑw Ef511BBrȂ< $0!Q_cD@T%Hژ;x;lrz㨪}e*])hǏ.6L%ݮNs^.qZlK6U|_ruȺV?|ɫg0T77HV*r>i]|ՓI78月s֙h5}7]Pd\^]i>IX8'@|^Ռe9CHT%<=.D`HF0#P Cd" !iΪ,{CP˭恜c)ȇdhVL  s3}F %0Q4v!hAXlC(0P=;<::wU |wד];M>}񪷤ٶo9>=;瘇lII4ֳ`盛nQNSCӜId $!1؏y1̹@`2Sɘ]JUdB&Fl9Y #tdH u@ (9U``K".:Z)R,R's'P\!삕vBL4"&c6!b򹴬 G"waNڭM&fhq%11:uLf"PxʹwDC]n[b.;(y֛A(]}KXv-+WjQF3fnujyCU'Wۯ+8eL5-'Vr ggF9GbKrj_W7X`B&-onuudQ$m;ۦVW u1YTl>ͦͤ  VRG=b0 myW G&"9Ɯ鎥kN[rHR3UɮkǮ\\mb&xR&]JlQ\, Ps"AɸT=v4&f?ZʧQW U͹J0j9,ÐS%%}1 C[;FȔ-È ʹuȲǕ&|‹R!J~Vɢh0& 3f-APNj2TkP9ǁHGt^崂`G %i" "P!3 %̒)&QII5_2wF*,B8N_qDV7˘ `@TSB -ߋQsr Jc}/xs7K眳sBr5;0qyq*pcwt;Vw~{p߮Mg:Kӽny{ ~$ۛvܬW{i L3w=YO\3^jS&F$% IDATιwW/V'~8G>}t_ݝʙOv}mfḟzXGpxU3=ަUMjiHyMr&0q%x{ˎ, 6>H2$s) -h%@jC^(Td ӛ`f->'$Unp`8ڱ~jLsvFsoY6ݝ9;:&iMLkHX"DA@P T-jY* ZbdDuD5(HY]LT HQLńF˝$!*5 36eTM$ \j"YۥMu~S%}}36<#nFJ13Aw `Z^PS)#B}3+j,P  @ ?!ɼܿ/}zXHH:icGԴzG%랡R 8:- `Еl(;wcS`N^033 xr`Ȭ}.C`C1Ca'rmWGb{%eƮ;y6vqbՃ|)rk* Jum f8ViuV䔋O4C'TU;Cj!*"Թe2Wׄp:!9"bB&tŎTVA`$$u>g8LUVEC_ff*E$g")*RNc)KI9CS5\UW9[M[Bb~D CPDPc"^$ JHZ@*ojT $͠h=Nzkk~Z:O !+8_7?of !#N" 50@aӉ%VԤ{rt֝d(5U63D(5;\Vmf ZԦئ X1R  q ݑEjA8999cSrh2)dnxb>?k?X۪cZDr֜rN&\ޏ'T`f?uUx:9αFOVYTat/, 'cZJbQ 4(US1~) b"Vv3riDZ rV63ܞP? eT)B U(` d4͂J`vݸ&Ȉtu-UDDfW` 2LT&%MǮbHutf^||?OepVTbQT&-IKoajD4c@`F]CM<|hNF: LXh$bB3DF&$,(]Q0+umJ6g]\tggGgts{zkB( E!BR[Av4wX";/gRUXCnAQx|vc|p}G˙joz'?a^}<#6zvgG?{x3k4%RJߍ0Ā'iCYvVգ#||~u #O>yTL2tWų'Odؤvh`wߦ'ώI>/=>:=Y6vsvz/?\8YaujS/>Ul;Vّ4 hA1@Oqn[NR|D'D!ZWklkJlP&1 Tދi%:O `0cQȒ)&ށg?@!:tUPybXClW=1R|L~&bV@$2Q pfTTCDqм \ o>$z%f}WݫD9@`c"RBft͛|( 8eazXa=LPS B= z LH2bRqxs >' ׀1 w NT!h;D8CjF!+=zo:s $`IW;Y5Md *ܬm‚ۅk;fV5 &D3 'xBД,hsS"b]E*8e߷~ tEbff.b.:ftsp}M]@P 'HCO%QJuP)o"bJǡKv]'AĠE@FIYGhJrpfνxPQc.8 d 2$( J- 4`:*nt[VX2 T;7k(8d.?z~z?zKJ/}&uDE0+ (: NDRVH!!sX@$F S#Dr8 ʦYD$k̉i"TQ2ƒu~BИ)^GGPqU_+@5&j*&jhbs1Mq8=}v7}77ik]zM(m);1 ]&'ӜHz[,g]__ǡ ؝d"e\^,7}|'~v}].f>ܽ,b1C)?Ge(_'sﰉxq8}mm\d͛7wwMSbi(jb)' zHhut|ۿX/nG6خ=%"00P1Գ0(fU͢E _O{L}jJS%|0U\r(F(Q.7F%pw=~{."Q6%؍8( @Q LjZ)81}h&( IW 2|WDpm[QGa@ghF a$ʎԓy)+EDL̩bO3*ہreE$aHnwۖ4:>1SO4FXJz v <.ATfXfGa8s.9g$ i&6w1"ʅ S>OZ":AOD?* a=G:xLz&XR:Ѭ2 zi(j-o Iw{[ols;sǁT"P,*"E8R:C(  P J)6 u2$BZdKcvPԴiۦ {*UM鐅:w0,Q4 Sr(3Sђ%ǜ\½DhfJPyR?:(l?1P'(<TDHpd΃4J"Eq CDN1dEE5El4/)aao6z۔2 XDhSUdRT0 5s,v3w|,9P~,3S"XDǡ iR2G4OuU\T tpHFg9xs$ @;1宗J"Ea>K I׍XqDӆJMbxʐMVrRȆPGb6rt%s*(+0˧5˥DPwӑ †s.SDF`RhD TC)O0F,>9m>yO rpw[Lܮ1e3Ԛ3P1J@B VeBd;TSKt(n@7fB\,fMf+k 1Pp{{'!Mm؍Coi+!RΏCpj52Ohr{w=}2ƛ뵉j&ի˛x1sži*;&KG%7]YQַ׿t1[tY_7O_o:|ӳ~_~u4 \ԟr{G-04B̋|ӏq PjS* G*^7w7ʇt7vfǫ71(}ѻfV1,=7 Rpl',ؽSG[: 6n"1PЂR䦔A},0/0'sѷrކ`~\A3u.T DL@cђRqC m]PӭOxРzX:q"[*T T26_QJI6( \7ꫫtj.`.bA03%TlEnkqz PRJ]׍c6=H p9cyUbeEI:v}.6lffR1WgAИs0&w&o{jR?MLzD艜CvTJyTH>x9x2։%עtLd5 ̫zN淃ϩd %eDs}4~vcsNPVAu"~$3BUSP 1~,>>ãaP eaYG ,}g9(oG^ 6BQ *N\uU| IDAT@E(#l=/矜' A[YZDU6#= y^UlTiÙM@@EUKCR@Svx}\ fmlN6݇vp(Ɨ7wAb(x=^.=dl9^-W_~n9ҀB2.l5&ޖc򭵋v6xX.bnٖ9rӍc̆FdE&3) hxKl蛈]y}7ࣞ=Fd!M (1T407B E7گWi7Ŧ``Fj͢XPsz;xs_0~͵V2tyݿᓓ2`JR(ʽkvbcJG!Hԡ`yLv/L_SX@K#d9YΚld} 37I4k /|h8Onֆ6c1gvD<9G@ <!*KӟQxg&ֿ'0+:& &mJM"W 8Ywn8l<0S%Rб;=_Y"cA |™ I)uC}/"@ӎbi!HL5L:Ď']rv%:_hlw\P+D#C= {}dyS:4j&j"D`c_e(sU$q TD`3)mqwt9>0u$#|L:K|ݮ/yc*)2zq٦n,IE&M=#,`0E‰L@1Ae,6Kx|6+Y8r2+bf@SE!4F,ha4#(;/!RQfRq3)kf ;f2fbF<998`GmWb#E$l;7˫]} YCti3fѓd塀e@4A6a…&"fIcJ1yᧇJݫ*cM dӕ# yУI:TC $TmOt' n}I}Kv@6_a1Lfd5ŴS%DfE`0$%To&ZX3h "G:m(]1e㏞_޺ sv{v<~J( %NjӕB^}wbm/lԛtgg |}]zt59#ʎ @7ScW܌}s;ỿ+/_m͇a{w~ކǫg mo|2?C*yǛz;UwsZxzs8_-Vo^]nw9.<{wsz:?;7y\.֝MzGR,g9O 84iMe?\نƜKTJrӄ?RG{"9Y 0g8kh A@"H a5"dx]\>c=ybfdhHDcjRHVXm4=d!El i1[oŬ6ҹyv% UKGE8ӣfpG3:= hBs64ҴAɨБ1+A>\ 2U$#4Zx`nR{+llCPC6c4fc`FnBGn1z_EWaVRjĂLLi6Ȁʧk bʹy$%it' PG <=\b4k߽~ݫv<51]Rln`M_`ٰZ^awꎐ<[N_y/#7dxs[ìG.ne̞?? aGY >/V_ )nwZ/~n}cJ囯mۯ~7W~˾La`8Z-NN$}嵡}I|[).N?|ޅf#e+]/{v] s7oGa (]E -[tcL"io#r2db i@ x$ѣdašA!$CRP{8O'6p8QᣵR^_+lșDDy7G`%F_ئϯ߿~OgO=kO$I"[}yC8lNqCuBw`T @ 6)LEA Lͧnooo?OӧN Bӆe]d`VxWt ꄈ]8瘈Ba,JI'[7&ֿTๆF'ʉd\-DXQ=Ypb1x qdz抶1qHg[:9 vՙAq}Go.woōF E&D0% V|UCIRbH1Т&Ŷ޳C眂!s· ɃsL9sΩSe5#LAQP  '#QՒr ,DP5)ZOHutuczV'%nS!Nռ"('rh0tP P3AHguv]uZ7`ã9~z_OgP$<ޛ=u9Ttf HpD]˲׎orkI5єHq1yk쇵DnGP +3} 0 kCy u:z@`:?x+ FRE udو oG^a@( R-ʙ}Xjm2*$PxJJ kk_<_.w7_\ɇ;!DnrqP" a{D2- CU f\̮OҾb_m">۳OG刃+=BET ZesBMٹDr =BZ\}d7Hx:xz{ޞ༩d+3=")QP9w(C xLacPUCf[鴋MPRVP sp;멄PfƘ)%M*vpYƾwO)@΢ 옇gH,BhؼANLA6P ̅'_<@ p !^]kf--Iv`8 pp 0#*Ў*hߧ!j"z(NF Aa2s$XV#_/_`ve  68*E˅ :D<.yb աp>_W)mm<;;{9^\]Ghnsˮ^xT{0b9~YU%4NW =?cZWdg߽ǣb}|x4W18QoJ"Uj4^_!~j2?xWWo>ާO?p55$Yd7}~$ՁGy.g(*` Dbg U whއ<`tcfRQv!01a`,,bMtha6[*@0d8;)3TmruY7YX&o[P"XUcEX [nu}__|_.LJ?Mʪ1k e"%,K7[绖vj1>-]7n?˥Aú/=Ͼ>xxگֽf16m3(8rn~ۏ>0\B*(} ~p4? y{ޞw*CV D%%!0&W:/g}d/N z .+댐K1D 4nPɆ]^,N P$etinn  H*8sUՖU]T6O.~U< !x;y֎ekncOhHJAwTbGHl;UP D Mu bULt_i1)Kܴp~./r)}  t=xLAYP҆dʶC&QLL=Ý}|p'fVoJ',p5{yb(E.7uMJ2pw2&TbbvǓq=iQ*}`bvv>7"ۀ!%͵NHvٕ9<;rQCYppH(˲,KMz8;'L{ìU1eτ(j9YV͢YE=bgʧ &dЁk CPwa>\q58;ցfTQSUmۭWҵ !{T tA6ɐ{h,@AP-C֛y Uy#,O|qw %hNA{֊a{_}'>W鴸i՚G!]VU3#A^#QO>/g~l2+;]\&d1墨ye.< pE@lbbH4*aDp7c4$F#ΏG V\ųU{3mf#6%Kl\)Qi vvn.~}N8IUdVlyK1-.1 !F;{PP TRMkoj;wawYuo11//ǟ{VM*_lT19"&$b""ށL`bEd IDAT2ȰIm=oޕtGvuveUȇɃw8v%Pl Q %jUʀY5!;𤐶5pȋеV@ @pFU ͐c;#d!Hg7UQ5n=kŽc/ʪN lV(|`TAbh_ptTbؔ4-]U(lBejYR]v~~p7"*}$ZgB $%vP53 %Ḍ:6C Yl\}|r?3>L\!X8$G## lY-ej`ӻ-]-jMN TL6"DM2{_l0U(u(4`MUn. ;cͻwL=Zr/tDl$I<+-{Ga{MN:}osԑ.z.uLISҌ@b+0g|@%:8lצG019fEr#W*p@M3+" hۭiѾg3HoL x\Y6QL#lllg Ibs+ (.N=B &m`..q~j?_r(Qm& % v0&Lƚz5_.:w0ziͯϯEWW 4; ;eM񳏯˳;erݮRP V^\߿ߟV-Xvfl:}ݫMiZGw4vUcLr7oömV D >OGn}qфqQ#7Kh뺴_GWzL&ޝ=@X앙S73Irx\VT95Y쇁nZv,0jb"Qgtyt3:oSq_\^^\_W2o~￙>ݓGwѳ):٘w08ļg<‘n;E7 @z[A=o]A%53~Hlޅ2/ <9oG̲ rʬMz dEFbLLX"P tt3=x1]͚ncaHm_\b *hDu]fdBBSYJYI[fԏ'ukr|Q !Px  y$2UYA0r4-xTsAk Ŷ.YȚMZH l竄-aL@2L&pySrT$}~&@FSd2N4 XByuՁ"2YJFV *'vñBWY)d,`8!X4D%UȒۤۤ7[:vN+=$*5%B"6x9Qw098'մ(9'( F ԹDkض9jIYUӢE!傜)Lz[!qR_>p7?:,%¬cSDl9e@uTM3"+!01 ؟*&pC5=+!nDC*(j%pA#f0U<;ޥ Aآi2> xLl-D-Ƭ)[_񃻼Zg<I__7$t~y}=~&[λw7^q\Oo{)dzɉگIˋtT>VՖy7)%UPXGކØ6/Mi.ݩiǢĻǣݢ;0/ -$,*ڠkEKQlDDI 9k 0DsUPuJEY6&"TLtSUyvGc0B8fQûEL޴|svv)7a7QW͗>->ywQyX٬-D՘P2YBrX=BH&IGiXz՞_wJX&py%jHWpvwv_]~jNW½w=;DV @(Pqh[ 0ya69ɀE}S5[='<'D 2!v313{bvvV>D&b9kYd}[>ƶm7Y}c2316E"6U5l*0TLv8*"0(csO5JwY9olT Ki1(x캦)KK5H\T$!Y\W>-1 I$8b*Fa4 [($w$ӈ ̠M`!єrTp:6BPzQ\n, bR^eG#ĽJ51fh3 s &朐RUج3;K 1{G>WP>b-.//kѮعIv8Z8&t<fU9*BI<ogCHF 602 6MTxcsЍq6*hy؋ :=z%U!(H6U3r\8  7yOރc@R4i,2~+mFm7;g H3 YKBXmPp F|sPVϨ:q ZPu<3ft (vo']3x}\Zdmd\W>,h׬U3hUY-uUQY3|WtZMhUT7Z6iYr,xܷX9Z-6-,.[JYHʨ%!D\g߈ɇサGQ^,`o/AݭR&O^B(7StuGO~K_bfG}7?[Wd-V!vsfC@DWxyvQֳr2]o={s^__J޻ß~Z}:53 `$F޹a͒yQ7Ml@2H%IDM֥a.yt{!P@(.y:.2}r/㲅 fx~~޻_Ʉ$xZidӐR!6b//joW*p^eюk03Fsd B!`|d'ng/Y͗:}}p099?ܛN&#.D88 phn`b&yx[?{x{;z{ޞϽ]z[Hj*";1%0%ƔHQmv6}̌;Gw$,eݾi [03jc *^nåtQ] ,8Qd( iJ$Чm}bŽT 5ԋ6#йšUQ5J0e;L}jQfbLh6kh" Xp` )C©,IHJΐ0҃Zq7=Mt3*L _`XygB]˦Tb21' Z8)`A"4 >s8MI!`2 :gH lrx4?NǣIjwJjfPx&9.yަWr0KXC*v8T4;"$Dh7C^cziVPowWal.a1@J֔sƶ6$D,clۮ{UsΡFFߔc @ݍO8uaαs4 v3(U9yOCoDڭl}7"8r [[iۤP. D4B-%wDƁWs@f<9aя{I"sƹ4-`ơDB1bݝߴgWz - Y eHnzk#0( WEDeLÝ}x!{⧁PI|m7}@Ƀ$| \ -KSM gu0}*<6CF#eD2jKYA!!Bڕ@4lUq*l2۟NƣI]Ԟ='6y[D*DóH 1ƶp6oۮܴQUCYybg0$QWwv݃:7d!Рj2Ȓb$=dQIap.x w@  JHLVcݿ%P H^ 儒5k6ځ7;PLs6qv. H%  01&AްzJݝBfCH ɠ7l }^w֚ azs01kW4 %ե,tǡtmi PRLmKeN*պf1KәoB2lk9i[횴o䝣y_W ;O='?DuOU/r|'Gw?O>{GKߝ~gLF.Vw/^>Bot K~su,ȡ/PbVY]쑡zQΓ߻_tNYo`I;;G?̦ƋZ7ƪf Ĕ@bb;+ nPA G&W%Rfeತj{p~ mg & Dp<hjI 3Үz^) :ua5p0hvQQQuha*^_f/֛e`Ӧ_<^#}9GJ :K^7ËWpsn0 \+Rq9T$F 1C5fwSLFE5M'Gwz6}6] HHv}4nR:mjRQ)=''}"ҰdÍ yϦ&^DSo( {Q)If>(k i:av]nj  ol}%dXxLh.Q(&H'z|0Mj$ΩPz;.GDS¬!AWuOaS# 3U0 H(4KU,d)Azc Z- [!2:ELdM}&@P6 ՉfN[2#YJy*VCdN{A%VWȏ}x o{="E7`ZϦ{bpzvٕ2G8Is Rƥ28yw9ofݛ8<=ZH^5K("busuZK 3ˋ[Wl_ƒuwgf^ΦZPN>w_|wǓq>xwK(W{m2rgtNmi!9_EQMܬ".f4oȐCA{5U[?m=oϿyD~-m:B@E3,}[fODfs}9TL@o6Qw5 P3 ]L(o$èq9~1# g"wNQUj6*@pΙ"*Ky #!p)1GRͦe3_d%vD@ LJ LٔT]nTUe0BYStbuu8i-e=%JY+~b<|6a65$# pj*(h (0@`wa}oǜѭ 2;I5sFEd7/뜣!bBpPd10AUTT^g,)bohJ@m דr<{e=)9i IDAT b?`܎v@|&t{DL6۾\5u]u]`6pS49R<9bAۦR0fCEDVWRKҍ*!f5GEl]i'z,*dB0,fi6l#)`ΔD@BT j"ݕ@`8Pnm|,&ɢ*v`:a`|UJ#T,n;BBLSkM6ʮ 0;Go>v]xU~^&ᨆu i>_sM.ϖCmkWGa|鉏gŦեAmr=Yi7:n{ŏ>~?s}h-0Oao|IR'뗫V^IFPz4*+r}FL 1@LCFJ7{okI=Uu3μ3i A DaRpwnǧ:{ D9U{X+a0D,6"@أRC$5LS}ۣ|HRk*`s/x9Ÿ0IfU ᦪZ;I !&T6Or*6K"Bf< (Co/_6gγ 7 DC>p\̥ΖemFxo9Xv96W1]'Ú7㳋fӧ!HۊRM-9Wݗ g'"C8}:VðZl}`)E^#OԥHBuՊYQ,CmaF 94s%n\{1p$'TZKCb`nI; RbT@ʘ Yш DXz-hy 5JL̮a"v߹B.)ƲNi"**THG/Ǫ3E$P-ևHr9SG\>|n^vD~6 ^v}3!0y O%Wu.81Z_=*ՋN\^D/W~qvun jUT^>s.5HPr}u}|{!_|}\> O_ono./ >;:O^1p~w/Gy|_t$ 1۞'y*yMk̘gJookq8rϗV[ٮ*hzW)U;&fV"3H]2X`œh@V:H8rz|s[^TV#7ӤVC3ػ$YZ@@B,f3dʰ#& 4)}r_᳏G3\˟_/~QՋc8(Fnb1&ERE _v1uzڬ6+1Fb2cew[ Wpf_Rl0Ns_2'v?L)&oB?|WA[ֻ;®}isK,gp|fgg'j)`'"۽Ia֨} "f9%` M;lo}BM͌dͳSmi7B'ȵHb LMb&jT- fe.Vs.z1So\B NbO.Lb0 Q+'^"zYd)yJ쀚g V]Jc|2)wӕPڥ](VcGT4N?bwU ݠMyIoiOc|"]h$f r2VHq|\ hMV0by*)yMM_E8R 2&IHlԺ!# ;SeAlZ-!)Q-(FJɠZ1ijmv4p;q+ VW]|5( 狀}ń Cf 0!jU!I" $>|q>?2|ug__}%܉9fcq*I/lVB8~v|yR뗗ǹX ܻvw/~y}߿)C?Vy3ijze\'z__E4\?G/$tw#/ƽE޳=~yǃ曃in|Nw_[os)y?;v8&Fj: 03ĩCePcZ*yk53k#drԨܫ=J>IB*PM›k v"s6fwQ"Xt,4lNnU3kuV-:U. ]npy>j6lG/r&wwje!u0yRxUwY#VN]p7Z2c]n[g hӌHy8&[[)[L©X6ۂDa"f&Amh9quVwZs7Z`#r"%33-c*Y2Dkr{[m-@e&FCn)׵6B0ȡZ⒳s.H183SdBC}vN|/ڇƎÐ, K@Oz*X S`e&Qu7lOa'[1Γ_ dE+fjj^afC51(N5$ٻ2*,JXwE)Яvݡl;W~9،G~y\VgJ]AǼ:դ.jwzs[y?Xݱ~zeyqɫ-78A]Kuzs9߮AA-;.A RJc1_ Cn e"?[׼ڎc﷑^*{"VR)O1_qSAěy\aCXKS8 XܦYj΂GB脘5TEC*C*#j11ZdIRj 2' W(^2" LijkSJeEfA[,’gnR4}M϶_~oq,GOΆn>nSyv_ajݏKw{+Źjk:U>uW^ǃZFp-TROwfsҗoo Nn2}fǟdy.@<\t;PT[V+BI` WjBE|\s"Qb憾Kn6 պOֿC.yv;yqlJy07QcqKtb`yAp)`,)nc%^ Z)=3Wr~7?Aݮ0[2-8~f`?5Ό[&Us@LIDuۡ=Z?}qfJc։XR9A4OB6ԞM> U x8lsbQ#n"5_ncВ 3uRTp{wxzws{FͅBf oIom;*wz~3z j;9Q{ȶ&"Tai`?YkM{fNy'ԃ%ro{.|'QÎ/SE($FfG%e2sHXC`-bn=OS@N/)VI`*9v.< }}L6E.R0F_ļ}oDf#`wHb&IBN{JPP+QeAż\Ѐ Fu$1 nGĠG'dC |>$|;O|=wb@ 5bi }}"sJcn r؂_ٰX ."842Ms~ )TkB!pB캒s-u]qnnWӆ;CZ]7#ZB ]W+l!"Eqe6&bXoةFc4ffV:93$]C@f uս db0!8 O vPw2rE͆l^nAx #g˦foVm]Dd*w/o滃VtlV???8zXxy'Otp{yϿ.!P\ QՋWn+4*nL9oΟ=}ڽڪRq b SLB׷0w{B7w>T86fiV;&"1ȣG_^~^NkVwur6c|w_i,S~Xp;#M"}|o/>ŗwkxO5Fj~zz_2Bw]P1  s]n Y/$ pll`uڌhA@ aK^P|@h^+syyl-'2?5uAPM(բ$a"7᳏7o>GYxvBo!JFjc2}*S< .;0VRZsY;   Krך3̫[:uu\8F5/K~G*wz'…klZstKBކG lj') hA۵2-l32n{";=ɖN=USm 4pr+DZ U"<%\=۟,$RorNN "Y|",3019QsBWUV,%tHA'?UBcncٕdQh'HMɝl2y,0BnFGX6W(#C\9PӋ=r;,8jD'].J*y*'/ &}UsG8 \h1~m~_|U~KW5n'?*77j=;8a{^~1ɃuQR/{vuZ)KMpY8z\5λ>nxGg+]ԉ@FFAU8Zjnuԧ.v=uDi@AH"P"009~,wΏs2O,b0g H Pii 8)ZpSk,L!f&#lJ<є=+Mܷ} i DWxTc6dչxuZY!D"`B"Jrv"J_:Ο Cy|!J7/-xxr+)AmRs1v8{ryݾ_|uǃ짫 oordn TGLժy1?L(w4n5\>:/6i! u4\uY) QC\nNѥ!Et>rP '/ :Pfj)x$&/4dl88lŰT coZuͣ\%Fa&V'Ur )4 )uL^|+~~;O.=拋ۿzos,m B1&bI4I32oh[mAZUhy/Z#ZLua<̔ y3IoyS u|Ouq[A\4 FTgVRCqjFp*b}Eۤc.Cwޓ镭;Jb\k .L(߰`uj3OSYG~g>] GV~uO6>D.gtKZaEXqew$=g?heyz6^ %I%^@qTt7og__bǻ3Bax gl]C䦧ꢼf/=\ x z!RYcl<݃(X8q;N8l., &>uqCH&P$b37a5sH1 J%υMz 5  pVŦlsIa@HHu Zx^Rz^9Mj{d d gwBD0'SPj!8Zҟ=?_=;+"{;_ܖ(7t~x_77_V/C\ ͱC V V#]]Zy_zgbe\|^qc Bjy.q= ð8u"v tAjU/խݏ;7ISL90!w(|,я%WH&;]OGu<2k'0xNkw?͏??|JpT,UݠrNVE ӮCaW;uJ$IC|OC]QXtZo]_)` ɥ9C cו2<2j%cQ՝U9WP2;KV@s0PpJĂ-L )ǃeEp "U6&skX"5X9E88%\A `nD 'U/Y<=uw`X t2ΎxX^OSF"!W28Ƣ{3>GϺٶt&t@9|'v~6g|s<9ᄐN 3Q*bm@e4WM1D)&Tc}/vW;(a-u$ΣRu?^>kS:֪NTl]wwyKOe}W],wc&!ɲתV9ߎqԋmgaSi:K(֒"AM0SnBWWKsqXyU:ùwHU0ŃzZub'!DaY#oVKUrT9#y B0ӳgWhtK-4M+jtIRCD֐hTřՃS(Dщɼ`+grLꦰt9## %!ao5׼%QUj=QrJӼFjͪlsE%Gچ~۾A (6TWչXu6V#692ª], ΊNi @s: sޓpuGW?<ܼ^uœ~u|8_\'A~P &b7QJl^ m.6uֹګWuJ{?y0$y-q6tr֮cq=Hxuoo7gێ\ba1k7a>_;luGǗ qLHm WQ(6 %y|}]7|/{qS`]qEU$\zB$BྋGQ=Wh<#׬h!P$[{GGN+ D&d脪j1ZDJpo&sb5S|i E؛;$r$s!4~ŧ.:񛻽M*>5c0ko\X?1 0N9C909OW|<~sGJL׫E WweeLJ0CwG0cq^BMܦ %ggD<@VFyZjKGUpib:$}Gπ[L!ATQ:MnE'bDk{z~~II:&(66{pd)___C&^*U5Иz!}6lX u)%xOv),)3ЈN8Mh, t1ZtӀCG{SϖGTJL_nۅ.DנFH"sr,ݡ pƃ4kdn^IBQ mY!sL$f0A T e ٲBB $]<{(Dر@@~BDmw'7QWBCL!,},=:d }4&@MɌ*\A^"I+Y2"-ܺJZWQ*˜qܸhF (8#Lq%CY=2CP@Z s:q7j&PnG.Vyj X'ڏuC1f>J^c_ FnV&N"́ P6J.=N֛֛lXma]V^~$*@!k؏fJ )rb . ?x\䚳 nypgD8,`bR1qqHJm|7C  a+)q3,2Q'J[ɕ.h%C8yZrc~$Ak-fc#a6"5PZ<++xIpԪn}"tBO23 d*5ʑYlGrϟF? =_7E,1 3n>F 1gӄH yJzR*eKq._nǏHp8&9c>b }YJ?hD'ΫmB!ġO^8UX,|{}0ozh)u*TKM$ A;y$*RDchf*}qeQ0*"w!<"INR.jeR=Ofֹjvp%myEȐl1{H<:)E&'}XJU?eY' 2\-m%LDBmaX;qv];S2 +3 e>xۯ?/^͇mɟw]h=(b3T~Gs[+;LS{zTs CD0Ӣeq.!9J!-K[ҴZJ)j*Z2߰9F[zwԻn[?@F!p,81HH$8jvn68M ԋN۔HnJj OAZFXtp7:w锩~/_ 8񲱶`EsosF;uӲ "''7v Wwr'!KU̩ ê#G|^m@CL4!# p2jSȐ@@x'qĬhPLw!Vʪ+VDcQ8N{ }$؅Q YU*t~_ѵr 0G:Óp{UXvo4;d\oׯ/p}d Ub(SK%vr~R Mê뇔- foXƎ8V6o9;E kVA[ Dnɦ/OyJ &DhjpJ~2 $01)pQ\<~QKjHCއ40#hDfA^|": w幝79'4:}yz: _ߝ.I0-! ǣ+"0S]tVj^j)fN?X˱p<=РV- 5'y( p5E>M틯y^5az""z)oG/B.VMnWq\^Lfn-pᐁHe&wL1XA1!a,L ޙ5D3U(pJQ<u"Z (uTX<A9x ĄͩxMCoe5rv u$oOt,]vCp"?W()!On~c]emVe VC8~ۧ|ꖍ}wy 1{0y%;Vo o<ϥdDބLQ$&5UJ] C V\q?VPq=߻Dnr]Y|Q*" B`=щng,H{Js0hj QB`vg"!ݔ!ƀ8o7?$wxX/\g-{-WE\ݎdc8ALdj.=Ӿ5m'pNs9GnVIHZSanZfzrh)Ԛ% H Ԇ;FI!J`)p*OE퟾?ϥ/qh]'گ^ K` !!1!$7}Laڍ4Sc13cS:°>^(/:`l nnK  !xͲ6͘k9]b8 ƉC"؈<1HI*[ra8\MH ݽ=j[ 5((c7vs ؘM׉$Y~k_%QY/e\LÁO,}1"@Hpg4eqnbDH"9<=k} 0AZkq?yb$f_(L֫fv%`CʼA/ 8 q~?%|5|Z<|_98 ZkKI\.}.r8N,1}9 xi(ySkf08>}/ݽ*]߼[b'Ih#Q3XlaLW_} @ѹOY)0ƑG|jdR4ܟϲz1 /?Η%)P[7B#!ۘ6j[>+& 1Y5#j=̎\E˥,ZfBxb lbcȦŭ[ uM+| >AAf}]J `sݾMgm[*KFUptᣧHٔ1wӇ/ڑS Y$ ڞ,s< iCN26~i{d=#Wpk ͋W6*>vi˼??mY8 #SȍRhu13sc51Kqӵ Uӵy=.tYRsy@L)׊"T"cgY*]_efLm %8 1,yH4 0N0CRJaqi6P6[`P ݞQNcȼ<7>a,, IK wd; u^תEv_|v.ZȞjkw}->a g]'e [V[):՜`U3;!zYeW7 |]@0++ITlKAH ) RZHmo֯vIEhUkQ@sKkyn?ݥ)̬!ysr8 m'~s! d`_`ǤVYw7O}O crܿ;GC /nږZ'{\q=VP!f*z~ S e#3՛iO&Xj]PW9]y6]UU%AZ!qU>!hk;=8z[a~k~Q(Sy,sv) A"KEya8} O!ՁEľ}.qf+ݗ7뻓^.+^<hԔq"4uXL~})|"fYK9KSaÐd"N%ȹ}}iL(YMvy;>h;y+F[ږ^0uto!WPJh6dKZJ;ib73VA܇PGi6W=׺VBw=,檺yHpOģ9_ח4C*"6ȹsYtۻOK{@]p0EDmX,83eIjYFk7SV_Ah*O}=7= 9`J):EzY\T1Vgw.nw_.DWĭh 7l.^!1ɞ0/cB,z aϞ47慨q<Rg|[w>>o?~qzod[jsw$Yét>VZX6Vfsw-Mժܫj3=P[qdQ2sm5 aKR0u xb<=3+QC$+Iȕ9>I!dJ]ߚ8Oxؾ>~닊" )&NIzFCqӺo:<v ^ lܣ@RNi\ؚ 8nRZ[E[yOE.ⱂz\q=.@)~ظsiD",}OTZXUMݣs+/{Q?Pɷi 4tHBWu`aEɮPzh@BK`L70~&DMp´%ILTA(QA!@_ڗoq\pQYII̼A;4 OSAAsYH!k10 TεC!l%F%G 1s{0L|ۯֹQ ^zu16*˓O?VuS֯@TDž7Xq.F`fU='#7_{5\A5__V=v)%0QXRV9Ĵ}H~X{v{9 [L,}}r%x|,eI1)pT_W}\Aҋ/S-k.\7k*Y "ѣ=V/˂$`]χÓ'F>y:ml7nCO+O_?.?z/޿[_@ N*C`ނэF{yͯckzu 6H'ʩ<_6,6WV[3u0)p-ΚaDy8rVh0opq@@`;* 5=3HcH9LQI` -EtLG ?;y.IJj<鯞)008RH֕ )fJ6w(KHW'"3WVVV-E{NC^ߢJ=_+䊑CP6 &2m}U2f5wz/B>BLDַUk'mP]Ufuywk̜zr-CAHG.l٠]frEZO|%w$y4 S YRd""HB1QLj@cۨ6/?1?umoWo <=4R JbԮBVPc5o=wc]Rz\gi1(:pZlÇwGeVu帜|Y/MȻGר=E/,ARnƴ4w/_-yY|SłPCEA"Rc @C1abaHyÐR1@(<H+Z_+m2vv t?FǨuדF$fa"gff+ L)088XLr`!<؝}~YRQ=8]}ݡ ?-qK{*ԜQݏeYn}&> _NG+Y55Hک kurHsj`wyCp;~~x}U[Ցvk,Ϟ~MNj``A1t^jD!/M8u.\fc#묦;<DKsRmf !Iu\wS5!4vniz`?(<|yʻT;~{듧{I*(b]IRKHzK@Nd!z h HqwWr3@!$& dFfa:Rl.f) =\ 1q$܅==^D3ZSHHāE]rEW± K bDͪkp?-g_`~3;X6tf?sÔ\D)HqUL!:77Y M4+JZˏzYz\q=TPI:{ÇUw!mMn歳e):<կM[_?|?!&f܍L;40Ckl,b3WVmeQC@ reT{00gd-$ 99yb3Q^ U+۹</kvY1,xl. Lu:͡i؂q:HܕٕͥWoz̜M  #u N8QB#ERe\rzZme6BE4 ֵ~ӆjT_]=y qHCv!1e!R(!0meIa1rJ1B9fH a$ֻF|oRk^|.VY[voYaWDpXs昣qU;w8Y#]eqFkW]{m&}\y,Z\0Hi^f-j50DJ) lMSq%#)X,ԟvw'f"v0H!,npC'b`B8\RJ;^/?u~ŪH!^7V"Dc˸o|C.@a3ayȖ W|:^wr/ǥ, JrbT0i;T]R%8ļKyaw8 t B^uV컫*w=d顲^=TPaù:d{CYgW25b0תؗ*wia p#9CLyH9،Z7q#y0$e4}pw/4ŷc Z`dC9AAN,@ U{ӺVW+ nd܍/v}G:N%V9E0- fFj wGS_^r^K]Vʖ7 q׻:0Qz\ *yC[>ҡNfS!Wya7&Zg†Bb{O쟆:Ь3$rVjm!4rv\qZZ luV4 V)N5xؕpw! 9i^u4Zr:.z:.,MmUQ34w jN9,qH8q)L4 1K(,Z!gfP]aDN!f $)۠z[nGӃW4pVMeI7`ZZ:5ՋkԿ$zk2SAbFL3R0%".4 >2?e,fs+g"΅Ȕ\@.$Ff0)FxT-D;qf{}pYBfXU׵6Wn@LƈivW˫;4Bs0[[r OGW+f< 0&8H 3ūS#[n숑C#TU$v ϋ.TcᰏZۥi4x)0bmnHߜ>l/!}(U!jo1Dq&+|9dL<$vJ~~n\ߟOpðؕ817P0BS41޽OO&z*|/rUٳoȴ#X #d.4z+}{ %=d_tF z5ML-bGS~O33h$uU#ޥ3:ju' s H]Њ*ll]/e|uWCĘi&VMM;r <'E8LU0)ywx"]˗i$A ׮aoh'"brb7Rw1;\Ĺ`7Eu"țתږs]mAS=VPq=77;6}3Q~󞐣08|bJvG%lq;uݸpcgl D$- arb9c{,s͹|]=kgyaln$4qCKm[.olw 8(3H-80ȳlU 3q*Z C6_CzdWEU @ fa{EOTsU;mn+3KIBG.rkmD!c( "i Hp7(0S:FJ͐ܤiÀ@-JVJ4RHI\`nDX 9*l7w?ٯ]럎>shm =dqߏ܉]֜A(0 j^;)7`OҖeYָw1r_9w]4>zz\T 2s? 竏ɺJ'#^bhf̡_.Z֥垧dX6]HQḆ/ě,,*&ViY1Uu}P-m-4m 1 Tqi]oF"jV7F'o54Eñл=݂R!/J͜{1`BnxÅKn\/̖FPzR[SS`7^urxcЏ,1R i!n~I(1)g admdI fRUZZJUU'!qc bac;C CߍOɜa$qy+ɘ JھAԼ[$mBͣp'6];yEy`C%𧟧OvkԓHݎ1LNjf A0J=\xU[W7y0HH)"Qin"Dslǹ΅>m+59s-jc7rny]1U9"7~&tjYjCA `"l- jf7'΀)D3rDw ^\5VV;ͫY`ΧsQ,I IDAT7?|Η%,&)a͑Zu}勛}7~}/_PJ8ljkCZeS?>޼ko_ܹ+W?7W{}^k IF18pV/9u< L@~ ׀ ;[L" @kic#Ǧݍ ؅ .N$v&u >$]JŘL jZ]:j1Nc4i.n¸C ` z.x~o"bZm`hdNrisۺhkN]6鱂z\qZQ#! }~d33}4҇ګz0fע죇f'vriwkF.sc!!20L'Bxq ƭriX@R-K]m!؈F`~v!(1C1CKtnt9;ȭ֊y^ ]A L#n`ڋ5wOZQ!.oR~y^닟*P+*Aw PW|^r~ԼeZgp߮U 7_uo( 8,sy }nn>48 !m Zպu˲,˺,,V#8&B!`4/x]3J2z|(qw`mAi=0ﭿIlJaLdN !cJM(W1"tKIÜ_>y{a7j߆jM ײdW{8"3 @)TuUtwqhAO@ 4hcnV(DVk;/֎.-+`H-\nFbJugrArk*"eH5:abZyiYCu:,RH#MϪQ]8x'TFZPEwwLVZW}uZ?;LZĜ[v t<!Dđ8煎%uR )  k݁ޭxsx5ںHkQ+I_x^|7!䎬!M_1gd|O@v?9?}FGfx?>|Q>og?N}_5j9z*|~b]P׈ 5QL"Ś R"!A?pc8 dNSi!A6|LHj r "pnF) $Ą9sEgO Ȁ EWwc-0pbG1@"(kKUqK0: 6Q!R//~9z <N#VQ{OU.x9-uvyI70h,ԈkˢXݫ~ǵp3m%M(s1k)4o;y{qKaH`{L__^?U/~swa70ohڏ7n >M/y6\08R̒wqwn?Ĕﻜc1G@bSh)Zk=K"dD96!CB<]rr1 dW_f_fgL+锑QLojjS(JPBf *jA0h3"<N3O+➞~ S"mlV!,Y-ܬepUc]ke-K63R8d_4+6/!AvWpWicߧи{"A"1Z w6Rt]k).ey^q|>OӴJk&֦ ћ\zV`6"_(Z9LD !  hB˦6ɕ[ ?,f#!>|[ Q45ozjS8lZDEaPR24Tx07FtK`rp{O~7hJjG]ʻNRB$+UJ>VbIkp259335&98Rtp}j-} F~^'YWHb,! Pl@kHȕ nR~~*@j"'GUKaxbX:Bi ճ6F{{79<٭_'`*:O/i& ?ONPG[J/{wU/ݫu i]]s0Vh!uȒihR{sY=CdfJb !`˪fslOE"imP3"g ġU]@DnFf@bYųbǛ>z} deuO m*rS);a&"@Db Ե U;['{ c%Ԋ™] IXlԾuvZ,eyuHu&MImn*ZUJ&AvO 3B[jJmʬOϗǏ0t)ճ?Gɗ7' / \!c8A|KF@Vmj)&i%~ h| Ds#*($0lgAnNf8Dr'HmzX`\ԟu oxnqoaLM2h#3PLT>}6/&ʟ}_o~cfqA 1¾M.⮜3,NZ21 ~_|NOOOUz H A ̱;f?0_7?h20m&m-3a[17 5QjˬTr:/wwt:Z3uK.K[vPotLP ?@>zok9CsuYC<@pIk}40%`;U77!򰋹1ƔRJ1FIA6 rl-uJm0U-C]UEḆ/a"u}վ O)iS+x%}Ey<Χq}uRWw:9kEUVvrم0XHU_%Vꓦ`N5K5Yj8OW48Xm媲z0H { HBNwukIS r+^ H@J.Ռ6ȢCv=#)s^r/!1ESsy;' LM64ߍx:q]Jhm.`6Y1Zu]lu\4O^NRVUmkv/јyK8_S8A}o;y{65i_s€آ_I}jmEx]\G"²`nl gHdI_m>tSH!0"B-$X[z Yp!J1Um#A!ݮ;\onwCbJ1B;juY4ߟJaR ^*!AR<;R` D}<آ#f(dtV*K2Iy\4k_0. sj`cUZQ2`,t)բu*k]lqA79 $HB^ֲÄIR9u9SEGpD_]\GXz?ݡc?^! =v'xP|'ʮ'Y"Ww|z>`OnupuzڟwB|2=͑Q7U)Ad%#Wcec^֪U+)4W`!^%esZ~?pߵMo  IVINPbnD$9Cn+i>'pYVCӈ&pAi/2_߾:=w{owQץoAh[ tC| B:hϏWOszL-ejǟ|!_/{_@p^RO~O]IkӉ۬XdfV]W]f'e<-O8<x [t#s7'6]GZ=oϟ ;br=mH›`S燆js 7o ڒ%RLs殦f),yC7r1KBh(b`F؂5ĥUD&!繚:!`,on׷!}a'=vU]iM:OVWV#* C05k1V¡K̂b4ֵT&$_ .0PՕLv ĜY+|FPɕȨٮ֊ã u6]܂n pQ+@L2N8[(\$Z})XݪB+j&hRg6u% #݋hOюGIV I?e}p%PƱLҕ|˱nGi)d?x_s.1պB8M/u)W3qP DQfP2fձ9r`LuB)y.17%ٶj5\sPfK`0Chy-FDo!B܂6ɦJqbE[/˲~Ǐ{{|;RE u"f6} FS¹i/j.XVg~ߗwv>N~Jiy~|~:=>[;osoݿ:޽:T>S׼o63&mnKujX)Z6 $%e1gr]W\IZ+^i)|y&?=6=jm53`Mm^Bn%ߊهהG̉ KCJɈ̬j(]}yC DcV]R@3rX8X2PR_ލV8rG~d9FTVoQndJHP"q'bh&UO}!Zj~ 2ejjUKSnP -UJR`LbUZJ5V{N"wp:] Vz '[26սXjIA\Re㛭I pd∐99.8DJUj-4ߝ/WyGc 1;|Vwe2Vu: F Rsscdjnj Ab"fsbNFP7'BfR/K,d:5ÃsH1:vy% !V5&@SSP nÉPtT+;9x B*r!MI&2+]O?~Q]G=>GHy~=>Ү+]{5?רÓ; 5v9,Ǜ﬜gPg0OP\bN`Q'1(OeU.9{ عZ\|~>t7{wWSI v3_Xma@%Q " 4X2""+qobL6# 2gq6s8Ӧ;+#svatwuhó?tJ|>=4 IDAT豭ɝjCJѥش~6?;ߗO? xxu_=zr}gi?},Iw~o_=}_xz˗w3WZWoRHLr'#Wsfjp :9SJjq-0%5XuuwZZTZ0lM+ !견1H3bLݮo;y{U|\`&#n2 j!C!"a\hLf殭h4؜c(u}J)n.g)ކHV1DRv0Qs:/iZ Abݐ?Sg--R GKZ]J_v^~^QZ u`2-D=T3V ZY$bLɠB5&<[5[KZJ53"(CZH1v~S/V"uZLżlK07fFnQ76BeD$IS7ͧ&'uoi98/8WWw4yᄵ`= V.V}?LF!\mz lʋCiZ l"m؛~ PF#XE6c9V[ &]u:]wɇ߿!u>'6 QIXZV"85DŽܹSr09Gfr %F K VWIs4Ok>t9ZVMZŽŹEL]K ue;E!RSG8y Ƣ'fZqB++ 0/Զed:W]+9(KQD4a>Yo%>|ň  Qj!a-=t?w{;Cջ3z>~/~wUU;o;̗B`I]?tȒF UҔ;+G*FvEV\Qަ&&dN1UT]}Ara=!JL9h褏̴)^U@"0*HUDGxgEy0ܕpmgDbu }gB5@t:Ͽ_&R2n-__*]vW]sJ(`1) 1潏or<% #4|ӟWӝGworwxq-_|IXamޒ%q_)D("jj } mSjֲZ[Ֆ@3wٺ˼,osiC߿ޞ=ä %% i6#ff6oQrmd K^ܼD )K]߉($C xU2 .z)`D0b⦴k )UrCvNӼ )nzS.V ȍ) 0xM/x Zf5qDSXͅ&h)W+-sqqguUk#90i5rp õKBOY H0wbHhD?ߴME<9&Z3.SNî CYB&jDrW-Ze:tOe XFJR2/˼RBߢU`Id'߄1FoڸD[>=45¨xP5˖rIqʖo6!.|D qWWCɣawfFڸd"CF`k:W`v #IF:})GuB|SW6yiπM @(s=~uAd̏\x]8:`Bb 7AFP04~~_dD>;IxуDYLu]}V0bHpvffG;]u}.R0YRFw7crAM9V3/ePK@ #p0vF31Ip@H$w2s+#λR͇%]Y/ןً󱒒q8/v7n /Onıؓ/RCaDl|o)<߼;нCoVl]1!0[]d78R(ԬICZۆL7ٹYZJY˪m5 t)w93j]xaG1]yw:ޞ6n~dڶmpp!qLjc!pi7p*pclB %pJEj *mE̐#80C37sZͭS3)7I19#; Ru̔LA̴j-eֲT(uv!>"*ȝiZEqX_Ք}\0:W>y9q;8 K7[ D(D]RSs@XCBN)F1W[MVca\F #Rjf1Al_,RǷ ȑL).dg0hPe^W}xr1fV}rZg@[cZ뺖u-eejecv] bzEl%e+pSKmA6>hYL3}sDi94Tryݏ> «4?Pi.]ۑ$s6$ʪcs}=zLreHE1D̉8dFF5ACrpM,}jnB!9V+${@9"::dA U@X0jPHsA 56ٴ=C␻WUY8g22F,\t*ij+C94$1\țJs1c" @e^{WG1<6;gťVPKN&g]P,.êP4j4U&\DL"L`Tc3@Yb/T]}.}䴚j>>AO:-4\%nP:`̽R0BmCNP&ZÜz1zS%F7 /Zu830ntYeUU30O/Ky~s)B1ID!aG>/^gȹi;}߿Q)MM_KzhM];ĩ@)KGO+#J箻~]YWYL/$uDL ԥUsEsf꽦WWϞ2|Gf?%iv{cZ7v9FF zѓ^ $(L%++3"|[`#ZaH ׯgY1>jZn@":1וog+g!a S%,hӔ+7\eP1(c~вmHE!P * ͚= *Ĵhl,O1#(Iv~xX1w˕'%B2)Nժ[''Є$ Q7ᙏh1Q : xPیu_ףW;-(H2Owu7h]lNܺq)\ X$su}p xbm@VA@{A:3g5r=6|7'yw_}w'b-x!pIGY;zw>rqw!UeiRd_+*Z䓟OG䧿׿S#r.Wv+}ޮ{[V'˺ۺNu'Z *JHGШƩEE7c8(9~O8$`2Wt';ZKQ&d3vh~v3V˛& tޢtQ-8Avx G H$!$xnv>6~TKR"u"̬ʥj5u;fq7G?E;Q:h(KSIBP$DxYRؓb׬{kњz>x>WX]הiDU ݺ[xdr..b]m>#u9uB]&J)Et;ư%qRF$\UM@-/IK X+"2k_-jko3"cS>Qs܎Ddj|vލj~X5jayP,׵OR"NL3I l$.Rn0԰R9mEqdm<;6  A8S)wFa@my\ٍzuueAk#lf]#45/˪Gzo^> O~rS-|o4=o4WLJsM ANS\TN 1S9R2& >+)<כ-Loo&U[omDR9©LRD*t~ ( 0# 'jcyoA>=0%G"❞Gy2O45eb[ܐ3i/P=0ֳw3˰F(/}}6ݫJ)a\N_77o?= ѿݷ=#jxU!IFF͓" ({J3&(#hAw:"0JK7 CDoyL4K3 IDAT97 *v@~>]`"Zʤ,[{,Zrz)g)D mD,r5бws-"bk H3tS;t\Nu9:ji]N˺L$gCsUvLSH ]k*'BU0cW*0 VJp$Q(Gy춡" i"}/,I Ť PSI$ݝITD:I<rs RvNS)E ]w0FՊSy|,~tWv;v9ef]͐8iɜݰ,x<=H)hU.j<<3a ,4Me7T0DT>=U,O>x'_~g_|ëW^g~eexZS[&Fp͵eU"]p8DUD蛻*!h2YezzZT=7 q%J1@f|vjGef3aIdͼVP!"uMTԪ$ DHjM!9 HdWfz{"pDڲN㲜lc|,t>wUM"!TpNRSK /VD, !iTUE+ gӺ&[G{#Wݼ\TnB$BIW^{W>_\]^@]^\HǐOGt}x}\%H p;H PEhǼrUh_r4F'V8;ze4K5[ѫ3c62}-{P], uI(R4I'D/14LZypN@'XLiI֘DzQnI!c%UCٍHaLA$BRDpn<6?.bfF;;223`w|93QX'(`" !MMUCҥuz]}%$`P(ȷ.,䥧H?pZyW*wDz뇻;&Ne"@yLM<="##7MH8 "wŸWyXf֮w,up$EX$-=Ϥ i=zz; 4Oޟ8cD;%ީeG@'0Sdpj$E"RIUi:ZJ)ET݌J(ck,<2Zȑ-8AFk;Lw%7_|\e}8x8-f=D-3щ׵/˲׶N4$9 Hx wCRp eJ%Nb31#`N >60i@Ñaf6"d6X ,(E9B N+U*s$aa),.دsTjiWO WWnwt3UYmF&Ǩ4K <ˡTUZZj)t!;g s1&rO}KH#zTw*6 2>Q_Wޮ?yWrҾHRn)gPE G-r]-ٺ8#)c1y'5Xn=E'kt:W_5^S?qw}|}/X0C:ȷrOUH)zD\vB\rG̑N O4cC)#}VW [b'$wxe`.W-xv ?=,$*4r Đ )AT9у֌"sQW%#,RQϤ7uuRn\Va ZeWNr8Oe9/(23܌u=Χt>Zk*,LE̤lQ T]&8GۼJ}3@G;Bf|kqZ(! 2!6:AJf8*D[TbLP+8$7WKrF ;: DOQh~Vv|-Y|ubtҔ Ygda:h6m* E䚈@KB!2=$4pa[YClA?L ؙ *_ڼ[[6#[8_[B daUfՊ]c!E-(p4yOXJb)X_o/"?͟{~A^\YY+G` TYw}h>jT^O 0 Sqy=u5؈ P"pA?OPOZ['{Z6d͢Yṉ\_~}3M{wru=v77]]|W_|Wwk?}>]]M/ܒU", nd1iG*Cdٲ\"NSZJ!6A:⇨K֣hr Fr%}(NCHq1i~LeɎu JHOD5 =rq>u>y.-jANzY`Vg__N59ɂ@o/>;|8<7 ZnHOk~j- V@ir<.3"!>y̱@dx'ZlBbbOjheab3Cs|ccׄLz>uۛ}K)?'/{^}pokn772ϻ{k+Ghtؑw"&!" -<)I#(ɂŲP_{oKVxr{nr+ݭ7&l'ݡN|lcFپy:m4 &$a[kzKI@w( 0 1x7wq!8//WNgx>{1o^{NpXǶq:aYp8 PE)vf~wh糏樿[4rA2(<֍̜0 bȺ((Xγ|i{8jRJQ"f ˆ0yҥd(8l_Uiwx,D[4ס5&"i+$l\ 3Ý.)0Vw1' 'H ֆqJ\FȄgŨ`ꤾPF`ZL"\ZJiVan&8@'o{_{ojֳO,=K %afkkkڛy TI{+v]8'R&Y(3{±m)A1v7B¢D;k#Ӕ&)᭚"m V3DP"Dd\c55#[m_Wv+AxOwNՙ `V"AY*g&V*P%{7&XKbI +"ьBn|a>ʱሖQγOP:8k;/ȅH8ćc|+d Z~Q%Q #9g즨Ҍ2؉X @ibY(()3f#hͲ;7p7&2DGrQ!hK=9ڵIoᏴJ[.ڂ%ɠ˼Wa\4b,nt>n'S\jޭRjըf4͑gvReVin݃MӔGXxwLWWr^ץRQD0{h"mO}POi=?صm]B}g@QLC<~a.澱Au3wZtv̌œ{tO6*H)Rk6AiRqi Iޜ-l`336p@5anfpKEF\wsa⪓2KٕRUFon2DnƼoNʱ-؋OaB VC;>-ɩZHFnkr$_"OAӡ/@'>\ =,ouQ)5={瞈̓97d0d9RyPK"ea@2SHʤȌ0!QHݳyR˯] a#"bڄ >8Q5!k"r5ѵwqg IDATd&H0)f: J<>\q7m.E#3_l{[yf '#/#5`p < *scVԊ{MBa1Z\y48Ó q;xSx? I!GzOLKov*|iԊ`XpsCS&S`p )fw{&"/t_ϧts ͎p8$XТ^cEQ:SxTv,Jk:Zjje`& =WilX{[#a.LVXA1#K¤BS,<KOB=MPOi=HzFĖʗu:[{mQ$eia \E'`HP<| cvSEjJE0go-1!؆/3ö~YspK_t$I&76I莥ztOPfZ=KYsgW|@{97ͥn"B@st1Q>Y.`"JMj4zEQ32(ʅ*)a,lvx;%<kJq啥/ۯ~_/W:pJD\['%)qy+&D214GҤ(JJ\2%ڵɓSr8gc2hΙsUnċ9DN.BLpH0bF$'2MD-i?{z"%͗J1%-9G YȵC{W.Ûas.\ 4X:e a*B329} Ea$o~$g_薥-x3 B`_4(xE@^.Â,05Q+d"%et_]{M׷݉t'fdI q^%$0yI[z˾>J[Yw)UJx))H-ɝ}X-"(UmhWT>?xonnvnKAE12x"U~okKLѬnۻwsi}9uvk̬mǥެMuP!{Y[̬޽/2&A% Y&% z?l$K ːP\e23"Z~g e=r:}Xk}#k4/Pu/lV׹XSsk)"4Ѧ4t> y=+W8S]5>6"zTL3qO !@NAAM&M;wI@wYkͼCUU%sJIs]3S+q eNFּuY׵XQתVN>]v1 *Lɜk2ǼzHIEmnkKwą|.[Uֶ.OxXy{i/ܢvh*ײʔyҎ@l$&p U*{`j m9z<mExfY'lqɘH{6OfY f,wz0KJǔ0I(,QjFVB͋DHs_CC&!lX/,**C!n$ P8 aಖΚe`FPtw]);Sh.P>t#qZ-W-8©gKiETGE-2XȔYA'3)kdwV0Y]yww|?kXH%䴤ޏ?|~en RnYWz gv!d.PpFâ"@!7Y-a%/AQrkU::"(h`I"YҀ@jFVXa>zC B3D4D&i&a@JG.Do)wgI£4qc7Ua&aVqV)d3KF0('mn %7U͗p;^SS;%QNN@18NjcLpkBp&M nŎyF[PiЁMsIIXqMhBCP4ХaRW/Y?ycez{Dɉ|HSj_;Dq`@A&R0/>On_p3M)zzw>م[ԓ3ͫ&yuX5Նvs 2AbvC0MoFַ_}}>EL&i8jӼܟ9y ,rUyYn7A= $gGĺ)uSY5[kz^7vm4?p*M[+ίhKzC$qJ"*"DAa0nfN)pRQՔJ [;h̐lQܭu]j^Yi%Nj}FRkPK{>)֠T:~0v7ߜy)ucx6ey8-hTnI +{IiG~E[3qDH$&76' 4`Ff D6c=?]a?]][D+""VjY(sbHre$3`nfI"}zT#-~O/"iH/go -PS*{)I}c ‚jN5Ø5HW5S ZRc>_rIX H9\W+Qޗ18"ZfiB7;93TEQKt~XN|eVZ%{gCyxO߻9L?݇BDhbPf=t (f52t 46gnO/]N|.k`ZN;9k?jL9gn~)%h$my}wolD$"Bz^WϠ tGfm14]ķ" [*4!%rR_N Ue&T5HUzE0ͨ(JYCW:bW?y~z ~Èa䜓 sתky-"&įnMyyxxoӺM[Q-mYt*ߟd)::i"RHHFP$NBRy-6/υT|#:j RaaK?8/~>+g'O(` E*nnV`MP"rV3  A`)*jNfdkq4U¨Zk,HtGюo mYL9ڸ 0&ʈlڢXAS9[Ȼ{| >m OW_S9އ2U(1_59y&wN1'9LVEX 3,d&Jcǐ&fQ ElV펶bJIqu56)rT/Xc8w ;ܻyw(65ˏzƢyPbF#WPcKEdks߱ ~Oηk4 3_XO>=.`wЂ.ݭۄRۗ/^v;! 3B_,tA`tMuvGj_hn kV^9yaoyD]H"Vjmm)yw߿}%|Fc+ ZI,˼,< CFp6"*JYUj.͢I_P? =WPy=_seﻞ=K&}wuG% D"f9i^>Ԟma\<>M0b ͪ[x]|y:G%$ond|:2i2FIYhnaYc"ONc5ZUOSݥw/ץf!%+XKe8'o'PQ%PH20SbJ^dѭIayںO5(90DEEi8FYP Y1M0My 8nҪ,~A0TcZE`";ꭿG2;9!rZk˹dZg^5`c)] @x3̉ΉOEUIlN+ܹ;#FϪ- LW2v-h>nzCȉpὮm:z ':zu'G!01{s+l|l jb;?HO?(o)ZJƉXf`h&JjNAP⬬BD81#<%p&}!#ۜ^8dhJPwc+рoEm̽03&O~~z9=ܿ}ߖvCGT :$ƥ,Nojiޅ"P <@J`6aH\)sĒX!ΫU3!0)C؊I8u1#U+[%JIaW{#wW5Sj5|˪l-<w!BY$&ܓCMKFu=|`02V̷"|v¦kE\ Sa0c!X~Dc ,aJI%'YSf&ݲ)cN׸؆pjn6kC+UuX6|aji㔇)BeAqt^ô8{r\lڋpEkneZk/)jk8l0!Vjuq0˶wB{\A=~Xk;p%ksM\DB8:䔒D$8Hl?]DD4 |iRb둈݊A͢6*-Z9e }rX^uL!%I&EeRsp9 TC#~I~yy]XcKʷ\/"nF M3 q^f:D|{r:S L(ČH A&s)·ޥ&}>\LJ$.N0 ҂9rq4LasBkJ]Zq6jT+WfTLa);R@*I%!&`vqD>>.rݒU'2=+s 23um-8¶.2=C&SV0}P>ꊗw85f|o3~ޢE[E|*,(f.N:?<<ֲ IE XܽdžWvo-ARH`ܜEi7X3if,V)\v/Dn39dQ2{υpa͢4[Eьx G?_k6>Wŏ?@](D $1A/3M f2ڹDHģB @h=G D<I],<C#&S(ª@ )7Do_fPg⦋ [EYk"e09"ej_xoA|~8sN*8.J[x֓DwIO|-h֮|2/&DɊ$0<\,!qTs!)q>aTaČ^GZn 6Z( ǖeaܿwAY)1h;s=/G%7Ӌ7$iuO~]eYe y9RDTky*U=־ɖn뽞 y=ZAdWeO?fPj¢r΃R%Vծ.>{b'p1' wEY|<){{o~O^ߎ&cT2u:MFP2";Qu2J4<^CfN_~uj{8hv|KsF! DPAb%B^~rSߣX,W BI-yM@2 "!CVGy ?=IL;*7IfNA"YHU< kzInxcM\囓ݚ[AeӉXAbe01DžG]xڟ zT||zu> 'Pv%@]TJ[aՋX%xZP뿇s[1]N}pX$]s,< 2D HR$rP,PErB3|fkDS vohJX[FGtCZ{3[ q ѿOo7B;/w_mOHI#A{4Q(D!wRa쫭E2 9jJVأ∙s4B=([3#fr)}EFF&6?FpUf-w=g [ Ŧt @)(ZrROK-0JZ[/kY%E8`h5\JC$T_{`L6~B&@(Ax ]}Uѹ/^r{a/G̋ , CqyHu[/EH,j1`- w nn5%ՔqVx Q`%p{)Kֵ"?3Njm ֔8h)%w>JOhG"n=w*a>tu_+ozǩz!˷I.B M|H{x>T%%Ѭ])ID8a{7+܏Wv6%tLҼKOZxun8 2rhhB 5eZ;[f &)&à) o~:[ATg<qY`%e "~2[ԢB\FS[yfcvp4&FD` {Oq䪍!b]X0dut|vUy9_ZJj0m3kZ`jE[6iPo, ~,/|f^[˓|Я雳yi6 Եv@hMX)Kĉ;>NetX;m>x}9 IDATAzaq,l$5Gx֊hFr:VM?G+l~|: x<$JRp#W_ی&/k73+2 :rbcfs|[׷= ѝ``DROP& G{Edyn9h00@:eQ8=8ϼ5kN;jXZj@3剆")2:T"h*øʺ"Ir.yHrt&Jy@̭Y##2/*"u9}w~3~J90;!:́;p8Hݭ9js#H#;BNz^?kZœ8}oUW9g ,= [+oaG"߯*]RG?w SvZ' f踄>N"zSݯ&Fge֊b̭ֆ01Cqy({@L 1Kki',˲tpS9Sy/Mq#=U;+o\< |殗>m6ڸHA9.r&]/. U'ljO芸è)-Jh-e]N[u-N}Xĉȝ>6 X|nb–(gx7Y Ԝ܎f}aaF ~_~c_9g;=3B27\C6dڏe&\}$(-qG"lL3MO]!B?7J]¼mڪJ j[k04kZ@}a)ܦpO㘧PuQfML4]Г4#: wepo gfg"͆Ceb1 IКp>^]GH[Vh$0)O;^nٟ|٧+у1++Jk`dGG,`Dּz@HUyONȉCq|VPV5\0͐^!3d$Atcam:F,,,#}]lz8H/=<8ſ^9ۿSϧ˻vtnHBJŨU ƽ>S)sgJw{v\wR!tLgh 8Oj-΋- Q*8(g5< (r ͍z=óSXR2ȭKBN]*(ݪvXE8 '=E"PĢ@Q*Qͣ{!%t1 ~g*~wY_&v>S▽#"Q@yn^/^0H8"7fբ *,{] 2fiD`,L$HY44!<4dͪ99kN`ֺ;Y;l"'P)n,=-Z럦H.< CJZk-k1ٻ>;Obqz^y.ٴfW؇Խ'Va%ǵzw=YReQģJc[Oߏ<ּVkVy_qY^WǷx[e=T* nñm'4a;;:"E,NGA4UIvxu>~n˻\6G5!k/'vK"WptِbІ]H ]ș]9D#;1Cp 0$=^_뿔Vx`[v* 3JV5XՁR oS5+}LU}m( F Nt0ÉB)!< pbpػITXfA0]XݴP6W0!Җ#NoRIvYwcpcJ|DR8%ӔM AAD<ӣG$.Ox⪽N')[*u0&ioCuha/|x5ܼ^iÔXAfpG"$S  㠻]NV"j%yVN3ҴK c~,I="%/Uշ, "ĥ"WW= ZH3ٙKw%/眸NG"Q<f}~}D^QRUfܦb gᵐv4\ynԜؠ+<{׼,!oZ)Y$TJ饂zY/e}O3xmJ;`c.ULӸct=ҚѴx걆X[} bJ\<:My$O7F>ovr@1A<nQ)&'!UtPM3PU*Jv "Lђw=ݧ㻷n(Z}*zwH!GU.͜W ;sIysV굺9ɈBL`o `(;c'.ǖv7w6<I-u3cHLbT8:UZM4 Ul@s l$.ՊvWnG\t݂Wjx{ǯ˯^~}qCǸ$}yb?O! 3XH9/ ^=VSrC lWb:? V w\tz 6b5UaԚ(\f:ZU7 0N\2PU|\RICY@(cǪ댲xQ b{M7] # b`r>LO=P$I0^xu^x+-"9xZ=p/K@v. gY؜k14t:ug'Wa|Kh*}mƁUnnM|C魏jZ٪BdZ=ΥScfr|񛷟NQaD0GpBmf@Ugr f`BspӾ0+Oŧs8r@]}7=Kh!A+Z*̍ , UH,Ph-aO40b#,77D#W!Xa-GH,ZĴGlUB]/1nāTQgl>^ Jwe*}BY"Kmͅ8Jum#B$BYLCoޝ觿7?;e6&w^}ٖ}{[P"b5$0M͔%"m9"%q2P 0.E9\Pmm){BDv"*0Ǜy ` Wh< K9h3gv[QoDgӊg&['ZM'ϐ+fV( pDmeC?Lq;&.>@`[cPn⇻7AlED$ XQ*||Ox)ʎ괵"YUM.4f׻o@ IDAT 5sX(v^- Ca w( Ldz+j>l(m*%IP2Qf}jw?5702zXݕ;hG{FV )) !h;\@ѩ3cNs=tle.V@@V縻8`N>EZL ќMcV/IB!P.KK\Q#Ebwj+1̹B3ɫb.</N\V#]=OZqӂb1EgK&á -yɋu2 RI.ۮ:$pInꦥh-nB !B7i#µn^j9\PE;R:MxӒgsc%SC&dmv)-W5.}2)j*D̠.ҿn_iYVS؁ha2ۤ4 j밹qX"Gxrv'6&V 3)0qd xj-/~}O_)BaKD3+ɈF(t"l1RU!W ,̭V#W+t˴&ALnZs OӮ ͞Q  ܞ nhPr"+N+Uy'==Jvz p hee2VjɮkEnUS QT"#6_XJ-"Fȭןo1ڏ冺 mhgi-&3OI@߅;\}j)%QR-_8SK]\ܫV5yEҦK],(-1/˲,9/p A$pץv3 ;UXQ9ZD?ZkU73)MMݿ-IUMU׾#uɴYwkv]C-#1uﬓF.S^*lt}wgoy 4u@y b"*X%N ?Ovl!6kq 3)H/rVN= (nSFZS*֓tJm0sSׇ0a.Z,'|^̕{(TA+,j*>UgŬeQsE+aJG{M— *U"'RƆ= $5gvBk.uY8!thq10n)6^VK]u}$yl,` gs6o4#A0ӒjB".P.)isƈNlpk50#ɟ}H>eER%pKNҾZcUe@bЁx8Rtvr=A'"2|ܧ6TJ!rz܈PB5'g"'$Ė锭/?]UJ!a~0p^GLaf268"l: b?W-hRYr2KI;^kNd Zݕ0s!p0ܵ@'za"QuDA\+3|eDOF5-j=ŹrUOJ 6!j ü\gD4sC-݆Cd)~o79{ |n!@PVݟÊZH%w蛻O?EOFR kkG nlaoaw٥c+!!56X甼3 68s~臮K)D^ͪ,2M4ORb b)uCû01DDdL.y)ܝ%ت:18zs=)0q`ԥs4z2gu>?+B"7.ok1('"H LE= ʬrX9ݟdwJ]݉ 2%*j!Xg9^a5&1LanZ sT`]!-4Őg.+ `R 0^UM((-زR})VחU݉)½jav5j;99̟{r>KZ AcԗyaL8vA7a`&^\R-1Ռ grsOs&pŗLcɋ b(ŋ38T;:{=WsssBp,Mw7m 8p wpinڴظ`4?!1 ~xa@=tmPt疷FME5.d*jb""kL?d1Pp1':6Rիw{;.N55=ꥒSNԑ6yӻrIyeY/RB o)VLl(jFyiVɖPaI ) ]e XId H@N~VyF6!؆xB kʹY8Z&d'0i+sCj01keQcGm>=K̨]#q;*99iDk E5낞jKHXbTi=Ѐ$0qa+Wmw8lRb VmK3"EXj%ז2 ZPB1PbOlbcRB"1] P:hao?ޥ+;57FiZ\"6'B  SA g54frFjL2qW٬a$$QǜK^VP3_Qޗva$vmgڼ1muk{)b#x+;m=uɆS6jRS.E/agrH.&Սm4v 1wpRZIKi|qڄAXk?ncUY^`jij΀^v:Ux^+^/ɵ  ڢ+nuXcssoicyp 2X[fks߇^}^nVPrXF&7ԴM\hu0S1qbs%kɦJ IL̊j䁣q/U:^TpĽk&A_"On'P)̞^.<i`*&(n/HB3H8Cur(A ǰ>PfvV(7˓kU8"rx5$+({eF&d Um).i)0?U aQ疤dMZ0UH`K]EδBZADBpZy"0L$6QlFf‘NBy f8pD,Fn:nMӚ9 b2wi#JQ9FBV ,x ?V̸"xO6Z 0Qy#9GܼY ,ս1&s-nȠfjNFWC߽y 9j1Ihg:\#G̃fYRT_*^t}e)P+e,zmCY7"筕f zME,"sHV_S8UŴh^|/BʒB9qit'%,i{ Vd*DFDP"PEV4=x ׼3 od!ɩ,ҚˌZB2@6${庂Ds_nכlkXG"ϽA?x뎦{}9Si< wDYpuۅ}N Ƶ1| 찥)KvR–7o@2VDqKv-Ֆ nGB E4GIfDnmDI]o+`P_WdH*Y޾-ðQÔ+7HAsyAUΨ>{"͖E[͟ɻ%]h~\ DȣFbTO48/cmtnZ!PZ$gj5ϛq1b!pL!]qf}XſՁ{^zY߳ j.o.~AIղJn>F׹pw"抂 FJwl6iؤ( D<jn+̪.ssy
  • N<2eQͰZAD%;)9cεpVUf0 77'W+:+//i S&OFL-\Nc|@KM~s7|Zl)J~~ u0i/顣} A$b2ϊ\y*4.r4a:-d'[wy8Dy_ mcIP'k?hM̝"6zY aoqGs,LƎk-+@ӂ^J]jo1S0¿0!՝(8lf> {xXҢ8i+. *T@rqlEB ;kRATak$4yZ[ۖ۠iq|Y2嫪 ۧjm !b\beֲeZqy<ͧ4yy,yѼh)ڰWo@2gg I8f pn5SR%2IS٪Z=/|8[{ijQTbNHd GQ=L%W,,9ַ|UЧn}VbLyThK~[r2()zOsl3 ,9 lյ%+2^pO#3/ϑPgP~ZB} ?݊j71# q޺ 2Epo}y_#q`N4x)ſUй167mxj3}<&ݥjе * "k%yDpBAfUiS}0z.Sb:#\:5%0QHYq.q?!lz7H!  _I V=s5¦bhd߄tsgZۄ^\kq#!@poL- )?~5Ϗs3ΓF \) on{'__|A IDATާ"vqLΤ1UrJ"Wn8lSEȸOWn- s$1*3Rq*S-Ȼݰ6p}uC^4?t:EG+h!ctCono.txUKB~}B}I\Ȱie#A><ܓHSMɝK"$(]R8QE|/zY//}]k'6az}xfѷʧoNبv8j*j\jހtz`>iw9"yufnO^3Ef9.);Kp(qO-d*pBH ,uNoUc=?>Ɏ g%HDnɝU/M%eDЁ J#h~~Q_y/2QL,]YnJdÏvKy\dq6@p"Wm "Ҏ7wfZ.-E@04Hs>X4pQZjlT FWɬg72K0 Urz)RoϏi24L7`č' A(f ۾u C^b7bk6#sWo{@dSЩǥrKD"FcNwn?i|\tw5]S_i<ww石v6|Z;N"QHBigp8Nf/A\D"1,<5P[Ԫf)!ZkkTP/e YH-\gT [T>lwonuQ\MK.q\S>=)x9l%{)0=KʻM߃;͐Y'\;6洂TUYLV`%TG?XJjT;QEr Ict? "bOWWվM?LR4DTj0LƑ(*猹j3mKdAgC%rA̬͊5z[ɚ{ j? z""kPdejS"ԁB1J($(W]m6~͝~t Azv9^OcU&KX>WN}n& ofq_gE\7}Hs;DUki# R"pvgc?:ٳD &8~EgnoS2.#PW{_Y֊̬2)٤Lih@,A@[~?яa@d3$3$G3=}=}̈"k=CA_='h]vUfF}LM.;.Ak@r6VqMY\;h5%D8ZCH 鎱pzf&7l.\^bp GUo}^P!⤲;VDȀgzD]DR,i7P rn.dr͠uN:Xo w]Da2MDŪu1my3nnoonZK"8[Js`@_/noo__Tw_'O_Z<>z|'?M*usz8-_z8B5W {1|?fޟZ&}~_{tEAOԞ  <Yaͮ\^n.6q+TTS=.v|ww>N֯USS.zGO dhK wx(\#cGŭ{XòD]P GN26C8R0"76>(3sIr||9]iJ(}MQiЈ%T#|vb2;\<(hL L$W;Zjv.E t8KkD9V1%TX(L#yɺHF9^{kD,̽*wbIy{ӃTCg1u]hM5ix?u?<)#BV8ݿ|b]D'8zjH-0pvj6 ŷ>(R;Tr8ލ-(I4^0u UkGX/n%Z'ꛗ- |-OGKmaq+ܢ$Jh O^ @5 `s:Cg$t/_?~5w$y0Lُjw_v&c UYU=!H- }&Р ՈVyxZTqbbV~\K󐸞C5"!px nIFGa]5@zhC= ʂDQzA‰ߘLd;+c+@Q6[?K<_<}%XP@M!%{A 8ZazF/_g`Idʸ) G&'zˉH1 3!{nXz$lQ]D0qH%É ='-c)Yqj!wo.%0k:}ctQLpZS_iگoo~gϟ?~LKn6vRV\2"t:=*II٭ Ne(U%Yh[RJ=w~_?KR JYסPS97"F;^tjVUI2nҴMm6Z DX;.KVY6өo|ws<-Autp/5BDZHɛW뇗x"nnK:f4(#ՔEUj-S+/_if˻AJwgҝ{2聆fz'=#YMYIen`^fw2M{N|:uaS{f4  5Bz+VeW4y0RqH׿n%楻[  Ri/Kƚ(D[H!LXA/{WҳEx!iTA(`@;ݓH0E0"tZ5{\FMZ4`~=<}ol~/pۯO/|2K賍Z$-j?CTXK.e%0e#%I@ )Nt{̳pAXN ]咮(EmjBE=ώB|w cAQ0\\`̅Z+PnƈX!dmEK?pHUoDDȓś#iG'{0$.$9d㮥u] fX-`}s9WP rNsdfA]2Ij$1~s솤Ѭ $DIT\0>"csmQ%SZ4%"ܝT_^^^o^_[u=;[E{_mPY Z*-?o/>ƳOg'͏̹^^=_8 4raT[)*p5? )$ZKLnVkќ!ֺ1a zޯǥEV=lmO3RE (Y$ZV=DVB@єePf 4O5vQnC))_%y޿{4vc;cZg몕"cs]S\̧s\ ݄uU7kٲZkjgZۼezڬٹ;Hc={]G"D*iXd'E`aNUyDԏL6CD3@po+'ã"`L.9,U\ëw)U$i*)kPrzw?|Y'+27_b^CYNoċ-~^&=0N>??7 2wg.0 ׍\|x Cv ybAxKU%pØ=ひfXyg聤psLDR `PyރΩdw0R+kx5 2BV+A%`B8.Y!pA0e7~ow!I@katO9ʀ̀a6wi5|<( s֒~ʡp:wCفk0: D.!+]-ҟ9ZkZk3P}~_J95A=lkGM=`ܶKZ68_=^)AU^$puˏ@V0DsfmJrD$f5B"i,~aX0:v:{hcQuQ*@%y͌\93وZtXR:}M5;enE6m4*p__%`Q."P4TJ*C*6cz7A=+d15e0Vf4))aﮚ&^OGE)j/^yvxYڳ8U9H #p[ $ A7Y *.o_|wo~XғTƛׯ?ӟۯI|O~WEX\D3"Uòl/>yg 4BWGf[N'`zxr_b( |G4Aj.$yԒ0h03償:DgpNsGɔ,"sE}5B٩ u~jK$uz>[;|gf1ZR2`i;=ܥO_~Ց4%9v+ޯ:mxt/`FPPI9 0̌p(i7bǬ:KR-ȇ5ktB@0ޞola3ْRfl|:ݝN'oEE8w. !}{?8j.ٌcW>|g}ÿnޞpϿ6'|㏾}usa^X AX[:waޭf}SxxuiPJ~+z~.+$=.A%"gap،ڎa:qCHqg;f`HV#$ThZIsOxͱ rFG8~O!J_jzOѩz%d@sF($C2vyhrmi>@v!k&(ˆp:C8=x_Xsl5kMG410 r^v й*^Y|# O:>/-z]y>%wY2 -"e DykѪϧFV0%2*^DɻºWW zy@OQc|Wz^`jǻp8NGRY$YeZZ-։V0鈋ކmjV@ߐTƱLӶ! . ˔ [ u#2 ^xeIdxiճG%&м4,IdOss@jR8@ " TBq63͟|<=ڶXXV߼]o{ɓ<GGΚ$AšU%4h}XvYs KJ&X-8cl'u=wS**pp{3B)H9A7dձ k/9]\gb=Mn Hx)oOPXRT2%AAPP.FVre(yrhI-/߽~sw_? ԁ=BJi3攦5mgoux.?*[oF3z}ӻ E("C״:IH]\(%v܌Wq3%1SH)kg΃r'rw@`Rv<òJKmVft:ɚuj s]VQwDx 'oOʐnoʯ/|m8V IDAT[+~gg|uQg[V17@I^ORfHd^iZ;~_?q䫳c +'<}?1v&9Z j=zymZx[\"T-:7֮uOu;>RY:=H lB$Cꠏwͣf Ӡ9a+PV8jr" RLo{ʗ0 -dxx`[⭺y!6%gg#D'e?WDUGp J5-vT!wc۳nH %ofܜ( CѥEܚG< ~2=pEʹmf5c~o^$`AO2a,e(M*ݜnK,K;a;20 P|Vk[Ie(!)}Jw-QQM7eܠ/aw)9jRX}};Q]`ntV} b W ^m7aW4zVwqY<7ӜJN}~_Ba1[eXi'ጌG-CG-rιr|4@.bꐎY{u"D SB$L*=V͞j3To{Qk%\*PaVdEYV+Y5)"S.S9ĜVQI lUWw՛md(z;\%\X;a{$ӫ40ٶJxf4} | (w :t_ANp꜇~B`J2~܎ۡ )4vV Uc;xS̕7&9P:Ȃc]JY4SFգ=({zo,,q-{avdmv gO|wϖُweyo?KiLYu ,2$B@H.%^P)C)p{sP_A_(عM>+rVу<>A0 kgcƃ3bUeRWN{_D^" Ĕ jҖj&@sn e #1灚U4AQ-%|ݖ㏼5psHRQp//ݰnvrrCQqAUQM~o h=5] !GyhaK[hi^ADwUZ`y+)kQr<onnAS3Nâr3]EE40hRBF伜"Qksd-X,I\ĥs WLN)s5Cn-jVyQ(Ix?t'3JY7qw1/n\wWW4u{ҥBXc5o`G7t{ppֈ`e=]6>(2գGqr=r-"<pZDMjkc=DJITu Ud$it8Yy8Eڃ4p D4XM LD&Ua C`2ku^Jqɶm6L}oyMj*c4tXxuco9g{hޯ9]us=VO8 C>7 +6zmQw SWFWcLD#@ A1`,m\j:.~sف H˩4TPRx!T(% 2mwi( Z5̞clA=o_ob6HNH[Nt7p+ʹ0MΌC؆:du3 F@υК|AwEOEKSx5?Gy}^nN8-fND< [mDf$@jEcӑ?~<*Eƫ7fd(6,̱ Qs\#+b I;x:/"x&{XlCPwy A>`TE5'Q$wn NX_gHհmeI1M'is6Ykfb HH@&ɵͱ8UJvMӨY-X롤9H?1bYVBJ"!"©LYl6v)zB^䜅ԜD"4ϳ{u[ѳTh*0%9,=G("@-ޡ⢮YPa-fwVZ#jv ^=P$F*бNIW~ƷuqbP)q{YԥeSLR-ιE 7Q &n(2m|?GϗW)NQ4vU'ŷ`vD;!;z pTk c,P6珮O# h"4Rsyu*Ytqi4f~BID$1CĽ8jw| $K:IC%$R" YZ#uuJ02 lF"TL k͵ʳ_i-%wv~{7^+JU|/̡xe*s֐ @34h g4HUPFhr ItZnYq={>"U' МTp9Ow1!'{vw:ޝN5JJkaW{L`vO*rieN'Wv}gK]r@F(M)5n\K({#BØ>Ϟ~KԷoo8z}wċɳDXPv[WP~VPYActO+SOfw#== Za,GkQ\iJT1UzX^o77[Af76*bhaN,VJ9Cia[&!v$@)n3c&6m(rUmJWv.xDMhv2n"P1X;B$vF=dH{Bn져,w m}cYh9"i -M&MlΊp(1ݖI4 ν(LL%~xfYUt*c}(ljHu7qs6a͗ꭙ;"*zwA902&.$v05ShFKngV|Z5>磶htr_n"gba1k5@ )KAR@Z AhJi1sH (1Fp՜ĀZD$dffNU+ϓ-ӡL{!G%qRډnP3 L<˫_~_AKO.oC5SӪf`NAP #HSPidLww|s1W?7x1#z绱ƀLKb}o@otVcLn`_ $tS~r>.014&3X9+q3XRAH6RB@`+ 歩$SęA~W0A9 $ ) qjO"@ a_~}x{a>:y()FFǒG=g/Rp%dDʹVҦné#8֪VZJ.,̼TL( !%u-l (ZU} ](/^vg1msWӡK>M~y bYU+P^VuKsX581!Dx$`Znoق$ZZ-2P;Bjk5]PjQUP@4v7ðm<R7t{[~>f?_ʓ;޽:9'iSC 3 ]ĉٍݛ51'UnVXA=~sy"-qnX~jTهO~j@zZ%ޘLwddKU>ؓw?ߖ'K$ܔ&nf}]v1Vfn*>c6xR"R!ABi S2xjDh"6XфHM%tID^r% ă%Q>ޕ|UxKULO7a IDATɌ[ֆjpݥ3{#-N3#"xio)L˳3B<+#!j9䁃Wev0 م.vO`EԘb-MMB:e綱>|L,&)8LUMa؊DՖ3Zqk5KYbmOQ^TN<=6-)1]r/>m$̮h~$a̬&{@@0G`ffBK5effD QR CzqyӓG/_1GZZ_a'aK]{<)\#dU .! |gj c.Bh*FynozXA=HjшGֹe?z ,QZ2_=K}+I!2DnOOwٶohS ]#)xL &ǫM9R&@xvb\Ԫ ,Z.(L"ak؍gi082"qO>&+2TQFbՕ A8nkK+Ӝh-< sS{0ޢXW3U*3Bk I +JĤbέJkgf}Ndu44\[V3 fa [彔ᾆ2 Zc QcS:.N6mR rGZ>j _㙍 0:P0ږ^oxqb,٪=Zxsˑڗ+ Vj4vx/ϟONRD$8I鮝˓a5݃jP8]\޽Ү/nʒk!h6zQ?'g YB$dZ2uv2bԴyC myvw df ؄o a0'yԕM ! b'q[8kcy9r"84R 5 ։ @9ܫԖ"@f nh@P̔ Vj.s˩%}>Ja7Cb]ߟtiSbҰ'?櫋҂iv,S7 C l浺UUmJ"! LKбZh!K܆XQM>ne>٤_SQzw8\Q)F12Q3,&Pg77{ɌBȅ^_9̅$H6Uu/ 6L+j{Ƿ|l}"iui NUkE.uIXi4}os7۔O^|pU3>9ėϟ?&̲Ѵ RS[3dM`{\q6mf :LYv}egZNK pUv/ܥ"B"Nwx1 }c{qjOM#IDPBHNn2Y:>tkgn'5!*|9.8Vv#Wf aI9mb ɋ8j(%HsO! )ݪëIN`ѹ5qcIZw୭BPșx[d*Z& QԟR7iˆ<-) ɭUks%:rɥMZt%Zj5²4LUadUwT]͈(B$HmRKIk}aaq-fVk͵6PcҖ cܳS!\͌)XSok$`UKRrUK]RǾmn> ժ6ͤ}5-;_oVaev(E ȭ!G?|O~r{7JTW?\wgCx4~7;<=ߞơ$f&+QUK%3ᗟ~g*t/nS$KnE;à(;-sׅ(~펐D$q!mob^D7=ֵ*xi49jQHHdqj1W@LNL&f%@L7Rmc6޽z_^hJ`7W2`(ṰA ,!2s@@ιA1uSJ6ϳF$8w<==}fonoǟ/pJx[^}^ӳ>v=Y)-F6VITW>z\7u`ZLk~Kl3mqI<-b_e+F+Fm䔾<|"|j϶v:X ŇmNhR::*8i&?̶.$bl5Ůfv "iăx"+ĭsIMΤLb"JRR!E- yq ȏƖ{:*MY^.0Zkl/c(rw:&#Y DV),91/@ֺ.y*9R LT朧iSRH)F(fan/ #n/E+YHc]ߥEYȗ%sYajnJn+q朧y6}?@nҔiKy\nfVV-~ZLj^RJiS1}ݶ6C?~]HZu4-7fҙ9Bh5 ή{x_=wcBceo?/o޿532ٸmlƯ/~ÿ8pdx|s~֝ 1qFs~nvK)Yo=??' hy ܠmR2͓ Ѧ Sj)CcRj:}YY :ۭ< ?h284M8]jݭ $"LM;R5GTG2tyy͛)׆1I` />}|q ]8ݴiCXٻO)0L@wtN{J)s>櫫KU~w':ꐳ??=B$(9 6Ƙ|Bu#g7=VPq=jՌݷǘY[1x|_ydTC{7 ZĮS۪.^~?..4%I}9 @ B֚dr53nv{wmG$rā T_Ѻh3p$\`EQ8dPTݛovDR0XQ-`gSt%}w׏!Y,KHQd:c ^N&*.MKi mKQBh ;jx YZj\cQZ"7? 1ԫj.%׬V.)uB ^sej#>mnyy63Btre14_s,onjZkVM[30wF_]k8뇡n:zC5cjp=|WHJ;{i:ϸ<>(xSSn~/G_|1es5VJsLQ6Dxo&Zvvw%2U9S-jZQ:4^8f uVfcPҬ*puRO7~thqPG{/`1Sq@tgy􉜝!&'6&"uٔajC-canۥ݆ `7_=mmι|8<$9ϡ w럗 `khyVD 0rsUd!cU¡p󀔂Vv*Ixl$kcOŀЂ(y;;߉`ۊxQK-LFzA=~SeN[æكÑj#!W&-@0;R0X9jآ.`ىt7xJL`q #WB2,Ue,4g'KA-Z܁g܌u?apa ݄ͯG' 43{($2Fͯ\f٣@ JVy@l*mls#eHvBݽT|Ph-1[?B88jU*\[XCj-zkucl<3b1chN3`(5ɵ:KV >Xx %}m _"3]>UuUͶۅb2sMb#, Y:i [%nkUv$#whmdv+.9Wr9L>粟c?WW~=g1k,Mٹ*B)h=ܰ#fll.l&p"Te0jlVU=u[aFnȘ\Li8 `JN[&wJNB(" U'۸|xv;Gpt c8[m_Pc02 y+c A)"D_r[dxa  DLpvgp2'@A 6dqWA?-"Jl(vXH$2_WMV[IAF4[ \K߽fK ]BAas-˴Q*9)D2p-%-Zn\ĬEW7~w"js15qVmMiUXY? $^ PXx ~N/]0kbϸw. v6j58EHIY@۞H[F $}G&VݲՑuVwڀ: (D9gr#bVzqISKXβL~fV]jְ~{XX]5X̦GW&[.@  aVPjn]gVaf4Ǫk @DUMB!"^KkyZkm%+)HhUv6kZR7-SG}RwN^㫿5|( Fc(=,qy-:1{fJnF\ .f'/ :TpgPq7}.VP3"7h\>Q (N^zwϾpk%SSTKV OB!(uO? gg2aM* NPsW2m!0X~&6:H;p^y0$\ P T="J^pPp*kT IDAT->Pt @ L2- B3|+( c 2/?|MJ3q:\_}t/r# $"54 $f1*"&uCbFݫ5#r!@n)a&hźjґ9+5S0/ۿzQ6j뛻NsuKZQKMp@E')xBn ε̳VwA0&K&z'0u*Gs۹Y=;;nt]zoJ$,▫y!ŐjR4pABz-^~GO7CG~׿z͛a)3}x;·_jf{A}Ϟb*ȫT}kŅ٢pXE+EeFWuS8aNysB-KdŐELgG9nRlyHu6۞vCnZYmvh}(&S)\p\=>,Tq.o y]C@MN`"nQĪnPZJ)Zo-E8R'Sܠ&ZZ 1ɠKԒKɥj^,AnVRkV-:M4ݦ)pLcApdhnG0w&fiAX/3n;h ISRkZeiZ⊪s9܎j&~uC`5c 7ZL͈L;$` ]ePDB!w1֬B"1h!uכqy@:PbvJo__#:\"i:V)1Tas6l?KϞa3h:Nf)݅`ͨg0VݏWPNdf@ 9.Hm,ZZԅ9rB$ v=!Dtܰ'q祹"PDD9s#סqC@$esquFƥX#( 7_yɳbat}ywj7`6soZm.0Peؤn41q#kEVŬ VbN&7Dh3{p_ [ @LI7nq43S8~Anph6/²,:e QzU*YUn» ;XQjK㶰XdG*;~< ewOOwfyvSJ9gUuhLTl. 4{^,),nusԋo}ÿ5HtW!>mO'z\7z0>_{?m{ӂ@_kkG ƴLFZ%*\ 8S|-G'~9?;AF4^iaSOOCxL3!VDI}wNp"aK4 zA s>i2CV6'rkqiIRkiɵl)hWKF`%MœXqXlFXOvIXt9\K=_Vۤ͌ԥ@‚sm~t,@,,$$G?.W3B`[vךL n,v6ٜK#sԅvB`WjTZYKVE_H3VZs8iUVs\.m۳ӓ0 ׆zD]^7z)sRRM B`r]7斀Ycj؄B*jSN%g1cԏw)q,jPUrE`uXVkpԸw2ZLFs*UͪܕaĤ!`Y,;C ;9L|lX,>wOu*:*vٓ)+`d 'mJ h38vsۉm)!Fv p!4%k+Z y !ZbT[h0QF @@oTB`"k PK%F#I=D99wCϿC]I q}ysuq|H} "!\߾}w>\vVvǪT ZjSDs퇡$b:YxjΥsUZ1P2@]c)ET}a3s0gT4N̕t!B#ԽZ0ͷqiԜJjZMp{sf,䙩tT6R6# ԡs5$۫j-A!ݏ+!N.D\Mӯ{֚pw3,8c3LU]f=2Iɖꪌp7 l7 P8fѶTA 2|*-h9ۺZAEx1Ro5'l$EXN gL )zYİnC(QY5na$=Xj9R\yS?:nD٪' 0&ecr{y??+ f:l0FXo_^ޖVDHRA9gU?' =>7+VJHb1f-ͩ# y`2A@ @(b w Er4OxwϗŴĶ=[AHD?UP֧i1¹.T bRNgT߳$\P˜vuyA(K3?_&?~T)B qw Xp A1]í\Kh Q[h3kBE\d2C`*2jG맱 XQ&&+zHc8wT axv"%$M"a'{G?E,,qAY>>` , K@eRE-<|2.dRTORp'a~Sx SYGh6()ÜQ2YE"R]idcl3іmC^ch "Jnl0snAY \Gcxý{! 3!+a6 èՙ٨=a m[C3~"9ǂoǿϷDZݟ&:3$6k+P|·+: pc&ai/||־}{w^F gPG־crssrn[߶|>: ޢw0Z",E=33q*'}؉"fJxvރ,cx8HEhjBZDT_Lv%mPv,ڱx%bG ,.c|5Ӄom7a.+ݮqK>2ϊ=L31:O盛ͱ4"u:|<qV<|,߽{rŗǟ_|{}曻_u[jUYA" ҧ >m"'^GW9%O71J *|XI7?.OoO?O"2($f'Fs-G}qNKEx.1Uw#A[ Iag$4+0CKCo mkҁF&!EQy)1@KpaHR 6K0sSs@$;uF09Oy\;"돼1mhNDVKM)1=..'ݙC q 32TED2"ƮFz1n01 eֶ.ʅN`&R$$4R]2w @p%I" ˶mۺ׵ sRTR+bY{7 ^/ú^-iycd`Ny ‡箍'K~tne@|ޛs%"b]vzxTe9zmՂpz{'?}yj~x?p|uro?_gZOԧi}Z. |[D Gݙ݉smI67O$5X&gJ??ɛr~x1)2 DNᨯ^NzA%[ibu`(` :W#t)9 F0ڶ=lv'P,`CQH2"\YzT$NcK4 & &")pz..<1h^DY؈LºOf;șɃ/Mnfxvg- 昽i>>E3.a-Ė8-.0̑ED;!94*C1쁻" a%f2Qqa;n<}nۻmypz80SUsl}][kk L(Hcvq9ݯuZr)Df-(]Q ڶm}n<䒢VFH<ש;usJQ:{W  }‹,itop;O!2q;Jv T9@ư<1i ϯ'Mw[VY0 ;Dі~A$" G3g>9aUjUi⧘` V (@-wr1,8Tj[祍>jAkm[e-dCa6:zu[#Z9{߼c[K+Fp۲mFEŀ#I>F \2}Lp"e?nɠfG|a:J { fg9^]y6>"“ eCTla!>L|F>@¯|U^]t>MIK$EX=` &%wXRT;[n_ޟ% ȍuρNC9XסX|^ mt!RalN㻏b (Qyh lQ f[a"bH|)>#-@}Ǹu?=avA11aoJom*P;x/_ *84 N_XOm}]ZQ\T$"@4[T 0U-#67e`U1ư0T̑bQQU#b]LW{b-_qdXAG޻m 'et{xsu%TSk޼/(^1_}ӏj/^/uB IDATb\_zsSxM)z{{P%}>Oՠv[ZX.lY.NcXdFagf_zhU: za'|n8-wz𽋼C)51Zl7/3q}SeV$p3><,(4ġ@P YPoR0J;Aу@ZH-:W VbI ࠰6p7cMQJQI8G9QLe&yh߃H3Ķhv |J_`Dq0^ {0.e}KE,4ǜxբVsm=7ϙxo1AN6;!F=YT"8 ƴ+'-Z&.֩N{u]u]yg:\Ad@sZ ׀8Y9=BJ/ =ID ٣p'616`P9V9'.38 x9607xXP_6`XmŶRW/Te][¤ ahcE|`Xqܽw}{}ކm#HAg`x+X,JlΌxcgd)8vޓ|rg3EO͠ZKZT$h0: CG_`gࠓ-ynS ŽLI!ESڳSp#W{,%0"_Msul[w;Xa"$JcR([w?'p-5]\e]mY_j>w^9fixVqg§ >Z *]DZXv~$IXn`[>.8Crq@d"ċkΏ'w\M[U+&&i t91+p|U&E!I. :1Iu>`BTR Z4SJxH7NpO6m Q9lpp`"bU~ zdK9!6z${.st T!rS3mIVd>jBAĒBZ תn6!T[{='41r.]HKWpG4F8y: e'%8>Džy}}ϰ3Oԇ2!لNnpBTĄ] NH0Ì᱒Z?{[VN/Mjm':2"2[K{{b 0i l/WP% vA  6^͛/W1I@ku BS)%OU_l0?{ݻOi60,M! @tM GsYZ|f@yd.^xx^py"#S90d WtO=F K藏[8ETX`f1"꽷2 Rk"u:޿xz[ \+g?ŏ??ë <ɫOԧi}ZTf? yXvQyU3D(z;UDR]#fcxu˿nPM ''Ԛl&؄QkTwRB9̝L.wH)-K7svc7^Sh+{ U*XN\&թZ*X>ov,n$6vX+3s/w99i,9yJ,=EP˛zRiF Y ct&u[g: RP^\O:Ui0,\_΁z)DrEgAAs9a) ;Ƃ{w_|$rCQb](:oew…d v `ֱ1AJ/)^ފvPrED1ꗿh?gHc|I zCLudfjz:I:`X,bÇ`*r Z! ۱y.Khl胑.g_~_}>O뷵*L"Z ePRsqnxOaLL'3DS3 S ^^篦W7|3ǤMe)Tmu1J;s@Ti4:1`A{IIQ3#F$"MO ȕ:F+Ǒ& &"Y3eRΤ4ٸf3-muiἬ(eR.UJ-jqt%1Y[{{iE\GNu!ڵ% zdg5*8L njν b" 4 {PCux<5 {﹫'Ouw}{O/N#As O[)\ #b]x|L\H'"ڲ-6q׻(WWAScD#vák$jmK)>|+86,D0LfhO\<1"ЇyzXt6[YF$DE:>lY۰p*2Y* Q C̈ER֜~U{!`@&cC~(}`/7\{zvHĉX(NSV˲W_˗6¼-R%طtsןzyz3+ًY~m]>UP֧i@E9z$]rK);?6RHD"0G60\ '9ՄIRt՚ox޿k6cܾi$ X F QDoNfy/"Tkhq'!,h-8cS_jS-B"`rG84RgvqH(}th[߶۲˲M{p0-qx[%-DX;"nD-<7.Sv0<TgI^eoc]rjv>lۚ#v-q9$4h %rj8|=)' Nϗ}뒙gF/^>I1rZjRh Pkt3y<O}n}͂}l:+>3U|0-B9 qcaOHg}}Fn{a<BBT3)*D&"u!Hh2K_m\=׿xP)1ZW.2J Ie(pVXj<~{˿AԞ)Kdֱ.o)#2uM9 Ѫu"c>>D1 \*tuWz<Ϊ0Zon$ 5=ZU’May-TKi%^ 'ѭ+'99,BL.*VuԮԮuP7mP["|Zqn#(f_/w'acԪU˽>pIk v~Sj5Lk1zl0-MTT(L,˺oNiևi{w|[ۛ/| xwoo>Or%6R)=>o.씛pɌ"JL?sH#ie7B,dETFPxu ö=ѷ_7pg/`* ]#$DN,Sb`ÞHfNd=b%DWs>J"@ $:e8ܼwkt>u]m FթhB(,hY1ưa6̇_I3 7az}bvSDUl4+inK(̢ZT]ĉU77W$ piYA$጖|rAz45dQe{.=q=+(4ADwk,YDED%;+{Q􂍰[α7F` >nf=7t1߫".f zҾWM}Oz鶝.}>۴4BUǫ/nVZ~㽻7~͛2ɛ?gZ@ڶo5wj-sww4O~{+(JD,<<4 ; ]NU;J 9w[rЙ@\6b66K~UAnf;L[*`"by98E(ԭѷ޶v:Osxu'`AJs6,+Cn` "F2UxGY*,f5VYHEr!ŸSkRejv]XUKpW4RpS=jU!Yi;}xz_e_v9}K@2\\1&1Tkqs@^;<|nң`J)\ k!,(Cue;/K޻#kq0>+xlw\r^ o^́6|g+ τť[p:ۇ{;} $z9`a'!ų=  , ] `ŀ5}ܷaw򷸧?otbkc&f{pJo/㯾'rb L=CDQxڲS_νHj]| )77<|>O@iqS\b_ {pR 4D3~b]2AqTl;(7j֮+bp߰,lPH:}:g4Cz@f&L"HC^kQR h>?V8G-%Xh(=`;-Yl) ƶuYu]emyno74թB tE҅ޞǃaf6z>,)F܆{gff8~pJūqєD$ư1:B}^.<9-{6bc}l[{ wv}P !.* k߶jm+6z.S+ HK#TfHefC</"Ey͡'ZJ-\yEKIV!̷wwam`x`αp n><I,i_Z9=O1=PQ-5!9[anm[[t޶hO4g1 S{ R`[-[#kaxP?Upg$J:'3(@a$Ӷ>tlm?{I,=lfҭuϴF>;  @%HizC6l"-pw胙Gfi UVedsywiDlm4HQA K7GW4ᗿ?}k $mSDn~<,sz Ce^tY൚p$Bd1`RlV CSfryyO?~g$024-)1#[U+݀HDIEx6Pz}L>3GŢ{)JUk0#'&QoBdeeOePi1l.% IDATS CE{;n{l}2&7Zͯ=#(1Y|Pt#rRp?g4g0 9#CZuAGCcNC:(Qp՘+`ݛ]k8{woi*[rz3#wNӌ,᮪ebA0 -Ve)ZJ]֢U0lU)-ț\#´c9%xtW"KݛW_^]^7C+/; [ :q i/ףDtIPAcR=ixFmQCm(NsNIDD0iu8,K5[{xlʯq xlXUpvgXRjpz$2dDUL3wW`]zvqUwSvr%' /Ua'1@Op}Yv4n$;#IH(H@ zޮUΗ(K>/_~$bmفA-GnN'vAg!9PAX WX `nnW׈ra),ƒ iƈV:.!\j<ݎ?O8qu^T01'Dʀ"aAAG] y]]V]ID$,Ic\98i]lki8U BA-z=GwsHHTx$]I=o 0lHDgUry^J\[z2zߎ[''XM]lI|˫B\[ 86b2]jRpXje0i*@j!N>O哧 ?x챼>x/㫫yLFȀQEhROb  :vXk #I$Z4r:-ke9=ⰣiyŨ̈v/F^)A")ƭ#"t ^Gu>J[lѮ|m`+ =zyٖY7ہaXpO7۱)BkP@u@hjE6"S v_Aݯu~Si렾7_ͣQ]w[6@znWWk|xyʧ#4N4nk9츔/56*st0/pXp*4<8$ qG&BbNl=MVwKÐ9]ð6DE4W^*V# rlI]_j)e~S)̓$ISS>Dbe^RlFkZ,e2-ΝۆĒ ik@bEXx ۍ`_83 .\zpQ}w{S1ݩRܪa8Um#׺f7sG01&1nn{/(9(j԰vXGkְz:9ְ(M-̩6  ׉ ""U[:Mnwvy:Բ{"l7[vs,s  Ӑ$1L&hEBfBZSF`!]EDr09De՛KVJmW3DC##@168RHrF33ϧxvJeBplZ- :Gz݂Ж7zyz\(@[S0 p{skލ xz*F9G$a+uPgzWO/a B/?w !vdR6%"V9BJ^j'O?w3jFR6sD(lj9eQ⎄ાT-Ṷ8V4G4m$%&<|_>s{wΓGNEu)q6 21IeApj3jp'`j-:oLmsy_I!D9!C '*c]X*9`FS5 DtMuEj6nvk35}5t;z^ߺ hSL bl'g[IafsQj,0[5U )k#,Tx,FneV|ؽrhM_[AES!ܵXOL؝qܞ}EcU<p±* \6'I9,v{T¡P /2 ]/PeV^L*{06p!fF&bT`TU/+ ILjXLv % a Pj-,uYy.30'!k˼̥8 KScjRYd;>-px|Y?/&;),@}ֺo |28B%E7_N?_@ e`[GR|0iT2"B@[v5C8Fwn"ꈵ>DWZxX cE/ r⻗Wo^~wߝXff 4`ARJ!")gM)['":o b@w=\xZ:PHl62Qe1zlUji)K^0T5Gbo)@ŕB[ CUU0c"`o#nfWg:kOh B 6=~|9֔TUa@H*:kYaLq󢅙$d"ЪZ5 eݮWP~ݯ"n #o {K/M`&5]݀`E!lqy`'83EqCOX*'P~= ( Ĵjִ3 <c dFd$ j5p N!cՖ(r$#:[k]Fr U{U%"ӏ! jUꁍ&Y20 T_sT Al=sV@UsW@t[ qRjc5 I}ޖhмZLɿ ԫ Swosder9qJ!{m,0Y$K2u\ 14TU[ޟ.ZXogF o3MvgnG#spe2k7!b͌ ,B Ø1L:m3a~VA!5W J n9@]R*Z9={x[eޝRDꞨVo.9< ӑA)u(xBXH0WO:-WwZ==H6 ikVQ͵J]V2*eysm7?OO~,c7@r΂ Qkiy5(18!8(̥mXH(" S3xG#s4TZ!mMʧ۩[@/ax 1/< :z/Mj9 Has @- D"fZ-VTC8 coVu>Js/z` Rk.[(ŢZzcBpN< 5ŒȚauh7SuU8vojO#VVp Ҝo k|CdӴsEt\],%<Q8,y䔑XCuASaaLN/_+utuSDoKwFU hBoc&"Owt\U"z`an``T7Wq9e@v Hm(#;!:b HE7Kl IŤ A&ND̂,ȹQ{\& <|f3I YJ}&4 =l,=VA92z)42DR`d@"IA"blլeBGK2~XZ"džUr4"^LLq!R%nԽ\jZZkAsE*0Xn&dsv9=;9999=lO6)a) $%uX%I, \έ2ZZtv(a""14\-SJ =dMW:խDmdGy@H=mme0D& fb#`xt>s4We^wh6 Q f>z0 ^za}1{><[$pn!!f7'9^0OGȹF4s77_]40_:#naAw1(B0ĐdO6Ko/?SW?]nq PD{cEn"ˏ|ڰf7L@V_=yT~ﻩ7"{D<""#$"9!!v@!Z$'ZyB@Y?Gps-mhUDۡ b0A2ptq pǦ[&⦱n&cqb]ABȤ+8֒ |)uY.2yE5VOu E8XP $)khZT(V޵1]ia޴MC68D2ANN?yATdQ3G*( Ah}o_<=O&kkχw6lԐDHHt0t_~ВZE$5*"'$Xzwz ؏M` XA x`UA sLUqsZRnK)8,2̠T @9_ IDATdh&,@2)5f{XCt!7]b4e22 G @ZJH@5`jZŪE d!QyuuRF-@=ܫGjVVdE5<ޮ8ZݝR cbQ:]G ,B9xzy|3@za`ui*2%a^N$L"X})m}u#?aE@"uCgFP %@ t sP5UumE~3S%@u=^KlB!b3!B53[6VbmP"vX)Ɂ%qJaeQ9'$,H@˘ P H+!#gNjXyQ'u'$HԠWᤡZuY2Y5"ьɺҚvxn?Ͽ9*HBX?9 gxĊk># 0ZՀB0Ͱl,cP\<+:L@jqk !\Bus x9͘sAQýh6$;)U 0$jV:d" [C3= +:'ajtzr "Di@4p8vyӏs02EDZmN,pZeI6m6)s8IP"cqTCjdN-U˲,sŎ輣{S}0j6cӘ4qUU# ++Ό"<Id֠dw=sYRr/Z=+C("":asCPqCwuU}s uSuVK]DRr{بZZP@98doc*Pw8lN6'gۓpr7ۆRiSmXwkj\_U=jeTIj,"CBɬ؂E|Zc>W5/<$;4q[6X2$)$R [A-7c*9q4D &lm_Gmض;mAaZ?oxf)u""-9߱}>[ۤU4+ĉ`U=7H&2qH !Y:gu}٫铏o>W_y}wd7(VN H 쾘s GB8g_r3cNp=ï><:/mW; ta/o2Nz?zɃ( "PH${H)u?y 2[@U*m.+ Aފ^mK;IP-yvG"a33a@掀?)b@rO0Iv^sӯ_ĦBՌ׸Nk0M?y|ζĘ!ji7W/W_wT4񮋦 B iw-BbIBja"9݋z)%;:swjI%Donu#Q R&y.nv(pN$$A2lh*׍BX_ŭ- ]!CL,V>sAC΄h AbMѭAP=,"Tu)G ԼhNpr[WK)cs"D=X8"T(2x4dA[f\ËWr6p a7:^ O74/Ϳ.C/'vCzt6l(IhkޮEsNgg'Ø1{mB(8C?1sN9"...#BIԪ닋7S)yVA!0 秵.1Fj2WP~ݯ ʚdG!TٔgPf֡d, DĄYHR LTMBɈ,e'F 8Ey?_7V9FL2RIZJa[v A<4lx!e$W)RRJLeLIu9{ƃuxLK*c$dč{9{Yz9mqypX]< JSͻ%Ac)B8䁾nyRXc؛1]5͘H&(B`K 6SnM L$U5ĠDADn{idõa,XWUK1NDpd3Jܔ7R52x&5= m8o$j5zUOuJ!@󬦈ee` _#ш՚ܽ)8bFUGeDe=@T-5RTLDv8њZWw@g.(N a9?Zbpӱ",%a `u ʺ_0p aiP.~77LO}^APջzCP0#!Ga "7pB#H0 Pg.: 4VK_zzq^]^wKhu N v'/\$=xdU{Jf`Ala@(2mW͟|7>P:xP Mӳ{h>, 0L8MWz_?ֳo?=߀evR&N,r,m1mO_|mgů/[O&֣3o=0ĤO˄*Ո p} Ifͺ~.94ɼ2=j5Y"C'Q|׽TAFʪ(̜f"֛jƱӷ1u8|CVB3iwB& W$ebh,Dfm7Q:@\j(cЁ>84`8'}k"w\zMaY!qZjhfLQDVUJ Z9TBQ,o//.6j#ĘDC] H򮂺[wn 1}$nn2[W+"ܗu LP  ,Q5Es pRkř2C4%'7Rio|ũ@ D "<ڗH~&H/^ Wbn)Ft uܚ-T+BD."Zh 8a-ԁ{yiZH|$f.e'@ e[y!UU]\ k$#a RVP'( |ӖfUMaĿ/gPRԐR8zMͻ4s# zKzN[ѪEn773b0Sø^zӮ]n1)hRT\j%#{ (5NNay y9Mq "(y_:a8,CHr-TM!D:~'vyO~|uuqr~A-v*<ֻJHd4Spk P1À(Z Ó'?ypvvz줰t}<l3O^n?>[t?C9}}kk_ITW6$'* @gTt&;w$6X€#98C|wgΰVؾ"Rq;D`3_^nM'}o._϶m!T1Fʪr)E__/_/wo\??7!lQ~M7[ހL9^]ܲ7,Qk](p8'ԒyZIqUMtOm<[k,̵{'LTí;sՎ?"-wpFP; >O3"JaO Z`3 GxS@CYwlG|f80P3lA9rF:2 '_;}x-ȽIaWg$jB#bkggǧ7~?vn什Z#5R ÆXքl\J6[*u APb76S☰ٔQ1~.EŢ glI8Xvt;;- 8GP7+]Ϸx9N zg{F -#&y =H4pXE<ẅY9Zֻ57x-HEJ e"\ Ҡfm޷ pVsSsNsk nah-ЃԀa*;,' S?d 7fn01x䔤Yb(375_ TPD'CdtlMkꈲ;UP"$BJAhijݼL~s'.ff@gķdJfsֳa8q5 L{Cb?uƕW[ 'җBDtkDP ۀa ?H Tiq|+2A#`>HT c~jKo%1Paڣ}ӳP{YWWv`55 FBܲ^*(L!͂qUpv:=[jaNOժvwٽZTyr6>{]vx1&]#|z{=k3ãGz20%@2-|zGT#ɫ[QlfBbS`Ab5_G\EF0..'8CPO='̄puTòѿ~>=OC{Wp`/0dLH% 4YI1! Qڟ:93R[.!֏O%9zyXvHBHakEpYXs9:L=,\IS=Z NjMyh7ۅS䤥#`…,&Ahs8d:K p52+:_xNz #9>?CK,2# [k5=]VUպyfmii?On7MHG2#-Cyͼ>?yӳtZWb@tp U/:ayк\_??,``pz N&Ɖa&ZJ`l" 0H6}̾?jBpYCA7[+7{+X╦yOߺhf <"BA]e(FİkjLj/م7hH躤4]77̥j,GLY r:4/4;@Z gާ 4sw`bo*ߺaStZ8TBvGb.)wNq>b yګ #=hN*f BM RfںW"yK7Ͻ!p nݭs Bs4LX9cN$‡&23HDQ t@ӈ֝0ZC+:K ̛^g;cP\gi\2$˨yD*1Ru( ͥ.cާy{ AffpDRJ:VXJ),Eɺ[6ck;G8 EDB[Z뭻e9RoUPdRqHRfQKw89h֢705b 9*1`V"_GW[3#sbcsm:rsu{zsu̥ոƦ[-%XDw0p m箭' jW RZ•^j]b\Q 9X1 3SQt4"n'΄.-crӎ8{[lnH̀tw<_}f>ܫuRXUM_#\M#pk}߫*GWmMոF$3yn?~z|jdq5RT}V'V jeUtC:o/ųO'}ʙ򨸕!'^ cA`\I:0 n$[+h@xVL %  E"=a*)p4_2R]X":!SD,1pH@%T5,"/\nIC*`bwwpp ^ Y$&h$XG)LD|4.ag e XjUE[3EPJSk}Ұ@BT #`8j\ 2adq|{28I04W_\]Ο_>yt'PZ[mn_nDKJ0 X("Ӵ\~&7ePXdOJn!C.+)^/*uk勅8G-BX$qx8̥" T$`(nKP k" Cmzvt>kV s7t4AdɵlƺG8R ŢssS % RPKRkf"FB@p 'w_&4Af  t .0PÛyM(|Сr4E ׁ|n`*  !^ɒ2-V ϯ7Hկ=ӷ}0{_PU,TYvmnnn}jʵunkT2==@ť# yTWW]~o.>|e[ł`I$ GlW9뿱6]/{zHʼn0),a `Q59un5Wnn8+<HP{z=}eZLhL9ZNoTPQ-iW #桖RK"E)B  cq13\M@&GoǟRx@ A:?>-OZ R pUjTit[߾Ϳ4.= 8#| 5  d%'2z~M7Xv 0PH |iT,iψy/x9NA^fA1ChJ#eyggu ʬ$ w BaH=7_n]-ܘfIa*EHGg9IBl8h5=YjU iofs5O "< T6i?4Iڕӛ1츙G.*?[Q^mCag]rq3kP֔ jwymNǢsn7Vu\Q; kGUon֮8RK'.RXYW$E0IZ}5VU AJ@%C~U8"$PRDwSU苻0cZG{1+h%È,wO/_o>sߍ*C]d"њ@@=42{jW5dulm駟:?_ڻ_F&0o,izt{lwf=q|{?9?5O.@r$:@'W# ;`qWhͼB'/N~t[(Ô8Y`P۠:'Kο/ӏ>~9} 0:/@@ni@wkSc E~@48)>ul^`NS acfQc~1Ymjzd~Qpfw@eơB›94%q=njD@<1Q8@8RtȺSsSS' eavxL:UrjPfA(AfBi~zZz>jQt3GP5Mav30n?^>}[O?|t,PY0T^JLfa Sa(EE!BWiNuߴ𮂺[wn}_M-Ёw!`F rS 18Glg +;bBh掻.b'vj*&r T`Fk!K1#`@0w5WںEء7aݼ*r@KHSC)iLTDV`gܭpm߷n!"kNOmZfK7,:\Q "n*Xs2UًFNĆ:MIZa|̘nu]_nKLf{4v^a2YZ #mrt j#1D@(QDʺ8?_49b0yA 21Y#'$M[k;GA2㯙Q$)ja%|导_~֣O_|xq+Nd5 ysP<#;-gR|{ lRP yt8h`!,6/0__O_F꽄20epA D7Ӧ4,3pwTXY3!0 R! ''D$F 0S[9p\[L7c%l&"{/es0"<w0w$^2y߽MQ) fs ٟ#_d{ @d&A`ڭ >gzcn?{G! ݑBDUխcx)1(ɝE)BLaθ!zbٿxރO{O;Smv\^^n1,sH@_JSː٪2 ™x}2,n3͝P?arWAݭu~.\j7/|#d#_fh:0H:IXH1v4[pFj!u G0[Si˄F`D0pjW{l+wB!xcf02(vHœ3wsZ'nQ}IJ{az!(ɁH,% d+#!p&B 0K)cyޛ;*nT;zqg'vow7?<~Կ`Zڭs^1IEZ8"nM.D?;}|ff6M=vj{yl6e*2=[(PWֽ7 ΅LM;3PɤBW SԚf,Go-LM>WmB0RTba)ČR`vFoZfቖ t%x.8D&H- ԻJ'~~ރR鳗_]v޽GLP U&ts<.@N$Dzp!->vgg)d"w^\=tD2FOiҁi{w?Jw?~ a;z.HD\%*z>ܭlԲ#FQ"(B]%U^dև'3"x8A9ƒ.Ô ޻z. $?%فq38ho|ĸn͠nZwl,J+!BVu>Iy*"0 ax4ZfE *ǀ'`4=E\EhO(`rpf`aU)H [b"rS5<ϓ?~pGw??vQUsCR {#!f$uph.TV8!kw`@v"R6d8Ngݺ[w竎?/nP`/Iv&Bb@$J4TD#7܃6j~(!Lͽ )m\Mrwr.{3pp Vd :g?opk9eD@ʴ뼟]oTs.$0P);1!-ɽ6'.EKbpRLDRU^~_Zm28V~0#SnMvu<7L]8L15Sm7}9 N!d~P-z7n_T/>X^-@>Rn\O]g7C% LjU{,sa<&y!"#32{DNC8r @+γΓN{ӎqUONφJP䉊( S"6AB(*Ά2s!'L@J%KfGO?y:7<{od<=;99YOJ tϸ'6x[92 P1IZ8B\c(Z2 nU _>Ňj*%0$g:X" "d oUO뇧OQA &}{Si߿>=Ab*MzAb0HneDIBݻ!o?x!NcY⼛:C ɲ<f;XD80t>[)ͬs&C]UމE o3QΩ[HI"%Q5i IDATz]wz[>:azwNL 3p{I=A̲V'a$~?u@07@R@Fa_'_k nݭ)?iIoL3B"D\G2dJ$I)`%ҟ +1pt!9 H!H#Ǽ:NFg|=ES瞜QE80o`Isݾf 0j`)a$ ,B K0p_9)c]Nne(6-ҙpmgmvm6nߚ.8;];[_^]Ӧ]4uX,r<T?EބFgꄞM#~JDnqoMu~gBoɸHMFiL1 E5˹)L;^Mi&ZwGћMffDXa\pro^KT*!{2#7CiLƖFܖK yth:p)ԛyó{^/?7dީHim&aA{ %3-[ED<kz5 Bj/q,nɹg#eg?y]~=PR,)h /}yx(gxț@@ =`n'7}>AqB\x@$Huht%"/0._95 "%6CBBXD'| `9XrnCFP2h*HKXcӴrD-Lf9Rd`7D㊈Rt8AȾ8S\RkFzӾA$ hz<Ö2';zxa.a֌_ p("0t|lg~Y,v~HW+QU I)'o=y TUכ> cn |´6Cc.ck]^]I!@a> ^ybHN*uMt233گ?'u-}4L"NRPQ2(Y``nKl&햍R $ R8g ڹl\5ǮA6bG bIM: 2., VI(+(ϭm#,02uXIaX{V˜R``2duF"=@1p}fZ]\Ovz~0HU}p;iٚi#p" fHH0}C L?8R'!0 Ϻp;6sșp-̬#iDt\5C/1X44,D,",(%ݨM1OZmw]T?gf-F%!J bذ?uw޵\w{Ŷ\ˮ E(HQB@Ԅ@;37)9'y9sղ_DѮ-6 5- DO eiex,CGvChWkma(,eWڵ]v{n'm׌óR2M^dÿv.=ztҴ}WZ z}VdT Ꮘ|֮+[CIxiocpԵ Ci(˴hvrQQZa#1MeZ- +J Uks Ujk[]*ı4LCW/M(2%W #Kr>KVю蠘!%^ۖϞfk.seyCIV\vb}}PJ[;Ri]mm!)J-~S#Z\Q5#JL%J\SZ73E4npTx{m5z'K_ױ+i[~?:B/Aɩ9 BT7lۿ2~}흪[BTG~:O σ/:"1N8 $( vHP T?p0eO>$p֭]5sƫT6+tV^'hkKoyt!qawHN2jh@pRPTWE[bEuIMM=+uږ~gdw7D!A[; A8]ye5_5qθKzDD7o+5k;F<1ٵr /Z՟_< +o5/Zm̽MJy鍅k6{']qAxU_^{?/{1J7.~[IwI?zV4yS \ry1.y0 Xlg[~{M:CpXIsߝw)}amn*}7wat&GDD~/2 kE#g;c^d{{ȸ}_ V'?3O_L+R=*C*:'?mǗ{[Ś`y&-lPn㧦k}ZDD7UV#{υY&m HP0䚟}. |5U5Hk٧+/jt~Fz' O 0nZ')VJ0ypQgO9z-C<ƾ/53wWIILw}-k5rs7ohw[Zp@jy醠[ feZT~.s 뚾)z틿|to8׈(愎:Vb7=17'~ %n+uE^yYo(O+ѻ8[| y )y*ժKѴ;JorWCvЌhrwnP6hTaJ)[NBjg[斶8mA]7wּJ{ S윷`}}URz竊›*˷zһ"Wxs>^[#rr Qu')9,!.66'@}Q1]<Ջ?X~c?Fml__u5xmWDDdے^|/^YEM(.1g͜Y 7{S1#Wڶ~o|;bL몺ɋPbײ~Cw~)"beVӯ.ܶ|ߩviDpXTĀ)׍KH*9E5D 2o18-7qSoŷ_1?B'Ko5wdzF=~j\`/[7vA]tl51bK2n}|'""axJgAO-340b`²֘.M殭kKTTڠDDJ[S3g̴Dz:-[[8 kוl5qK?z-k/;vmL=awV)"|ZNw) =br,e6 `M4hK֕T//+L3V;5Y gWD_0g767{nO{H}驖޳u{kNЁLN -Yf-q͜Mn\ìY9|pZuT!)%9%nm(HPN N-HKH蘭6bklƪ&MΊFnII^T]ר;׵h׍EyYWX`Cg,m*_iv":Z.k{>zŘSV>CV8 Ź9ݥsK:hijհw溝_ N߽`wGkjlѻlf8hݦƺ ]]7f|'V8ڱCZfEey92,WPH76Ӹ䝷vKѷ2aX_[ I={j(ݺnfݻc埗} nic;qq?{jgm/g^*:z~hۯ gg`QV>ykeC~ϞѾtʺ(񺒵2 v~xN^̗o yGlY_o"b$M[sZn(>2MKItDۡ}gK jxT'#l+%{{ԔOn2,먦twOK9!Vm[ߋ oqib=z3>3oϢ;{ws6۱9]cI}Պ%f:}Q![?|Ë/KI[>٦}_oyQkK?j|uf}Uwf @p3cRΖ$oۀeo/PUvȭٵ3"wl4aw_1Վ.}v:,ю1rvmWD^k#?gAc?ul'{I9Xfx_ܥ]PA8x;,QnX)h_vK8qC(iׯ|\#{ַv?4=OBg;} (s}o)QI]PיLBHPNt*!g).\uAo|A1ŋ&3JWT%qMn;c8qw{G+;:%bt?KW>6cׁf]I+$ Ģ5l :/ߨ%0̯:ڿ*:%˾id˂|"'HkǤ*))? `>33v'XkR'ӹ HP@$( HP@ A HP@ A HP@TRT`lCp؟jhiiI0NĴBNJ)0<Ouu5Nj0m:)ضzFtW^m۶8gBLӴ,+::nŊPHk-"'0FگGFFGGG[e6ENi---mS-daY^cx'a^75**J}'`FDL4 òp  85CRʲ,8ysԉHP)|'鐆_89$( A HP$( A @ijbscIDAT$( A @$( AHP@&UjXIENDB`binwiederhier-ntfy-5ad2431/.github/workflows/000077500000000000000000000000001517171047500212425ustar00rootroot00000000000000binwiederhier-ntfy-5ad2431/.github/workflows/build.yaml000066400000000000000000000012541517171047500232270ustar00rootroot00000000000000name: build on: push: branches: [ main ] pull_request: jobs: build: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v3 - name: Install Go uses: actions/setup-go@v4 with: go-version: '1.25.x' - name: Install node uses: actions/setup-node@v3 with: node-version: '24' cache: 'npm' cache-dependency-path: './web/package-lock.json' - name: Install dependencies run: make build-deps-ubuntu - name: Build all the things run: make build - name: Print build results and checksums run: make cli-build-results binwiederhier-ntfy-5ad2431/.github/workflows/docs.yaml000066400000000000000000000020541517171047500230570ustar00rootroot00000000000000name: docs on: push: branches: - main jobs: publish-docs: runs-on: ubuntu-latest steps: - name: Checkout ntfy code uses: actions/checkout@v3 - name: Checkout docs pages code uses: actions/checkout@v3 with: repository: binwiederhier/ntfy-docs.github.io path: build/ntfy-docs.github.io token: ${{secrets.NTFY_DOCS_PUSH_TOKEN}} # Expires after 1 year, re-generate via # User -> Settings -> Developer options -> Personal Access Tokens -> Fine Grained Token - name: Build docs run: make docs - name: Copy generated docs run: rsync -av --exclude CNAME --delete server/docs/ build/ntfy-docs.github.io/docs/ - name: Publish docs run: | cd build/ntfy-docs.github.io git config user.name "GitHub Actions Bot" git config user.email "" git add docs/ git commit -m "Updated docs" git push origin main binwiederhier-ntfy-5ad2431/.github/workflows/release.yaml000066400000000000000000000026561517171047500235570ustar00rootroot00000000000000name: release on: push: tags: - 'v[0-9]+.[0-9]+.[0-9]+' jobs: release: runs-on: ubuntu-latest services: postgres: image: postgres:17 env: POSTGRES_USER: ntfy POSTGRES_PASSWORD: ntfy POSTGRES_DB: ntfy_test ports: - 5432:5432 options: >- --health-cmd "pg_isready -U ntfy" --health-interval 10s --health-timeout 5s --health-retries 5 env: NTFY_TEST_DATABASE_URL: "postgres://ntfy:ntfy@localhost:5432/ntfy_test?sslmode=disable" NTFY_TEST_S3_URL: ${{ secrets.NTFY_TEST_S3_URL }} steps: - name: Checkout code uses: actions/checkout@v3 - name: Install Go uses: actions/setup-go@v4 with: go-version: '1.25.x' - name: Install node uses: actions/setup-node@v3 with: node-version: '24' cache: 'npm' cache-dependency-path: './web/package-lock.json' - name: Docker login uses: docker/login-action@v2 with: username: ${{ github.repository_owner }} password: ${{ secrets.DOCKER_HUB_TOKEN }} - name: Install dependencies run: make build-deps-ubuntu - name: Build and publish run: make release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Print build results and checksums run: make cli-build-results binwiederhier-ntfy-5ad2431/.github/workflows/test.yaml000066400000000000000000000024651517171047500231140ustar00rootroot00000000000000name: test on: push: branches: [ main ] pull_request: jobs: test: runs-on: ubuntu-latest services: postgres: image: postgres:17 env: POSTGRES_USER: ntfy POSTGRES_PASSWORD: ntfy POSTGRES_DB: ntfy_test ports: - 5432:5432 options: >- --health-cmd "pg_isready -U ntfy" --health-interval 10s --health-timeout 5s --health-retries 5 env: NTFY_TEST_DATABASE_URL: "postgres://ntfy:ntfy@localhost:5432/ntfy_test?sslmode=disable" NTFY_TEST_S3_URL: ${{ secrets.NTFY_TEST_S3_URL }} steps: - name: Checkout code uses: actions/checkout@v3 - name: Install Go uses: actions/setup-go@v4 with: go-version: '1.25.x' - name: Install node uses: actions/setup-node@v3 with: node-version: '24' cache: 'npm' cache-dependency-path: './web/package-lock.json' - name: Install dependencies run: make build-deps-ubuntu - name: Build docs (required for tests) run: make docs - name: Build web app (required for tests) run: make web - name: Run tests, formatting, vetting and linting run: make checkv - name: Run coverage run: make coverage binwiederhier-ntfy-5ad2431/.gitignore000066400000000000000000000004021517171047500176310ustar00rootroot00000000000000dist/ dev-dist/ build/ .idea/ .vscode/ *.swp server/docs/ server/site/ tools/fbsend/fbsend tools/pgimport/pgimport tools/loadtest/loadtest tools/s3cli/s3cli playground/ secrets/ *.iml node_modules/ .DS_Store __pycache__ web/dev-dist/ venv/ cmd/key-file.yaml binwiederhier-ntfy-5ad2431/.gitpod.yml000066400000000000000000000012031517171047500177300ustar00rootroot00000000000000tasks: - name: docs before: make docs-deps command: mkdocs serve - name: binary before: | npm install --global nodemon make cli-deps-static-sites command: | nodemon --watch './**/*.go' --ext go --signal SIGTERM --exec "CGO_ENABLED=1 go run main.go serve --listen-http :2586 --debug --base-url $(gp url 2586)" openMode: split-right - name: web before: make web-deps command: cd web && npm start openMode: split-right vscode: extensions: - golang.go - ms-azuretools.vscode-docker ports: - name: docs port: 8000 - name: binary port: 2586 - name: web port: 3000binwiederhier-ntfy-5ad2431/.goreleaser.yml000066400000000000000000000136621517171047500206060ustar00rootroot00000000000000version: 2 before: hooks: - go mod download - go mod tidy builds: - id: ntfy_linux_amd64 binary: ntfy env: - CGO_ENABLED=1 # required for go-sqlite3 tags: [ sqlite_omit_load_extension,osusergo,netgo ] ldflags: - "-linkmode=external -extldflags=-static -s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}" goos: [ linux ] goarch: [ amd64 ] - id: ntfy_linux_armv6 binary: ntfy env: - CGO_ENABLED=1 # required for go-sqlite3 - CC=arm-linux-gnueabi-gcc # apt install gcc-arm-linux-gnueabi tags: [ sqlite_omit_load_extension,osusergo,netgo ] ldflags: - "-linkmode=external -extldflags=-static -s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}" goos: [ linux ] goarch: [ arm ] goarm: [ 6 ] - id: ntfy_linux_armv7 binary: ntfy env: - CGO_ENABLED=1 # required for go-sqlite3 - CC=arm-linux-gnueabi-gcc # apt install gcc-arm-linux-gnueabi tags: [ sqlite_omit_load_extension,osusergo,netgo ] ldflags: - "-linkmode=external -extldflags=-static -s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}" goos: [ linux ] goarch: [ arm ] goarm: [ 7 ] - id: ntfy_linux_arm64 binary: ntfy env: - CGO_ENABLED=1 # required for go-sqlite3 - CC=aarch64-linux-gnu-gcc # apt install gcc-aarch64-linux-gnu tags: [ sqlite_omit_load_extension,osusergo,netgo ] ldflags: - "-linkmode=external -extldflags=-static -s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}" goos: [ linux ] goarch: [ arm64 ] - id: ntfy_windows_amd64 binary: ntfy env: - CGO_ENABLED=1 # required for go-sqlite3 - CC=x86_64-w64-mingw32-gcc # apt install gcc-mingw-w64-x86-64 tags: [ sqlite_omit_load_extension,osusergo,netgo ] ldflags: - "-s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}" goos: [ windows ] goarch: [amd64 ] - id: ntfy_darwin_all binary: ntfy env: - CGO_ENABLED=0 # explicitly disable, since we don't need go-sqlite3 tags: [ noserver ] # don't include server files ldflags: - "-X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}" goos: [ darwin ] goarch: [ amd64, arm64 ] # will be combined to "universal binary" (see below) nfpms: - package_name: ntfy homepage: https://heckel.io/ntfy maintainer: Philipp C. Heckel description: Simple pub-sub notification service license: Apache 2.0 formats: - deb - rpm bindir: /usr/bin contents: - src: server/server.yml dst: /etc/ntfy/server.yml type: "config|noreplace" - src: server/ntfy.service dst: /lib/systemd/system/ntfy.service - src: client/client.yml dst: /etc/ntfy/client.yml type: "config|noreplace" - src: client/ntfy-client.service dst: /lib/systemd/system/ntfy-client.service - src: client/user/ntfy-client.service dst: /lib/systemd/user/ntfy-client.service - dst: /var/cache/ntfy type: dir - dst: /var/cache/ntfy/attachments type: dir - dst: /var/lib/ntfy type: dir - dst: /usr/share/ntfy/logo.png src: web/public/static/images/ntfy.png scripts: preinstall: "scripts/preinst.sh" postinstall: "scripts/postinst.sh" preremove: "scripts/prerm.sh" postremove: "scripts/postrm.sh" archives: - id: ntfy_linux ids: - ntfy_linux_amd64 - ntfy_linux_armv6 - ntfy_linux_armv7 - ntfy_linux_arm64 wrap_in_directory: true files: - LICENSE - README.md - server/server.yml - server/ntfy.service - client/client.yml - client/ntfy-client.service - client/user/ntfy-client.service - id: ntfy_windows ids: - ntfy_windows_amd64 formats: [ zip ] wrap_in_directory: true files: - LICENSE - README.md - client/client.yml - id: ntfy_darwin ids: - ntfy_darwin_all wrap_in_directory: true files: - LICENSE - README.md - client/client.yml universal_binaries: - id: ntfy_darwin_all replace: true name_template: ntfy checksum: name_template: 'checksums.txt' snapshot: version_template: "{{ .Tag }}-next" changelog: sort: asc filters: exclude: - '^docs:' - '^test:' dockers: - image_templates: - &amd64_image "binwiederhier/ntfy:{{ .Tag }}-amd64" use: buildx dockerfile: Dockerfile goarch: amd64 build_flag_templates: - "--platform=linux/amd64" - image_templates: - &arm64v8_image "binwiederhier/ntfy:{{ .Tag }}-arm64v8" use: buildx dockerfile: Dockerfile-arm goarch: arm64 build_flag_templates: - "--platform=linux/arm64/v8" - image_templates: - &armv7_image "binwiederhier/ntfy:{{ .Tag }}-armv7" use: buildx dockerfile: Dockerfile-arm goarch: arm goarm: 7 build_flag_templates: - "--platform=linux/arm/v7" - image_templates: - &armv6_image "binwiederhier/ntfy:{{ .Tag }}-armv6" use: buildx dockerfile: Dockerfile-arm goarch: arm goarm: 6 build_flag_templates: - "--platform=linux/arm/v6" docker_manifests: - name_template: "binwiederhier/ntfy:latest" image_templates: - *amd64_image - *arm64v8_image - *armv7_image - *armv6_image - name_template: "binwiederhier/ntfy:{{ .Tag }}" image_templates: - *amd64_image - *arm64v8_image - *armv7_image - *armv6_image - name_template: "binwiederhier/ntfy:v{{ .Major }}" image_templates: - *amd64_image - *arm64v8_image - *armv7_image - *armv6_image - name_template: "binwiederhier/ntfy:v{{ .Major }}.{{ .Minor }}" image_templates: - *amd64_image - *arm64v8_image - *armv7_image - *armv6_image binwiederhier-ntfy-5ad2431/CODE_OF_CONDUCT.md000066400000000000000000000126251517171047500204520ustar00rootroot00000000000000# Contributor Covenant Code of Conduct ## Our Pledge We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. ## Our Standards Examples of behavior that contributes to a positive environment for our community include: * Demonstrating empathy and kindness toward other people * Being respectful of differing opinions, viewpoints, and experiences * Giving and gracefully accepting constructive feedback * Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience * Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: * The use of sexualized language or imagery, and sexual attention or advances of any kind * Trolling, insulting or derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or email address, without their explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. ## Scope This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement via Discord/Matrix (binwiederhier), or email (ntfy@heckel.io). All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. ## Enforcement Guidelines Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: ### 1. Correction **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. ### 2. Warning **Community Impact**: A violation through a single incident or series of actions. **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. ### 3. Temporary Ban **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. ### 4. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within the community. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder][Mozilla CoC]. For answers to common questions about this code of conduct, see the FAQ at [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at [https://www.contributor-covenant.org/translations][translations]. [homepage]: https://www.contributor-covenant.org [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html [Mozilla CoC]: https://github.com/mozilla/diversity [FAQ]: https://www.contributor-covenant.org/faq [translations]: https://www.contributor-covenant.org/translations binwiederhier-ntfy-5ad2431/Dockerfile000066400000000000000000000011761517171047500176440ustar00rootroot00000000000000FROM alpine LABEL org.opencontainers.image.authors="philipp.heckel@gmail.com" LABEL org.opencontainers.image.url="https://ntfy.sh/" LABEL org.opencontainers.image.documentation="https://docs.ntfy.sh/" LABEL org.opencontainers.image.source="https://github.com/binwiederhier/ntfy" LABEL org.opencontainers.image.vendor="Philipp C. Heckel" LABEL org.opencontainers.image.licenses="Apache-2.0, GPL-2.0" LABEL org.opencontainers.image.title="ntfy" LABEL org.opencontainers.image.description="Send push notifications to your phone or desktop using PUT/POST" RUN apk add --no-cache tzdata COPY ntfy /usr/bin EXPOSE 80/tcp ENTRYPOINT ["ntfy"] binwiederhier-ntfy-5ad2431/Dockerfile-arm000066400000000000000000000013221517171047500204120ustar00rootroot00000000000000FROM alpine LABEL org.opencontainers.image.authors="philipp.heckel@gmail.com" LABEL org.opencontainers.image.url="https://ntfy.sh/" LABEL org.opencontainers.image.documentation="https://docs.ntfy.sh/" LABEL org.opencontainers.image.source="https://github.com/binwiederhier/ntfy" LABEL org.opencontainers.image.vendor="Philipp C. Heckel" LABEL org.opencontainers.image.licenses="Apache-2.0, GPL-2.0" LABEL org.opencontainers.image.title="ntfy" LABEL org.opencontainers.image.description="Send push notifications to your phone or desktop using PUT/POST" # Alpine does not support adding "tzdata" on ARM anymore, see # https://github.com/binwiederhier/ntfy/issues/894 COPY ntfy /usr/bin EXPOSE 80/tcp ENTRYPOINT ["ntfy"] binwiederhier-ntfy-5ad2431/Dockerfile-build000066400000000000000000000041211517171047500207320ustar00rootroot00000000000000FROM golang:1.25-bookworm AS builder ARG VERSION=dev ARG COMMIT=unknown ARG NODE_MAJOR=24 RUN apt-get update && apt-get install -y \ build-essential ca-certificates curl gnupg \ && mkdir -p /etc/apt/keyrings \ && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" >> /etc/apt/sources.list.d/nodesource.list \ && apt-get update \ && apt-get install -y \ python3-pip \ python3-venv \ nodejs \ && rm -rf /var/lib/apt/lists/* WORKDIR /app ADD Makefile . # docs ADD ./requirements.txt . RUN --mount=type=cache,target=/root/.cache/pip make docs-deps ADD ./mkdocs.yml . ADD ./docs ./docs RUN make docs-build # web ADD ./web/package.json ./web/package-lock.json ./web/ RUN --mount=type=cache,target=/root/.npm make web-deps ADD ./web ./web RUN make web-build # cli & server ADD go.mod go.sum main.go ./ ADD ./client ./client ADD ./cmd ./cmd ADD ./log ./log ADD ./server ./server ADD ./user ./user ADD ./util ./util ADD ./payments ./payments ADD ./db ./db ADD ./message ./message ADD ./model ./model ADD ./webpush ./webpush RUN --mount=type=cache,target=/go/pkg/mod --mount=type=cache,target=/root/.cache/go-build make VERSION=$VERSION COMMIT=$COMMIT cli-linux-server FROM alpine ARG VERSION=dev LABEL org.opencontainers.image.authors="philipp.heckel@gmail.com" LABEL org.opencontainers.image.url="https://ntfy.sh/" LABEL org.opencontainers.image.documentation="https://docs.ntfy.sh/" LABEL org.opencontainers.image.source="https://github.com/binwiederhier/ntfy" LABEL org.opencontainers.image.vendor="Philipp C. Heckel" LABEL org.opencontainers.image.licenses="Apache-2.0, GPL-2.0" LABEL org.opencontainers.image.title="ntfy" LABEL org.opencontainers.image.description="Send push notifications to your phone or desktop using PUT/POST" LABEL org.opencontainers.image.version="$VERSION" COPY --from=builder /app/dist/ntfy_linux_server/ntfy /usr/bin/ntfy EXPOSE 80/tcp ENTRYPOINT ["ntfy"] binwiederhier-ntfy-5ad2431/LICENSE000066400000000000000000000261231517171047500166560ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2021 Philipp C. Heckel Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. binwiederhier-ntfy-5ad2431/LICENSE.GPLv2000066400000000000000000000431501517171047500175460ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. ntfy Copyright (C) 2021 Philipp C. Heckel This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. binwiederhier-ntfy-5ad2431/Makefile000066400000000000000000000325631517171047500173160ustar00rootroot00000000000000MAKEFLAGS := --jobs=1 NPM := npm PYTHON := python3 PIP := pip3 VERSION := $(shell git describe --tag) COMMIT := $(shell git rev-parse --short HEAD) .PHONY: help: @echo "Typical commands (more see below):" @echo " make build - Build web app, documentation and server/client (sloowwww)" @echo " make cli-linux-amd64 - Build server/client binary (amd64, no web app or docs)" @echo " make install-linux-amd64 - Install ntfy binary to /usr/bin/ntfy (amd64)" @echo " make web - Build the web app" @echo " make docs - Build the documentation" @echo " make check - Run all tests, vetting/formatting checks and linters" @echo @echo "Build everything:" @echo " make build - Build web app, documentation and server/client" @echo " make clean - Clean build/dist folders" @echo @echo "Build server & client (using GoReleaser, not release version):" @echo " make cli - Build server & client (all architectures)" @echo " make cli-linux-amd64 - Build server & client (Linux, amd64 only)" @echo " make cli-linux-armv6 - Build server & client (Linux, armv6 only)" @echo " make cli-linux-armv7 - Build server & client (Linux, armv7 only)" @echo " make cli-linux-arm64 - Build server & client (Linux, arm64 only)" @echo " make cli-windows-amd64 - Build client (Windows, amd64 only)" @echo " make cli-darwin-all - Build client (macOS, arm64+amd64 universal binary)" @echo @echo "Build server & client (without GoReleaser):" @echo " make cli-linux-server - Build client & server (no GoReleaser, current arch, Linux)" @echo " make cli-darwin-server - Build client & server (no GoReleaser, current arch, macOS)" @echo " make cli-windows-server - Build client & server (no GoReleaser, amd64 only, Windows)" @echo " make cli-client - Build client only (no GoReleaser, current arch, Linux/macOS/Windows)" @echo @echo "Build dev Docker:" @echo " make docker-dev - Build client & server for current architecture using Docker only" @echo @echo "Build web app:" @echo " make web - Build the web app" @echo " make web-deps - Install web app dependencies (npm install the universe)" @echo " make web-build - Actually build the web app" @echo " make web-lint - Run eslint on the web app" @echo " make web-fmt - Run prettier on the web app" @echo " make web-fmt-check - Run prettier on the web app, but don't change anything" @echo @echo "Build documentation:" @echo " make docs - Build the documentation" @echo " make docs-deps - Install Python dependencies (pip3 install)" @echo " make docs-build - Actually build the documentation" @echo @echo "Test/check:" @echo " make test - Run tests" @echo " make race - Run tests with -race flag" @echo " make coverage - Run tests and show coverage" @echo " make coverage-html - Run tests and show coverage (as HTML)" @echo " make coverage-upload - Upload coverage results to codecov.io" @echo @echo "Lint/format:" @echo " make fmt - Run 'go fmt'" @echo " make fmt-check - Run 'go fmt', but don't change anything" @echo " make vet - Run 'go vet'" @echo " make lint - Run 'golint'" @echo " make staticcheck - Run 'staticcheck'" @echo @echo "Releasing:" @echo " make release - Create a release" @echo " make release-snapshot - Create a test release" @echo @echo "Install locally (requires sudo):" @echo " make install-linux-amd64 - Copy amd64 binary from dist/ to /usr/bin/ntfy" @echo " make install-linux-armv6 - Copy armv6 binary from dist/ to /usr/bin/ntfy" @echo " make install-linux-armv7 - Copy armv7 binary from dist/ to /usr/bin/ntfy" @echo " make install-linux-arm64 - Copy arm64 binary from dist/ to /usr/bin/ntfy" @echo " make install-linux-deb-amd64 - Install .deb from dist/ (amd64 only)" @echo " make install-linux-deb-armv6 - Install .deb from dist/ (armv6 only)" @echo " make install-linux-deb-armv7 - Install .deb from dist/ (armv7 only)" @echo " make install-linux-deb-arm64 - Install .deb from dist/ (arm64 only)" # Building everything clean: .PHONY rm -rf dist build server/docs server/site build: web docs cli update: web-deps-update cli-deps-update docs-deps-update docker pull alpine docker-dev: docker build \ --file ./Dockerfile-build \ --tag binwiederhier/ntfy:$(VERSION) \ --tag binwiederhier/ntfy:dev \ --build-arg VERSION=$(VERSION) \ --build-arg COMMIT=$(COMMIT) \ ./ # Ubuntu-specific build-deps-ubuntu: sudo apt-get update sudo apt-get install -y \ curl \ gcc-aarch64-linux-gnu \ gcc-arm-linux-gnueabi \ gcc-mingw-w64-x86-64 \ python3 \ python3-venv \ jq which pip3 || sudo apt-get install -y python3-pip # Documentation docs: docs-deps docs-build docs-venv: .PHONY $(PYTHON) -m venv ./venv docs-build: docs-venv (. venv/bin/activate && $(PYTHON) -m mkdocs build) docs-deps: docs-venv (. venv/bin/activate && $(PIP) install -r requirements.txt) docs-deps-update: .PHONY (. venv/bin/activate && $(PIP) install -r requirements.txt --upgrade) # Web app web: web-deps web-build web-build: cd web \ && $(NPM) run build \ && mv build/index.html build/app.html \ && rm -rf ../server/site \ && mv build ../server/site \ && rm \ ../server/site/config.js web-deps: cd web && $(NPM) ci # Use "npm ci" so that we don't change the package lock file # If this fails for .svg files, optimize them with svgo web-deps-update: cd web && $(NPM) update cd web && $(NPM) install web-fmt: cd web && $(NPM) run format web-fmt-check: cd web && $(NPM) run format:check web-lint: cd web && $(NPM) run lint # Main server/client build cli: cli-deps goreleaser build --snapshot --clean cli-linux-amd64: cli-deps-static-sites goreleaser build --snapshot --clean --id ntfy_linux_amd64 cli-linux-armv6: cli-deps-static-sites cli-deps-gcc-armv6-armv7 goreleaser build --snapshot --clean --id ntfy_linux_armv6 cli-linux-armv7: cli-deps-static-sites cli-deps-gcc-armv6-armv7 goreleaser build --snapshot --clean --id ntfy_linux_armv7 cli-linux-arm64: cli-deps-static-sites cli-deps-gcc-arm64 goreleaser build --snapshot --clean --id ntfy_linux_arm64 cli-windows-amd64: cli-deps-static-sites goreleaser build --snapshot --clean --id ntfy_windows_amd64 cli-darwin-all: cli-deps-static-sites goreleaser build --snapshot --clean --id ntfy_darwin_all cli-linux-server: cli-deps-static-sites # This is a target to build the CLI (including the server) manually. # Use this for development, if you really don't want to install GoReleaser ... mkdir -p dist/ntfy_linux_server server/docs CGO_ENABLED=1 go build \ -o dist/ntfy_linux_server/ntfy \ -tags sqlite_omit_load_extension,osusergo,netgo \ -ldflags \ "-linkmode=external -extldflags=-static -s -w -X main.version=$(VERSION) -X main.commit=$(COMMIT) -X main.date=$(shell date +%s)" cli-darwin-server: cli-deps-static-sites # This is a target to build the CLI (including the server) manually. # Use this for macOS/iOS development, so you have a local server to test with. mkdir -p dist/ntfy_darwin_server server/docs CGO_ENABLED=1 go build \ -o dist/ntfy_darwin_server/ntfy \ -tags sqlite_omit_load_extension,osusergo,netgo \ -ldflags \ "-linkmode=external -s -w -X main.version=$(VERSION) -X main.commit=$(COMMIT) -X main.date=$(shell date +%s)" cli-windows-server: cli-deps-static-sites # This is a target to build the CLI (including the server) for Windows. # Use this for Windows development, if you really don't want to install GoReleaser ... mkdir -p dist/ntfy_windows_server server/docs CC=x86_64-w64-mingw32-gcc GOOS=windows GOARCH=amd64 CGO_ENABLED=1 go build \ -o dist/ntfy_windows_server/ntfy.exe \ -tags sqlite_omit_load_extension,osusergo,netgo \ -ldflags \ "-s -w -X main.version=$(VERSION) -X main.commit=$(COMMIT) -X main.date=$(shell date +%s)" cli-client: cli-deps-static-sites # This is a target to build the CLI (excluding the server) manually. This should work on Linux/macOS/Windows. # Use this for development, if you really don't want to install GoReleaser ... mkdir -p dist/ntfy_client server/docs CGO_ENABLED=0 go build \ -o dist/ntfy_client/ntfy \ -tags noserver \ -ldflags \ "-X main.version=$(VERSION) -X main.commit=$(COMMIT) -X main.date=$(shell date +%s)" cli-deps: cli-deps-static-sites cli-deps-all cli-deps-gcc cli-deps-gcc: cli-deps-gcc-armv6-armv7 cli-deps-gcc-arm64 cli-deps-gcc-windows cli-deps-static-sites: mkdir -p server/docs server/site touch server/docs/index.html server/site/app.html cli-deps-all: go install github.com/goreleaser/goreleaser/v2@latest cli-deps-gcc-armv6-armv7: which arm-linux-gnueabi-gcc || { echo "ERROR: ARMv6/ARMv7 cross compiler not installed. On Ubuntu, run: apt install gcc-arm-linux-gnueabi"; exit 1; } cli-deps-gcc-arm64: which aarch64-linux-gnu-gcc || { echo "ERROR: ARM64 cross compiler not installed. On Ubuntu, run: apt install gcc-aarch64-linux-gnu"; exit 1; } cli-deps-gcc-windows: which x86_64-w64-mingw32-gcc || { echo "ERROR: Windows cross compiler not installed. On Ubuntu, run: apt install gcc-mingw-w64-x86-64"; exit 1; } cli-deps-update: go get -u go mod tidy go install honnef.co/go/tools/cmd/staticcheck@latest go install golang.org/x/lint/golint@latest go install github.com/goreleaser/goreleaser/v2@latest cli-build-results: cat dist/config.yaml [ -f dist/artifacts.json ] && cat dist/artifacts.json | jq . || true [ -f dist/metadata.json ] && cat dist/metadata.json | jq . || true [ -f dist/checksums.txt ] && cat dist/checksums.txt || true find dist -maxdepth 2 -type f \ \( -name '*.deb' -or -name '*.rpm' -or -name '*.zip' -or -name '*.tar.gz' -or -name 'ntfy' \) \ -and -not -path 'dist/goreleaserdocker*' \ -exec sha256sum {} \; # Test/check targets check: test web-fmt-check fmt-check vet web-lint lint staticcheck checkv: testv web-fmt-check fmt-check vet web-lint lint staticcheck test: .PHONY go test $(shell go list -f '{{if .TestGoFiles}}{{.ImportPath}}{{end}}' ./... | grep -vE 'ntfy/v2/(test|examples|tools)') testv: .PHONY go test -v $(shell go list -f '{{if .TestGoFiles}}{{.ImportPath}}{{end}}' ./... | grep -vE 'ntfy/v2/(test|examples|tools)') race: .PHONY go test -v -race $(shell go list -f '{{if .TestGoFiles}}{{.ImportPath}}{{end}}' ./... | grep -vE 'ntfy/v2/(test|examples|tools)') coverage: mkdir -p build/coverage go test -v -race -coverprofile=build/coverage/coverage.txt -covermode=atomic $(shell go list -f '{{if .TestGoFiles}}{{.ImportPath}}{{end}}' ./... | grep -vE 'ntfy/v2/(test|examples|tools|web)') go tool cover -func build/coverage/coverage.txt coverage-html: mkdir -p build/coverage go test -race -coverprofile=build/coverage/coverage.txt -covermode=atomic $(shell go list -f '{{if .TestGoFiles}}{{.ImportPath}}{{end}}' ./... | grep -vE 'ntfy/v2/(test|examples|tools)') go tool cover -html build/coverage/coverage.txt coverage-upload: cd build/coverage && (curl -s https://codecov.io/bash | bash) # Lint/formatting targets fmt: web-fmt gofmt -s -w . fmt-check: test -z $(shell gofmt -l .) vet: go vet ./... lint: which golint || go install golang.org/x/lint/golint@latest go list ./... | grep -v /vendor/ | xargs -L1 golint -set_exit_status staticcheck: .PHONY rm -rf build/staticcheck which staticcheck || go install honnef.co/go/tools/cmd/staticcheck@latest mkdir -p build/staticcheck ln -s "go" build/staticcheck/go PATH="$(PWD)/build/staticcheck:$(PATH)" staticcheck ./... rm -rf build/staticcheck # Releasing targets release: clean cli-deps release-checks docs web check goreleaser release --clean release-snapshot: clean cli-deps docs web check goreleaser release --snapshot --clean release-checks: $(eval LATEST_TAG := $(shell git describe --abbrev=0 --tags | cut -c2-)) if ! grep -q $(LATEST_TAG) docs/install.md; then\ echo "ERROR: Must update docs/install.md with latest tag first.";\ exit 1;\ fi if ! grep -q $(LATEST_TAG) docs/releases.md; then\ echo "ERROR: Must update docs/releases.md with latest tag first.";\ exit 1;\ fi if [ -n "$(shell git status -s)" ]; then\ echo "ERROR: Git repository is in an unclean state.";\ exit 1;\ fi # Installing targets install-linux-amd64: remove-binary sudo cp -a dist/ntfy_linux_amd64_linux_amd64_v1/ntfy /usr/bin/ntfy install-linux-armv6: remove-binary sudo cp -a dist/ntfy_linux_armv6_linux_arm_6/ntfy /usr/bin/ntfy install-linux-armv7: remove-binary sudo cp -a dist/ntfy_linux_armv7_linux_arm_7/ntfy /usr/bin/ntfy install-linux-arm64: remove-binary sudo cp -a dist/ntfy_linux_arm64_linux_arm64/ntfy /usr/bin/ntfy remove-binary: sudo rm -f /usr/bin/ntfy install-linux-amd64-deb: purge-package sudo dpkg -i dist/ntfy_*_linux_amd64.deb install-linux-armv6-deb: purge-package sudo dpkg -i dist/ntfy_*_linux_armv6.deb install-linux-armv7-deb: purge-package sudo dpkg -i dist/ntfy_*_linux_armv7.deb install-linux-arm64-deb: purge-package sudo dpkg -i dist/ntfy_*_linux_arm64.deb purge-package: sudo systemctl stop ntfy || true sudo apt-get purge ntfy || true binwiederhier-ntfy-5ad2431/README.md000066400000000000000000000567611517171047500171430ustar00rootroot00000000000000
    Special thanks to:

    Warp sponsorship ### [Warp, built for coding with multiple AI agents.](https://go.warp.dev/ntfy) [Available for MacOS, Linux, & Windows](https://go.warp.dev/ntfy)

    ![ntfy](web/public/static/images/ntfy.png) # ntfy.sh | Send push notifications to your phone or desktop via PUT/POST [![Release](https://img.shields.io/github/release/binwiederhier/ntfy.svg?color=success&style=flat-square)](https://github.com/binwiederhier/ntfy/releases/latest) [![Go Reference](https://pkg.go.dev/badge/heckel.io/ntfy.svg)](https://pkg.go.dev/heckel.io/ntfy/v2) [![Tests](https://github.com/binwiederhier/ntfy/workflows/test/badge.svg)](https://github.com/binwiederhier/ntfy/actions) [![Go Report Card](https://goreportcard.com/badge/github.com/binwiederhier/ntfy)](https://goreportcard.com/report/github.com/binwiederhier/ntfy) [![codecov](https://codecov.io/gh/binwiederhier/ntfy/branch/main/graph/badge.svg?token=A597KQ463G)](https://codecov.io/gh/binwiederhier/ntfy) [![Discord](https://img.shields.io/discord/874398661709295626?label=Discord)](https://discord.gg/cT7ECsZj9w) [![Matrix](https://img.shields.io/matrix/ntfy:matrix.org?label=Matrix)](https://matrix.to/#/#ntfy:matrix.org) [![Matrix space](https://img.shields.io/matrix/ntfy-space:matrix.org?label=Matrix+space)](https://matrix.to/#/#ntfy-space:matrix.org) [![Healthcheck](https://healthchecks.io/badge/68b65976-b3b0-4102-aec9-980921/kcoEgrLY.svg)](https://ntfy.statuspage.io/) [![Gitpod](https://img.shields.io/badge/Contribute%20with-Gitpod-908a85?logo=gitpod)](https://gitpod.io/#https://github.com/binwiederhier/ntfy) **ntfy** (pronounced "*notify*") is a simple HTTP-based [pub-sub](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) notification service. With ntfy, you can **send notifications to your phone or desktop via scripts** from any computer, **without having to sign up or pay any fees**. If you'd like to run your own instance of the service, you can easily do so since ntfy is open source. You can access the free version of ntfy at **[ntfy.sh](https://ntfy.sh)**. There is also an [open-source Android app](https://github.com/binwiederhier/ntfy-android) available on [Google Play](https://play.google.com/store/apps/details?id=io.heckel.ntfy) or [F-Droid](https://f-droid.org/en/packages/io.heckel.ntfy/), as well as an [open source iOS app](https://github.com/binwiederhier/ntfy-ios) available on the [App Store](https://apps.apple.com/us/app/ntfy/id1625396347).

    ## [ntfy Pro](https://ntfy.sh/app) 💸 🎉 I now offer paid plans for [ntfy.sh](https://ntfy.sh/) if you don't want to self-host, or you want to support the development of ntfy (→ [Purchase via web app](https://ntfy.sh/app)). You can **buy a plan for as low as $5/month**. You can also donate via [GitHub Sponsors](https://github.com/sponsors/binwiederhier), and [Liberapay](https://liberapay.com/ntfy). I would be very humbled by your sponsorship. ❤️ ## **[Documentation](https://ntfy.sh/docs/)** [Getting started](https://ntfy.sh/docs/) | [Android/iOS](https://ntfy.sh/docs/subscribe/phone/) | [API](https://ntfy.sh/docs/publish/) | [Install / Self-hosting](https://ntfy.sh/docs/install/) | [Building](https://ntfy.sh/docs/develop/) ## Chat/forum There are a few ways to get in touch with me and/or the rest of the community. Feel free to use any of these methods. Whatever works best for you: * [Discord server](https://discord.gg/cT7ECsZj9w) - direct chat with the community * [Matrix room #ntfy](https://matrix.to/#/#ntfy:matrix.org) (+ [Matrix space](https://matrix.to/#/#ntfy-space:matrix.org)) - same chat, bridged from Discord * [GitHub issues](https://github.com/binwiederhier/ntfy/issues) - questions, features, bugs ## Announcements/beta testers For announcements of new releases and cutting-edge beta versions, please subscribe to the [ntfy.sh/announcements](https://ntfy.sh/announcements) topic. If you'd like to test the iOS app, join [TestFlight](https://testflight.apple.com/join/P1fFnAm9). For Android betas, join Discord/Matrix (I'll eventually make a testing channel in Google Play). ## Sponsors If you'd like to support the ntfy maintainers, please consider donating to [GitHub Sponsors](https://github.com/sponsors/binwiederhier) or and [Liberapay](https://liberapay.com/ntfy). We would be humbled if you helped carry the server and developer account costs. Even small donations are very much appreciated. Thank you to our commercial sponsors, who help keep the service running and the development going: And a big fat **Thank You** to the individuals who have sponsored ntfy in the past, or are still sponsoring ntfy: ## Contributing I welcome any contributions. Just create a PR or an issue. For larger features/ideas, please reach out on Discord/Matrix first to see if I'd accept them. To contribute code, check out the [build instructions](https://ntfy.sh/docs/develop/) for the server and the Android app. Or, if you'd like to help translate 🇩🇪 🇺🇸 🇧🇬, you can start immediately in [Hosted Weblate](https://hosted.weblate.org/projects/ntfy/). Translation status ## Code of Conduct We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. **We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.** _Please be sure to read the complete [Code of Conduct](CODE_OF_CONDUCT.md)._ ## License Made with ❤️ by [Philipp C. Heckel](https://heckel.io). The project is dual licensed under the [Apache License 2.0](LICENSE) and the [GPLv2 License](LICENSE.GPLv2). Third-party libraries and resources: * [github.com/urfave/cli](https://github.com/urfave/cli) (MIT) is used to drive the CLI * [Mixkit sounds](https://mixkit.co/free-sound-effects/notification/) (Mixkit Free License) are used as notification sounds * [Sounds from notificationsounds.com](https://notificationsounds.com) (Creative Commons Attribution) are used as notification sounds * [Roboto Font](https://fonts.google.com/specimen/Roboto) (Apache 2.0) is used as a font in everything web * [React](https://reactjs.org/) (MIT) is used for the web app * [Material UI components](https://mui.com/) (MIT) are used in the web app * [MUI dashboard template](https://github.com/mui/material-ui/tree/master/docs/data/material/getting-started/templates/dashboard) (MIT) was used as a basis for the web app * [Dexie.js](https://github.com/dexie/Dexie.js) (Apache 2.0) is used for web app persistence in IndexedDB * [GoReleaser](https://goreleaser.com/) (MIT) is used to create releases * [go-smtp](https://github.com/emersion/go-smtp) (MIT) is used to receive e-mails * [stretchr/testify](https://github.com/stretchr/testify) (MIT) is used for unit and integration tests * [github.com/mattn/go-sqlite3](https://github.com/mattn/go-sqlite3) (MIT) is used to provide the persistent message cache * [Firebase Admin SDK](https://github.com/firebase/firebase-admin-go) (Apache 2.0) is used to send FCM messages * [github/gemoji](https://github.com/github/gemoji) (MIT) is used for emoji support (specifically the [emoji.json](https://raw.githubusercontent.com/github/gemoji/master/db/emoji.json) file) * [Lightbox with vanilla JS](https://yossiabramov.com/blog/vanilla-js-lightbox) as a lightbox on the landing page * [HTTP middleware for gzip compression](https://gist.github.com/CJEnright/bc2d8b8dc0c1389a9feeddb110f822d7) (MIT) is used for serving static files * [Regex for auto-linking](https://github.com/bryanwoods/autolink-js) (MIT) is used to highlight links (the library is not used) * [Statically linking go-sqlite3](https://www.arp242.net/static-go.html) * [Linked tabs in mkdocs](https://facelessuser.github.io/pymdown-extensions/extensions/tabbed/#linked-tabs) * [webpush-go](https://github.com/SherClockHolmes/webpush-go) (MIT) is used to send web push notifications * [Sprig](https://github.com/Masterminds/sprig) (MIT) is used to add template parsing functions binwiederhier-ntfy-5ad2431/SECURITY.md000066400000000000000000000006641517171047500174440ustar00rootroot00000000000000# Security Policy ## Supported Versions As of today, I only support the latest version of ntfy. Please make sure you stay up-to-date. ## Reporting a Vulnerability Please report security vulnerabilities privately via email to [security@mail.ntfy.sh](mailto:security@mail.ntfy.sh). You can also reach me on [Discord](https://discord.gg/cT7ECsZj9w) or [Matrix](https://matrix.to/#/#ntfy:matrix.org) (my username is `binwiederhier`). binwiederhier-ntfy-5ad2431/assets/000077500000000000000000000000001517171047500171475ustar00rootroot00000000000000binwiederhier-ntfy-5ad2431/assets/favicon.xcf000066400000000000000000000232671517171047500213100ustar00rootroot00000000000000gimp xcf filePPBBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) *$^%Rrn     ogimp-text-layerS(markup "n") (font "Sans") (font-size 29.000000) (font-size-unit pixels) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 1.000000 1.000000 1.000000)) (justify left) (box-mode fixed) (box-width 82.000000) (box-height 114.000000) (box-unit pixels) (hinting yes) RrRr N ^`        ++,,                  `        ++,,                  `        ++,,                  `HԲ~@ /  m e     g λ++ ,X,W* 'i $s( pT  |  ` n #    _ .                                                                                      )9Rrn #1       ogimp-text-layerS(markup "n") (font "Sans") (font-size 29.000000) (font-size-unit pixels) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.654902 0.654902 0.654902)) (justify left) (box-mode fixed) (box-width 82.000000) (box-height 114.000000) (box-unit pixels) (hinting yes) NRrf$RRr$B`   U     +,,-      U             `   U     +,,-      U             `   U     +,,-      U             `HԲ~@ /  m e     g λ++ ,X,W* 'i $s( pT  |  ` n #    _ .                                                                                      )9ddLayer     % dd%$%dd%@%P%`%p        22dd Background     &Gdd&_&dd&{&&&9Z 9  Z 9  Z9Z22binwiederhier-ntfy-5ad2431/assets/sponsors/000077500000000000000000000000001517171047500210355ustar00rootroot00000000000000binwiederhier-ntfy-5ad2431/assets/sponsors/magicbell.png000066400000000000000000000277071517171047500234770ustar00rootroot00000000000000PNG  IHDR C pHYs  sRGBgAMA a/\IDATxMvIֆo(S直zk`:57H lS ifY Z5 1zsTvUG̈Me 3*i$LS&/_ EJET|$tF7!SVޥi=>|ag{&JE,8 GKN?1*Qn@>KT5R V"  +yQX2",Idk.Ǯ}cjDWJR v~P.!{?}J Sp$U9!2-TSzS4HoHvUǕrMgpB 5s B|H;5!".gwau49LPuܰY&h\{,A{*>ۇ2hQ&h}Gܠ!ERy{ī(JZ$YCyy^CyfY(}tl'l?,VU4-8>LRg8?/eJlˆht1Qlxޮ1P}xA=>{F:M"\1¯[yAJɛS䕉9WA_!E"`wk[CFIƿk'qd5a}( y7N^H-=t8Uپm1`'C1UH׽P*n ͂. >$){ҩn@'DgmczcOgQ);|><.f'YqjURUF{A_& &tl,@x(J>PKH &bwD(O:@u " P.([h<iW6 [B ϶s1m e0ᡫTў"+S660UJb$TOtv^g{-F|_'/^ >jWezR>Ꚓi uM53y*U99'G+8 Α-#Rr}VdJO)܎:FQ'dօM^#^B]LtʥgQl,pF)j/-(cmA)jI]9oo-8Q)*ϵ)ӈIV#߻j-׈Lyxg-=`e8?߮"u)Y1 (uO6Gy/Oj_O:׎<^f7.,OxiV I鮲>B̝F5?]%"3_K@Ӑ ^b)Ti;"KfwN xhD|6d3w9 s2#GTD)`-pf b@*yQp^(VFՐk:"Gء1)sN( < de!:3Lφ"t[G7'%r`B~_p 'EޙAZKҕƣ=:k:.>݈x:nv vdAq~FR(I 1|/.aqITBzLntb>.~Rt 0Q¦۴SEfw픯)ju +w\&_hMb }MגG H\x'M DnE;_5[%قS "L8X3J-y+&ٵޕ mXl",SVHmr)-nSmq!M2D+5G6Ye-jAjT|, ,/d5Ek72p*?,[黎}KPrF":"1 .0$3 k5yGݲKș=5}#pu @< `~zіZmE)pfy"DZ6LCt BѢ}G2ZϜ{]H#0L!\j b.%zCaz̈́.71yf0 Y8AX; bﻮE(<s!lӆ-m!& b;E|Mn~d%<,V"sFnnѷ(eGcJ:%%l!>BB1RK᠟`/޵Á`j" #Э/`iHr>UEC IăS%7&~vC99|*-Kё*=7 @Bt3A 1xp~ 蘀SR*#Jj> > hu{= u|ƯRӹ+\N)[߽3 ;>8Ֆ9L-t|U/g0 @<ng6E7 &ֻ A\xZ3*12w1db]sEM>Q!@yH5(}]! "=3^gi/qIRqʜtP}9K3m<,> S'{#RNeֺC1<=9)XP&2QV]DZxB< 1g#/Va>^zYG2W޴19gp<J5tjwuJz}]^'ϝO~f^=ū!ýfgGs+#|3k-} ꣰cYe72_ƈ->a(υ͡{Bƨ&[#Ѯ5; 1{y?{;q9O`eqX'Z-Wuɳz:`VvL`­Z{]c(BϏ^:Ĩ:zϥH0dܥ(m\^S6v㩀H GQC#艱kU97z"pc6´YkxrVN@A=.`B&6|ɂ\]Wd=&ύ`N2v^0|qzRo@`ifISLr#Bm@{# ){z-%Dé&( r,`nӄdp3Pn4YE551d^q3a#蚬+6R fԅ">f<"Bl[(zsʟmlqf!Ķ{USٻw:]DAƇɨ*eD:WvM̅SGj}s\Ϲ~f50TGя"Ii0FWj$J%cQq3*, 4/eJ+p.@j};8ɟhKd.{q:hsyHaD]F71,BQr=Nּfw)˽i>#<}PX5Ii/ָ8 EWN)XH0BF&pٳCYҴQ~D}muc5f歭 FZ|kjBxtݢD_xߖe 8(|h%l;`̃R"_.3EU(Q54bs<:!E|T]u eHt^8sxv:A܌ & 2ԟUQ}= \ Yպz^X)Bl%YݜҢon# ?۵+Oxa)jCxEH`eE F4B|c}M9Y56WX5mhp`N78d3jȂя]゙hVynH/s:T  KGGi9 ?zgVmB{-NhkYV%mG]ZqڢvROa: 959$ U.ÎD?ܔ Ս |?{X6vCj!3$_~m|i`GeQ-*\&McLm],ISSSjVA<: ]c~U AFZol]oم+n̼k?YwEK聓 UM<:l6 sFt8ٸ1lNd4)$ڏqny#y8@d|ɒQRE@:`{XJ(=y.:8ڡ=$Dt uM1xh$XRYC3ԉ˚vQ W#)uGD 6' kZVpc Q{ʮ\y_SE[*ö\l{ @]H$QTp[֎ 9vҍ1a7yW[R'zpn~.+VLM_ʩS)g%8q8z$qmU,2'#L+=:>LRRp)ZQS:$HQ-u ƲmQ[1dEc8C"a]D0FS"ĈC7pdufNȂ7&1+#$%{M%Nǻ]q p-LC=Z2{OyC J( y(3y_q|=C)l.숷>٣Ez^ Yŝ]X$JlH7,#Gz\Wap&B~Z|l8 =9Tt'i讣HbȞX3=2Kr >ĵ5 .~3iGzPk9MK6` H(ؕP[sC{[nA(P&k*#_Sy+ݭ{.9D">u~HsO>8|lj{Ȏ#8d67E}1pBN>s䝤4ڮyoͺFn7t!t+gb B׍x]B##4dJ|{ E-bLڦ\Nb!Rtz=v$\o*Fa!>=\ۼȵw!>vI5A; &'O[L BXx?ٝʹ HTZ(*/xlMZ< ;`X:i b$kWHfd|!MM**fq%TPyd_=GDޯ=|q"ΣUm!-7G?N|wt؃)NЖ`ѽk .SBtpB:^ysS*XH-$_!v[+kFw O %\Q=!-'Gcs!"9y=G uwX-isP=(gksYkeD;^!^`M/{z$e[ZNx߶80^`OQT" ~crEۺ#gHױ ۲|#@L@:@A:X't ]XGh6B BZ9=}őֹFh my!iCٴ7XO =Qf!*i8BM6fv!>H?IKzu3Dzn@[^vCq}rB`gr_(_ӷ^XhٓzlD09*$DM 61o ZaDHȅkX-B8tjBtUFs쟐$1 b`Z-@t]ݖ#[!@|sG| \݉j&vG{ 8"ںh pd)ASA (‘p T](-&i0zKRki=D5M\F, Dl;C趼}` RJޱU@MNיńN(Ɵ6Z@~~,kG})Y'勸C(D#9Au[I Ժ8E֎H[SBDshJ\׽;1^C"eodϯ#E{n!(uQYTO<^s/."?a;NZ'WM7w2U8C IRq2[W0ϱʠ[5[;ʠijjB k{6Oڒg{׉Z׉#?/e>‹-)@6e6DPjsH_PEKg+Fd/-yuag>I- ':@X"ٔTĈa0sz; Z-?5nOu 36]GFzzO6:nMjsOhq!zО Y 弐}* |Ld)7P6V ^/h-{PVyycѫ|^+Q+i&:w?ߙYoևҞ3l a^gh#g%4;2V'c!}{͆fRRƆ/$X{~ lS^CxegKQ34K?:Ɯv?*8CK 3xp;y=;;.fl;`dǥs+`"p3 ߒV1E " Isb`m*  VUK؂x@kDS-, ֠TRi=W @'>Co @2QiKD{q5M*WHir^0тycOQu@#{yN9JI4x=P*SJedAڡS`zQE8b0|afWj(@zSV^-IJ: {^Z5)}#sҔN@-@Xξ`l 8Xtbj"tMݓWjz^p;Rޣ\ IG8Mc?EJzQȳ!9>jvFTы׽ x%`НJH(8uiW)zVN,-"яW]Pu` Ɏ<",n4Db; 9"c%8{X$s)>h^()K@*3#!L4⎍{!{\f%KjuW -QnQq )]YCf>I2ev"9DPRyLtZ=.ӣWᰕzL8,c c=HW]7| BQvv!Ҙ@crL'`^'6HuiTk B >tNi;5qƯj<LdS_b#HP%}H3 rVޥI?v e._ZSR_;i 0sIENDB`binwiederhier-ntfy-5ad2431/attachment/000077500000000000000000000000001517171047500177755ustar00rootroot00000000000000binwiederhier-ntfy-5ad2431/attachment/backend.go000066400000000000000000000011031517171047500217060ustar00rootroot00000000000000package attachment import ( "io" "time" ) // backendObject represents an object stored in a backend. type object struct { ID string Size int64 LastModified time.Time } // backend is a minimal I/O interface for storing and retrieving attachment files. // It has no knowledge of size tracking, limiting, or ID validation. type backend interface { Put(id string, reader io.Reader, untrustedLength int64) error Get(id string) (io.ReadCloser, int64, error) List() ([]object, error) Delete(ids ...string) error DeleteIncomplete(cutoff time.Time) error } binwiederhier-ntfy-5ad2431/attachment/backend_file.go000066400000000000000000000036251517171047500227200ustar00rootroot00000000000000package attachment import ( "fmt" "io" "os" "path/filepath" "time" ) type fileBackend struct { dir string } var _ backend = (*fileBackend)(nil) func newFileBackend(dir string) (*fileBackend, error) { if err := os.MkdirAll(dir, 0700); err != nil { return nil, err } return &fileBackend{dir: dir}, nil } func (b *fileBackend) Put(id string, reader io.Reader, untrustedLength int64) error { if untrustedLength > 0 { reader = io.LimitReader(reader, untrustedLength) } file := filepath.Join(b.dir, id) f, err := os.OpenFile(file, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0600) if err != nil { return err } defer f.Close() n, err := io.Copy(f, reader) if err != nil { os.Remove(file) return err } else if untrustedLength > 0 && n != untrustedLength { os.Remove(file) return fmt.Errorf("content length mismatch: claimed %d, got %d", untrustedLength, n) } if err := f.Close(); err != nil { os.Remove(file) return err } return nil } func (b *fileBackend) List() ([]object, error) { entries, err := os.ReadDir(b.dir) if err != nil { return nil, err } objects := make([]object, 0, len(entries)) for _, e := range entries { info, err := e.Info() if err != nil { return nil, err } objects = append(objects, object{ ID: e.Name(), Size: info.Size(), LastModified: info.ModTime(), }) } return objects, nil } func (b *fileBackend) Get(id string) (io.ReadCloser, int64, error) { file := filepath.Join(b.dir, id) stat, err := os.Stat(file) if err != nil { return nil, 0, err } f, err := os.Open(file) if err != nil { return nil, 0, err } return f, stat.Size(), nil } func (b *fileBackend) Delete(ids ...string) error { for _, id := range ids { file := filepath.Join(b.dir, id) if err := os.Remove(file); err != nil && !os.IsNotExist(err) { return err } } return nil } func (b *fileBackend) DeleteIncomplete(_ time.Time) error { return nil } binwiederhier-ntfy-5ad2431/attachment/backend_s3.go000066400000000000000000000022071517171047500223210ustar00rootroot00000000000000package attachment import ( "context" "io" "time" "heckel.io/ntfy/v2/s3" ) type s3Backend struct { client *s3.Client } var _ backend = (*s3Backend)(nil) func newS3Backend(client *s3.Client) *s3Backend { return &s3Backend{client: client} } func (b *s3Backend) Put(id string, reader io.Reader, untrustedLength int64) error { return b.client.PutObject(context.Background(), id, reader, untrustedLength) } func (b *s3Backend) Get(id string) (io.ReadCloser, int64, error) { return b.client.GetObject(context.Background(), id) } func (b *s3Backend) List() ([]object, error) { objects, err := b.client.ListObjectsV2(context.Background()) if err != nil { return nil, err } result := make([]object, 0, len(objects)) for _, obj := range objects { result = append(result, object{ ID: obj.Key, Size: obj.Size, LastModified: obj.LastModified, }) } return result, nil } func (b *s3Backend) Delete(ids ...string) error { return b.client.DeleteObjects(context.Background(), ids) } func (b *s3Backend) DeleteIncomplete(cutoff time.Time) error { return b.client.AbortIncompleteUploads(context.Background(), cutoff) } binwiederhier-ntfy-5ad2431/attachment/store.go000066400000000000000000000175351517171047500214730ustar00rootroot00000000000000package attachment import ( "errors" "fmt" "io" "sync" "time" "heckel.io/ntfy/v2/log" "heckel.io/ntfy/v2/model" "heckel.io/ntfy/v2/s3" "heckel.io/ntfy/v2/util" ) const ( tagStore = "attachment_store" syncInterval = 15 * time.Minute // How often to run the background sync loop ) var errInvalidFileID = errors.New("invalid file ID") // Store manages attachment storage with shared logic for size tracking, limiting, // ID validation, and background sync to reconcile storage with the database. type Store struct { backend backend limit int64 // Defined limit of the store in bytes size int64 // Current size of the store in bytes sizes map[string]int64 // File ID -> size, for subtracting on Remove attachmentsWithSizes func() (map[string]int64, error) // Returns file ID -> size for active attachments orphanGracePeriod time.Duration // Don't delete orphaned objects younger than this closeChan chan struct{} doneChan chan struct{} mu sync.RWMutex // Protects size and sizes } // NewFileStore creates a new file-system backed attachment cache func NewFileStore(dir string, totalSizeLimit int64, orphanGracePeriod time.Duration, attachmentsWithSizes func() (map[string]int64, error)) (*Store, error) { b, err := newFileBackend(dir) if err != nil { return nil, err } return newStore(b, totalSizeLimit, orphanGracePeriod, attachmentsWithSizes) } // NewS3Store creates a new S3-backed attachment cache. The s3URL must be in the format: // // s3://ACCESS_KEY:SECRET_KEY@BUCKET[/PREFIX]?region=REGION[&endpoint=ENDPOINT][&disable_http2=true] func NewS3Store(s3URL string, totalSizeLimit int64, orphanGracePeriod time.Duration, attachmentsWithSizes func() (map[string]int64, error)) (*Store, error) { config, err := s3.ParseURL(s3URL) if err != nil { return nil, err } return newStore(newS3Backend(s3.New(config)), totalSizeLimit, orphanGracePeriod, attachmentsWithSizes) } func newStore(backend backend, totalSizeLimit int64, orphanGracePeriod time.Duration, attachmentsWithSizes func() (map[string]int64, error)) (*Store, error) { c := &Store{ backend: backend, limit: totalSizeLimit, sizes: make(map[string]int64), attachmentsWithSizes: attachmentsWithSizes, orphanGracePeriod: orphanGracePeriod, closeChan: make(chan struct{}), doneChan: make(chan struct{}), } // Hydrate sizes from the database immediately so that Size()/Remaining()/Remove() // are accurate from the start, without waiting for the first sync() call. if attachmentsWithSizes != nil { attachments, err := attachmentsWithSizes() if err != nil { return nil, fmt.Errorf("attachment store: failed to load existing attachments: %w", err) } for id, size := range attachments { c.sizes[id] = size c.size += size } go c.syncLoop() } else { close(c.doneChan) } return c, nil } // Write stores an attachment file. The id is validated, and the write is subject to // the total size limit and any additional limiters. The untrustedLength is a hint // from the client's Content-Length header; backends may use it to optimize uploads (e.g. // streaming directly to S3 without buffering). func (c *Store) Write(id string, reader io.Reader, untrustedLength int64, limiters ...util.Limiter) (int64, error) { if !model.ValidMessageID(id) { return 0, errInvalidFileID } log.Tag(tagStore).Field("message_id", id).Debug("Writing attachment") limiters = append(limiters, util.NewFixedLimiter(c.Remaining())) countingReader := util.NewCountingReader(reader) limitReader := util.NewLimitReader(countingReader, limiters...) if err := c.backend.Put(id, limitReader, untrustedLength); err != nil { c.backend.Delete(id) //nolint:errcheck return 0, err } size := countingReader.Total() c.mu.Lock() c.size += size c.sizes[id] = size c.mu.Unlock() return size, nil } // Read retrieves an attachment file by ID func (c *Store) Read(id string) (io.ReadCloser, int64, error) { if !model.ValidMessageID(id) { return nil, 0, errInvalidFileID } return c.backend.Get(id) } // Remove deletes attachment files by ID and subtracts their known sizes from // the total. Sizes for objects not tracked (e.g. written before this process // started and before the first sync) are corrected by the next sync() call. func (c *Store) Remove(ids ...string) error { for _, id := range ids { if !model.ValidMessageID(id) { return errInvalidFileID } } // Remove from backend for _, id := range ids { log.Tag(tagStore).Field("message_id", id).Debug("Removing attachment") } if err := c.backend.Delete(ids...); err != nil { return err } // Update total cache size c.mu.Lock() for _, id := range ids { if size, ok := c.sizes[id]; ok { c.size -= size delete(c.sizes, id) } } if c.size < 0 { c.size = 0 } c.mu.Unlock() return nil } // Sync triggers an immediate reconciliation of storage with the database. func (c *Store) Sync() error { return c.sync() } // sync reconciles the backend storage with the database. It lists all objects, // deletes orphans (not in the valid ID set and older than the grace period), and // recomputes the total size from the existing attachments in the database. func (c *Store) sync() error { if c.attachmentsWithSizes == nil { return nil } attachmentsWithSizes, err := c.attachmentsWithSizes() if err != nil { return fmt.Errorf("attachment sync: failed to get existing attachments: %w", err) } remoteObjects, err := c.backend.List() if err != nil { return fmt.Errorf("attachment sync: failed to list objects: %w", err) } // Calculate total cache size and collect orphaned attachments, excluding objects younger // than the grace period to account for races, and skipping objects with invalid IDs. cutoff := time.Now().Add(-c.orphanGracePeriod) var orphanIDs []string var count, totalSize int64 sizes := make(map[string]int64, len(remoteObjects)) for _, obj := range remoteObjects { if !model.ValidMessageID(obj.ID) { continue } if _, ok := attachmentsWithSizes[obj.ID]; !ok && obj.LastModified.Before(cutoff) { orphanIDs = append(orphanIDs, obj.ID) } else { count++ totalSize += attachmentsWithSizes[obj.ID] sizes[obj.ID] = attachmentsWithSizes[obj.ID] } } log.Tag(tagStore).Debug("Attachment store updated: %d attachment(s), %s", count, util.FormatSizeHuman(totalSize)) c.mu.Lock() c.size = totalSize c.sizes = sizes c.mu.Unlock() // Delete orphaned attachments if len(orphanIDs) > 0 { log.Tag(tagStore).Debug("Deleting %d orphaned attachment(s)", len(orphanIDs)) if err := c.backend.Delete(orphanIDs...); err != nil { return fmt.Errorf("attachment sync: failed to delete orphaned objects: %w", err) } } // Clean up incomplete uploads (S3 only) if err := c.backend.DeleteIncomplete(cutoff); err != nil { log.Tag(tagStore).Err(err).Warn("Failed to abort incomplete uploads from attachment cache") } return nil } // Size returns the current total size of all attachments func (c *Store) Size() int64 { c.mu.RLock() defer c.mu.RUnlock() return c.size } // Remaining returns the remaining capacity for attachments func (c *Store) Remaining() int64 { c.mu.RLock() defer c.mu.RUnlock() remaining := c.limit - c.size if remaining < 0 { return 0 } return remaining } // Close stops the background sync goroutine and waits for it to finish func (c *Store) Close() { close(c.closeChan) <-c.doneChan } func (c *Store) syncLoop() { defer close(c.doneChan) if err := c.sync(); err != nil { log.Tag(tagStore).Err(err).Warn("Attachment sync failed") } ticker := time.NewTicker(syncInterval) defer ticker.Stop() for { select { case <-ticker.C: if err := c.sync(); err != nil { log.Tag(tagStore).Err(err).Warn("Attachment sync failed") } case <-c.closeChan: return } } } binwiederhier-ntfy-5ad2431/attachment/store_file_test.go000066400000000000000000000005411517171047500235160ustar00rootroot00000000000000package attachment import ( "testing" "time" "github.com/stretchr/testify/require" ) func newTestFileStore(t *testing.T, totalSizeLimit int64) (dir string, cache *Store) { t.Helper() dir = t.TempDir() cache, err := NewFileStore(dir, totalSizeLimit, time.Hour, nil) require.Nil(t, err) t.Cleanup(func() { cache.Close() }) return dir, cache } binwiederhier-ntfy-5ad2431/attachment/store_s3_test.go000066400000000000000000000055671517171047500231410ustar00rootroot00000000000000package attachment import ( "context" "io" "os" "strings" "sync" "testing" "time" "github.com/stretchr/testify/require" "heckel.io/ntfy/v2/s3" ) func TestS3Store_WriteWithPrefix(t *testing.T) { s3URL := os.Getenv("NTFY_TEST_S3_URL") if s3URL == "" { t.Skip("NTFY_TEST_S3_URL not set") } cfg, err := s3.ParseURL(s3URL) require.Nil(t, err) cfg.Prefix = "test-prefix" client := s3.New(cfg) deleteAllObjects(t, client) backend := newS3Backend(client) cache, err := newStore(backend, 10*1024, time.Hour, nil) require.Nil(t, err) t.Cleanup(func() { deleteAllObjects(t, client) cache.Close() }) size, err := cache.Write("abcdefghijkl", strings.NewReader("test"), 0) require.Nil(t, err) require.Equal(t, int64(4), size) reader, _, err := cache.Read("abcdefghijkl") require.Nil(t, err) data, err := io.ReadAll(reader) reader.Close() require.Nil(t, err) require.Equal(t, "test", string(data)) } // --- Helpers --- func newTestRealS3Store(t *testing.T, totalSizeLimit int64) (*Store, *modTimeOverrideBackend) { t.Helper() s3URL := os.Getenv("NTFY_TEST_S3_URL") if s3URL == "" { t.Skip("NTFY_TEST_S3_URL not set") } cfg, err := s3.ParseURL(s3URL) require.Nil(t, err) if cfg.Prefix != "" { cfg.Prefix = cfg.Prefix + "/testpkg-attachment" } else { cfg.Prefix = "testpkg-attachment" } client := s3.New(cfg) inner := newS3Backend(client) wrapper := &modTimeOverrideBackend{backend: inner, modTimes: make(map[string]time.Time)} deleteAllObjects(t, client) store, err := newStore(wrapper, totalSizeLimit, time.Hour, nil) require.Nil(t, err) t.Cleanup(func() { deleteAllObjects(t, client) store.Close() }) return store, wrapper } func deleteAllObjects(t *testing.T, client *s3.Client) { t.Helper() for i := 0; i < 20; i++ { objects, err := client.ListObjectsV2(context.Background()) require.Nil(t, err) if len(objects) == 0 { return } keys := make([]string, len(objects)) for j, obj := range objects { keys[j] = obj.Key } require.Nil(t, client.DeleteObjects(context.Background(), keys)) time.Sleep(200 * time.Millisecond) } t.Fatal("timed out waiting for bucket to be empty") } // modTimeOverrideBackend wraps a backend and allows overriding LastModified times returned by List(). // This is used in tests to simulate old objects on backends (like real S3) where // LastModified cannot be set directly. type modTimeOverrideBackend struct { backend mu sync.Mutex modTimes map[string]time.Time // object ID -> override time } func (b *modTimeOverrideBackend) List() ([]object, error) { objects, err := b.backend.List() if err != nil { return nil, err } b.mu.Lock() defer b.mu.Unlock() for i, obj := range objects { if t, ok := b.modTimes[obj.ID]; ok { objects[i].LastModified = t } } return objects, nil } func (b *modTimeOverrideBackend) setModTime(id string, t time.Time) { b.mu.Lock() b.modTimes[id] = t b.mu.Unlock() } binwiederhier-ntfy-5ad2431/attachment/store_test.go000066400000000000000000000251261517171047500225250ustar00rootroot00000000000000package attachment import ( "bytes" "fmt" "io" "os" "path/filepath" "strings" "testing" "time" "github.com/stretchr/testify/require" "heckel.io/ntfy/v2/util" ) const testSizeLimit = 10 * 1024 func TestStore_WriteReadRemove(t *testing.T) { forEachBackend(t, testSizeLimit, func(t *testing.T, s *Store, _ func(string)) { // Write size, err := s.Write("abcdefghijkl", strings.NewReader("hello world"), 0) require.Nil(t, err) require.Equal(t, int64(11), size) require.Equal(t, int64(11), s.Size()) // Read back reader, readSize, err := s.Read("abcdefghijkl") require.Nil(t, err) require.Equal(t, int64(11), readSize) data, err := io.ReadAll(reader) reader.Close() require.Nil(t, err) require.Equal(t, "hello world", string(data)) // Remove require.Nil(t, s.Remove("abcdefghijkl")) require.Equal(t, int64(0), s.Size()) // Read after remove should fail _, _, err = s.Read("abcdefghijkl") require.Error(t, err) }) } func TestStore_WriteRemoveMultiple(t *testing.T) { forEachBackend(t, testSizeLimit, func(t *testing.T, s *Store, _ func(string)) { for i := 0; i < 5; i++ { _, err := s.Write(fmt.Sprintf("abcdefghijk%d", i), bytes.NewReader(make([]byte, 100)), 0) require.Nil(t, err) } require.Equal(t, int64(500), s.Size()) require.Nil(t, s.Remove("abcdefghijk1", "abcdefghijk3")) require.Equal(t, int64(300), s.Size()) // Removed files should not be readable _, _, err := s.Read("abcdefghijk1") require.Error(t, err) _, _, err = s.Read("abcdefghijk3") require.Error(t, err) // Remaining files should still be readable for _, id := range []string{"abcdefghijk0", "abcdefghijk2", "abcdefghijk4"} { reader, _, err := s.Read(id) require.Nil(t, err) reader.Close() } }) } func TestStore_WriteTotalSizeLimit(t *testing.T) { forEachBackend(t, 100, func(t *testing.T, s *Store, _ func(string)) { // First write fits _, err := s.Write("abcdefghijk0", bytes.NewReader(make([]byte, 80)), 0) require.Nil(t, err) require.Equal(t, int64(80), s.Size()) require.Equal(t, int64(20), s.Remaining()) // Second write exceeds total limit _, err = s.Write("abcdefghijk1", bytes.NewReader(make([]byte, 50)), 0) require.ErrorIs(t, err, util.ErrLimitReached) }) } func TestStore_WriteAdditionalLimiter(t *testing.T) { forEachBackend(t, testSizeLimit, func(t *testing.T, s *Store, _ func(string)) { _, err := s.Write("abcdefghijkl", bytes.NewReader(make([]byte, 200)), 0, util.NewFixedLimiter(100)) require.ErrorIs(t, err, util.ErrLimitReached) // File should not be readable (was cleaned up) _, _, err = s.Read("abcdefghijkl") require.Error(t, err) }) } func TestStore_WriteWithLimiter(t *testing.T) { forEachBackend(t, testSizeLimit, func(t *testing.T, s *Store, _ func(string)) { size, err := s.Write("abcdefghijkl", strings.NewReader("normal file"), 0, util.NewFixedLimiter(999)) require.Nil(t, err) require.Equal(t, int64(11), size) require.Equal(t, int64(11), s.Size()) }) } func TestStore_WriteOverwriteSameID(t *testing.T) { forEachBackend(t, testSizeLimit, func(t *testing.T, s *Store, _ func(string)) { // Write 100 bytes _, err := s.Write("abcdefghijkl", bytes.NewReader(make([]byte, 100)), 0) require.Nil(t, err) require.Equal(t, int64(100), s.Size()) // Overwrite with 50 bytes _, err = s.Write("abcdefghijkl", bytes.NewReader(make([]byte, 50)), 0) require.Nil(t, err) require.Equal(t, int64(150), s.Size()) // Store tracks both writes // Read back should return the latest content reader, readSize, err := s.Read("abcdefghijkl") require.Nil(t, err) require.Equal(t, int64(50), readSize) reader.Close() }) } func TestStore_WriteAfterFailure(t *testing.T) { forEachBackend(t, testSizeLimit, func(t *testing.T, s *Store, _ func(string)) { // Failed write: limiter rejects it _, err := s.Write("abcdefghijkl", bytes.NewReader(make([]byte, 200)), 0, util.NewFixedLimiter(100)) require.ErrorIs(t, err, util.ErrLimitReached) require.Equal(t, int64(0), s.Size()) // Subsequent write with a different ID should succeed size, err := s.Write("abcdefghijk2", strings.NewReader("hello"), 0) require.Nil(t, err) require.Equal(t, int64(5), size) require.Equal(t, int64(5), s.Size()) // The failed ID should not be readable _, _, err = s.Read("abcdefghijkl") require.Error(t, err) // The successful ID should be readable reader, _, err := s.Read("abcdefghijk2") require.Nil(t, err) reader.Close() }) } func TestStore_SyncRecomputesSize(t *testing.T) { forEachBackend(t, testSizeLimit, func(t *testing.T, s *Store, makeOld func(string)) { // Write two files _, err := s.Write("abcdefghijk0", bytes.NewReader(make([]byte, 100)), 0) require.Nil(t, err) _, err = s.Write("abcdefghijk1", bytes.NewReader(make([]byte, 200)), 0) require.Nil(t, err) require.Equal(t, int64(300), s.Size()) // Corrupt the in-memory size tracking s.mu.Lock() s.size = 999 s.mu.Unlock() require.Equal(t, int64(999), s.Size()) // Set attachmentsWithSizes to include both files so nothing gets deleted s.attachmentsWithSizes = func() (map[string]int64, error) { return map[string]int64{"abcdefghijk0": 100, "abcdefghijk1": 200}, nil } // Sync should recompute size from the backend require.Nil(t, s.sync()) require.Equal(t, int64(300), s.Size()) }) } func TestStore_ReadNotFound(t *testing.T) { forEachBackend(t, testSizeLimit, func(t *testing.T, s *Store, _ func(string)) { _, _, err := s.Read("abcdefghijkl") require.Error(t, err) }) } func TestStore_InvalidID(t *testing.T) { forEachBackend(t, testSizeLimit, func(t *testing.T, s *Store, _ func(string)) { _, err := s.Write("bad", strings.NewReader("x"), 0) require.Equal(t, errInvalidFileID, err) _, _, err = s.Read("bad") require.Equal(t, errInvalidFileID, err) err = s.Remove("bad") require.Equal(t, errInvalidFileID, err) }) } func TestStore_WriteLargeObjects(t *testing.T) { sizes := map[string]int64{ "100B": 100, "6MB": 6 * 1024 * 1024, "12MB": 12 * 1024 * 1024, } for name, sz := range sizes { t.Run(name, func(t *testing.T) { forEachBackend(t, sz+1024, func(t *testing.T, s *Store, _ func(string)) { data := make([]byte, sz) for i := range data { data[i] = byte(i % 251) } size, err := s.Write("abcdefghijkl", bytes.NewReader(data), 0) require.Nil(t, err) require.Equal(t, sz, size) require.Equal(t, sz, s.Size()) reader, readSize, err := s.Read("abcdefghijkl") require.Nil(t, err) require.Equal(t, sz, readSize) got, err := io.ReadAll(reader) reader.Close() require.Nil(t, err) require.Equal(t, data, got) }) }) } } func TestStore_WriteUntrustedLengthExact(t *testing.T) { forEachBackend(t, testSizeLimit, func(t *testing.T, s *Store, _ func(string)) { size, err := s.Write("abcdefghijkl", strings.NewReader("hello world"), 11) require.Nil(t, err) require.Equal(t, int64(11), size) reader, _, err := s.Read("abcdefghijkl") require.Nil(t, err) data, err := io.ReadAll(reader) reader.Close() require.Nil(t, err) require.Equal(t, "hello world", string(data)) }) } func TestStore_WriteUntrustedLengthBodyLonger(t *testing.T) { forEachBackend(t, testSizeLimit, func(t *testing.T, s *Store, _ func(string)) { // Body has 11 bytes, but we claim 5 — only first 5 bytes should be stored size, err := s.Write("abcdefghijkl", strings.NewReader("hello world"), 5) require.Nil(t, err) require.Equal(t, int64(5), size) reader, _, err := s.Read("abcdefghijkl") require.Nil(t, err) data, err := io.ReadAll(reader) reader.Close() require.Nil(t, err) require.Equal(t, "hello", string(data)) }) } func TestStore_WriteUntrustedLengthBodyShorter(t *testing.T) { forEachBackend(t, testSizeLimit, func(t *testing.T, s *Store, _ func(string)) { // Body has 5 bytes, but we claim 100 — should fail _, err := s.Write("abcdefghijkl", strings.NewReader("hello"), 100) require.Error(t, err) // File should not be readable (was cleaned up) _, _, err = s.Read("abcdefghijkl") require.Error(t, err) }) } func TestStore_Sync(t *testing.T) { forEachBackend(t, testSizeLimit, func(t *testing.T, s *Store, makeOld func(string)) { // Write some files _, err := s.Write("abcdefghijk0", strings.NewReader("file0"), 0) require.Nil(t, err) _, err = s.Write("abcdefghijk1", strings.NewReader("file1"), 0) require.Nil(t, err) _, err = s.Write("abcdefghijk2", strings.NewReader("file2"), 0) require.Nil(t, err) require.Equal(t, int64(15), s.Size()) // Set the ID provider to only know about file 0 and 2 s.attachmentsWithSizes = func() (map[string]int64, error) { return map[string]int64{"abcdefghijk0": 5, "abcdefghijk2": 5}, nil } // Make file 1 old enough to be cleaned up makeOld("abcdefghijk1") // Run sync require.Nil(t, s.sync()) // File 1 should be deleted (orphan, old enough) _, _, err = s.Read("abcdefghijk1") require.Error(t, err) // Files 0 and 2 should still be readable r, _, err := s.Read("abcdefghijk0") require.Nil(t, err) r.Close() r, _, err = s.Read("abcdefghijk2") require.Nil(t, err) r.Close() // Size should be updated require.Equal(t, int64(10), s.Size()) }) } func TestStore_Sync_SkipsRecentFiles(t *testing.T) { forEachBackend(t, testSizeLimit, func(t *testing.T, s *Store, _ func(string)) { // Write a file _, err := s.Write("abcdefghijk0", strings.NewReader("file0"), 0) require.Nil(t, err) // Set the ID provider to return empty (no valid IDs) s.attachmentsWithSizes = func() (map[string]int64, error) { return map[string]int64{}, nil } // File was just created, so it should NOT be deleted (< 1 hour old) require.Nil(t, s.sync()) // File should still exist reader, _, err := s.Read("abcdefghijk0") require.Nil(t, err) reader.Close() }) } // forEachBackend runs f against both the file and S3 backends. It also provides a makeOld // callback that makes a specific object's timestamp old enough for orphan cleanup (> 1 hour). // For the file backend, this uses os.Chtimes; for the S3 backend, it overrides the object's // LastModified time via a modTimeOverrideBackend wrapper. Objects start with recent timestamps // by default. The S3 subtest is skipped if NTFY_TEST_S3_URL is not set. func forEachBackend(t *testing.T, totalSizeLimit int64, f func(t *testing.T, s *Store, makeOld func(string))) { t.Run("file", func(t *testing.T) { dir, s := newTestFileStore(t, totalSizeLimit) makeOld := func(id string) { oldTime := time.Unix(1, 0) os.Chtimes(filepath.Join(dir, id), oldTime, oldTime) } f(t, s, makeOld) }) t.Run("s3", func(t *testing.T) { s, wrapper := newTestRealS3Store(t, totalSizeLimit) makeOld := func(id string) { wrapper.setModTime(id, time.Unix(1, 0)) } f(t, s, makeOld) }) } binwiederhier-ntfy-5ad2431/client/000077500000000000000000000000001517171047500171235ustar00rootroot00000000000000binwiederhier-ntfy-5ad2431/client/client.go000066400000000000000000000216631517171047500207400ustar00rootroot00000000000000// Package client provides a ntfy client to publish and subscribe to topics package client import ( "bufio" "context" "encoding/json" "errors" "fmt" "heckel.io/ntfy/v2/log" "heckel.io/ntfy/v2/util" "io" "net/http" "regexp" "strings" "sync" "time" ) const ( // MessageEvent identifies a message event MessageEvent = "message" ) const ( maxResponseBytes = 4096 ) var ( topicRegex = regexp.MustCompile(`^[-_A-Za-z0-9]{1,64}$`) // Same as in server/server.go ) // Client is the ntfy client that can be used to publish and subscribe to ntfy topics type Client struct { Messages chan *Message config *Config subscriptions map[string]*subscription mu sync.Mutex } // Message is a struct that represents a ntfy message type Message struct { // TODO combine with server.message ID string Event string Time int64 Topic string Message string Title string Priority int Tags []string Click string Icon string Attachment *Attachment // Additional fields TopicURL string SubscriptionID string Raw string } // Attachment represents a message attachment type Attachment struct { Name string `json:"name"` Type string `json:"type,omitempty"` Size int64 `json:"size,omitempty"` Expires int64 `json:"expires,omitempty"` URL string `json:"url"` Owner string `json:"-"` // IP address of uploader, used for rate limiting } type subscription struct { ID string topicURL string cancel context.CancelFunc } // New creates a new Client using a given Config func New(config *Config) *Client { return &Client{ Messages: make(chan *Message, 50), // Allow reading a few messages config: config, subscriptions: make(map[string]*subscription), } } // Publish sends a message to a specific topic, optionally using options. // See PublishReader for details. func (c *Client) Publish(topic, message string, options ...PublishOption) (*Message, error) { return c.PublishReader(topic, strings.NewReader(message), options...) } // PublishReader sends a message to a specific topic, optionally using options. // // A topic can be either a full URL (e.g. https://myhost.lan/mytopic), a short URL which is then prepended https:// // (e.g. myhost.lan -> https://myhost.lan), or a short name which is expanded using the default host in the // config (e.g. mytopic -> https://ntfy.sh/mytopic). // // To pass title, priority and tags, check out WithTitle, WithPriority, WithTagsList, WithDelay, WithNoCache, // WithNoFirebase, and the generic WithHeader. func (c *Client) PublishReader(topic string, body io.Reader, options ...PublishOption) (*Message, error) { topicURL, err := c.expandTopicURL(topic) if err != nil { return nil, err } req, err := http.NewRequest("POST", topicURL, body) if err != nil { return nil, err } for _, option := range options { if err := option(req); err != nil { return nil, err } } log.Debug("%s Publishing message with headers %s", util.ShortTopicURL(topicURL), req.Header) resp, err := http.DefaultClient.Do(req) if err != nil { return nil, err } defer resp.Body.Close() b, err := io.ReadAll(io.LimitReader(resp.Body, maxResponseBytes)) if err != nil { return nil, err } if resp.StatusCode != http.StatusOK { return nil, errors.New(strings.TrimSpace(string(b))) } m, err := toMessage(string(b), topicURL, "") if err != nil { return nil, err } return m, nil } // Poll queries a topic for all (or a limited set) of messages. Unlike Subscribe, this method only polls for // messages and does not subscribe to messages that arrive after this call. // // A topic can be either a full URL (e.g. https://myhost.lan/mytopic), a short URL which is then prepended https:// // (e.g. myhost.lan -> https://myhost.lan), or a short name which is expanded using the default host in the // config (e.g. mytopic -> https://ntfy.sh/mytopic). // // By default, all messages will be returned, but you can change this behavior using a SubscribeOption. // See WithSince, WithSinceAll, WithSinceUnixTime, WithScheduled, and the generic WithQueryParam. func (c *Client) Poll(topic string, options ...SubscribeOption) ([]*Message, error) { topicURL, err := c.expandTopicURL(topic) if err != nil { return nil, err } ctx := context.Background() messages := make([]*Message, 0) msgChan := make(chan *Message) errChan := make(chan error) log.Debug("%s Polling from topic", util.ShortTopicURL(topicURL)) options = append(options, WithPoll()) go func() { err := performSubscribeRequest(ctx, msgChan, topicURL, "", options...) close(msgChan) errChan <- err }() for m := range msgChan { messages = append(messages, m) } return messages, <-errChan } // Subscribe subscribes to a topic to listen for newly incoming messages. The method starts a connection in the // background and returns new messages via the Messages channel. // // A topic can be either a full URL (e.g. https://myhost.lan/mytopic), a short URL which is then prepended https:// // (e.g. myhost.lan -> https://myhost.lan), or a short name which is expanded using the default host in the // config (e.g. mytopic -> https://ntfy.sh/mytopic). // // By default, only new messages will be returned, but you can change this behavior using a SubscribeOption. // See WithSince, WithSinceAll, WithSinceUnixTime, WithScheduled, and the generic WithQueryParam. // // The method returns a unique subscriptionID that can be used in Unsubscribe. // // Example: // // c := client.New(client.NewConfig()) // subscriptionID, _ := c.Subscribe("mytopic") // for m := range c.Messages { // fmt.Printf("New message: %s", m.Message) // } func (c *Client) Subscribe(topic string, options ...SubscribeOption) (string, error) { topicURL, err := c.expandTopicURL(topic) if err != nil { return "", err } c.mu.Lock() defer c.mu.Unlock() subscriptionID := util.RandomString(10) log.Debug("%s Subscribing to topic", util.ShortTopicURL(topicURL)) ctx, cancel := context.WithCancel(context.Background()) c.subscriptions[subscriptionID] = &subscription{ ID: subscriptionID, topicURL: topicURL, cancel: cancel, } go handleSubscribeConnLoop(ctx, c.Messages, topicURL, subscriptionID, options...) return subscriptionID, nil } // Unsubscribe unsubscribes from a topic that has been previously subscribed to using the unique // subscriptionID returned in Subscribe. func (c *Client) Unsubscribe(subscriptionID string) { c.mu.Lock() defer c.mu.Unlock() sub, ok := c.subscriptions[subscriptionID] if !ok { return } delete(c.subscriptions, subscriptionID) sub.cancel() } func (c *Client) expandTopicURL(topic string) (string, error) { if strings.HasPrefix(topic, "http://") || strings.HasPrefix(topic, "https://") { return topic, nil } else if strings.Contains(topic, "/") { return fmt.Sprintf("https://%s", topic), nil } if !topicRegex.MatchString(topic) { return "", fmt.Errorf("invalid topic name: %s", topic) } return fmt.Sprintf("%s/%s", c.config.DefaultHost, topic), nil } func handleSubscribeConnLoop(ctx context.Context, msgChan chan *Message, topicURL, subcriptionID string, options ...SubscribeOption) { for { // TODO The retry logic is crude and may lose messages. It should record the last message like the // Android client, use since=, and do incremental backoff too if err := performSubscribeRequest(ctx, msgChan, topicURL, subcriptionID, options...); err != nil { log.Warn("%s Connection failed: %s", util.ShortTopicURL(topicURL), err.Error()) } select { case <-ctx.Done(): log.Info("%s Connection exited", util.ShortTopicURL(topicURL)) return case <-time.After(10 * time.Second): // TODO Add incremental backoff } } } func performSubscribeRequest(ctx context.Context, msgChan chan *Message, topicURL string, subscriptionID string, options ...SubscribeOption) error { streamURL := fmt.Sprintf("%s/json", topicURL) log.Debug("%s Listening to %s", util.ShortTopicURL(topicURL), streamURL) req, err := http.NewRequestWithContext(ctx, http.MethodGet, streamURL, nil) if err != nil { return err } for _, option := range options { if err := option(req); err != nil { return err } } resp, err := http.DefaultClient.Do(req) if err != nil { return err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { b, err := io.ReadAll(io.LimitReader(resp.Body, maxResponseBytes)) if err != nil { return err } return errors.New(strings.TrimSpace(string(b))) } scanner := bufio.NewScanner(resp.Body) for scanner.Scan() { messageJSON := scanner.Text() m, err := toMessage(messageJSON, topicURL, subscriptionID) if err != nil { return err } log.Trace("%s Message received: %s", util.ShortTopicURL(topicURL), messageJSON) if m.Event == MessageEvent { msgChan <- m } } return nil } func toMessage(s, topicURL, subscriptionID string) (*Message, error) { var m *Message if err := json.NewDecoder(strings.NewReader(s)).Decode(&m); err != nil { return nil, err } m.TopicURL = topicURL m.SubscriptionID = subscriptionID m.Raw = s return m, nil } binwiederhier-ntfy-5ad2431/client/client.yml000066400000000000000000000045461517171047500211350ustar00rootroot00000000000000# ntfy client config file # Base URL used to expand short topic names in the "ntfy publish" and "ntfy subscribe" commands. # If you self-host a ntfy server, you'll likely want to change this. # # default-host: https://ntfy.sh # Default credentials will be used with "ntfy publish" and "ntfy subscribe" if no other credentials are provided. # You can set a default token to use or a default user:password combination, but not both. For an empty password, # use empty double-quotes (""). # # To override the default user:password combination or default token for a particular subscription (e.g., to send # no Authorization header), set the user:pass/token for the subscription to empty double-quotes (""). # default-token: # default-user: # default-password: # Default command will execute after "ntfy subscribe" receives a message if no command is provided in subscription below # default-command: # Subscriptions to topics and their actions. This option is primarily used by the systemd service, # or if you can "ntfy subscribe --from-config" directly. # # Example: # subscribe: # - topic: mytopic # command: /usr/local/bin/mytopic-triggered.sh # - topic: myserver.com/anothertopic # command: 'echo "$message"' # if: # priority: high,urgent # - topic: secret # command: 'notify-send "$m"' # user: phill # password: mypass # - topic: token_topic # token: tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 # # Variables: # Variable Aliases Description # --------------- --------------------- ----------------------------------- # $NTFY_ID $id Unique message ID # $NTFY_TIME $time Unix timestamp of the message delivery # $NTFY_TOPIC $topic Topic name # $NTFY_MESSAGE $message, $m Message body # $NTFY_TITLE $title, $t Message title # $NTFY_PRIORITY $priority, $prio, $p Message priority (1=min, 5=max) # $NTFY_TAGS $tags, $tag, $ta Message tags (comma separated list) # $NTFY_RAW $raw Raw JSON message # # Filters ('if:'): # You can filter 'message', 'title', 'priority' (comma-separated list, logical OR) # and 'tags' (comma-separated list, logical AND). See https://ntfy.sh/docs/subscribe/api/#filter-messages. # # subscribe: binwiederhier-ntfy-5ad2431/client/client_test.go000066400000000000000000000062631517171047500217760ustar00rootroot00000000000000package client_test import ( "fmt" "github.com/stretchr/testify/require" "heckel.io/ntfy/v2/client" "heckel.io/ntfy/v2/log" "heckel.io/ntfy/v2/test" "os" "testing" "time" ) func TestMain(m *testing.M) { log.SetLevel(log.ErrorLevel) os.Exit(m.Run()) } func TestClient_Publish_Subscribe(t *testing.T) { s, port := test.StartServer(t) defer test.StopServer(t, s, port) c := client.New(newTestConfig(port)) subscriptionID, _ := c.Subscribe("mytopic") time.Sleep(time.Second) msg, err := c.Publish("mytopic", "some message") require.Nil(t, err) require.Equal(t, "some message", msg.Message) msg, err = c.Publish("mytopic", "some other message", client.WithTitle("some title"), client.WithPriority("high"), client.WithTags([]string{"tag1", "tag 2"})) require.Nil(t, err) require.Equal(t, "some other message", msg.Message) require.Equal(t, "some title", msg.Title) require.Equal(t, []string{"tag1", "tag 2"}, msg.Tags) require.Equal(t, 4, msg.Priority) msg, err = c.Publish("mytopic", "some delayed message", client.WithDelay("25 hours")) require.Nil(t, err) require.Equal(t, "some delayed message", msg.Message) require.True(t, time.Now().Add(24*time.Hour).Unix() < msg.Time) time.Sleep(200 * time.Millisecond) msg = nextMessage(c) require.NotNil(t, msg) require.Equal(t, "some message", msg.Message) msg = nextMessage(c) require.NotNil(t, msg) require.Equal(t, "some other message", msg.Message) require.Equal(t, "some title", msg.Title) require.Equal(t, []string{"tag1", "tag 2"}, msg.Tags) require.Equal(t, 4, msg.Priority) msg = nextMessage(c) require.Nil(t, msg) c.Unsubscribe(subscriptionID) time.Sleep(200 * time.Millisecond) msg, err = c.Publish("mytopic", "a message that won't be received") require.Nil(t, err) require.Equal(t, "a message that won't be received", msg.Message) msg = nextMessage(c) require.Nil(t, msg) } func TestClient_Publish_Poll(t *testing.T) { s, port := test.StartServer(t) defer test.StopServer(t, s, port) c := client.New(newTestConfig(port)) msg, err := c.Publish("mytopic", "some message", client.WithNoFirebase(), client.WithTagsList("tag1,tag2")) require.Nil(t, err) require.Equal(t, "some message", msg.Message) require.Equal(t, []string{"tag1", "tag2"}, msg.Tags) msg, err = c.Publish("mytopic", "this won't be cached", client.WithNoCache()) require.Nil(t, err) require.Equal(t, "this won't be cached", msg.Message) msg, err = c.Publish("mytopic", "some delayed message", client.WithDelay("20 min")) require.Nil(t, err) require.Equal(t, "some delayed message", msg.Message) messages, err := c.Poll("mytopic") require.Nil(t, err) require.Equal(t, 1, len(messages)) require.Equal(t, "some message", messages[0].Message) messages, err = c.Poll("mytopic", client.WithScheduled()) require.Nil(t, err) require.Equal(t, 2, len(messages)) require.Equal(t, "some message", messages[0].Message) require.Equal(t, "some delayed message", messages[1].Message) } func newTestConfig(port int) *client.Config { c := client.NewConfig() c.DefaultHost = fmt.Sprintf("http://127.0.0.1:%d", port) return c } func nextMessage(c *client.Client) *client.Message { select { case m := <-c.Messages: return m default: return nil } } binwiederhier-ntfy-5ad2431/client/config.go000066400000000000000000000031331517171047500207170ustar00rootroot00000000000000package client import ( "gopkg.in/yaml.v2" "heckel.io/ntfy/v2/log" "os" ) const ( // DefaultBaseURL is the base URL used to expand short topic names DefaultBaseURL = "https://ntfy.sh" ) // DefaultConfigFile is the default path to the client config file (set in config_*.go) var DefaultConfigFile string // Config is the config struct for a Client type Config struct { DefaultHost string `yaml:"default-host"` DefaultUser string `yaml:"default-user"` DefaultPassword *string `yaml:"default-password"` DefaultToken string `yaml:"default-token"` DefaultCommand string `yaml:"default-command"` Subscribe []Subscribe `yaml:"subscribe"` } // Subscribe is the struct for a Subscription within Config type Subscribe struct { Topic string `yaml:"topic"` User *string `yaml:"user"` Password *string `yaml:"password"` Token *string `yaml:"token"` Command string `yaml:"command"` If map[string]string `yaml:"if"` } // NewConfig creates a new Config struct for a Client func NewConfig() *Config { return &Config{ DefaultHost: DefaultBaseURL, DefaultUser: "", DefaultPassword: nil, DefaultToken: "", DefaultCommand: "", Subscribe: nil, } } // LoadConfig loads the Client config from a yaml file func LoadConfig(filename string) (*Config, error) { log.Debug("Loading client config from %s", filename) b, err := os.ReadFile(filename) if err != nil { return nil, err } c := NewConfig() if err := yaml.Unmarshal(b, c); err != nil { return nil, err } return c, nil } binwiederhier-ntfy-5ad2431/client/config_darwin.go000066400000000000000000000005171517171047500222660ustar00rootroot00000000000000//go:build darwin package client import ( "os" "os/user" "path/filepath" ) func init() { u, err := user.Current() if err == nil && u.Uid == "0" { DefaultConfigFile = "/etc/ntfy/client.yml" } else if configDir, err := os.UserConfigDir(); err == nil { DefaultConfigFile = filepath.Join(configDir, "ntfy", "client.yml") } } binwiederhier-ntfy-5ad2431/client/config_test.go000066400000000000000000000111731517171047500217610ustar00rootroot00000000000000package client_test import ( "github.com/stretchr/testify/require" "heckel.io/ntfy/v2/client" "os" "path/filepath" "testing" ) func TestConfig_Load(t *testing.T) { filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(` default-host: http://localhost default-user: philipp default-password: mypass default-command: 'echo "Got the message: $message"' subscribe: - topic: no-command-with-auth user: phil password: mypass - topic: echo-this command: 'echo "Message received: $message"' - topic: alerts command: notify-send -i /usr/share/ntfy/logo.png "Important" "$m" if: priority: high,urgent - topic: defaults `), 0600)) conf, err := client.LoadConfig(filename) require.Nil(t, err) require.Equal(t, "http://localhost", conf.DefaultHost) require.Equal(t, "philipp", conf.DefaultUser) require.Equal(t, "mypass", *conf.DefaultPassword) require.Equal(t, `echo "Got the message: $message"`, conf.DefaultCommand) require.Equal(t, 4, len(conf.Subscribe)) require.Equal(t, "no-command-with-auth", conf.Subscribe[0].Topic) require.Equal(t, "", conf.Subscribe[0].Command) require.Equal(t, "phil", *conf.Subscribe[0].User) require.Equal(t, "mypass", *conf.Subscribe[0].Password) require.Equal(t, "echo-this", conf.Subscribe[1].Topic) require.Equal(t, `echo "Message received: $message"`, conf.Subscribe[1].Command) require.Equal(t, "alerts", conf.Subscribe[2].Topic) require.Equal(t, `notify-send -i /usr/share/ntfy/logo.png "Important" "$m"`, conf.Subscribe[2].Command) require.Equal(t, "high,urgent", conf.Subscribe[2].If["priority"]) require.Equal(t, "defaults", conf.Subscribe[3].Topic) } func TestConfig_EmptyPassword(t *testing.T) { filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(` default-host: http://localhost default-user: philipp default-password: "" subscribe: - topic: no-command-with-auth user: phil password: "" `), 0600)) conf, err := client.LoadConfig(filename) require.Nil(t, err) require.Equal(t, "http://localhost", conf.DefaultHost) require.Equal(t, "philipp", conf.DefaultUser) require.Equal(t, "", *conf.DefaultPassword) require.Equal(t, 1, len(conf.Subscribe)) require.Equal(t, "no-command-with-auth", conf.Subscribe[0].Topic) require.Equal(t, "", conf.Subscribe[0].Command) require.Equal(t, "phil", *conf.Subscribe[0].User) require.Equal(t, "", *conf.Subscribe[0].Password) } func TestConfig_NullPassword(t *testing.T) { filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(` default-host: http://localhost default-user: philipp default-password: ~ subscribe: - topic: no-command-with-auth user: phil password: ~ `), 0600)) conf, err := client.LoadConfig(filename) require.Nil(t, err) require.Equal(t, "http://localhost", conf.DefaultHost) require.Equal(t, "philipp", conf.DefaultUser) require.Nil(t, conf.DefaultPassword) require.Equal(t, 1, len(conf.Subscribe)) require.Equal(t, "no-command-with-auth", conf.Subscribe[0].Topic) require.Equal(t, "", conf.Subscribe[0].Command) require.Equal(t, "phil", *conf.Subscribe[0].User) require.Nil(t, conf.Subscribe[0].Password) } func TestConfig_NoPassword(t *testing.T) { filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(` default-host: http://localhost default-user: philipp subscribe: - topic: no-command-with-auth user: phil `), 0600)) conf, err := client.LoadConfig(filename) require.Nil(t, err) require.Equal(t, "http://localhost", conf.DefaultHost) require.Equal(t, "philipp", conf.DefaultUser) require.Nil(t, conf.DefaultPassword) require.Equal(t, 1, len(conf.Subscribe)) require.Equal(t, "no-command-with-auth", conf.Subscribe[0].Topic) require.Equal(t, "", conf.Subscribe[0].Command) require.Equal(t, "phil", *conf.Subscribe[0].User) require.Nil(t, conf.Subscribe[0].Password) } func TestConfig_DefaultToken(t *testing.T) { filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(` default-host: http://localhost default-token: tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 subscribe: - topic: mytopic `), 0600)) conf, err := client.LoadConfig(filename) require.Nil(t, err) require.Equal(t, "http://localhost", conf.DefaultHost) require.Equal(t, "", conf.DefaultUser) require.Nil(t, conf.DefaultPassword) require.Equal(t, "tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2", conf.DefaultToken) require.Equal(t, 1, len(conf.Subscribe)) require.Equal(t, "mytopic", conf.Subscribe[0].Topic) require.Nil(t, conf.Subscribe[0].User) require.Nil(t, conf.Subscribe[0].Password) require.Nil(t, conf.Subscribe[0].Token) } binwiederhier-ntfy-5ad2431/client/config_unix.go000066400000000000000000000005731517171047500217670ustar00rootroot00000000000000//go:build linux || dragonfly || freebsd || netbsd || openbsd package client import ( "os" "os/user" "path/filepath" ) func init() { u, err := user.Current() if err == nil && u.Uid == "0" { DefaultConfigFile = "/etc/ntfy/client.yml" } else if configDir, err := os.UserConfigDir(); err == nil { DefaultConfigFile = filepath.Join(configDir, "ntfy", "client.yml") } } binwiederhier-ntfy-5ad2431/client/config_windows.go000066400000000000000000000003261517171047500224720ustar00rootroot00000000000000//go:build windows package client import ( "os" "path/filepath" ) func init() { if configDir, err := os.UserConfigDir(); err == nil { DefaultConfigFile = filepath.Join(configDir, "ntfy", "client.yml") } } binwiederhier-ntfy-5ad2431/client/ntfy-client.service000066400000000000000000000003331517171047500227400ustar00rootroot00000000000000[Unit] Description=ntfy client After=network.target [Service] User=ntfy Group=ntfy ExecStart=/usr/bin/ntfy subscribe --config /etc/ntfy/client.yml --from-config Restart=on-failure [Install] WantedBy=multi-user.target binwiederhier-ntfy-5ad2431/client/options.go000066400000000000000000000166331517171047500211560ustar00rootroot00000000000000package client import ( "fmt" "heckel.io/ntfy/v2/util" "net/http" "strings" "time" ) // RequestOption is a generic request option that can be added to Client calls type RequestOption = func(r *http.Request) error // PublishOption is an option that can be passed to the Client.Publish call type PublishOption = RequestOption // SubscribeOption is an option that can be passed to a Client.Subscribe or Client.Poll call type SubscribeOption = RequestOption // WithMessage sets the notification message. This is an alternative way to passing the message body. func WithMessage(message string) PublishOption { return WithHeader("X-Message", message) } // WithTitle adds a title to a message func WithTitle(title string) PublishOption { return WithHeader("X-Title", title) } // WithPriority adds a priority to a message. The priority can be either a number (1=min, 5=max), // or the corresponding names (see util.ParsePriority). func WithPriority(priority string) PublishOption { return WithHeader("X-Priority", priority) } // WithTagsList adds a list of tags to a message. The tags parameter must be a comma-separated list // of tags. To use a slice, use WithTags instead func WithTagsList(tags string) PublishOption { return WithHeader("X-Tags", tags) } // WithTags adds a list of a tags to a message func WithTags(tags []string) PublishOption { return WithTagsList(strings.Join(tags, ",")) } // WithDelay instructs the server to send the message at a later date. The delay parameter can be a // Unix timestamp, a duration string or a natural langage string. See https://ntfy.sh/docs/publish/#scheduled-delivery // for details. func WithDelay(delay string) PublishOption { return WithHeader("X-Delay", delay) } // WithClick makes the notification action open the given URL as opposed to entering the detail view func WithClick(url string) PublishOption { return WithHeader("X-Click", url) } // WithIcon makes the notification use the given URL as its icon func WithIcon(icon string) PublishOption { return WithHeader("X-Icon", icon) } // WithActions adds custom user actions to the notification. The value can be either a JSON array or the // simple format definition. See https://ntfy.sh/docs/publish/#action-buttons for details. func WithActions(value string) PublishOption { return WithHeader("X-Actions", value) } // WithAttach sets a URL that will be used by the client to download an attachment func WithAttach(attach string) PublishOption { return WithHeader("X-Attach", attach) } // WithMarkdown instructs the server to interpret the message body as Markdown func WithMarkdown() PublishOption { return WithHeader("X-Markdown", "yes") } // WithTemplate instructs the server to use a specific template for the message. If templateName is is "yes" or "1", // the server will interpret the message and title as a template. func WithTemplate(templateName string) PublishOption { return WithHeader("X-Template", templateName) } // WithFilename sets a filename for the attachment, and/or forces the HTTP body to interpreted as an attachment func WithFilename(filename string) PublishOption { return WithHeader("X-Filename", filename) } // WithSequenceID sets a sequence ID for the message, allowing updates to existing notifications func WithSequenceID(sequenceID string) PublishOption { return WithHeader("X-Sequence-ID", sequenceID) } // WithEmail instructs the server to also send the message to the given e-mail address func WithEmail(email string) PublishOption { return WithHeader("X-Email", email) } // WithBasicAuth adds the Authorization header for basic auth to the request func WithBasicAuth(user, pass string) PublishOption { return WithHeader("Authorization", util.BasicAuth(user, pass)) } // WithBearerAuth adds the Authorization header for Bearer auth to the request func WithBearerAuth(token string) PublishOption { return WithHeader("Authorization", fmt.Sprintf("Bearer %s", token)) } // WithEmptyAuth clears the Authorization header func WithEmptyAuth() PublishOption { return RemoveHeader("Authorization") } // WithNoCache instructs the server not to cache the message server-side func WithNoCache() PublishOption { return WithHeader("X-Cache", "no") } // WithNoFirebase instructs the server not to forward the message to Firebase func WithNoFirebase() PublishOption { return WithHeader("X-Firebase", "no") } // WithSince limits the number of messages returned from the server. The parameter since can be a Unix // timestamp (see WithSinceUnixTime), a duration (WithSinceDuration) the word "all" (see WithSinceAll). func WithSince(since string) SubscribeOption { return WithQueryParam("since", since) } // WithSinceAll instructs the server to return all messages for the given topic from the server func WithSinceAll() SubscribeOption { return WithSince("all") } // WithSinceDuration instructs the server to return all messages since the given duration ago func WithSinceDuration(since time.Duration) SubscribeOption { return WithSinceUnixTime(time.Now().Add(-1 * since).Unix()) } // WithSinceUnixTime instructs the server to return only messages newer or equal to the given timestamp func WithSinceUnixTime(since int64) SubscribeOption { return WithSince(fmt.Sprintf("%d", since)) } // WithPoll instructs the server to close the connection after messages have been returned. Don't use this option // directly. Use Client.Poll instead. func WithPoll() SubscribeOption { return WithQueryParam("poll", "1") } // WithScheduled instructs the server to also return messages that have not been sent yet, i.e. delayed/scheduled // messages (see WithDelay). The messages will have a future date. func WithScheduled() SubscribeOption { return WithQueryParam("scheduled", "1") } // WithFilter is a generic subscribe option meant to be used to filter for certain messages only func WithFilter(param, value string) SubscribeOption { return WithQueryParam(param, value) } // WithMessageFilter instructs the server to only return messages that match the exact message func WithMessageFilter(message string) SubscribeOption { return WithQueryParam("message", message) } // WithTitleFilter instructs the server to only return messages with a title that match the exact string func WithTitleFilter(title string) SubscribeOption { return WithQueryParam("title", title) } // WithPriorityFilter instructs the server to only return messages with the matching priority. Not that messages // without priority also implicitly match priority 3. func WithPriorityFilter(priority int) SubscribeOption { return WithQueryParam("priority", fmt.Sprintf("%d", priority)) } // WithTagsFilter instructs the server to only return messages that contain all of the given tags func WithTagsFilter(tags []string) SubscribeOption { return WithQueryParam("tags", strings.Join(tags, ",")) } // WithHeader is a generic option to add headers to a request func WithHeader(header, value string) RequestOption { return func(r *http.Request) error { if value != "" { r.Header.Set(header, value) } return nil } } // WithQueryParam is a generic option to add query parameters to a request func WithQueryParam(param, value string) RequestOption { return func(r *http.Request) error { if value != "" { q := r.URL.Query() q.Add(param, value) r.URL.RawQuery = q.Encode() } return nil } } // RemoveHeader is a generic option to remove a header from a request func RemoveHeader(header string) RequestOption { return func(r *http.Request) error { if header != "" { delete(r.Header, header) } return nil } } binwiederhier-ntfy-5ad2431/client/user/000077500000000000000000000000001517171047500201015ustar00rootroot00000000000000binwiederhier-ntfy-5ad2431/client/user/ntfy-client.service000066400000000000000000000003131517171047500237140ustar00rootroot00000000000000[Unit] Description=ntfy client After=network.target [Service] ExecStart=/usr/bin/ntfy subscribe --config "%h/.config/ntfy/client.yml" --from-config Restart=on-failure [Install] WantedBy=default.target binwiederhier-ntfy-5ad2431/cmd/000077500000000000000000000000001517171047500164105ustar00rootroot00000000000000binwiederhier-ntfy-5ad2431/cmd/access.go000066400000000000000000000202551517171047500202040ustar00rootroot00000000000000//go:build !noserver package cmd import ( "errors" "fmt" "github.com/urfave/cli/v2" "heckel.io/ntfy/v2/user" "heckel.io/ntfy/v2/util" ) func init() { commands = append(commands, cmdAccess) } const ( userEveryone = "everyone" ) var flagsAccess = append( append([]cli.Flag{}, flagsUser...), &cli.BoolFlag{Name: "reset", Aliases: []string{"r"}, Usage: "reset access for user (and topic)"}, ) var cmdAccess = &cli.Command{ Name: "access", Usage: "Grant/revoke access to a topic, or show access", UsageText: "ntfy access [USERNAME [TOPIC [PERMISSION]]]", Flags: flagsAccess, Before: initConfigFileInputSourceFunc("config", flagsAccess, initLogFunc), Action: execUserAccess, Category: categoryServer, Description: `Manage the access control list for the ntfy server. This is a server-only command. It directly manages the user.db as defined in the server config file server.yml. The command only works if 'auth-file' is properly defined. Please also refer to the related command 'ntfy user'. The command allows you to show the access control list, as well as change it, depending on how it is called. Usage: ntfy access # Shows access control list (alias: 'ntfy user list') ntfy access USERNAME # Shows access control entries for USERNAME ntfy access USERNAME TOPIC PERMISSION # Allow/deny access for USERNAME to TOPIC Arguments: USERNAME an existing user, as created with 'ntfy user add', or "everyone"/"*" to define access rules for anonymous/unauthenticated clients TOPIC name of a topic with optional wildcards, e.g. "mytopic*" PERMISSION one of the following: - read-write (alias: rw) - read-only (aliases: read, ro) - write-only (aliases: write, wo) - deny (alias: none) Examples: ntfy access # Shows access control list (alias: 'ntfy user list') ntfy access phil # Shows access for user phil ntfy access phil mytopic rw # Allow read-write access to mytopic for user phil ntfy access everyone mytopic rw # Allow anonymous read-write access to mytopic ntfy access everyone "up*" write # Allow anonymous write-only access to topics "up..." ntfy access --reset # Reset entire access control list ntfy access --reset phil # Reset all access for user phil ntfy access --reset phil mytopic # Reset access for user phil and topic mytopic `, } func execUserAccess(c *cli.Context) error { if c.NArg() > 3 { return errors.New("too many arguments, please check 'ntfy access --help' for usage details") } manager, err := createUserManager(c) if err != nil { return err } username := c.Args().Get(0) if username == userEveryone { username = user.Everyone } topic := c.Args().Get(1) perms := c.Args().Get(2) reset := c.Bool("reset") if reset { if perms != "" { return errors.New("too many arguments, please check 'ntfy access --help' for usage details") } return resetAccess(c, manager, username, topic) } else if perms == "" { if topic != "" { return errors.New("invalid syntax, please check 'ntfy access --help' for usage details") } return showAccess(c, manager, username) } return changeAccess(c, manager, username, topic, perms) } func changeAccess(c *cli.Context, manager *user.Manager, username string, topic string, perms string) error { if !util.Contains([]string{"", "read-write", "rw", "read-only", "read", "ro", "write-only", "write", "wo", "none", "deny"}, perms) { return errors.New("permission must be one of: read-write, read-only, write-only, or deny (or the aliases: read, ro, write, wo, none)") } permission, err := user.ParsePermission(perms) if err != nil { return err } u, err := manager.User(username) if errors.Is(err, user.ErrUserNotFound) { return fmt.Errorf("user %s does not exist", username) } else if err != nil { return err } else if u.Role == user.RoleAdmin { return fmt.Errorf("user %s is an admin user, access control entries have no effect", username) } if err := manager.AllowAccess(username, topic, permission); err != nil { return err } if permission.IsReadWrite() { fmt.Fprintf(c.App.Writer, "granted read-write access to topic %s\n\n", topic) } else if permission.IsRead() { fmt.Fprintf(c.App.Writer, "granted read-only access to topic %s\n\n", topic) } else if permission.IsWrite() { fmt.Fprintf(c.App.Writer, "granted write-only access to topic %s\n\n", topic) } else { fmt.Fprintf(c.App.Writer, "revoked all access to topic %s\n\n", topic) } return showUserAccess(c, manager, username) } func resetAccess(c *cli.Context, manager *user.Manager, username, topic string) error { if username == "" { return resetAllAccess(c, manager) } else if topic == "" { return resetUserAccess(c, manager, username) } return resetUserTopicAccess(c, manager, username, topic) } func resetAllAccess(c *cli.Context, manager *user.Manager) error { if err := manager.ResetAccess("", ""); err != nil { return err } fmt.Fprintln(c.App.Writer, "reset access for all users") return nil } func resetUserAccess(c *cli.Context, manager *user.Manager, username string) error { if err := manager.ResetAccess(username, ""); err != nil { return err } fmt.Fprintf(c.App.Writer, "reset access for user %s\n\n", username) return showUserAccess(c, manager, username) } func resetUserTopicAccess(c *cli.Context, manager *user.Manager, username string, topic string) error { if err := manager.ResetAccess(username, topic); err != nil { return err } fmt.Fprintf(c.App.Writer, "reset access for user %s and topic %s\n\n", username, topic) return showUserAccess(c, manager, username) } func showAccess(c *cli.Context, manager *user.Manager, username string) error { if username == "" { return showAllAccess(c, manager) } return showUserAccess(c, manager, username) } func showAllAccess(c *cli.Context, manager *user.Manager) error { users, err := manager.Users() if err != nil { return err } return showUsers(c, manager, users) } func showUserAccess(c *cli.Context, manager *user.Manager, username string) error { users, err := manager.User(username) if errors.Is(err, user.ErrUserNotFound) { return fmt.Errorf("user %s does not exist", username) } else if err != nil { return err } return showUsers(c, manager, []*user.User{users}) } func showUsers(c *cli.Context, manager *user.Manager, users []*user.User) error { for _, u := range users { grants, err := manager.Grants(u.Name) if err != nil { return err } tier := "none" if u.Tier != nil { tier = u.Tier.Name } provisioned := "" if u.Provisioned { provisioned = ", server config" } fmt.Fprintf(c.App.Writer, "user %s (role: %s, tier: %s%s)\n", u.Name, u.Role, tier, provisioned) if u.Role == user.RoleAdmin { fmt.Fprintf(c.App.Writer, "- read-write access to all topics (admin role)\n") } else if len(grants) > 0 { for _, grant := range grants { grantProvisioned := "" if grant.Provisioned { grantProvisioned = " (server config)" } if grant.Permission.IsReadWrite() { fmt.Fprintf(c.App.Writer, "- read-write access to topic %s%s\n", grant.TopicPattern, grantProvisioned) } else if grant.Permission.IsRead() { fmt.Fprintf(c.App.Writer, "- read-only access to topic %s%s\n", grant.TopicPattern, grantProvisioned) } else if grant.Permission.IsWrite() { fmt.Fprintf(c.App.Writer, "- write-only access to topic %s%s\n", grant.TopicPattern, grantProvisioned) } else { fmt.Fprintf(c.App.Writer, "- no access to topic %s%s\n", grant.TopicPattern, grantProvisioned) } } } else { fmt.Fprintf(c.App.Writer, "- no topic-specific permissions\n") } if u.Name == user.Everyone { access := manager.DefaultAccess() if access.IsReadWrite() { fmt.Fprintln(c.App.Writer, "- read-write access to all (other) topics (server config)") } else if access.IsRead() { fmt.Fprintln(c.App.Writer, "- read-only access to all (other) topics (server config)") } else if access.IsWrite() { fmt.Fprintln(c.App.Writer, "- write-only access to all (other) topics (server config)") } else { fmt.Fprintln(c.App.Writer, "- no access to any (other) topics (server config)") } } } return nil } binwiederhier-ntfy-5ad2431/cmd/access_test.go000066400000000000000000000052141517171047500212410ustar00rootroot00000000000000package cmd import ( "fmt" "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" "heckel.io/ntfy/v2/server" "heckel.io/ntfy/v2/test" "testing" ) func TestCLI_Access_Show(t *testing.T) { s, conf, port := newTestServerWithAuth(t) defer test.StopServer(t, s, port) app, _, stdout, _ := newTestApp() require.Nil(t, runAccessCommand(app, conf)) require.Contains(t, stdout.String(), "user * (role: anonymous, tier: none)\n- no topic-specific permissions\n- no access to any (other) topics (server config)") } func TestCLI_Access_Grant_And_Publish(t *testing.T) { s, conf, port := newTestServerWithAuth(t) defer test.StopServer(t, s, port) app, stdin, _, _ := newTestApp() stdin.WriteString("philpass\nphilpass\nbenpass\nbenpass") require.Nil(t, runUserCommand(app, conf, "add", "--role=admin", "phil")) require.Nil(t, runUserCommand(app, conf, "add", "ben")) require.Nil(t, runAccessCommand(app, conf, "ben", "announcements", "rw")) require.Nil(t, runAccessCommand(app, conf, "ben", "sometopic", "read")) require.Nil(t, runAccessCommand(app, conf, "everyone", "announcements", "read")) app, _, stdout, _ := newTestApp() require.Nil(t, runAccessCommand(app, conf)) expected := `user phil (role: admin, tier: none) - read-write access to all topics (admin role) user ben (role: user, tier: none) - read-write access to topic announcements - read-only access to topic sometopic user * (role: anonymous, tier: none) - read-only access to topic announcements - no access to any (other) topics (server config) ` require.Equal(t, expected, stdout.String()) // See if access permissions match app, _, _, _ = newTestApp() require.Error(t, app.Run([]string{ "ntfy", "publish", fmt.Sprintf("http://127.0.0.1:%d/announcements", port), })) require.Nil(t, app.Run([]string{ "ntfy", "publish", "-u", "ben:benpass", fmt.Sprintf("http://127.0.0.1:%d/announcements", port), })) require.Nil(t, app.Run([]string{ "ntfy", "publish", "-u", "phil:philpass", fmt.Sprintf("http://127.0.0.1:%d/announcements", port), })) require.Nil(t, app.Run([]string{ "ntfy", "subscribe", "--poll", fmt.Sprintf("http://127.0.0.1:%d/announcements", port), })) require.Error(t, app.Run([]string{ "ntfy", "subscribe", "--poll", fmt.Sprintf("http://127.0.0.1:%d/something-else", port), })) } func runAccessCommand(app *cli.App, conf *server.Config, args ...string) error { userArgs := []string{ "ntfy", "--log-level=ERROR", "access", "--config=" + conf.File, // Dummy config file to avoid lookups of real file "--auth-file=" + conf.AuthFile, "--auth-default-access=" + conf.AuthDefault.String(), } return app.Run(append(userArgs, args...)) } binwiederhier-ntfy-5ad2431/cmd/app.go000066400000000000000000000065241517171047500175260ustar00rootroot00000000000000// Package cmd provides the ntfy CLI application package cmd import ( "fmt" "os" "regexp" "github.com/urfave/cli/v2" "github.com/urfave/cli/v2/altsrc" "heckel.io/ntfy/v2/log" ) const ( categoryClient = "Client commands" categoryServer = "Server commands" ) // Build metadata keys for app.Metadata const ( MetadataKeyCommit = "commit" MetadataKeyDate = "date" ) var commands = make([]*cli.Command, 0) var flagsDefault = []cli.Flag{ &cli.BoolFlag{Name: "debug", Aliases: []string{"d"}, EnvVars: []string{"NTFY_DEBUG"}, Usage: "enable debug logging"}, &cli.BoolFlag{Name: "trace", EnvVars: []string{"NTFY_TRACE"}, Usage: "enable tracing (very verbose, be careful)"}, &cli.BoolFlag{Name: "no-log-dates", Aliases: []string{"no_log_dates"}, EnvVars: []string{"NTFY_NO_LOG_DATES"}, Usage: "disable the date/time prefix"}, altsrc.NewStringFlag(&cli.StringFlag{Name: "log-level", Aliases: []string{"log_level"}, Value: log.InfoLevel.String(), EnvVars: []string{"NTFY_LOG_LEVEL"}, Usage: "set log level"}), altsrc.NewStringSliceFlag(&cli.StringSliceFlag{Name: "log-level-overrides", Aliases: []string{"log_level_overrides"}, EnvVars: []string{"NTFY_LOG_LEVEL_OVERRIDES"}, Usage: "set log level overrides"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "log-format", Aliases: []string{"log_format"}, Value: log.TextFormat.String(), EnvVars: []string{"NTFY_LOG_FORMAT"}, Usage: "set log format"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "log-file", Aliases: []string{"log_file"}, EnvVars: []string{"NTFY_LOG_FILE"}, Usage: "set log file, default is STDOUT"}), } var ( logLevelOverrideRegex = regexp.MustCompile(`(?i)^([^=\s]+)(?:\s*=\s*(\S+))?\s*->\s*(TRACE|DEBUG|INFO|WARN|ERROR)$`) ) // New creates a new CLI application func New() *cli.App { return &cli.App{ Name: "ntfy", Usage: "Simple pub-sub notification service", UsageText: "ntfy [OPTION..]", HideVersion: true, UseShortOptionHandling: true, Reader: os.Stdin, Writer: os.Stdout, ErrWriter: os.Stderr, Commands: commands, Flags: flagsDefault, Before: initLogFunc, } } func initLogFunc(c *cli.Context) error { log.SetLevel(log.ToLevel(c.String("log-level"))) log.SetFormat(log.ToFormat(c.String("log-format"))) if c.Bool("trace") { log.SetLevel(log.TraceLevel) } else if c.Bool("debug") { log.SetLevel(log.DebugLevel) } if c.Bool("no-log-dates") { log.DisableDates() } if err := applyLogLevelOverrides(c.StringSlice("log-level-overrides")); err != nil { return err } logFile := c.String("log-file") if logFile != "" { w, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600) if err != nil { return err } log.SetOutput(w) } return nil } func applyLogLevelOverrides(rawOverrides []string) error { for _, override := range rawOverrides { m := logLevelOverrideRegex.FindStringSubmatch(override) if len(m) == 4 { field, value, level := m[1], m[2], m[3] log.SetLevelOverride(field, value, log.ToLevel(level)) } else if len(m) == 3 { field, level := m[1], m[2] log.SetLevelOverride(field, "", log.ToLevel(level)) // Matches any value } else { return fmt.Errorf(`invalid log level override "%s", must be "field=value -> loglevel", e.g. "user_id=u_123 -> DEBUG"`, override) } } return nil } binwiederhier-ntfy-5ad2431/cmd/app_test.go000066400000000000000000000012761517171047500205640ustar00rootroot00000000000000package cmd import ( "bytes" "encoding/json" "github.com/urfave/cli/v2" "heckel.io/ntfy/v2/client" "heckel.io/ntfy/v2/log" "os" "strings" "testing" ) // This only contains helpers so far func TestMain(m *testing.M) { log.SetLevel(log.ErrorLevel) os.Exit(m.Run()) } func newTestApp() (*cli.App, *bytes.Buffer, *bytes.Buffer, *bytes.Buffer) { var stdin, stdout, stderr bytes.Buffer app := New() app.Reader = &stdin app.Writer = &stdout app.ErrWriter = &stderr return app, &stdin, &stdout, &stderr } func toMessage(t *testing.T, s string) *client.Message { var m *client.Message if err := json.NewDecoder(strings.NewReader(s)).Decode(&m); err != nil { t.Fatal(err) } return m } binwiederhier-ntfy-5ad2431/cmd/config_loader.go000066400000000000000000000035441517171047500215400ustar00rootroot00000000000000package cmd import ( "fmt" "github.com/urfave/cli/v2" "github.com/urfave/cli/v2/altsrc" "gopkg.in/yaml.v2" "heckel.io/ntfy/v2/util" "os" ) // initConfigFileInputSourceFunc is like altsrc.InitInputSourceWithContext and altsrc.NewYamlSourceFromFlagFunc, but checks // if the config flag is exists and only loads it if it does. If the flag is set and the file exists, it fails. func initConfigFileInputSourceFunc(configFlag string, flags []cli.Flag, next cli.BeforeFunc) cli.BeforeFunc { return func(context *cli.Context) error { configFile := context.String(configFlag) if context.IsSet(configFlag) && !util.FileExists(configFile) { return fmt.Errorf("config file %s does not exist", configFile) } else if !context.IsSet(configFlag) && !util.FileExists(configFile) { return nil } inputSource, err := newYamlSourceFromFile(configFile, flags) if err != nil { return err } if err := altsrc.ApplyInputSourceValues(context, inputSource, flags); err != nil { return err } if next != nil { if err := next(context); err != nil { return err } } return nil } } // newYamlSourceFromFile creates a new Yaml InputSourceContext from a filepath. // // This function also maps aliases, so a .yml file can contain short options, or options with underscores // instead of dashes. See https://github.com/binwiederhier/ntfy/issues/255. func newYamlSourceFromFile(file string, flags []cli.Flag) (altsrc.InputSourceContext, error) { var rawConfig map[any]any b, err := os.ReadFile(file) if err != nil { return nil, err } if err := yaml.Unmarshal(b, &rawConfig); err != nil { return nil, err } for _, f := range flags { flagName := f.Names()[0] for _, flagAlias := range f.Names()[1:] { if _, ok := rawConfig[flagAlias]; ok { rawConfig[flagName] = rawConfig[flagAlias] } } } return altsrc.NewMapInputSource(file, rawConfig), nil } binwiederhier-ntfy-5ad2431/cmd/config_loader_test.go000066400000000000000000000015261517171047500225750ustar00rootroot00000000000000package cmd import ( "github.com/stretchr/testify/require" "os" "path/filepath" "testing" ) func TestNewYamlSourceFromFile(t *testing.T) { filename := filepath.Join(t.TempDir(), "server.yml") contents := ` # Normal options listen-https: ":10443" # Note the underscore! listen_http: ":1080" # OMG this is allowed now ... K: /some/file.pem ` require.Nil(t, os.WriteFile(filename, []byte(contents), 0600)) ctx, err := newYamlSourceFromFile(filename, flagsServe) require.Nil(t, err) listenHTTPS, err := ctx.String("listen-https") require.Nil(t, err) require.Equal(t, ":10443", listenHTTPS) listenHTTP, err := ctx.String("listen-http") // No underscore! require.Nil(t, err) require.Equal(t, ":1080", listenHTTP) keyFile, err := ctx.String("key-file") // Long option! require.Nil(t, err) require.Equal(t, "/some/file.pem", keyFile) } binwiederhier-ntfy-5ad2431/cmd/publish.go000066400000000000000000000320621517171047500204100ustar00rootroot00000000000000package cmd import ( "errors" "fmt" "github.com/urfave/cli/v2" "heckel.io/ntfy/v2/client" "heckel.io/ntfy/v2/log" "heckel.io/ntfy/v2/util" "io" "os" "os/exec" "path/filepath" "strings" "time" ) func init() { commands = append(commands, cmdPublish) } var flagsPublish = append( append([]cli.Flag{}, flagsDefault...), &cli.StringFlag{Name: "config", Aliases: []string{"c"}, EnvVars: []string{"NTFY_CONFIG"}, Usage: "client config file"}, &cli.StringFlag{Name: "title", Aliases: []string{"t"}, EnvVars: []string{"NTFY_TITLE"}, Usage: "message title"}, &cli.StringFlag{Name: "message", Aliases: []string{"m"}, EnvVars: []string{"NTFY_MESSAGE"}, Usage: "message body"}, &cli.StringFlag{Name: "priority", Aliases: []string{"p"}, EnvVars: []string{"NTFY_PRIORITY"}, Usage: "priority of the message (1=min, 2=low, 3=default, 4=high, 5=max)"}, &cli.StringFlag{Name: "tags", Aliases: []string{"tag", "T"}, EnvVars: []string{"NTFY_TAGS"}, Usage: "comma separated list of tags and emojis"}, &cli.StringFlag{Name: "delay", Aliases: []string{"at", "in", "D"}, EnvVars: []string{"NTFY_DELAY"}, Usage: "delay/schedule message"}, &cli.StringFlag{Name: "click", Aliases: []string{"U"}, EnvVars: []string{"NTFY_CLICK"}, Usage: "URL to open when notification is clicked"}, &cli.StringFlag{Name: "icon", Aliases: []string{"i"}, EnvVars: []string{"NTFY_ICON"}, Usage: "URL to use as notification icon"}, &cli.StringFlag{Name: "actions", Aliases: []string{"A"}, EnvVars: []string{"NTFY_ACTIONS"}, Usage: "actions JSON array or simple definition"}, &cli.StringFlag{Name: "attach", Aliases: []string{"a"}, EnvVars: []string{"NTFY_ATTACH"}, Usage: "URL to send as an external attachment"}, &cli.BoolFlag{Name: "markdown", Aliases: []string{"md"}, EnvVars: []string{"NTFY_MARKDOWN"}, Usage: "Message is formatted as Markdown"}, &cli.StringFlag{Name: "template", Aliases: []string{"tpl"}, EnvVars: []string{"NTFY_TEMPLATE"}, Usage: "use templates to transform JSON message body"}, &cli.StringFlag{Name: "filename", Aliases: []string{"name", "n"}, EnvVars: []string{"NTFY_FILENAME"}, Usage: "filename for the attachment"}, &cli.StringFlag{Name: "sequence-id", Aliases: []string{"sequence_id", "sid", "S"}, EnvVars: []string{"NTFY_SEQUENCE_ID"}, Usage: "sequence ID for updating notifications"}, &cli.StringFlag{Name: "file", Aliases: []string{"f"}, EnvVars: []string{"NTFY_FILE"}, Usage: "file to upload as an attachment"}, &cli.StringFlag{Name: "email", Aliases: []string{"mail", "e"}, EnvVars: []string{"NTFY_EMAIL"}, Usage: "also send to e-mail address"}, &cli.StringFlag{Name: "user", Aliases: []string{"u"}, EnvVars: []string{"NTFY_USER"}, Usage: "username[:password] used to auth against the server"}, &cli.StringFlag{Name: "token", Aliases: []string{"k"}, EnvVars: []string{"NTFY_TOKEN"}, Usage: "access token used to auth against the server"}, &cli.IntFlag{Name: "wait-pid", Aliases: []string{"wait_pid", "pid"}, EnvVars: []string{"NTFY_WAIT_PID"}, Usage: "wait until PID exits before publishing"}, &cli.BoolFlag{Name: "wait-cmd", Aliases: []string{"wait_cmd", "cmd", "done"}, EnvVars: []string{"NTFY_WAIT_CMD"}, Usage: "run command and wait until it finishes before publishing"}, &cli.BoolFlag{Name: "no-cache", Aliases: []string{"no_cache", "C"}, EnvVars: []string{"NTFY_NO_CACHE"}, Usage: "do not cache message server-side"}, &cli.BoolFlag{Name: "no-firebase", Aliases: []string{"no_firebase", "F"}, EnvVars: []string{"NTFY_NO_FIREBASE"}, Usage: "do not forward message to Firebase"}, &cli.BoolFlag{Name: "quiet", Aliases: []string{"q"}, EnvVars: []string{"NTFY_QUIET"}, Usage: "do not print message"}, ) var cmdPublish = &cli.Command{ Name: "publish", Aliases: []string{"pub", "send", "trigger"}, Usage: "Send message via a ntfy server", UsageText: `ntfy publish [OPTIONS..] TOPIC [MESSAGE...] ntfy publish [OPTIONS..] --wait-cmd COMMAND... NTFY_TOPIC=.. ntfy publish [OPTIONS..] [MESSAGE...]`, Action: execPublish, Category: categoryClient, Flags: flagsPublish, Before: initLogFunc, Description: `Publish a message to a ntfy server. Examples: ntfy publish mytopic This is my message # Send simple message ntfy send myserver.com/mytopic "This is my message" # Send message to different default host ntfy pub -p high backups "Backups failed" # Send high priority message ntfy pub --tags=warning,skull backups "Backups failed" # Add tags/emojis to message ntfy pub --delay=10s delayed_topic Laterzz # Delay message by 10s ntfy pub --at=8:30am delayed_topic Laterzz # Send message at 8:30am ntfy pub -e phil@example.com alerts 'App is down!' # Also send email to phil@example.com ntfy pub --click="https://reddit.com" redd 'New msg' # Opens Reddit when notification is clicked ntfy pub --icon="http://some.tld/icon.png" 'Icon!' # Send notification with custom icon ntfy pub --attach="http://some.tld/file.zip" files # Send ZIP archive from URL as attachment ntfy pub --file=flower.jpg flowers 'Nice!' # Send image.jpg as attachment ntfy pub -S my-id mytopic 'Update me' # Send with sequence ID for updates echo 'message' | ntfy publish mytopic # Send message from stdin ntfy pub -u phil:mypass secret Psst # Publish with username/password ntfy pub --wait-pid 1234 mytopic # Wait for process 1234 to exit before publishing ntfy pub --wait-cmd mytopic rsync -av ./ /tmp/a # Run command and publish after it completes NTFY_USER=phil:mypass ntfy pub secret Psst # Use env variables to set username/password NTFY_TOPIC=mytopic ntfy pub "some message" # Use NTFY_TOPIC variable as topic cat flower.jpg | ntfy pub --file=- flowers 'Nice!' # Same as above, send image.jpg as attachment ntfy trigger mywebhook # Sending without message, useful for webhooks Please also check out the docs on publishing messages. Especially for the --tags and --delay options, it has incredibly useful information: https://ntfy.sh/docs/publish/. ` + clientCommandDescriptionSuffix, } func execPublish(c *cli.Context) error { conf, err := loadConfig(c) if err != nil { return err } title := c.String("title") priority := c.String("priority") tags := c.String("tags") delay := c.String("delay") click := c.String("click") icon := c.String("icon") actions := c.String("actions") attach := c.String("attach") markdown := c.Bool("markdown") template := c.String("template") filename := c.String("filename") sequenceID := c.String("sequence-id") file := c.String("file") email := c.String("email") user := c.String("user") token := c.String("token") noCache := c.Bool("no-cache") noFirebase := c.Bool("no-firebase") quiet := c.Bool("quiet") pid := c.Int("wait-pid") // Checks if user != "" && token != "" { return errors.New("cannot set both --user and --token") } // Do the things topic, message, command, err := parseTopicMessageCommand(c) if err != nil { return err } var options []client.PublishOption if title != "" { options = append(options, client.WithTitle(title)) } if priority != "" { options = append(options, client.WithPriority(priority)) } if tags != "" { options = append(options, client.WithTagsList(tags)) } if delay != "" { options = append(options, client.WithDelay(delay)) } if click != "" { options = append(options, client.WithClick(click)) } if icon != "" { options = append(options, client.WithIcon(icon)) } if actions != "" { options = append(options, client.WithActions(strings.ReplaceAll(actions, "\n", " "))) } if attach != "" { options = append(options, client.WithAttach(attach)) } if markdown { options = append(options, client.WithMarkdown()) } if template != "" { options = append(options, client.WithTemplate(template)) } if filename != "" { options = append(options, client.WithFilename(filename)) } if sequenceID != "" { options = append(options, client.WithSequenceID(sequenceID)) } if email != "" { options = append(options, client.WithEmail(email)) } if noCache { options = append(options, client.WithNoCache()) } if noFirebase { options = append(options, client.WithNoFirebase()) } if token != "" { options = append(options, client.WithBearerAuth(token)) } else if user != "" { var pass string parts := strings.SplitN(user, ":", 2) if len(parts) == 2 { user = parts[0] pass = parts[1] } else { fmt.Fprint(c.App.ErrWriter, "Enter Password: ") p, err := util.ReadPassword(c.App.Reader) if err != nil { return err } pass = string(p) fmt.Fprintf(c.App.ErrWriter, "\r%s\r", strings.Repeat(" ", 20)) } options = append(options, client.WithBasicAuth(user, pass)) } else if conf.DefaultToken != "" { options = append(options, client.WithBearerAuth(conf.DefaultToken)) } else if conf.DefaultUser != "" && conf.DefaultPassword != nil { options = append(options, client.WithBasicAuth(conf.DefaultUser, *conf.DefaultPassword)) } if pid > 0 { newMessage, err := waitForProcess(pid) if err != nil { return err } else if message == "" { message = newMessage } } else if len(command) > 0 { newMessage, err := runAndWaitForCommand(command) if err != nil { return err } else if message == "" { message = newMessage } } var body io.Reader if file == "" { body = strings.NewReader(message) } else { if message != "" { options = append(options, client.WithMessage(message)) } if file == "-" { if filename == "" { options = append(options, client.WithFilename("stdin")) } body = c.App.Reader } else { if filename == "" { options = append(options, client.WithFilename(filepath.Base(file))) } body, err = os.Open(file) if err != nil { return err } } } cl := client.New(conf) m, err := cl.PublishReader(topic, body, options...) if err != nil { return err } if !quiet { fmt.Fprintln(c.App.Writer, strings.TrimSpace(m.Raw)) } return nil } // parseTopicMessageCommand reads the topic and the remaining arguments from the context. // There are a few cases to consider: // // ntfy publish [] // ntfy publish --wait-cmd // NTFY_TOPIC=.. ntfy publish [] // NTFY_TOPIC=.. ntfy publish --wait-cmd func parseTopicMessageCommand(c *cli.Context) (topic string, message string, command []string, err error) { var args []string topic, args, err = parseTopicAndArgs(c) if err != nil { return } if c.Bool("wait-cmd") { if len(args) == 0 { err = errors.New("must specify command when --wait-cmd is passed, type 'ntfy publish --help' for help") return } command = args } else { message = strings.Join(args, " ") } if c.String("message") != "" { message = c.String("message") } if message == "" && isStdinRedirected() { var data []byte data, err = io.ReadAll(io.LimitReader(c.App.Reader, 1024*1024)) if err != nil { log.Debug("Failed to read from stdin: %s", err.Error()) return } message = strings.TrimSpace(string(data)) } return } func parseTopicAndArgs(c *cli.Context) (topic string, args []string, err error) { envTopic := os.Getenv("NTFY_TOPIC") if envTopic != "" { topic = envTopic return topic, remainingArgs(c, 0), nil } if c.NArg() < 1 { return "", nil, errors.New("must specify topic, type 'ntfy publish --help' for help") } return c.Args().Get(0), remainingArgs(c, 1), nil } func remainingArgs(c *cli.Context, fromIndex int) []string { if c.NArg() > fromIndex { return c.Args().Slice()[fromIndex:] } return []string{} } func waitForProcess(pid int) (message string, err error) { if !processExists(pid) { return "", fmt.Errorf("process with PID %d not running", pid) } start := time.Now() log.Debug("Waiting for process with PID %d to exit", pid) for processExists(pid) { time.Sleep(500 * time.Millisecond) } runtime := time.Since(start).Round(time.Millisecond) log.Debug("Process with PID %d exited after %s", pid, runtime) return fmt.Sprintf("Process with PID %d exited after %s", pid, runtime), nil } func runAndWaitForCommand(command []string) (message string, err error) { prettyCmd := util.QuoteCommand(command) log.Debug("Running command: %s", prettyCmd) start := time.Now() cmd := exec.Command(command[0], command[1:]...) if log.IsTrace() { cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr } err = cmd.Run() runtime := time.Since(start).Round(time.Millisecond) if err != nil { if exitError, ok := err.(*exec.ExitError); ok { log.Debug("Command failed after %s (exit code %d): %s", runtime, exitError.ExitCode(), prettyCmd) return fmt.Sprintf("Command failed after %s (exit code %d): %s", runtime, exitError.ExitCode(), prettyCmd), nil } // Hard fail when command does not exist or could not be properly launched return "", fmt.Errorf("command failed: %s, error: %s", prettyCmd, err.Error()) } log.Debug("Command succeeded after %s: %s", runtime, prettyCmd) return fmt.Sprintf("Command succeeded after %s: %s", runtime, prettyCmd), nil } func isStdinRedirected() bool { stat, err := os.Stdin.Stat() if err != nil { log.Debug("Failed to stat stdin: %s", err.Error()) return false } return (stat.Mode() & os.ModeCharDevice) == 0 } binwiederhier-ntfy-5ad2431/cmd/publish_test.go000066400000000000000000000265331517171047500214550ustar00rootroot00000000000000package cmd import ( "fmt" "net/http" "net/http/httptest" "os" "os/exec" "path/filepath" "strconv" "strings" "testing" "time" "github.com/stretchr/testify/require" "heckel.io/ntfy/v2/test" "heckel.io/ntfy/v2/util" ) func TestCLI_Publish_Subscribe_Poll_Real_Server(t *testing.T) { t.Skip("temporarily disabled") // FIXME testMessage := util.RandomString(10) app, _, _, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "publish", "ntfytest", "ntfy unit test " + testMessage})) _, err := util.Retry(func() (*int, error) { app2, _, stdout, _ := newTestApp() if err := app2.Run([]string{"ntfy", "subscribe", "--poll", "ntfytest"}); err != nil { return nil, err } if !strings.Contains(stdout.String(), testMessage) { return nil, fmt.Errorf("test message %s not found in topic", testMessage) } return util.Int(1), nil }, time.Second, 2*time.Second, 5*time.Second) // Since #502, ntfy.sh writes messages to the cache asynchronously, after a timeout of ~1.5s require.Nil(t, err) } func TestCLI_Publish_Subscribe_Poll(t *testing.T) { s, port := test.StartServer(t) defer test.StopServer(t, s, port) topic := fmt.Sprintf("http://127.0.0.1:%d/mytopic", port) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "publish", topic, "some message"})) m := toMessage(t, stdout.String()) require.Equal(t, "some message", m.Message) app2, _, stdout, _ := newTestApp() require.Nil(t, app2.Run([]string{"ntfy", "subscribe", "--poll", topic})) m = toMessage(t, stdout.String()) require.Equal(t, "some message", m.Message) } func TestCLI_Publish_All_The_Things(t *testing.T) { s, port := test.StartServer(t) defer test.StopServer(t, s, port) topic := fmt.Sprintf("http://127.0.0.1:%d/mytopic", port) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{ "ntfy", "publish", "--title", "this is a title", "--priority", "high", "--tags", "tag1,tag2", // No --delay, --email "--click", "https://ntfy.sh", "--icon", "https://ntfy.sh/static/img/ntfy.png", "--attach", "https://f-droid.org/F-Droid.apk", "--filename", "fdroid.apk", "--no-cache", "--no-firebase", topic, "some message", })) m := toMessage(t, stdout.String()) require.Equal(t, "message", m.Event) require.Equal(t, "mytopic", m.Topic) require.Equal(t, "some message", m.Message) require.Equal(t, "this is a title", m.Title) require.Equal(t, 4, m.Priority) require.Equal(t, []string{"tag1", "tag2"}, m.Tags) require.Equal(t, "https://ntfy.sh", m.Click) require.Equal(t, "https://f-droid.org/F-Droid.apk", m.Attachment.URL) require.Equal(t, "fdroid.apk", m.Attachment.Name) require.Equal(t, int64(0), m.Attachment.Size) require.Equal(t, "", m.Attachment.Owner) require.Equal(t, int64(0), m.Attachment.Expires) require.Equal(t, "", m.Attachment.Type) require.Equal(t, "https://ntfy.sh/static/img/ntfy.png", m.Icon) } func TestCLI_Publish_Wait_PID_And_Cmd(t *testing.T) { s, port := test.StartServer(t) defer test.StopServer(t, s, port) topic := fmt.Sprintf("http://127.0.0.1:%d/mytopic", port) // Test: sleep 0.5 sleep := exec.Command("sleep", "0.5") require.Nil(t, sleep.Start()) go sleep.Wait() // Must be called to release resources start := time.Now() app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "publish", "--wait-pid", strconv.Itoa(sleep.Process.Pid), topic})) m := toMessage(t, stdout.String()) require.True(t, time.Since(start) >= 500*time.Millisecond) require.Regexp(t, `Process with PID \d+ exited after `, m.Message) // Test: PID does not exist app, _, _, _ = newTestApp() err := app.Run([]string{"ntfy", "publish", "--wait-pid", "1234567", topic}) require.Error(t, err) require.Equal(t, "process with PID 1234567 not running", err.Error()) // Test: Successful command (exit 0) start = time.Now() app, _, stdout, _ = newTestApp() require.Nil(t, app.Run([]string{"ntfy", "publish", "--wait-cmd", topic, "sleep", "0.5"})) m = toMessage(t, stdout.String()) require.True(t, time.Since(start) >= 500*time.Millisecond) require.Contains(t, m.Message, `Command succeeded after `) require.Contains(t, m.Message, `: sleep 0.5`) // Test: Failing command (exit 1) app, _, stdout, _ = newTestApp() require.Nil(t, app.Run([]string{"ntfy", "publish", "--wait-cmd", topic, "/bin/false", "false doesn't care about its args"})) m = toMessage(t, stdout.String()) require.Contains(t, m.Message, `Command failed after `) require.Contains(t, m.Message, `(exit code 1): /bin/false "false doesn't care about its args"`, m.Message) // Test: Non-existing command (hard fail!) app, _, _, _ = newTestApp() err = app.Run([]string{"ntfy", "publish", "--wait-cmd", topic, "does-not-exist-no-really", "really though"}) require.Error(t, err) require.Equal(t, `command failed: does-not-exist-no-really "really though", error: exec: "does-not-exist-no-really": executable file not found in $PATH`, err.Error()) // Tests with NTFY_TOPIC set //// t.Setenv("NTFY_TOPIC", topic) // Test: Successful command with NTFY_TOPIC app, _, stdout, _ = newTestApp() require.Nil(t, app.Run([]string{"ntfy", "publish", "--cmd", "echo", "hi there"})) m = toMessage(t, stdout.String()) require.Equal(t, "mytopic", m.Topic) // Test: Successful --wait-pid with NTFY_TOPIC sleep = exec.Command("sleep", "0.2") require.Nil(t, sleep.Start()) go sleep.Wait() // Must be called to release resources app, _, stdout, _ = newTestApp() require.Nil(t, app.Run([]string{"ntfy", "publish", "--wait-pid", strconv.Itoa(sleep.Process.Pid)})) m = toMessage(t, stdout.String()) require.Regexp(t, `Process with PID \d+ exited after .+ms`, m.Message) } func TestCLI_Publish_Default_UserPass(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic", r.URL.Path) require.Equal(t, "Basic cGhpbGlwcDpteXBhc3M=", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s default-user: philipp default-password: mypass `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "publish", "--config=" + filename, "mytopic", "triggered"})) m := toMessage(t, stdout.String()) require.Equal(t, "triggered", m.Message) } func TestCLI_Publish_Default_Token(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic", r.URL.Path) require.Equal(t, "Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s default-token: tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "publish", "--config=" + filename, "mytopic", "triggered"})) m := toMessage(t, stdout.String()) require.Equal(t, "triggered", m.Message) } func TestCLI_Publish_Default_UserPass_CLI_Token(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic", r.URL.Path) require.Equal(t, "Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s default-user: philipp default-password: mypass `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "publish", "--config=" + filename, "--token", "tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2", "mytopic", "triggered"})) m := toMessage(t, stdout.String()) require.Equal(t, "triggered", m.Message) } func TestCLI_Publish_Default_Token_CLI_UserPass(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic", r.URL.Path) require.Equal(t, "Basic cGhpbGlwcDpteXBhc3M=", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s default-token: tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "publish", "--config=" + filename, "--user", "philipp:mypass", "mytopic", "triggered"})) m := toMessage(t, stdout.String()) require.Equal(t, "triggered", m.Message) } func TestCLI_Publish_Default_Token_CLI_Token(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic", r.URL.Path) require.Equal(t, "Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s default-token: tk_FAKETOKEN01234567890FAKETOKEN `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "publish", "--config=" + filename, "--token", "tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2", "mytopic", "triggered"})) m := toMessage(t, stdout.String()) require.Equal(t, "triggered", m.Message) } func TestCLI_Publish_Default_UserPass_CLI_UserPass(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic", r.URL.Path) require.Equal(t, "Basic cGhpbGlwcDpteXBhc3M=", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s default-user: philipp default-password: fakepass `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "publish", "--config=" + filename, "--user", "philipp:mypass", "mytopic", "triggered"})) m := toMessage(t, stdout.String()) require.Equal(t, "triggered", m.Message) } func TestCLI_Publish_Token_And_UserPass(t *testing.T) { app, _, _, _ := newTestApp() err := app.Run([]string{"ntfy", "publish", "--token", "tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2", "--user", "philipp:mypass", "mytopic", "triggered"}) require.Error(t, err) require.Equal(t, "cannot set both --user and --token", err.Error()) } binwiederhier-ntfy-5ad2431/cmd/publish_unix.go000066400000000000000000000003151517171047500214470ustar00rootroot00000000000000//go:build darwin || linux || dragonfly || freebsd || netbsd || openbsd package cmd import "syscall" func processExists(pid int) bool { err := syscall.Kill(pid, syscall.Signal(0)) return err == nil } binwiederhier-ntfy-5ad2431/cmd/publish_windows.go000066400000000000000000000001661517171047500221620ustar00rootroot00000000000000package cmd import ( "os" ) func processExists(pid int) bool { _, err := os.FindProcess(pid) return err == nil } binwiederhier-ntfy-5ad2431/cmd/serve.go000066400000000000000000001326151517171047500200730ustar00rootroot00000000000000//go:build !noserver package cmd import ( "errors" "fmt" "io/fs" "math" "net" "net/netip" "net/url" "runtime" "strings" "text/template" "time" "github.com/urfave/cli/v2" "github.com/urfave/cli/v2/altsrc" "heckel.io/ntfy/v2/log" "heckel.io/ntfy/v2/payments" "heckel.io/ntfy/v2/server" "heckel.io/ntfy/v2/user" "heckel.io/ntfy/v2/util" ) func init() { commands = append(commands, cmdServe) } var flagsServe = append( append([]cli.Flag{}, flagsDefault...), &cli.StringFlag{Name: "config", Aliases: []string{"c"}, EnvVars: []string{"NTFY_CONFIG_FILE"}, Value: server.DefaultConfigFile, Usage: "config file"}, altsrc.NewStringFlag(&cli.StringFlag{Name: "base-url", Aliases: []string{"base_url", "B"}, EnvVars: []string{"NTFY_BASE_URL"}, Usage: "externally visible base URL for this host (e.g. https://ntfy.sh)"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "listen-http", Aliases: []string{"listen_http", "l"}, EnvVars: []string{"NTFY_LISTEN_HTTP"}, Value: server.DefaultListenHTTP, Usage: "ip:port used as HTTP listen address"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "listen-https", Aliases: []string{"listen_https", "L"}, EnvVars: []string{"NTFY_LISTEN_HTTPS"}, Usage: "ip:port used as HTTPS listen address"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "listen-unix", Aliases: []string{"listen_unix", "U"}, EnvVars: []string{"NTFY_LISTEN_UNIX"}, Usage: "listen on unix socket path"}), altsrc.NewIntFlag(&cli.IntFlag{Name: "listen-unix-mode", Aliases: []string{"listen_unix_mode"}, EnvVars: []string{"NTFY_LISTEN_UNIX_MODE"}, DefaultText: "system default", Usage: "file permissions of unix socket, e.g. 0700"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "key-file", Aliases: []string{"key_file", "K"}, EnvVars: []string{"NTFY_KEY_FILE"}, Usage: "private key file, if listen-https is set"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "cert-file", Aliases: []string{"cert_file", "E"}, EnvVars: []string{"NTFY_CERT_FILE"}, Usage: "certificate file, if listen-https is set"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "firebase-key-file", Aliases: []string{"firebase_key_file", "F"}, EnvVars: []string{"NTFY_FIREBASE_KEY_FILE"}, Usage: "Firebase credentials file; if set additionally publish to FCM topic"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "database-url", Aliases: []string{"database_url"}, EnvVars: []string{"NTFY_DATABASE_URL"}, Usage: "PostgreSQL connection string for database-backed stores (e.g. postgres://user:pass@host:5432/ntfy)"}), altsrc.NewStringSliceFlag(&cli.StringSliceFlag{Name: "database-replica-urls", Aliases: []string{"database_replica_urls"}, EnvVars: []string{"NTFY_DATABASE_REPLICA_URLS"}, Usage: "PostgreSQL read replica connection strings for offloading read queries"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "cache-file", Aliases: []string{"cache_file", "C"}, EnvVars: []string{"NTFY_CACHE_FILE"}, Usage: "cache file used for message caching"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "cache-duration", Aliases: []string{"cache_duration", "b"}, EnvVars: []string{"NTFY_CACHE_DURATION"}, Value: util.FormatDuration(server.DefaultCacheDuration), Usage: "buffer messages for this time to allow `since` requests"}), altsrc.NewIntFlag(&cli.IntFlag{Name: "cache-batch-size", Aliases: []string{"cache_batch_size"}, EnvVars: []string{"NTFY_BATCH_SIZE"}, Usage: "max size of messages to batch together when writing to message cache (if zero, writes are synchronous)"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "cache-batch-timeout", Aliases: []string{"cache_batch_timeout"}, EnvVars: []string{"NTFY_CACHE_BATCH_TIMEOUT"}, Value: util.FormatDuration(server.DefaultCacheBatchTimeout), Usage: "timeout for batched async writes to the message cache (if zero, writes are synchronous)"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "cache-startup-queries", Aliases: []string{"cache_startup_queries"}, EnvVars: []string{"NTFY_CACHE_STARTUP_QUERIES"}, Usage: "queries run when the cache database is initialized"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "auth-file", Aliases: []string{"auth_file", "H"}, EnvVars: []string{"NTFY_AUTH_FILE"}, Usage: "auth database file used for access control"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "auth-startup-queries", Aliases: []string{"auth_startup_queries"}, EnvVars: []string{"NTFY_AUTH_STARTUP_QUERIES"}, Usage: "queries run when the auth database is initialized"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "auth-default-access", Aliases: []string{"auth_default_access", "p"}, EnvVars: []string{"NTFY_AUTH_DEFAULT_ACCESS"}, Value: "read-write", Usage: "default permissions if no matching entries in the auth database are found"}), altsrc.NewStringSliceFlag(&cli.StringSliceFlag{Name: "auth-users", Aliases: []string{"auth_users"}, EnvVars: []string{"NTFY_AUTH_USERS"}, Usage: "pre-provisioned declarative users"}), altsrc.NewStringSliceFlag(&cli.StringSliceFlag{Name: "auth-access", Aliases: []string{"auth_access"}, EnvVars: []string{"NTFY_AUTH_ACCESS"}, Usage: "pre-provisioned declarative access control entries"}), altsrc.NewStringSliceFlag(&cli.StringSliceFlag{Name: "auth-tokens", Aliases: []string{"auth_tokens"}, EnvVars: []string{"NTFY_AUTH_TOKENS"}, Usage: "pre-provisioned declarative access tokens"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "attachment-cache-dir", Aliases: []string{"attachment_cache_dir"}, EnvVars: []string{"NTFY_ATTACHMENT_CACHE_DIR"}, Usage: "cache directory for attached files, or S3 URL (s3://ACCESS_KEY:SECRET_KEY@BUCKET[/PREFIX]?region=REGION[&endpoint=ENDPOINT])"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "attachment-total-size-limit", Aliases: []string{"attachment_total_size_limit", "A"}, EnvVars: []string{"NTFY_ATTACHMENT_TOTAL_SIZE_LIMIT"}, Value: util.FormatSize(server.DefaultAttachmentTotalSizeLimit), Usage: "limit of the on-disk attachment cache"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "attachment-file-size-limit", Aliases: []string{"attachment_file_size_limit", "Y"}, EnvVars: []string{"NTFY_ATTACHMENT_FILE_SIZE_LIMIT"}, Value: util.FormatSize(server.DefaultAttachmentFileSizeLimit), Usage: "per-file attachment size limit (e.g. 300k, 2M, 100M)"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "attachment-expiry-duration", Aliases: []string{"attachment_expiry_duration", "X"}, EnvVars: []string{"NTFY_ATTACHMENT_EXPIRY_DURATION"}, Value: util.FormatDuration(server.DefaultAttachmentExpiryDuration), Usage: "duration after which uploaded attachments will be deleted (e.g. 3h, 20h)"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "template-dir", Aliases: []string{"template_dir"}, EnvVars: []string{"NTFY_TEMPLATE_DIR"}, Value: server.DefaultTemplateDir, Usage: "directory to load named message templates from"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "keepalive-interval", Aliases: []string{"keepalive_interval", "k"}, EnvVars: []string{"NTFY_KEEPALIVE_INTERVAL"}, Value: util.FormatDuration(server.DefaultKeepaliveInterval), Usage: "interval of keepalive messages"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "manager-interval", Aliases: []string{"manager_interval", "m"}, EnvVars: []string{"NTFY_MANAGER_INTERVAL"}, Value: util.FormatDuration(server.DefaultManagerInterval), Usage: "interval of for message pruning and stats printing"}), altsrc.NewStringSliceFlag(&cli.StringSliceFlag{Name: "disallowed-topics", Aliases: []string{"disallowed_topics"}, EnvVars: []string{"NTFY_DISALLOWED_TOPICS"}, Usage: "topics that are not allowed to be used"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "web-root", Aliases: []string{"web_root"}, EnvVars: []string{"NTFY_WEB_ROOT"}, Value: "/", Usage: "sets root of the web app (e.g. /, or /app), or disables it (disable)"}), altsrc.NewBoolFlag(&cli.BoolFlag{Name: "enable-signup", Aliases: []string{"enable_signup"}, EnvVars: []string{"NTFY_ENABLE_SIGNUP"}, Value: false, Usage: "allows users to sign up via the web app, or API"}), altsrc.NewBoolFlag(&cli.BoolFlag{Name: "enable-login", Aliases: []string{"enable_login"}, EnvVars: []string{"NTFY_ENABLE_LOGIN"}, Value: false, Usage: "allows users to log in via the web app, or API"}), altsrc.NewBoolFlag(&cli.BoolFlag{Name: "enable-reservations", Aliases: []string{"enable_reservations"}, EnvVars: []string{"NTFY_ENABLE_RESERVATIONS"}, Value: false, Usage: "allows users to reserve topics (if their tier allows it)"}), altsrc.NewBoolFlag(&cli.BoolFlag{Name: "require-login", Aliases: []string{"require_login"}, EnvVars: []string{"NTFY_REQUIRE_LOGIN"}, Value: false, Usage: "all actions via the web app requires a login"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "upstream-base-url", Aliases: []string{"upstream_base_url"}, EnvVars: []string{"NTFY_UPSTREAM_BASE_URL"}, Value: "", Usage: "forward poll request to an upstream server, this is needed for iOS push notifications for self-hosted servers"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "upstream-access-token", Aliases: []string{"upstream_access_token"}, EnvVars: []string{"NTFY_UPSTREAM_ACCESS_TOKEN"}, Value: "", Usage: "access token to use for the upstream server; needed only if upstream rate limits are exceeded or upstream server requires auth"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "smtp-sender-addr", Aliases: []string{"smtp_sender_addr"}, EnvVars: []string{"NTFY_SMTP_SENDER_ADDR"}, Usage: "SMTP server address (host:port) for outgoing emails"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "smtp-sender-user", Aliases: []string{"smtp_sender_user"}, EnvVars: []string{"NTFY_SMTP_SENDER_USER"}, Usage: "SMTP user (if e-mail sending is enabled)"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "smtp-sender-pass", Aliases: []string{"smtp_sender_pass"}, EnvVars: []string{"NTFY_SMTP_SENDER_PASS"}, Usage: "SMTP password (if e-mail sending is enabled)"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "smtp-sender-from", Aliases: []string{"smtp_sender_from"}, EnvVars: []string{"NTFY_SMTP_SENDER_FROM"}, Usage: "SMTP sender address (if e-mail sending is enabled)"}), altsrc.NewBoolFlag(&cli.BoolFlag{Name: "smtp-sender-verify", Aliases: []string{"smtp_sender_verify"}, EnvVars: []string{"NTFY_SMTP_SENDER_VERIFY"}, Value: false, Usage: "require verified email addresses for sending email notifications"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "smtp-server-listen", Aliases: []string{"smtp_server_listen"}, EnvVars: []string{"NTFY_SMTP_SERVER_LISTEN"}, Usage: "SMTP server address (ip:port) for incoming emails, e.g. :25"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "smtp-server-domain", Aliases: []string{"smtp_server_domain"}, EnvVars: []string{"NTFY_SMTP_SERVER_DOMAIN"}, Usage: "SMTP domain for incoming e-mail, e.g. ntfy.sh"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "smtp-server-addr-prefix", Aliases: []string{"smtp_server_addr_prefix"}, EnvVars: []string{"NTFY_SMTP_SERVER_ADDR_PREFIX"}, Usage: "SMTP email address prefix for topics to prevent spam (e.g. 'ntfy-')"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "twilio-account", Aliases: []string{"twilio_account"}, EnvVars: []string{"NTFY_TWILIO_ACCOUNT"}, Usage: "Twilio account SID, used for phone calls, e.g. AC123..."}), altsrc.NewStringFlag(&cli.StringFlag{Name: "twilio-auth-token", Aliases: []string{"twilio_auth_token"}, EnvVars: []string{"NTFY_TWILIO_AUTH_TOKEN"}, Usage: "Twilio auth token"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "twilio-phone-number", Aliases: []string{"twilio_phone_number"}, EnvVars: []string{"NTFY_TWILIO_PHONE_NUMBER"}, Usage: "Twilio number to use for outgoing calls"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "twilio-verify-service", Aliases: []string{"twilio_verify_service"}, EnvVars: []string{"NTFY_TWILIO_VERIFY_SERVICE"}, Usage: "Twilio Verify service ID, used for phone number verification"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "twilio-call-format", Aliases: []string{"twilio_call_format"}, EnvVars: []string{"NTFY_TWILIO_CALL_FORMAT"}, Usage: "Twilio/TwiML format string for phone calls"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "message-size-limit", Aliases: []string{"message_size_limit"}, EnvVars: []string{"NTFY_MESSAGE_SIZE_LIMIT"}, Value: util.FormatSize(server.DefaultMessageSizeLimit), Usage: "size limit for the message (see docs for limitations)"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "message-delay-limit", Aliases: []string{"message_delay_limit"}, EnvVars: []string{"NTFY_MESSAGE_DELAY_LIMIT"}, Value: util.FormatDuration(server.DefaultMessageDelayMax), Usage: "max duration a message can be scheduled into the future"}), altsrc.NewIntFlag(&cli.IntFlag{Name: "global-topic-limit", Aliases: []string{"global_topic_limit", "T"}, EnvVars: []string{"NTFY_GLOBAL_TOPIC_LIMIT"}, Value: server.DefaultTotalTopicLimit, Usage: "total number of topics allowed"}), altsrc.NewIntFlag(&cli.IntFlag{Name: "visitor-subscription-limit", Aliases: []string{"visitor_subscription_limit"}, EnvVars: []string{"NTFY_VISITOR_SUBSCRIPTION_LIMIT"}, Value: server.DefaultVisitorSubscriptionLimit, Usage: "number of subscriptions per visitor"}), altsrc.NewBoolFlag(&cli.BoolFlag{Name: "visitor-subscriber-rate-limiting", Aliases: []string{"visitor_subscriber_rate_limiting"}, EnvVars: []string{"NTFY_VISITOR_SUBSCRIBER_RATE_LIMITING"}, Value: false, Usage: "enables subscriber-based rate limiting"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "visitor-attachment-total-size-limit", Aliases: []string{"visitor_attachment_total_size_limit"}, EnvVars: []string{"NTFY_VISITOR_ATTACHMENT_TOTAL_SIZE_LIMIT"}, Value: util.FormatSize(server.DefaultVisitorAttachmentTotalSizeLimit), Usage: "total storage limit used for attachments per visitor"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "visitor-attachment-daily-bandwidth-limit", Aliases: []string{"visitor_attachment_daily_bandwidth_limit"}, EnvVars: []string{"NTFY_VISITOR_ATTACHMENT_DAILY_BANDWIDTH_LIMIT"}, Value: "500M", Usage: "total daily attachment download/upload bandwidth limit per visitor"}), altsrc.NewIntFlag(&cli.IntFlag{Name: "visitor-request-limit-burst", Aliases: []string{"visitor_request_limit_burst"}, EnvVars: []string{"NTFY_VISITOR_REQUEST_LIMIT_BURST"}, Value: server.DefaultVisitorRequestLimitBurst, Usage: "initial limit of requests per visitor"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "visitor-request-limit-replenish", Aliases: []string{"visitor_request_limit_replenish"}, EnvVars: []string{"NTFY_VISITOR_REQUEST_LIMIT_REPLENISH"}, Value: util.FormatDuration(server.DefaultVisitorRequestLimitReplenish), Usage: "interval at which burst limit is replenished (one per x)"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "visitor-request-limit-exempt-hosts", Aliases: []string{"visitor_request_limit_exempt_hosts"}, EnvVars: []string{"NTFY_VISITOR_REQUEST_LIMIT_EXEMPT_HOSTS"}, Value: "", Usage: "hostnames and/or IP addresses of hosts that will be exempt from the visitor request limit"}), altsrc.NewIntFlag(&cli.IntFlag{Name: "visitor-message-daily-limit", Aliases: []string{"visitor_message_daily_limit"}, EnvVars: []string{"NTFY_VISITOR_MESSAGE_DAILY_LIMIT"}, Value: server.DefaultVisitorMessageDailyLimit, Usage: "max messages per visitor per day, derived from request limit if unset"}), altsrc.NewIntFlag(&cli.IntFlag{Name: "visitor-email-limit-burst", Aliases: []string{"visitor_email_limit_burst"}, EnvVars: []string{"NTFY_VISITOR_EMAIL_LIMIT_BURST"}, Value: server.DefaultVisitorEmailLimitBurst, Usage: "initial limit of e-mails per visitor"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "visitor-email-limit-replenish", Aliases: []string{"visitor_email_limit_replenish"}, EnvVars: []string{"NTFY_VISITOR_EMAIL_LIMIT_REPLENISH"}, Value: util.FormatDuration(server.DefaultVisitorEmailLimitReplenish), Usage: "interval at which burst limit is replenished (one per x)"}), altsrc.NewIntFlag(&cli.IntFlag{Name: "visitor-prefix-bits-ipv4", Aliases: []string{"visitor_prefix_bits_ipv4"}, EnvVars: []string{"NTFY_VISITOR_PREFIX_BITS_IPV4"}, Value: server.DefaultVisitorPrefixBitsIPv4, Usage: "number of bits of the IPv4 address to use for rate limiting (default: 32, full address)"}), altsrc.NewIntFlag(&cli.IntFlag{Name: "visitor-prefix-bits-ipv6", Aliases: []string{"visitor_prefix_bits_ipv6"}, EnvVars: []string{"NTFY_VISITOR_PREFIX_BITS_IPV6"}, Value: server.DefaultVisitorPrefixBitsIPv6, Usage: "number of bits of the IPv6 address to use for rate limiting (default: 64, /64 subnet)"}), altsrc.NewBoolFlag(&cli.BoolFlag{Name: "behind-proxy", Aliases: []string{"behind_proxy", "P"}, EnvVars: []string{"NTFY_BEHIND_PROXY"}, Value: false, Usage: "if set, use forwarded header (e.g. X-Forwarded-For, X-Client-IP) to determine visitor IP address (for rate limiting)"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "proxy-forwarded-header", Aliases: []string{"proxy_forwarded_header"}, EnvVars: []string{"NTFY_PROXY_FORWARDED_HEADER"}, Value: "X-Forwarded-For", Usage: "use specified header to determine visitor IP address (for rate limiting)"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "proxy-trusted-hosts", Aliases: []string{"proxy_trusted_hosts"}, EnvVars: []string{"NTFY_PROXY_TRUSTED_HOSTS"}, Value: "", Usage: "comma-separated list of trusted IP addresses, hosts, or CIDRs to remove from forwarded header"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "stripe-secret-key", Aliases: []string{"stripe_secret_key"}, EnvVars: []string{"NTFY_STRIPE_SECRET_KEY"}, Value: "", Usage: "key used for the Stripe API communication, this enables payments"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "stripe-webhook-key", Aliases: []string{"stripe_webhook_key"}, EnvVars: []string{"NTFY_STRIPE_WEBHOOK_KEY"}, Value: "", Usage: "key required to validate the authenticity of incoming webhooks from Stripe"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "billing-contact", Aliases: []string{"billing_contact"}, EnvVars: []string{"NTFY_BILLING_CONTACT"}, Value: "", Usage: "e-mail or website to display in upgrade dialog (only if payments are enabled)"}), altsrc.NewBoolFlag(&cli.BoolFlag{Name: "enable-metrics", Aliases: []string{"enable_metrics"}, EnvVars: []string{"NTFY_ENABLE_METRICS"}, Value: false, Usage: "if set, Prometheus metrics are exposed via the /metrics endpoint"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "metrics-listen-http", Aliases: []string{"metrics_listen_http"}, EnvVars: []string{"NTFY_METRICS_LISTEN_HTTP"}, Usage: "ip:port used to expose the metrics endpoint (implicitly enables metrics)"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "profile-listen-http", Aliases: []string{"profile_listen_http"}, EnvVars: []string{"NTFY_PROFILE_LISTEN_HTTP"}, Usage: "ip:port used to expose the profiling endpoints (implicitly enables profiling)"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-public-key", Aliases: []string{"web_push_public_key"}, EnvVars: []string{"NTFY_WEB_PUSH_PUBLIC_KEY"}, Usage: "public key used for web push notifications"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-private-key", Aliases: []string{"web_push_private_key"}, EnvVars: []string{"NTFY_WEB_PUSH_PRIVATE_KEY"}, Usage: "private key used for web push notifications"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-file", Aliases: []string{"web_push_file"}, EnvVars: []string{"NTFY_WEB_PUSH_FILE"}, Usage: "file used to store web push subscriptions"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-email-address", Aliases: []string{"web_push_email_address"}, EnvVars: []string{"NTFY_WEB_PUSH_EMAIL_ADDRESS"}, Usage: "e-mail address of sender, required to use browser push services"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-startup-queries", Aliases: []string{"web_push_startup_queries"}, EnvVars: []string{"NTFY_WEB_PUSH_STARTUP_QUERIES"}, Usage: "queries run when the web push database is initialized"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-expiry-duration", Aliases: []string{"web_push_expiry_duration"}, EnvVars: []string{"NTFY_WEB_PUSH_EXPIRY_DURATION"}, Value: util.FormatDuration(server.DefaultWebPushExpiryDuration), Usage: "automatically expire unused subscriptions after this time"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-expiry-warning-duration", Aliases: []string{"web_push_expiry_warning_duration"}, EnvVars: []string{"NTFY_WEB_PUSH_EXPIRY_WARNING_DURATION"}, Value: util.FormatDuration(server.DefaultWebPushExpiryWarningDuration), Usage: "send web push warning notification after this time before expiring unused subscriptions"}), ) var cmdServe = &cli.Command{ Name: "serve", Usage: "Run the ntfy server", UsageText: "ntfy serve [OPTIONS..]", Action: execServe, Category: categoryServer, Flags: flagsServe, Before: initConfigFileInputSourceFunc("config", flagsServe, initLogFunc), Description: `Run the ntfy server and listen for incoming requests The command will load the configuration from /etc/ntfy/server.yml. Config options can be overridden using the command line options. Examples: ntfy serve # Starts server in the foreground (on port 80) ntfy serve --listen-http :8080 # Starts server with alternate port`, } func execServe(c *cli.Context) error { if c.NArg() > 0 { return errors.New("no arguments expected, see 'ntfy serve --help' for help") } // Read all the options config := c.String("config") baseURL := strings.TrimSuffix(c.String("base-url"), "/") listenHTTP := c.String("listen-http") listenHTTPS := c.String("listen-https") listenUnix := c.String("listen-unix") listenUnixMode := c.Int("listen-unix-mode") keyFile := c.String("key-file") certFile := c.String("cert-file") firebaseKeyFile := c.String("firebase-key-file") databaseURL := c.String("database-url") databaseReplicaURLs := c.StringSlice("database-replica-urls") webPushPrivateKey := c.String("web-push-private-key") webPushPublicKey := c.String("web-push-public-key") webPushFile := c.String("web-push-file") webPushEmailAddress := c.String("web-push-email-address") webPushStartupQueries := c.String("web-push-startup-queries") webPushExpiryDurationStr := c.String("web-push-expiry-duration") webPushExpiryWarningDurationStr := c.String("web-push-expiry-warning-duration") cacheFile := c.String("cache-file") cacheDurationStr := c.String("cache-duration") cacheStartupQueries := c.String("cache-startup-queries") cacheBatchSize := c.Int("cache-batch-size") cacheBatchTimeoutStr := c.String("cache-batch-timeout") authFile := c.String("auth-file") authStartupQueries := c.String("auth-startup-queries") authDefaultAccess := c.String("auth-default-access") authUsersRaw := c.StringSlice("auth-users") authAccessRaw := c.StringSlice("auth-access") authTokensRaw := c.StringSlice("auth-tokens") attachmentCacheDir := c.String("attachment-cache-dir") attachmentTotalSizeLimitStr := c.String("attachment-total-size-limit") attachmentFileSizeLimitStr := c.String("attachment-file-size-limit") attachmentExpiryDurationStr := c.String("attachment-expiry-duration") templateDir := c.String("template-dir") keepaliveIntervalStr := c.String("keepalive-interval") managerIntervalStr := c.String("manager-interval") disallowedTopics := c.StringSlice("disallowed-topics") webRoot := c.String("web-root") enableSignup := c.Bool("enable-signup") enableLogin := c.Bool("enable-login") requireLogin := c.Bool("require-login") enableReservations := c.Bool("enable-reservations") upstreamBaseURL := c.String("upstream-base-url") upstreamAccessToken := c.String("upstream-access-token") smtpSenderAddr := c.String("smtp-sender-addr") smtpSenderUser := c.String("smtp-sender-user") smtpSenderPass := c.String("smtp-sender-pass") smtpSenderFrom := c.String("smtp-sender-from") smtpSenderVerify := c.Bool("smtp-sender-verify") smtpServerListen := c.String("smtp-server-listen") smtpServerDomain := c.String("smtp-server-domain") smtpServerAddrPrefix := c.String("smtp-server-addr-prefix") twilioAccount := c.String("twilio-account") twilioAuthToken := c.String("twilio-auth-token") twilioPhoneNumber := c.String("twilio-phone-number") twilioVerifyService := c.String("twilio-verify-service") twilioCallFormat := c.String("twilio-call-format") messageSizeLimitStr := c.String("message-size-limit") messageDelayLimitStr := c.String("message-delay-limit") totalTopicLimit := c.Int("global-topic-limit") visitorSubscriptionLimit := c.Int("visitor-subscription-limit") visitorSubscriberRateLimiting := c.Bool("visitor-subscriber-rate-limiting") visitorAttachmentTotalSizeLimitStr := c.String("visitor-attachment-total-size-limit") visitorAttachmentDailyBandwidthLimitStr := c.String("visitor-attachment-daily-bandwidth-limit") visitorRequestLimitBurst := c.Int("visitor-request-limit-burst") visitorRequestLimitReplenishStr := c.String("visitor-request-limit-replenish") visitorRequestLimitExemptHosts := util.SplitNoEmpty(c.String("visitor-request-limit-exempt-hosts"), ",") visitorMessageDailyLimit := c.Int("visitor-message-daily-limit") visitorEmailLimitBurst := c.Int("visitor-email-limit-burst") visitorEmailLimitReplenishStr := c.String("visitor-email-limit-replenish") visitorPrefixBitsIPv4 := c.Int("visitor-prefix-bits-ipv4") visitorPrefixBitsIPv6 := c.Int("visitor-prefix-bits-ipv6") behindProxy := c.Bool("behind-proxy") proxyForwardedHeader := c.String("proxy-forwarded-header") proxyTrustedHosts := util.SplitNoEmpty(c.String("proxy-trusted-hosts"), ",") stripeSecretKey := c.String("stripe-secret-key") stripeWebhookKey := c.String("stripe-webhook-key") billingContact := c.String("billing-contact") metricsListenHTTP := c.String("metrics-listen-http") enableMetrics := c.Bool("enable-metrics") || metricsListenHTTP != "" profileListenHTTP := c.String("profile-listen-http") // Convert durations cacheDuration, err := util.ParseDuration(cacheDurationStr) if err != nil { return fmt.Errorf("invalid cache duration: %s", cacheDurationStr) } cacheBatchTimeout, err := util.ParseDuration(cacheBatchTimeoutStr) if err != nil { return fmt.Errorf("invalid cache batch timeout: %s", cacheBatchTimeoutStr) } attachmentExpiryDuration, err := util.ParseDuration(attachmentExpiryDurationStr) if err != nil { return fmt.Errorf("invalid attachment expiry duration: %s", attachmentExpiryDurationStr) } keepaliveInterval, err := util.ParseDuration(keepaliveIntervalStr) if err != nil { return fmt.Errorf("invalid keepalive interval: %s", keepaliveIntervalStr) } managerInterval, err := util.ParseDuration(managerIntervalStr) if err != nil { return fmt.Errorf("invalid manager interval: %s", managerIntervalStr) } messageDelayLimit, err := util.ParseDuration(messageDelayLimitStr) if err != nil { return fmt.Errorf("invalid message delay limit: %s", messageDelayLimitStr) } visitorRequestLimitReplenish, err := util.ParseDuration(visitorRequestLimitReplenishStr) if err != nil { return fmt.Errorf("invalid visitor request limit replenish: %s", visitorRequestLimitReplenishStr) } visitorEmailLimitReplenish, err := util.ParseDuration(visitorEmailLimitReplenishStr) if err != nil { return fmt.Errorf("invalid visitor email limit replenish: %s", visitorEmailLimitReplenishStr) } webPushExpiryDuration, err := util.ParseDuration(webPushExpiryDurationStr) if err != nil { return fmt.Errorf("invalid web push expiry duration: %s", webPushExpiryDurationStr) } webPushExpiryWarningDuration, err := util.ParseDuration(webPushExpiryWarningDurationStr) if err != nil { return fmt.Errorf("invalid web push expiry warning duration: %s", webPushExpiryWarningDurationStr) } // Convert sizes to bytes messageSizeLimit, err := util.ParseSize(messageSizeLimitStr) if err != nil { return fmt.Errorf("invalid message size limit: %s", messageSizeLimitStr) } attachmentTotalSizeLimit, err := util.ParseSize(attachmentTotalSizeLimitStr) if err != nil { return fmt.Errorf("invalid attachment total size limit: %s", attachmentTotalSizeLimitStr) } attachmentFileSizeLimit, err := util.ParseSize(attachmentFileSizeLimitStr) if err != nil { return fmt.Errorf("invalid attachment file size limit: %s", attachmentFileSizeLimitStr) } visitorAttachmentTotalSizeLimit, err := util.ParseSize(visitorAttachmentTotalSizeLimitStr) if err != nil { return fmt.Errorf("invalid visitor attachment total size limit: %s", visitorAttachmentTotalSizeLimitStr) } visitorAttachmentDailyBandwidthLimit, err := util.ParseSize(visitorAttachmentDailyBandwidthLimitStr) if err != nil { return fmt.Errorf("invalid visitor attachment daily bandwidth limit: %s", visitorAttachmentDailyBandwidthLimitStr) } else if visitorAttachmentDailyBandwidthLimit > math.MaxInt { return fmt.Errorf("config option visitor-attachment-daily-bandwidth-limit must be lower than %d", math.MaxInt) } // Check values if databaseURL != "" && !strings.HasPrefix(databaseURL, "postgres://") && !strings.HasPrefix(databaseURL, "postgresql://") { return errors.New("if database-url is set, it must start with postgres:// or postgresql://") } else if databaseURL != "" && (authFile != "" || cacheFile != "" || webPushFile != "") { return errors.New("if database-url is set, auth-file, cache-file, and web-push-file must not be set") } else if len(databaseReplicaURLs) > 0 && databaseURL == "" { return errors.New("database-replica-urls can only be used if database-url is also set") } else if firebaseKeyFile != "" && !util.FileExists(firebaseKeyFile) { return errors.New("if set, FCM key file must exist") } else if firebaseKeyFile != "" && !server.FirebaseAvailable { return errors.New("cannot set firebase-key-file, support for Firebase is not available (nofirebase)") } else if webPushPublicKey != "" && (webPushPrivateKey == "" || (webPushFile == "" && databaseURL == "") || webPushEmailAddress == "" || baseURL == "") { return errors.New("if web push is enabled, web-push-private-key, web-push-public-key, web-push-file (or database-url), web-push-email-address, and base-url should be set. run 'ntfy webpush keys' to generate keys") } else if keepaliveInterval < 5*time.Second { return errors.New("keepalive interval cannot be lower than five seconds") } else if managerInterval < 5*time.Second { return errors.New("manager interval cannot be lower than five seconds") } else if cacheDuration > 0 && cacheDuration < managerInterval { return errors.New("cache duration cannot be lower than manager interval") } else if keyFile != "" && !util.FileExists(keyFile) { return errors.New("if set, key file must exist") } else if certFile != "" && !util.FileExists(certFile) { return errors.New("if set, certificate file must exist") } else if listenHTTPS != "" && (keyFile == "" || certFile == "") { return errors.New("if listen-https is set, both key-file and cert-file must be set") } else if smtpSenderAddr != "" && (baseURL == "" || smtpSenderFrom == "") { return errors.New("if smtp-sender-addr is set, base-url, and smtp-sender-from must also be set") } else if smtpSenderVerify && smtpSenderAddr == "" { return errors.New("if smtp-sender-verify is set, smtp-sender-addr must also be set") } else if smtpServerListen != "" && smtpServerDomain == "" { return errors.New("if smtp-server-listen is set, smtp-server-domain must also be set") } else if attachmentCacheDir != "" && baseURL == "" { return errors.New("if attachment-cache-dir is set, base-url must also be set") } else if baseURL != "" { u, err := url.Parse(baseURL) if err != nil { return fmt.Errorf("if set, base-url must be a valid URL, e.g. https://ntfy.mydomain.com: %v", err) } else if u.Scheme != "http" && u.Scheme != "https" { return errors.New("if set, base-url must be a valid URL starting with http:// or https://, e.g. https://ntfy.mydomain.com") } else if u.Path != "" { return fmt.Errorf("if set, base-url must not have a path (%s), as hosting ntfy on a sub-path is not supported, e.g. https://ntfy.mydomain.com", u.Path) } } else if upstreamBaseURL != "" && !strings.HasPrefix(upstreamBaseURL, "http://") && !strings.HasPrefix(upstreamBaseURL, "https://") { return errors.New("if set, upstream-base-url must start with http:// or https://") } else if upstreamBaseURL != "" && strings.HasSuffix(upstreamBaseURL, "/") { return errors.New("if set, upstream-base-url must not end with a slash (/)") } else if upstreamBaseURL != "" && baseURL == "" { return errors.New("if upstream-base-url is set, base-url must also be set") } else if upstreamBaseURL != "" && baseURL != "" && baseURL == upstreamBaseURL { return errors.New("base-url and upstream-base-url cannot be identical, you'll likely want to set upstream-base-url to https://ntfy.sh, see https://ntfy.sh/docs/config/#ios-instant-notifications") } else if authFile == "" && databaseURL == "" && (enableSignup || enableLogin || requireLogin || enableReservations || stripeSecretKey != "") { return errors.New("cannot set enable-signup, enable-login, require-login, enable-reserve-topics, or stripe-secret-key if auth-file or database-url is not set") } else if enableSignup && !enableLogin { return errors.New("cannot set enable-signup without also setting enable-login") } else if requireLogin && !enableLogin { return errors.New("cannot set require-login without also setting enable-login") } else if !payments.Available && (stripeSecretKey != "" || stripeWebhookKey != "") { return errors.New("cannot set stripe-secret-key or stripe-webhook-key, support for payments is not available in this build (nopayments)") } else if stripeSecretKey != "" && (stripeWebhookKey == "" || baseURL == "") { return errors.New("if stripe-secret-key is set, stripe-webhook-key and base-url must also be set") } else if twilioAccount != "" && (twilioAuthToken == "" || twilioPhoneNumber == "" || twilioVerifyService == "" || baseURL == "" || (authFile == "" && databaseURL == "")) { return errors.New("if twilio-account is set, twilio-auth-token, twilio-phone-number, twilio-verify-service, base-url, and auth-file (or database-url) must also be set") } else if messageSizeLimit > server.DefaultMessageSizeLimit { log.Warn("message-size-limit is greater than 4K, this is not recommended and largely untested, and may lead to issues with some clients") if messageSizeLimit > 5*1024*1024 { return errors.New("message-size-limit cannot be higher than 5M") } } else if !server.WebPushAvailable && (webPushPrivateKey != "" || webPushPublicKey != "" || webPushFile != "") { return errors.New("cannot enable WebPush, support is not available in this build (nowebpush)") } else if webPushExpiryWarningDuration > 0 && webPushExpiryWarningDuration > webPushExpiryDuration { return errors.New("web push expiry warning duration cannot be higher than web push expiry duration") } else if behindProxy && proxyForwardedHeader == "" { return errors.New("if behind-proxy is set, proxy-forwarded-header must also be set") } else if visitorPrefixBitsIPv4 < 1 || visitorPrefixBitsIPv4 > 32 { return errors.New("visitor-prefix-bits-ipv4 must be between 1 and 32") } else if visitorPrefixBitsIPv6 < 1 || visitorPrefixBitsIPv6 > 128 { return errors.New("visitor-prefix-bits-ipv6 must be between 1 and 128") } else if runtime.GOOS == "windows" && listenUnix != "" { return errors.New("listen-unix is not supported on Windows") } // Backwards compatibility if webRoot == "app" { webRoot = "/" } else if webRoot == "home" { webRoot = "/app" } else if webRoot == "disable" { webRoot = "" } else if !strings.HasPrefix(webRoot, "/") { webRoot = "/" + webRoot } // Convert default auth permission, read provisioned users authDefault, err := user.ParsePermission(authDefaultAccess) if err != nil { return errors.New("if set, auth-default-access must start set to 'read-write', 'read-only', 'write-only' or 'deny-all'") } authUsers, err := parseUsers(authUsersRaw) if err != nil { return err } authAccess, err := parseAccess(authUsers, authAccessRaw) if err != nil { return err } authTokens, err := parseTokens(authUsers, authTokensRaw) if err != nil { return err } // Special case: Unset default if listenHTTP == "-" { listenHTTP = "" } // Resolve hosts visitorRequestLimitExemptPrefixes := make([]netip.Prefix, 0) for _, host := range visitorRequestLimitExemptHosts { prefixes, err := parseIPHostPrefix(host) if err != nil { log.Warn("cannot resolve host %s: %s, ignoring visitor request exemption", host, err.Error()) continue } visitorRequestLimitExemptPrefixes = append(visitorRequestLimitExemptPrefixes, prefixes...) } // Parse trusted prefixes trustedProxyPrefixes := make([]netip.Prefix, 0) for _, host := range proxyTrustedHosts { prefixes, err := parseIPHostPrefix(host) if err != nil { return fmt.Errorf("cannot resolve trusted proxy host %s: %s", host, err.Error()) } trustedProxyPrefixes = append(trustedProxyPrefixes, prefixes...) } // Stripe things if stripeSecretKey != "" { payments.Setup(stripeSecretKey) } // Parse Twilio template var twilioCallFormatTemplate *template.Template if twilioCallFormat != "" { twilioCallFormatTemplate, err = template.New("").Parse(twilioCallFormat) if err != nil { return fmt.Errorf("failed to parse twilio-call-format template: %w", err) } } // Add default forbidden topics disallowedTopics = append(disallowedTopics, server.DefaultDisallowedTopics...) // Run server conf := server.NewConfig() conf.File = config conf.BaseURL = baseURL conf.ListenHTTP = listenHTTP conf.ListenHTTPS = listenHTTPS conf.ListenUnix = listenUnix conf.ListenUnixMode = fs.FileMode(listenUnixMode) conf.KeyFile = keyFile conf.CertFile = certFile conf.FirebaseKeyFile = firebaseKeyFile conf.CacheFile = cacheFile conf.CacheDuration = cacheDuration conf.CacheStartupQueries = cacheStartupQueries conf.CacheBatchSize = cacheBatchSize conf.CacheBatchTimeout = cacheBatchTimeout conf.AuthFile = authFile conf.AuthStartupQueries = authStartupQueries conf.AuthDefault = authDefault conf.AuthUsers = authUsers conf.AuthAccess = authAccess conf.AuthTokens = authTokens conf.AttachmentCacheDir = attachmentCacheDir conf.AttachmentTotalSizeLimit = attachmentTotalSizeLimit conf.AttachmentFileSizeLimit = attachmentFileSizeLimit conf.AttachmentExpiryDuration = attachmentExpiryDuration conf.TemplateDir = templateDir conf.KeepaliveInterval = keepaliveInterval conf.ManagerInterval = managerInterval conf.DisallowedTopics = disallowedTopics conf.WebRoot = webRoot conf.UpstreamBaseURL = upstreamBaseURL conf.UpstreamAccessToken = upstreamAccessToken conf.SMTPSenderAddr = smtpSenderAddr conf.SMTPSenderUser = smtpSenderUser conf.SMTPSenderPass = smtpSenderPass conf.SMTPSenderFrom = smtpSenderFrom conf.SMTPSenderVerify = smtpSenderVerify conf.SMTPServerListen = smtpServerListen conf.SMTPServerDomain = smtpServerDomain conf.SMTPServerAddrPrefix = smtpServerAddrPrefix conf.TwilioAccount = twilioAccount conf.TwilioAuthToken = twilioAuthToken conf.TwilioPhoneNumber = twilioPhoneNumber conf.TwilioVerifyService = twilioVerifyService conf.TwilioCallFormat = twilioCallFormatTemplate conf.MessageSizeLimit = int(messageSizeLimit) conf.MessageDelayMax = messageDelayLimit conf.TotalTopicLimit = totalTopicLimit conf.VisitorSubscriptionLimit = visitorSubscriptionLimit conf.VisitorSubscriberRateLimiting = visitorSubscriberRateLimiting conf.VisitorAttachmentTotalSizeLimit = visitorAttachmentTotalSizeLimit conf.VisitorAttachmentDailyBandwidthLimit = visitorAttachmentDailyBandwidthLimit conf.VisitorRequestLimitBurst = visitorRequestLimitBurst conf.VisitorRequestLimitReplenish = visitorRequestLimitReplenish conf.VisitorRequestExemptPrefixes = visitorRequestLimitExemptPrefixes conf.VisitorMessageDailyLimit = visitorMessageDailyLimit conf.VisitorEmailLimitBurst = visitorEmailLimitBurst conf.VisitorEmailLimitReplenish = visitorEmailLimitReplenish conf.VisitorPrefixBitsIPv4 = visitorPrefixBitsIPv4 conf.VisitorPrefixBitsIPv6 = visitorPrefixBitsIPv6 conf.BehindProxy = behindProxy conf.ProxyForwardedHeader = proxyForwardedHeader conf.ProxyTrustedPrefixes = trustedProxyPrefixes conf.StripeSecretKey = stripeSecretKey conf.StripeWebhookKey = stripeWebhookKey conf.BillingContact = billingContact conf.EnableSignup = enableSignup conf.EnableLogin = enableLogin conf.RequireLogin = requireLogin conf.EnableReservations = enableReservations conf.EnableMetrics = enableMetrics conf.MetricsListenHTTP = metricsListenHTTP conf.ProfileListenHTTP = profileListenHTTP conf.DatabaseURL = databaseURL conf.DatabaseReplicaURLs = databaseReplicaURLs conf.WebPushPrivateKey = webPushPrivateKey conf.WebPushPublicKey = webPushPublicKey conf.WebPushFile = webPushFile conf.WebPushEmailAddress = webPushEmailAddress conf.WebPushStartupQueries = webPushStartupQueries conf.WebPushExpiryDuration = webPushExpiryDuration conf.WebPushExpiryWarningDuration = webPushExpiryWarningDuration conf.BuildVersion = c.App.Version conf.BuildDate = maybeFromMetadata(c.App.Metadata, MetadataKeyDate) conf.BuildCommit = maybeFromMetadata(c.App.Metadata, MetadataKeyCommit) // Check if we should run as a Windows service if ranAsService, err := maybeRunAsService(conf); err != nil { log.Fatal("%s", err.Error()) } else if ranAsService { log.Info("Exiting.") return nil } // Set up hot-reloading of config go sigHandlerConfigReload(config) // Run server s, err := server.New(conf) if err != nil { log.Fatal("%s", err.Error()) } else if err := s.Run(); err != nil { log.Fatal("%s", err.Error()) } log.Info("Exiting.") return nil } func parseIPHostPrefix(host string) (prefixes []netip.Prefix, err error) { // Try parsing as prefix, e.g. 10.0.1.0/24 or 2001:db8::/32 prefix, err := netip.ParsePrefix(host) if err == nil { prefixes = append(prefixes, prefix.Masked()) return prefixes, nil } // Not a prefix, parse as host or IP (LookupHost passes through an IP as is) ips, err := net.LookupHost(host) if err != nil { return nil, err } for _, ipStr := range ips { ip, err := netip.ParseAddr(ipStr) if err == nil { prefix, err := ip.Prefix(ip.BitLen()) if err != nil { return nil, fmt.Errorf("%s successfully parsed but unable to make prefix: %s", ip.String(), err.Error()) } prefixes = append(prefixes, prefix.Masked()) } } return } func parseUsers(usersRaw []string) ([]*user.User, error) { users := make([]*user.User, 0) for _, userLine := range usersRaw { parts := strings.Split(userLine, ":") if len(parts) != 3 { return nil, fmt.Errorf("invalid auth-users: %s, expected format: 'name:hash:role'", userLine) } username := strings.TrimSpace(parts[0]) passwordHash := strings.TrimSpace(parts[1]) role := user.Role(strings.TrimSpace(parts[2])) if !user.AllowedUsername(username) { return nil, fmt.Errorf("invalid auth-users: %s, username invalid", userLine) } else if err := user.ValidPasswordHash(passwordHash, user.DefaultUserPasswordBcryptCost); err != nil { return nil, fmt.Errorf("invalid auth-users: %s, password hash invalid, %s", userLine, err.Error()) } else if !user.AllowedRole(role) { return nil, fmt.Errorf("invalid auth-users: %s, role %s is not allowed, allowed roles are 'admin' or 'user'", userLine, role) } users = append(users, &user.User{ Name: username, Hash: passwordHash, Role: role, Provisioned: true, }) } return users, nil } func parseAccess(users []*user.User, accessRaw []string) (map[string][]*user.Grant, error) { access := make(map[string][]*user.Grant) for _, accessLine := range accessRaw { parts := strings.Split(accessLine, ":") if len(parts) != 3 { return nil, fmt.Errorf("invalid auth-access: %s, expected format: 'user:topic:permission'", accessLine) } username := strings.TrimSpace(parts[0]) if username == userEveryone { username = user.Everyone } u, exists := util.Find(users, func(u *user.User) bool { return u.Name == username }) if username != user.Everyone { if !exists { return nil, fmt.Errorf("invalid auth-access: %s, user %s is not provisioned", accessLine, username) } else if !user.AllowedUsername(username) { return nil, fmt.Errorf("invalid auth-access: %s, username %s invalid", accessLine, username) } else if u.Role != user.RoleUser { return nil, fmt.Errorf("invalid auth-access: %s, user %s is not a regular user, only regular users can have ACL entries", accessLine, username) } } topic := strings.TrimSpace(parts[1]) if !user.AllowedTopicPattern(topic) { return nil, fmt.Errorf("invalid auth-access: %s, topic pattern %s invalid", accessLine, topic) } permission, err := user.ParsePermission(strings.TrimSpace(parts[2])) if err != nil { return nil, fmt.Errorf("invalid auth-access: %s, permission %s invalid, %s", accessLine, parts[2], err.Error()) } if _, exists := access[username]; !exists { access[username] = make([]*user.Grant, 0) } access[username] = append(access[username], &user.Grant{ TopicPattern: topic, Permission: permission, Provisioned: true, }) } return access, nil } func parseTokens(users []*user.User, tokensRaw []string) (map[string][]*user.Token, error) { tokens := make(map[string][]*user.Token) for _, tokenLine := range tokensRaw { parts := strings.Split(tokenLine, ":") if len(parts) < 2 || len(parts) > 3 { return nil, fmt.Errorf("invalid auth-tokens: %s, expected format: 'user:token[:label]'", tokenLine) } username := strings.TrimSpace(parts[0]) _, exists := util.Find(users, func(u *user.User) bool { return u.Name == username }) if !exists { return nil, fmt.Errorf("invalid auth-tokens: %s, user %s is not provisioned", tokenLine, username) } else if !user.AllowedUsername(username) { return nil, fmt.Errorf("invalid auth-tokens: %s, username %s invalid", tokenLine, username) } token := strings.TrimSpace(parts[1]) if !user.ValidToken(token) { return nil, fmt.Errorf("invalid auth-tokens: %s, token %s invalid, use 'ntfy token generate' to generate a random token", tokenLine, token) } var label string if len(parts) > 2 { label = parts[2] } if _, exists := tokens[username]; !exists { tokens[username] = make([]*user.Token, 0) } tokens[username] = append(tokens[username], &user.Token{ Value: token, Label: label, Provisioned: true, }) } return tokens, nil } func maybeFromMetadata(m map[string]any, key string) string { if m == nil { return "" } v, exists := m[key] if !exists { return "" } s, ok := v.(string) if !ok { return "" } return s } binwiederhier-ntfy-5ad2431/cmd/serve_test.go000066400000000000000000000344251517171047500211320ustar00rootroot00000000000000package cmd import ( "fmt" "math/rand" "os" "os/exec" "path/filepath" "testing" "time" "github.com/gorilla/websocket" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "heckel.io/ntfy/v2/client" "heckel.io/ntfy/v2/test" "heckel.io/ntfy/v2/user" "heckel.io/ntfy/v2/util" ) func TestParseUsers_Success(t *testing.T) { tests := []struct { name string input []string expected []*user.User }{ { name: "single user", input: []string{"alice:$2a$10$320YlQeaMghYZsvtu9jzfOQZS32FysWY/T9qu5NWqcIh.DN.u5P5S:user"}, expected: []*user.User{ { Name: "alice", Hash: "$2a$10$320YlQeaMghYZsvtu9jzfOQZS32FysWY/T9qu5NWqcIh.DN.u5P5S", Role: user.RoleUser, Provisioned: true, }, }, }, { name: "multiple users with different roles", input: []string{ "alice:$2a$10$320YlQeaMghYZsvtu9jzfOQZS32FysWY/T9qu5NWqcIh.DN.u5P5S:user", "bob:$2a$10$jIcuBWcbxd6oW1aPvoJ5iOShzu3/UJ2kSxKbTZtDypG06nBflQagq:admin", }, expected: []*user.User{ { Name: "alice", Hash: "$2a$10$320YlQeaMghYZsvtu9jzfOQZS32FysWY/T9qu5NWqcIh.DN.u5P5S", Role: user.RoleUser, Provisioned: true, }, { Name: "bob", Hash: "$2a$10$jIcuBWcbxd6oW1aPvoJ5iOShzu3/UJ2kSxKbTZtDypG06nBflQagq", Role: user.RoleAdmin, Provisioned: true, }, }, }, { name: "empty input", input: []string{}, expected: []*user.User{}, }, { name: "user with special characters in name", input: []string{"alice.test+123@example.com:$2a$10$RYUYAsl5zOnAIp6fH7BPX.Eug0rUfEUk92r8WiVusb0VK.vGojWBe:user"}, expected: []*user.User{ { Name: "alice.test+123@example.com", Hash: "$2a$10$RYUYAsl5zOnAIp6fH7BPX.Eug0rUfEUk92r8WiVusb0VK.vGojWBe", Role: user.RoleUser, Provisioned: true, }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := parseUsers(tt.input) require.NoError(t, err) require.Len(t, result, len(tt.expected)) for i, expectedUser := range tt.expected { assert.Equal(t, expectedUser.Name, result[i].Name) assert.Equal(t, expectedUser.Hash, result[i].Hash) assert.Equal(t, expectedUser.Role, result[i].Role) assert.Equal(t, expectedUser.Provisioned, result[i].Provisioned) } }) } } func TestParseUsers_Errors(t *testing.T) { tests := []struct { name string input []string error string }{ { name: "invalid format - too few parts", input: []string{"alice:hash"}, error: "invalid auth-users: alice:hash, expected format: 'name:hash:role'", }, { name: "invalid format - too many parts", input: []string{"alice:hash:role:extra"}, error: "invalid auth-users: alice:hash:role:extra, expected format: 'name:hash:role'", }, { name: "invalid username", input: []string{"alice@#$%:$2a$10$320YlQeaMghYZsvtu9jzfOQZS32FysWY/T9qu5NWqcIh.DN.u5P5S:user"}, error: "invalid auth-users: alice@#$%:$2a$10$320YlQeaMghYZsvtu9jzfOQZS32FysWY/T9qu5NWqcIh.DN.u5P5S:user, username invalid", }, { name: "invalid password hash - wrong prefix", input: []string{"alice:plaintext:user"}, error: "invalid auth-users: alice:plaintext:user, password hash invalid, password hash must be a bcrypt hash, use 'ntfy user hash' to generate", }, { name: "invalid role", input: []string{"alice:$2a$10$320YlQeaMghYZsvtu9jzfOQZS32FysWY/T9qu5NWqcIh.DN.u5P5S:invalid"}, error: "invalid auth-users: alice:$2a$10$320YlQeaMghYZsvtu9jzfOQZS32FysWY/T9qu5NWqcIh.DN.u5P5S:invalid, role invalid is not allowed, allowed roles are 'admin' or 'user'", }, { name: "empty username", input: []string{":$2a$10$320YlQeaMghYZsvtu9jzfOQZS32FysWY/T9qu5NWqcIh.DN.u5P5S:user"}, error: "invalid auth-users: :$2a$10$320YlQeaMghYZsvtu9jzfOQZS32FysWY/T9qu5NWqcIh.DN.u5P5S:user, username invalid", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := parseUsers(tt.input) require.Error(t, err) require.Nil(t, result) assert.Contains(t, err.Error(), tt.error) }) } } func TestParseAccess_Success(t *testing.T) { users := []*user.User{ {Name: "alice", Role: user.RoleUser}, {Name: "bob", Role: user.RoleUser}, } tests := []struct { name string users []*user.User input []string expected map[string][]*user.Grant }{ { name: "single access entry", users: users, input: []string{"alice:mytopic:read-write"}, expected: map[string][]*user.Grant{ "alice": { { TopicPattern: "mytopic", Permission: user.PermissionReadWrite, Provisioned: true, }, }, }, }, { name: "multiple access entries for same user", users: users, input: []string{ "alice:topic1:read-only", "alice:topic2:write-only", }, expected: map[string][]*user.Grant{ "alice": { { TopicPattern: "topic1", Permission: user.PermissionRead, Provisioned: true, }, { TopicPattern: "topic2", Permission: user.PermissionWrite, Provisioned: true, }, }, }, }, { name: "access for everyone", users: users, input: []string{"everyone:publictopic:read-only"}, expected: map[string][]*user.Grant{ user.Everyone: { { TopicPattern: "publictopic", Permission: user.PermissionRead, Provisioned: true, }, }, }, }, { name: "wildcard topic pattern", users: users, input: []string{"alice:topic*:read-write"}, expected: map[string][]*user.Grant{ "alice": { { TopicPattern: "topic*", Permission: user.PermissionReadWrite, Provisioned: true, }, }, }, }, { name: "empty input", users: users, input: []string{}, expected: map[string][]*user.Grant{}, }, { name: "deny-all permission", users: users, input: []string{"alice:secretopic:deny-all"}, expected: map[string][]*user.Grant{ "alice": { { TopicPattern: "secretopic", Permission: user.PermissionDenyAll, Provisioned: true, }, }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := parseAccess(tt.users, tt.input) require.NoError(t, err) assert.Equal(t, tt.expected, result) }) } } func TestParseAccess_Errors(t *testing.T) { users := []*user.User{ {Name: "alice", Role: user.RoleUser}, {Name: "admin", Role: user.RoleAdmin}, } tests := []struct { name string users []*user.User input []string error string }{ { name: "invalid format - too few parts", users: users, input: []string{"alice:topic"}, error: "invalid auth-access: alice:topic, expected format: 'user:topic:permission'", }, { name: "invalid format - too many parts", users: users, input: []string{"alice:topic:read:extra"}, error: "invalid auth-access: alice:topic:read:extra, expected format: 'user:topic:permission'", }, { name: "user not provisioned", users: users, input: []string{"charlie:topic:read"}, error: "invalid auth-access: charlie:topic:read, user charlie is not provisioned", }, { name: "admin user cannot have ACL entries", users: users, input: []string{"admin:topic:read"}, error: "invalid auth-access: admin:topic:read, user admin is not a regular user, only regular users can have ACL entries", }, { name: "invalid topic pattern", users: users, input: []string{"alice:topic-with-invalid-chars!:read"}, error: "invalid auth-access: alice:topic-with-invalid-chars!:read, topic pattern topic-with-invalid-chars! invalid", }, { name: "invalid permission", users: users, input: []string{"alice:topic:invalid-permission"}, error: "invalid auth-access: alice:topic:invalid-permission, permission invalid-permission invalid", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := parseAccess(tt.users, tt.input) require.Error(t, err) require.Nil(t, result) assert.Contains(t, err.Error(), tt.error) }) } } func TestParseTokens_Success(t *testing.T) { users := []*user.User{ {Name: "alice"}, {Name: "bob"}, } tests := []struct { name string users []*user.User input []string expected map[string][]*user.Token }{ { name: "single token without label", users: users, input: []string{"alice:tk_abcdefghijklmnopqrstuvwxyz123"}, expected: map[string][]*user.Token{ "alice": { { Value: "tk_abcdefghijklmnopqrstuvwxyz123", Label: "", Provisioned: true, }, }, }, }, { name: "single token with label", users: users, input: []string{"alice:tk_abcdefghijklmnopqrstuvwxyz123:My Phone"}, expected: map[string][]*user.Token{ "alice": { { Value: "tk_abcdefghijklmnopqrstuvwxyz123", Label: "My Phone", Provisioned: true, }, }, }, }, { name: "multiple tokens for same user", users: users, input: []string{ "alice:tk_abcdefghijklmnopqrstuvwxyz123:Phone", "alice:tk_zyxwvutsrqponmlkjihgfedcba987:Laptop", }, expected: map[string][]*user.Token{ "alice": { { Value: "tk_abcdefghijklmnopqrstuvwxyz123", Label: "Phone", Provisioned: true, }, { Value: "tk_zyxwvutsrqponmlkjihgfedcba987", Label: "Laptop", Provisioned: true, }, }, }, }, { name: "tokens for multiple users", users: users, input: []string{ "alice:tk_abcdefghijklmnopqrstuvwxyz123:Phone", "bob:tk_zyxwvutsrqponmlkjihgfedcba987:Tablet", }, expected: map[string][]*user.Token{ "alice": { { Value: "tk_abcdefghijklmnopqrstuvwxyz123", Label: "Phone", Provisioned: true, }, }, "bob": { { Value: "tk_zyxwvutsrqponmlkjihgfedcba987", Label: "Tablet", Provisioned: true, }, }, }, }, { name: "empty input", users: users, input: []string{}, expected: map[string][]*user.Token{}, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := parseTokens(tt.users, tt.input) require.NoError(t, err) assert.Equal(t, tt.expected, result) }) } } func TestParseTokens_Errors(t *testing.T) { users := []*user.User{ {Name: "alice"}, } tests := []struct { name string users []*user.User input []string error string }{ { name: "invalid format - too few parts", users: users, input: []string{"alice"}, error: "invalid auth-tokens: alice, expected format: 'user:token[:label]'", }, { name: "invalid format - too many parts", users: users, input: []string{"alice:token:label:extra:parts"}, error: "invalid auth-tokens: alice:token:label:extra:parts, expected format: 'user:token[:label]'", }, { name: "user not provisioned", users: users, input: []string{"charlie:tk_abcdefghijklmnopqrstuvwxyz123"}, error: "invalid auth-tokens: charlie:tk_abcdefghijklmnopqrstuvwxyz123, user charlie is not provisioned", }, { name: "invalid token format", users: users, input: []string{"alice:invalid-token"}, error: "invalid auth-tokens: alice:invalid-token, token invalid-token invalid, use 'ntfy token generate' to generate a random token", }, { name: "token too short", users: users, input: []string{"alice:tk_short"}, error: "invalid auth-tokens: alice:tk_short, token tk_short invalid, use 'ntfy token generate' to generate a random token", }, { name: "token without prefix", users: users, input: []string{"alice:abcdefghijklmnopqrstuvwxyz12345"}, error: "invalid auth-tokens: alice:abcdefghijklmnopqrstuvwxyz12345, token abcdefghijklmnopqrstuvwxyz12345 invalid, use 'ntfy token generate' to generate a random token", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := parseTokens(tt.users, tt.input) require.Error(t, err) require.Nil(t, result) assert.Contains(t, err.Error(), tt.error) }) } } func TestCLI_Serve_Unix_Curl(t *testing.T) { sockFile := filepath.Join(t.TempDir(), "ntfy.sock") configFile := newEmptyFile(t) // Avoid issues with existing server.yml file on system go func() { app, _, _, _ := newTestApp() err := app.Run([]string{"ntfy", "serve", "--config=" + configFile, "--listen-http=-", "--listen-unix=" + sockFile}) require.Nil(t, err) }() for i := 0; i < 40 && !util.FileExists(sockFile); i++ { time.Sleep(50 * time.Millisecond) } require.True(t, util.FileExists(sockFile)) cmd := exec.Command("curl", "-s", "--unix-socket", sockFile, "-d", "this is a message", "localhost/mytopic") out, err := cmd.Output() require.Nil(t, err) m := toMessage(t, string(out)) require.Equal(t, "this is a message", m.Message) } func TestCLI_Serve_WebSocket(t *testing.T) { port := 10000 + rand.Intn(20000) go func() { configFile := newEmptyFile(t) // Avoid issues with existing server.yml file on system app, _, _, _ := newTestApp() err := app.Run([]string{"ntfy", "serve", "--config=" + configFile, fmt.Sprintf("--listen-http=:%d", port)}) require.Nil(t, err) }() test.WaitForPortUp(t, port) ws, _, err := websocket.DefaultDialer.Dial(fmt.Sprintf("ws://127.0.0.1:%d/mytopic/ws", port), nil) require.Nil(t, err) messageType, data, err := ws.ReadMessage() require.Nil(t, err) require.Equal(t, websocket.TextMessage, messageType) require.Equal(t, "open", toMessage(t, string(data)).Event) c := client.New(client.NewConfig()) _, err = c.Publish(fmt.Sprintf("http://127.0.0.1:%d/mytopic", port), "my message") require.Nil(t, err) messageType, data, err = ws.ReadMessage() require.Nil(t, err) require.Equal(t, websocket.TextMessage, messageType) m := toMessage(t, string(data)) require.Equal(t, "my message", m.Message) require.Equal(t, "mytopic", m.Topic) } func TestIP_Host_Parsing(t *testing.T) { cases := map[string]string{ "1.1.1.1": "1.1.1.1/32", "fd00::1234": "fd00::1234/128", "192.168.0.3/24": "192.168.0.0/24", "10.1.2.3/8": "10.0.0.0/8", "201:be93::4a6/21": "201:b800::/21", } for q, expectedAnswer := range cases { ips, err := parseIPHostPrefix(q) require.Nil(t, err) assert.Equal(t, 1, len(ips)) assert.Equal(t, expectedAnswer, ips[0].String()) } } func newEmptyFile(t *testing.T) string { filename := filepath.Join(t.TempDir(), "empty") require.Nil(t, os.WriteFile(filename, []byte{}, 0600)) return filename } binwiederhier-ntfy-5ad2431/cmd/serve_unix.go000066400000000000000000000024521517171047500211310ustar00rootroot00000000000000//go:build linux || dragonfly || freebsd || netbsd || openbsd package cmd import ( "os" "os/signal" "syscall" "github.com/urfave/cli/v2/altsrc" "heckel.io/ntfy/v2/log" "heckel.io/ntfy/v2/server" ) func sigHandlerConfigReload(config string) { sigs := make(chan os.Signal, 1) signal.Notify(sigs, syscall.SIGHUP) for range sigs { log.Info("Partially hot reloading configuration ...") inputSource, err := newYamlSourceFromFile(config, flagsServe) if err != nil { log.Warn("Hot reload failed: %s", err.Error()) continue } if err := reloadLogLevel(inputSource); err != nil { log.Warn("Reloading log level failed: %s", err.Error()) } } } func reloadLogLevel(inputSource altsrc.InputSourceContext) error { newLevelStr, err := inputSource.String("log-level") if err != nil { return err } overrides, err := inputSource.StringSlice("log-level-overrides") if err != nil { return err } log.ResetLevelOverrides() if err := applyLogLevelOverrides(overrides); err != nil { return err } log.SetLevel(log.ToLevel(newLevelStr)) if len(overrides) > 0 { log.Info("Log level is %v, %d override(s) in place", newLevelStr, len(overrides)) } else { log.Info("Log level is %v", newLevelStr) } return nil } func maybeRunAsService(conf *server.Config) (bool, error) { return false, nil } binwiederhier-ntfy-5ad2431/cmd/serve_windows.go000066400000000000000000000051611517171047500216400ustar00rootroot00000000000000//go:build windows && !noserver package cmd import ( "fmt" "sync" "golang.org/x/sys/windows/svc" "heckel.io/ntfy/v2/log" "heckel.io/ntfy/v2/server" ) const serviceName = "ntfy" // sigHandlerConfigReload is a no-op on Windows since SIGHUP is not available. // Windows users can restart the service to reload configuration. func sigHandlerConfigReload(config string) { log.Debug("Config hot-reload via SIGHUP is not supported on Windows") } // runAsWindowsService runs the ntfy server as a Windows service func runAsWindowsService(conf *server.Config) error { return svc.Run(serviceName, &windowsService{conf: conf}) } // windowsService implements the svc.Handler interface type windowsService struct { conf *server.Config server *server.Server mu sync.Mutex } // Execute is the main entry point for the Windows service func (s *windowsService) Execute(args []string, requests <-chan svc.ChangeRequest, status chan<- svc.Status) (bool, uint32) { const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown status <- svc.Status{State: svc.StartPending} // Create and start the server var err error s.mu.Lock() s.server, err = server.New(s.conf) s.mu.Unlock() if err != nil { log.Error("Failed to create server: %s", err.Error()) return true, 1 } // Start server in a goroutine serverErrChan := make(chan error, 1) go func() { serverErrChan <- s.server.Run() }() status <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} log.Info("Windows service started") for { select { case err := <-serverErrChan: if err != nil { log.Error("Server error: %s", err.Error()) return true, 1 } return false, 0 case req := <-requests: switch req.Cmd { case svc.Interrogate: status <- req.CurrentStatus case svc.Stop, svc.Shutdown: log.Info("Windows service stopping...") status <- svc.Status{State: svc.StopPending} s.mu.Lock() if s.server != nil { s.server.Stop() } s.mu.Unlock() return false, 0 default: log.Warn("Unexpected service control request: %d", req.Cmd) } } } } // maybeRunAsService checks if the process is running as a Windows service, // and if so, runs the server as a service. Returns true if it ran as a service. func maybeRunAsService(conf *server.Config) (bool, error) { isService, err := svc.IsWindowsService() if err != nil { return false, fmt.Errorf("failed to detect Windows service mode: %w", err) } else if !isService { return false, nil } log.Info("Running as Windows service") if err := runAsWindowsService(conf); err != nil { return true, fmt.Errorf("failed to run as Windows service: %w", err) } return true, nil } binwiederhier-ntfy-5ad2431/cmd/subscribe.go000066400000000000000000000256061517171047500207310ustar00rootroot00000000000000package cmd import ( "errors" "fmt" "os" "os/exec" "sort" "strings" "github.com/urfave/cli/v2" "heckel.io/ntfy/v2/client" "heckel.io/ntfy/v2/log" "heckel.io/ntfy/v2/util" ) func init() { commands = append(commands, cmdSubscribe) } var flagsSubscribe = append( append([]cli.Flag{}, flagsDefault...), &cli.StringFlag{Name: "config", Aliases: []string{"c"}, Usage: "client config file"}, &cli.StringFlag{Name: "since", Aliases: []string{"s"}, Usage: "return events since `SINCE` (Unix timestamp, or all)"}, &cli.StringFlag{Name: "user", Aliases: []string{"u"}, EnvVars: []string{"NTFY_USER"}, Usage: "username[:password] used to auth against the server"}, &cli.StringFlag{Name: "token", Aliases: []string{"k"}, EnvVars: []string{"NTFY_TOKEN"}, Usage: "access token used to auth against the server"}, &cli.BoolFlag{Name: "from-config", Aliases: []string{"from_config", "C"}, Usage: "read subscriptions from config file (service mode)"}, &cli.BoolFlag{Name: "poll", Aliases: []string{"p"}, Usage: "return events and exit, do not listen for new events"}, &cli.BoolFlag{Name: "scheduled", Aliases: []string{"sched", "S"}, Usage: "also return scheduled/delayed events"}, ) var cmdSubscribe = &cli.Command{ Name: "subscribe", Aliases: []string{"sub"}, Usage: "Subscribe to one or more topics on a ntfy server", UsageText: "ntfy subscribe [OPTIONS..] [TOPIC]", Action: execSubscribe, Category: categoryClient, Flags: flagsSubscribe, Before: initLogFunc, Description: `Subscribe to a topic from a ntfy server, and either print or execute a command for every arriving message. There are 3 modes in which the command can be run: ntfy subscribe TOPIC This prints the JSON representation of every incoming message. It is useful when you have a command that wants to stream-read incoming JSON messages. Unless --poll is passed, this command stays open forever. Examples: ntfy subscribe mytopic # Prints JSON for incoming messages for ntfy.sh/mytopic ntfy sub home.lan/backups # Subscribe to topic on different server ntfy sub --poll home.lan/backups # Just query for latest messages and exit ntfy sub -u phil:mypass secret # Subscribe with username/password ntfy subscribe TOPIC COMMAND This executes COMMAND for every incoming messages. The message fields are passed to the command as environment variables: Variable Aliases Description --------------- --------------------- ----------------------------------- $NTFY_ID $id Unique message ID $NTFY_TIME $time Unix timestamp of the message delivery $NTFY_TOPIC $topic Topic name $NTFY_MESSAGE $message, $m Message body $NTFY_TITLE $title, $t Message title $NTFY_PRIORITY $priority, $prio, $p Message priority (1=min, 5=max) $NTFY_TAGS $tags, $tag, $ta Message tags (comma separated list) $NTFY_RAW $raw Raw JSON message Examples: ntfy sub mytopic 'notify-send "$m"' # Execute command for incoming messages ntfy sub topic1 myscript.sh # Execute script for incoming messages ntfy subscribe --from-config Service mode (used in ntfy-client.service). This reads the config file and sets up subscriptions for every topic in the "subscribe:" block (see config file). Examples: ntfy sub --from-config # Read topics from config file ntfy sub --config=myclient.yml --from-config # Read topics from alternate config file ` + clientCommandDescriptionSuffix, } func execSubscribe(c *cli.Context) error { // Read config and options conf, err := loadConfig(c) if err != nil { return err } cl := client.New(conf) since := c.String("since") user := c.String("user") token := c.String("token") poll := c.Bool("poll") scheduled := c.Bool("scheduled") fromConfig := c.Bool("from-config") topic := c.Args().Get(0) command := c.Args().Get(1) // Checks if user != "" && token != "" { return errors.New("cannot set both --user and --token") } if !fromConfig { conf.Subscribe = nil // wipe if --from-config not passed } var options []client.SubscribeOption if since != "" { options = append(options, client.WithSince(since)) } if token != "" { options = append(options, client.WithBearerAuth(token)) } else if user != "" { var pass string parts := strings.SplitN(user, ":", 2) if len(parts) == 2 { user = parts[0] pass = parts[1] } else { fmt.Fprint(c.App.ErrWriter, "Enter Password: ") p, err := util.ReadPassword(c.App.Reader) if err != nil { return err } pass = string(p) fmt.Fprintf(c.App.ErrWriter, "\r%s\r", strings.Repeat(" ", 20)) } options = append(options, client.WithBasicAuth(user, pass)) } else if conf.DefaultToken != "" { options = append(options, client.WithBearerAuth(conf.DefaultToken)) } else if conf.DefaultUser != "" && conf.DefaultPassword != nil { options = append(options, client.WithBasicAuth(conf.DefaultUser, *conf.DefaultPassword)) } if scheduled { options = append(options, client.WithScheduled()) } if topic == "" && len(conf.Subscribe) == 0 { return errors.New("must specify topic, type 'ntfy subscribe --help' for help") } // Execute poll or subscribe if poll { return doPoll(c, cl, conf, topic, command, options...) } return doSubscribe(c, cl, conf, topic, command, options...) } func doPoll(c *cli.Context, cl *client.Client, conf *client.Config, topic, command string, options ...client.SubscribeOption) error { for _, s := range conf.Subscribe { // may be nil if auth := maybeAddAuthHeader(s, conf); auth != nil { options = append(options, auth) } if err := doPollSingle(c, cl, s.Topic, s.Command, options...); err != nil { return err } } if topic != "" { if err := doPollSingle(c, cl, topic, command, options...); err != nil { return err } } return nil } func doPollSingle(c *cli.Context, cl *client.Client, topic, command string, options ...client.SubscribeOption) error { messages, err := cl.Poll(topic, options...) if err != nil { return err } for _, m := range messages { printMessageOrRunCommand(c, m, command) } return nil } func doSubscribe(c *cli.Context, cl *client.Client, conf *client.Config, topic, command string, options ...client.SubscribeOption) error { cmds := make(map[string]string) // Subscription ID -> command for _, s := range conf.Subscribe { // May be nil topicOptions := append(make([]client.SubscribeOption, 0), options...) for filter, value := range s.If { topicOptions = append(topicOptions, client.WithFilter(filter, value)) } if auth := maybeAddAuthHeader(s, conf); auth != nil { topicOptions = append(topicOptions, auth) } subscriptionID, err := cl.Subscribe(s.Topic, topicOptions...) if err != nil { return err } if s.Command != "" { cmds[subscriptionID] = s.Command } else if conf.DefaultCommand != "" { cmds[subscriptionID] = conf.DefaultCommand } else { cmds[subscriptionID] = "" } } if topic != "" { subscriptionID, err := cl.Subscribe(topic, options...) if err != nil { return err } cmds[subscriptionID] = command } for m := range cl.Messages { cmd, ok := cmds[m.SubscriptionID] if !ok { continue } log.Debug("%s Dispatching received message: %s", logMessagePrefix(m), m.Raw) printMessageOrRunCommand(c, m, cmd) } return nil } func maybeAddAuthHeader(s client.Subscribe, conf *client.Config) client.SubscribeOption { // if an explicit empty token or empty user:pass is given, exit without auth if (s.Token != nil && *s.Token == "") || (s.User != nil && *s.User == "" && s.Password != nil && *s.Password == "") { return client.WithEmptyAuth() } // check for subscription token then subscription user:pass if s.Token != nil && *s.Token != "" { return client.WithBearerAuth(*s.Token) } if s.User != nil && *s.User != "" && s.Password != nil { return client.WithBasicAuth(*s.User, *s.Password) } // if no subscription token nor subscription user:pass, check for default token then default user:pass if conf.DefaultToken != "" { return client.WithBearerAuth(conf.DefaultToken) } if conf.DefaultUser != "" && conf.DefaultPassword != nil { return client.WithBasicAuth(conf.DefaultUser, *conf.DefaultPassword) } return nil } func printMessageOrRunCommand(c *cli.Context, m *client.Message, command string) { if command != "" { runCommand(c, command, m) } else { log.Debug("%s Printing raw message", logMessagePrefix(m)) fmt.Fprintln(c.App.Writer, m.Raw) } } func runCommand(c *cli.Context, command string, m *client.Message) { if err := runCommandInternal(c, command, m); err != nil { log.Warn("%s Command failed: %s", logMessagePrefix(m), err.Error()) } } func runCommandInternal(c *cli.Context, script string, m *client.Message) error { scriptFile := fmt.Sprintf("%s/ntfy-subscribe-%s.%s", os.TempDir(), util.RandomString(10), scriptExt) log.Debug("%s Running command '%s' via temporary script %s", logMessagePrefix(m), script, scriptFile) script = scriptHeader + script if err := os.WriteFile(scriptFile, []byte(script), 0700); err != nil { return err } defer os.Remove(scriptFile) log.Debug("%s Executing script %s", logMessagePrefix(m), scriptFile) cmd := exec.Command(scriptLauncher[0], append(scriptLauncher[1:], scriptFile)...) cmd.Stdin = c.App.Reader cmd.Stdout = c.App.Writer cmd.Stderr = c.App.ErrWriter cmd.Env = envVars(m) return cmd.Run() } func envVars(m *client.Message) []string { env := make([]string, 0) env = append(env, envVar(m.ID, "NTFY_ID", "id")...) env = append(env, envVar(m.Topic, "NTFY_TOPIC", "topic")...) env = append(env, envVar(fmt.Sprintf("%d", m.Time), "NTFY_TIME", "time")...) env = append(env, envVar(m.Message, "NTFY_MESSAGE", "message", "m")...) env = append(env, envVar(m.Title, "NTFY_TITLE", "title", "t")...) env = append(env, envVar(fmt.Sprintf("%d", m.Priority), "NTFY_PRIORITY", "priority", "prio", "p")...) env = append(env, envVar(strings.Join(m.Tags, ","), "NTFY_TAGS", "tags", "tag", "ta")...) env = append(env, envVar(m.Raw, "NTFY_RAW", "raw")...) sort.Strings(env) if log.IsTrace() { log.Trace("%s With environment:\n%s", logMessagePrefix(m), strings.Join(env, "\n")) } return append(os.Environ(), env...) } func envVar(value string, vars ...string) []string { env := make([]string, 0) for _, v := range vars { env = append(env, fmt.Sprintf("%s=%s", v, value)) } return env } func loadConfig(c *cli.Context) (*client.Config, error) { filename := c.String("config") if filename != "" { return client.LoadConfig(filename) } if client.DefaultConfigFile != "" { if s, _ := os.Stat(client.DefaultConfigFile); s != nil { return client.LoadConfig(client.DefaultConfigFile) } log.Debug("Config file %s not found", client.DefaultConfigFile) } log.Debug("Loading default config") return client.NewConfig(), nil } func logMessagePrefix(m *client.Message) string { return fmt.Sprintf("%s/%s", util.ShortTopicURL(m.TopicURL), m.ID) } binwiederhier-ntfy-5ad2431/cmd/subscribe_darwin.go000066400000000000000000000005651517171047500222720ustar00rootroot00000000000000//go:build darwin package cmd const ( scriptExt = "sh" scriptHeader = "#!/bin/sh\n" clientCommandDescriptionSuffix = `The default config file for all client commands is /etc/ntfy/client.yml (if root user), or "~/Library/Application Support/ntfy/client.yml" for all other users.` ) var ( scriptLauncher = []string{"sh", "-c"} ) binwiederhier-ntfy-5ad2431/cmd/subscribe_test.go000066400000000000000000000351631517171047500217670ustar00rootroot00000000000000package cmd import ( "fmt" "github.com/stretchr/testify/require" "net/http" "net/http/httptest" "os" "path/filepath" "strings" "testing" ) func TestCLI_Subscribe_Default_UserPass_Subscription_Token(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic/json", r.URL.Path) require.Equal(t, "Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s default-user: philipp default-password: mypass subscribe: - topic: mytopic token: tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "subscribe", "--poll", "--from-config", "--config=" + filename})) require.Equal(t, message, strings.TrimSpace(stdout.String())) } func TestCLI_Subscribe_Default_Token_Subscription_UserPass(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic/json", r.URL.Path) require.Equal(t, "Basic cGhpbGlwcDpteXBhc3M=", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s default-token: tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 subscribe: - topic: mytopic user: philipp password: mypass `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "subscribe", "--poll", "--from-config", "--config=" + filename})) require.Equal(t, message, strings.TrimSpace(stdout.String())) } func TestCLI_Subscribe_Default_Token_Subscription_Token(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic/json", r.URL.Path) require.Equal(t, "Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s default-token: tk_FAKETOKEN01234567890FAKETOKEN subscribe: - topic: mytopic token: tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "subscribe", "--poll", "--from-config", "--config=" + filename})) require.Equal(t, message, strings.TrimSpace(stdout.String())) } func TestCLI_Subscribe_Default_UserPass_Subscription_UserPass(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic/json", r.URL.Path) require.Equal(t, "Basic cGhpbGlwcDpteXBhc3M=", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s default-user: fake default-password: password subscribe: - topic: mytopic user: philipp password: mypass `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "subscribe", "--poll", "--from-config", "--config=" + filename})) require.Equal(t, message, strings.TrimSpace(stdout.String())) } func TestCLI_Subscribe_Default_Token_Subscription_Empty(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic/json", r.URL.Path) require.Equal(t, "Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s default-token: tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 subscribe: - topic: mytopic `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "subscribe", "--poll", "--from-config", "--config=" + filename})) require.Equal(t, message, strings.TrimSpace(stdout.String())) } func TestCLI_Subscribe_Default_UserPass_Subscription_Empty(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic/json", r.URL.Path) require.Equal(t, "Basic cGhpbGlwcDpteXBhc3M=", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s default-user: philipp default-password: mypass subscribe: - topic: mytopic `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "subscribe", "--poll", "--from-config", "--config=" + filename})) require.Equal(t, message, strings.TrimSpace(stdout.String())) } func TestCLI_Subscribe_Default_Empty_Subscription_Token(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic/json", r.URL.Path) require.Equal(t, "Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s subscribe: - topic: mytopic token: tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "subscribe", "--poll", "--from-config", "--config=" + filename})) require.Equal(t, message, strings.TrimSpace(stdout.String())) } func TestCLI_Subscribe_Default_Empty_Subscription_UserPass(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic/json", r.URL.Path) require.Equal(t, "Basic cGhpbGlwcDpteXBhc3M=", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s subscribe: - topic: mytopic user: philipp password: mypass `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "subscribe", "--poll", "--from-config", "--config=" + filename})) require.Equal(t, message, strings.TrimSpace(stdout.String())) } func TestCLI_Subscribe_Default_Token_CLI_Token(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic/json", r.URL.Path) require.Equal(t, "Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s default-token: tk_FAKETOKEN0123456789FAKETOKEN `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "subscribe", "--poll", "--from-config", "--config=" + filename, "--token", "tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2", "mytopic"})) require.Equal(t, message, strings.TrimSpace(stdout.String())) } func TestCLI_Subscribe_Default_Token_CLI_UserPass(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic/json", r.URL.Path) require.Equal(t, "Basic cGhpbGlwcDpteXBhc3M=", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s default-token: tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "subscribe", "--poll", "--from-config", "--config=" + filename, "--user", "philipp:mypass", "mytopic"})) require.Equal(t, message, strings.TrimSpace(stdout.String())) } func TestCLI_Subscribe_Default_Token_Subscription_Token_CLI_UserPass(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic/json", r.URL.Path) require.Equal(t, "Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s default-token: tk_FAKETOKEN01234567890FAKETOKEN subscribe: - topic: mytopic token: tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "subscribe", "--poll", "--from-config", "--config=" + filename, "--user", "philipp:mypass"})) require.Equal(t, message, strings.TrimSpace(stdout.String())) } func TestCLI_Subscribe_Token_And_UserPass(t *testing.T) { app, _, _, _ := newTestApp() err := app.Run([]string{"ntfy", "subscribe", "--poll", "--token", "tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2", "--user", "philipp:mypass", "mytopic", "triggered"}) require.Error(t, err) require.Equal(t, "cannot set both --user and --token", err.Error()) } func TestCLI_Subscribe_Default_Token(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic/json", r.URL.Path) require.Equal(t, "Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s default-token: tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "subscribe", "--poll", "--from-config", "--config=" + filename, "mytopic"})) require.Equal(t, message, strings.TrimSpace(stdout.String())) } func TestCLI_Subscribe_Default_UserPass(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic/json", r.URL.Path) require.Equal(t, "Basic cGhpbGlwcDpteXBhc3M=", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s default-user: philipp default-password: mypass `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "subscribe", "--poll", "--from-config", "--config=" + filename, "mytopic"})) require.Equal(t, message, strings.TrimSpace(stdout.String())) } func TestCLI_Subscribe_Override_Default_UserPass_With_Empty_UserPass(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic/json", r.URL.Path) require.Equal(t, "", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s default-user: philipp default-password: mypass subscribe: - topic: mytopic user: "" password: "" `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "subscribe", "--poll", "--from-config", "--config=" + filename})) require.Equal(t, message, strings.TrimSpace(stdout.String())) } func TestCLI_Subscribe_Override_Default_Token_With_Empty_Token(t *testing.T) { message := `{"id":"RXIQBFaieLVr","time":124,"expires":1124,"event":"message","topic":"mytopic","message":"triggered"}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "/mytopic/json", r.URL.Path) require.Equal(t, "", r.Header.Get("Authorization")) w.WriteHeader(http.StatusOK) w.Write([]byte(message)) })) defer server.Close() filename := filepath.Join(t.TempDir(), "client.yml") require.Nil(t, os.WriteFile(filename, []byte(fmt.Sprintf(` default-host: %s default-token: tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 subscribe: - topic: mytopic token: "" `, server.URL)), 0600)) app, _, stdout, _ := newTestApp() require.Nil(t, app.Run([]string{"ntfy", "subscribe", "--poll", "--from-config", "--config=" + filename})) require.Equal(t, message, strings.TrimSpace(stdout.String())) } binwiederhier-ntfy-5ad2431/cmd/subscribe_unix.go000066400000000000000000000006131517171047500217630ustar00rootroot00000000000000//go:build linux || dragonfly || freebsd || netbsd || openbsd package cmd const ( scriptExt = "sh" scriptHeader = "#!/bin/sh\n" clientCommandDescriptionSuffix = `The default config file for all client commands is /etc/ntfy/client.yml (if root user), or ~/.config/ntfy/client.yml for all other users.` ) var ( scriptLauncher = []string{"sh", "-c"} ) binwiederhier-ntfy-5ad2431/cmd/subscribe_windows.go000066400000000000000000000004451517171047500224750ustar00rootroot00000000000000//go:build windows package cmd const ( scriptExt = "bat" scriptHeader = "" clientCommandDescriptionSuffix = `The default config file for all client commands is %AppData%\ntfy\client.yml.` ) var ( scriptLauncher = []string{"cmd.exe", "/Q", "/C"} ) binwiederhier-ntfy-5ad2431/cmd/tier.go000066400000000000000000000337731517171047500177170ustar00rootroot00000000000000//go:build !noserver package cmd import ( "errors" "fmt" "github.com/urfave/cli/v2" "heckel.io/ntfy/v2/user" "heckel.io/ntfy/v2/util" ) func init() { commands = append(commands, cmdTier) } const ( defaultMessageLimit = 5000 defaultMessageExpiryDuration = "12h" defaultEmailLimit = 20 defaultCallLimit = 0 defaultReservationLimit = 3 defaultAttachmentFileSizeLimit = "15M" defaultAttachmentTotalSizeLimit = "100M" defaultAttachmentExpiryDuration = "6h" defaultAttachmentBandwidthLimit = "1G" ) var ( flagsTier = append([]cli.Flag{}, flagsUser...) ) var cmdTier = &cli.Command{ Name: "tier", Usage: "Manage/show tiers", UsageText: "ntfy tier [list|add|change|remove] ...", Flags: flagsTier, Before: initConfigFileInputSourceFunc("config", flagsUser, initLogFunc), Category: categoryServer, Subcommands: []*cli.Command{ { Name: "add", Aliases: []string{"a"}, Usage: "Adds a new tier", UsageText: "ntfy tier add [OPTIONS] CODE", Action: execTierAdd, Flags: []cli.Flag{ &cli.StringFlag{Name: "name", Usage: "tier name"}, &cli.Int64Flag{Name: "message-limit", Value: defaultMessageLimit, Usage: "daily message limit"}, &cli.StringFlag{Name: "message-expiry-duration", Value: defaultMessageExpiryDuration, Usage: "duration after which messages are deleted"}, &cli.Int64Flag{Name: "email-limit", Value: defaultEmailLimit, Usage: "daily email limit"}, &cli.Int64Flag{Name: "call-limit", Value: defaultCallLimit, Usage: "daily phone call limit"}, &cli.Int64Flag{Name: "reservation-limit", Value: defaultReservationLimit, Usage: "topic reservation limit"}, &cli.StringFlag{Name: "attachment-file-size-limit", Value: defaultAttachmentFileSizeLimit, Usage: "per-attachment file size limit"}, &cli.StringFlag{Name: "attachment-total-size-limit", Value: defaultAttachmentTotalSizeLimit, Usage: "total size limit of attachments for the user"}, &cli.StringFlag{Name: "attachment-expiry-duration", Value: defaultAttachmentExpiryDuration, Usage: "duration after which attachments are deleted"}, &cli.StringFlag{Name: "attachment-bandwidth-limit", Value: defaultAttachmentBandwidthLimit, Usage: "daily bandwidth limit for attachment uploads/downloads"}, &cli.StringFlag{Name: "stripe-monthly-price-id", Usage: "Monthly Stripe price ID for paid tiers (e.g. price_12345)"}, &cli.StringFlag{Name: "stripe-yearly-price-id", Usage: "Yearly Stripe price ID for paid tiers (e.g. price_12345)"}, &cli.BoolFlag{Name: "ignore-exists", Usage: "if the tier already exists, perform no action and exit"}, }, Description: `Add a new tier to the ntfy user database. Tiers can be used to grant users higher limits, such as daily message limits, attachment size, or make it possible for users to reserve topics. This is a server-only command. It directly reads from user.db as defined in the server config file server.yml. The command only works if 'auth-file' is properly defined. Examples: ntfy tier add pro # Add tier with code "pro", using the defaults ntfy tier add \ # Add a tier with custom limits --name="Pro" \ --message-limit=10000 \ --message-expiry-duration=24h \ --email-limit=50 \ --reservation-limit=10 \ --attachment-file-size-limit=100M \ --attachment-total-size-limit=1G \ --attachment-expiry-duration=12h \ --attachment-bandwidth-limit=5G \ pro `, }, { Name: "change", Aliases: []string{"ch"}, Usage: "Change a tier", UsageText: "ntfy tier change [OPTIONS] CODE", Action: execTierChange, Flags: []cli.Flag{ &cli.StringFlag{Name: "name", Usage: "tier name"}, &cli.Int64Flag{Name: "message-limit", Usage: "daily message limit"}, &cli.StringFlag{Name: "message-expiry-duration", Usage: "duration after which messages are deleted"}, &cli.Int64Flag{Name: "email-limit", Usage: "daily email limit"}, &cli.Int64Flag{Name: "call-limit", Usage: "daily phone call limit"}, &cli.Int64Flag{Name: "reservation-limit", Usage: "topic reservation limit"}, &cli.StringFlag{Name: "attachment-file-size-limit", Usage: "per-attachment file size limit"}, &cli.StringFlag{Name: "attachment-total-size-limit", Usage: "total size limit of attachments for the user"}, &cli.StringFlag{Name: "attachment-expiry-duration", Usage: "duration after which attachments are deleted"}, &cli.StringFlag{Name: "attachment-bandwidth-limit", Usage: "daily bandwidth limit for attachment uploads/downloads"}, &cli.StringFlag{Name: "stripe-monthly-price-id", Usage: "Monthly Stripe price ID for paid tiers (e.g. price_12345)"}, &cli.StringFlag{Name: "stripe-yearly-price-id", Usage: "Yearly Stripe price ID for paid tiers (e.g. price_12345)"}, }, Description: `Updates a tier to change the limits. After updating a tier, you may have to restart the ntfy server to apply them to all visitors. This is a server-only command. It directly reads from user.db as defined in the server config file server.yml. The command only works if 'auth-file' is properly defined. Examples: ntfy tier change --name="Pro" pro # Update the name of an existing tier ntfy tier change \ # Update multiple limits and fields --message-expiry-duration=24h \ --stripe-monthly-price-id=price_1234 \ --stripe-monthly-price-id=price_5678 \ pro `, }, { Name: "remove", Aliases: []string{"del", "rm"}, Usage: "Removes a tier", UsageText: "ntfy tier remove CODE", Action: execTierDel, Description: `Remove a tier from the ntfy user database. You cannot remove a tier if there are users associated with a tier. Use "ntfy user change-tier" to remove or switch their tier first. This is a server-only command. It directly reads from user.db as defined in the server config file server.yml. The command only works if 'auth-file' is properly defined. Example: ntfy tier del pro `, }, { Name: "list", Aliases: []string{"l"}, Usage: "Shows a list of tiers", Action: execTierList, Description: `Shows a list of all configured tiers. This is a server-only command. It directly reads from user.db as defined in the server config file server.yml. The command only works if 'auth-file' is properly defined. `, }, }, Description: `Manage tiers of the ntfy server. The command allows you to add/remove/change tiers in the ntfy user database. Tiers are used to grant users higher limits, such as daily message limits, attachment size, or make it possible for users to reserve topics. This is a server-only command. It directly manages the user.db as defined in the server config file server.yml. The command only works if 'auth-file' is properly defined. Examples: ntfy tier add pro # Add tier with code "pro", using the defaults ntfy tier change --name="Pro" pro # Update the name of an existing tier ntfy tier del pro # Delete an existing tier `, } func execTierAdd(c *cli.Context) error { code := c.Args().Get(0) if code == "" { return errors.New("tier code expected, type 'ntfy tier add --help' for help") } else if !user.AllowedTier(code) { return errors.New("tier code must consist only of numbers and letters") } else if c.String("stripe-monthly-price-id") != "" && c.String("stripe-yearly-price-id") == "" { return errors.New("if stripe-monthly-price-id is set, stripe-yearly-price-id must also be set") } else if c.String("stripe-monthly-price-id") == "" && c.String("stripe-yearly-price-id") != "" { return errors.New("if stripe-yearly-price-id is set, stripe-monthly-price-id must also be set") } manager, err := createUserManager(c) if err != nil { return err } if tier, _ := manager.Tier(code); tier != nil { if c.Bool("ignore-exists") { fmt.Fprintf(c.App.Writer, "tier %s already exists (exited successfully)\n", code) return nil } return fmt.Errorf("tier %s already exists", code) } name := c.String("name") if name == "" { name = code } messageExpiryDuration, err := util.ParseDuration(c.String("message-expiry-duration")) if err != nil { return err } attachmentFileSizeLimit, err := util.ParseSize(c.String("attachment-file-size-limit")) if err != nil { return err } attachmentTotalSizeLimit, err := util.ParseSize(c.String("attachment-total-size-limit")) if err != nil { return err } attachmentBandwidthLimit, err := util.ParseSize(c.String("attachment-bandwidth-limit")) if err != nil { return err } attachmentExpiryDuration, err := util.ParseDuration(c.String("attachment-expiry-duration")) if err != nil { return err } tier := &user.Tier{ ID: "", // Generated Code: code, Name: name, MessageLimit: c.Int64("message-limit"), MessageExpiryDuration: messageExpiryDuration, EmailLimit: c.Int64("email-limit"), CallLimit: c.Int64("call-limit"), ReservationLimit: c.Int64("reservation-limit"), AttachmentFileSizeLimit: attachmentFileSizeLimit, AttachmentTotalSizeLimit: attachmentTotalSizeLimit, AttachmentExpiryDuration: attachmentExpiryDuration, AttachmentBandwidthLimit: attachmentBandwidthLimit, StripeMonthlyPriceID: c.String("stripe-monthly-price-id"), StripeYearlyPriceID: c.String("stripe-yearly-price-id"), } if err := manager.AddTier(tier); err != nil { return err } tier, err = manager.Tier(code) if err != nil { return err } fmt.Fprintf(c.App.Writer, "tier added\n\n") printTier(c, tier) return nil } func execTierChange(c *cli.Context) error { code := c.Args().Get(0) if code == "" { return errors.New("tier code expected, type 'ntfy tier change --help' for help") } else if !user.AllowedTier(code) { return errors.New("tier code must consist only of numbers and letters") } manager, err := createUserManager(c) if err != nil { return err } tier, err := manager.Tier(code) if err == user.ErrTierNotFound { return fmt.Errorf("tier %s does not exist", code) } else if err != nil { return err } if c.IsSet("name") { tier.Name = c.String("name") } if c.IsSet("message-limit") { tier.MessageLimit = c.Int64("message-limit") } if c.IsSet("message-expiry-duration") { tier.MessageExpiryDuration, err = util.ParseDuration(c.String("message-expiry-duration")) if err != nil { return err } } if c.IsSet("email-limit") { tier.EmailLimit = c.Int64("email-limit") } if c.IsSet("call-limit") { tier.CallLimit = c.Int64("call-limit") } if c.IsSet("reservation-limit") { tier.ReservationLimit = c.Int64("reservation-limit") } if c.IsSet("attachment-file-size-limit") { tier.AttachmentFileSizeLimit, err = util.ParseSize(c.String("attachment-file-size-limit")) if err != nil { return err } } if c.IsSet("attachment-total-size-limit") { tier.AttachmentTotalSizeLimit, err = util.ParseSize(c.String("attachment-total-size-limit")) if err != nil { return err } } if c.IsSet("attachment-expiry-duration") { tier.AttachmentExpiryDuration, err = util.ParseDuration(c.String("attachment-expiry-duration")) if err != nil { return err } } if c.IsSet("attachment-bandwidth-limit") { tier.AttachmentBandwidthLimit, err = util.ParseSize(c.String("attachment-bandwidth-limit")) if err != nil { return err } } if c.IsSet("stripe-monthly-price-id") { tier.StripeMonthlyPriceID = c.String("stripe-monthly-price-id") } if c.IsSet("stripe-yearly-price-id") { tier.StripeYearlyPriceID = c.String("stripe-yearly-price-id") } if tier.StripeMonthlyPriceID != "" && tier.StripeYearlyPriceID == "" { return errors.New("if stripe-monthly-price-id is set, stripe-yearly-price-id must also be set") } else if tier.StripeMonthlyPriceID == "" && tier.StripeYearlyPriceID != "" { return errors.New("if stripe-yearly-price-id is set, stripe-monthly-price-id must also be set") } if err := manager.UpdateTier(tier); err != nil { return err } fmt.Fprintf(c.App.Writer, "tier updated\n\n") printTier(c, tier) return nil } func execTierDel(c *cli.Context) error { code := c.Args().Get(0) if code == "" { return errors.New("tier code expected, type 'ntfy tier del --help' for help") } manager, err := createUserManager(c) if err != nil { return err } if _, err := manager.Tier(code); err == user.ErrTierNotFound { return fmt.Errorf("tier %s does not exist", code) } if err := manager.RemoveTier(code); err != nil { return err } fmt.Fprintf(c.App.Writer, "tier %s removed\n", code) return nil } func execTierList(c *cli.Context) error { manager, err := createUserManager(c) if err != nil { return err } tiers, err := manager.Tiers() if err != nil { return err } for _, tier := range tiers { printTier(c, tier) } return nil } func printTier(c *cli.Context, tier *user.Tier) { prices := "(none)" if tier.StripeMonthlyPriceID != "" && tier.StripeYearlyPriceID != "" { prices = fmt.Sprintf("%s / %s", tier.StripeMonthlyPriceID, tier.StripeYearlyPriceID) } fmt.Fprintf(c.App.Writer, "tier %s (id: %s)\n", tier.Code, tier.ID) fmt.Fprintf(c.App.Writer, "- Name: %s\n", tier.Name) fmt.Fprintf(c.App.Writer, "- Message limit: %d\n", tier.MessageLimit) fmt.Fprintf(c.App.Writer, "- Message expiry duration: %s (%d seconds)\n", tier.MessageExpiryDuration.String(), int64(tier.MessageExpiryDuration.Seconds())) fmt.Fprintf(c.App.Writer, "- Email limit: %d\n", tier.EmailLimit) fmt.Fprintf(c.App.Writer, "- Phone call limit: %d\n", tier.CallLimit) fmt.Fprintf(c.App.Writer, "- Reservation limit: %d\n", tier.ReservationLimit) fmt.Fprintf(c.App.Writer, "- Attachment file size limit: %s\n", util.FormatSizeHuman(tier.AttachmentFileSizeLimit)) fmt.Fprintf(c.App.Writer, "- Attachment total size limit: %s\n", util.FormatSizeHuman(tier.AttachmentTotalSizeLimit)) fmt.Fprintf(c.App.Writer, "- Attachment expiry duration: %s (%d seconds)\n", tier.AttachmentExpiryDuration.String(), int64(tier.AttachmentExpiryDuration.Seconds())) fmt.Fprintf(c.App.Writer, "- Attachment daily bandwidth limit: %s\n", util.FormatSizeHuman(tier.AttachmentBandwidthLimit)) fmt.Fprintf(c.App.Writer, "- Stripe prices (monthly/yearly): %s\n", prices) } binwiederhier-ntfy-5ad2431/cmd/tier_test.go000066400000000000000000000046121517171047500207440ustar00rootroot00000000000000package cmd import ( "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" "heckel.io/ntfy/v2/server" "heckel.io/ntfy/v2/test" "testing" ) func TestCLI_Tier_AddListChangeDelete(t *testing.T) { s, conf, port := newTestServerWithAuth(t) defer test.StopServer(t, s, port) app, _, stdout, _ := newTestApp() require.Nil(t, runTierCommand(app, conf, "add", "--name", "Pro", "--message-limit", "1234", "pro")) require.Contains(t, stdout.String(), "tier added\n\ntier pro (id: ti_") err := runTierCommand(app, conf, "add", "pro") require.NotNil(t, err) require.Equal(t, "tier pro already exists", err.Error()) app, _, stdout, _ = newTestApp() require.Nil(t, runTierCommand(app, conf, "list")) require.Contains(t, stdout.String(), "tier pro (id: ti_") require.Contains(t, stdout.String(), "- Name: Pro") require.Contains(t, stdout.String(), "- Message limit: 1234") app, _, stdout, _ = newTestApp() require.Nil(t, runTierCommand(app, conf, "change", "--message-limit=999", "--message-expiry-duration=2d", "--email-limit=91", "--reservation-limit=98", "--attachment-file-size-limit=100m", "--attachment-expiry-duration=1d", "--attachment-total-size-limit=10G", "--attachment-bandwidth-limit=100G", "--stripe-monthly-price-id=price_991", "--stripe-yearly-price-id=price_992", "pro", )) require.Contains(t, stdout.String(), "- Message limit: 999") require.Contains(t, stdout.String(), "- Message expiry duration: 48h") require.Contains(t, stdout.String(), "- Email limit: 91") require.Contains(t, stdout.String(), "- Reservation limit: 98") require.Contains(t, stdout.String(), "- Attachment file size limit: 100.0 MB") require.Contains(t, stdout.String(), "- Attachment expiry duration: 24h") require.Contains(t, stdout.String(), "- Attachment total size limit: 10.0 GB") require.Contains(t, stdout.String(), "- Stripe prices (monthly/yearly): price_991 / price_992") app, _, stdout, _ = newTestApp() require.Nil(t, runTierCommand(app, conf, "remove", "pro")) require.Contains(t, stdout.String(), "tier pro removed") } func runTierCommand(app *cli.App, conf *server.Config, args ...string) error { userArgs := []string{ "ntfy", "--log-level=ERROR", "tier", "--config=" + conf.File, // Dummy config file to avoid lookups of real file "--auth-file=" + conf.AuthFile, "--auth-default-access=" + conf.AuthDefault.String(), } return app.Run(append(userArgs, args...)) } binwiederhier-ntfy-5ad2431/cmd/token.go000066400000000000000000000162441517171047500200660ustar00rootroot00000000000000//go:build !noserver package cmd import ( "errors" "fmt" "github.com/urfave/cli/v2" "heckel.io/ntfy/v2/user" "heckel.io/ntfy/v2/util" "net/netip" "time" ) func init() { commands = append(commands, cmdToken) } var flagsToken = append([]cli.Flag{}, flagsUser...) var cmdToken = &cli.Command{ Name: "token", Usage: "Create, list or delete user tokens", UsageText: "ntfy token [list|add|remove] ...", Flags: flagsToken, Before: initConfigFileInputSourceFunc("config", flagsToken, initLogFunc), Category: categoryServer, Subcommands: []*cli.Command{ { Name: "add", Aliases: []string{"a"}, Usage: "Create a new token", UsageText: "ntfy token add [--expires=] [--label=..] USERNAME", Action: execTokenAdd, Flags: []cli.Flag{ &cli.StringFlag{Name: "expires", Aliases: []string{"e"}, Value: "", Usage: "token expires after"}, &cli.StringFlag{Name: "label", Aliases: []string{"l"}, Value: "", Usage: "token label"}, }, Description: `Create a new user access token. User access tokens can be used to publish, subscribe, or perform any other user-specific tasks. Tokens have full access, and can perform any task a user can do. They are meant to be used to avoid spreading the password to various places. This is a server-only command. It directly reads from user.db as defined in the server config file server.yml. The command only works if 'auth-file' is properly defined. Examples: ntfy token add phil # Create token for user phil which never expires ntfy token add --expires=2d phil # Create token for user phil which expires in 2 days ntfy token add -e "tuesday, 8pm" phil # Create token for user phil which expires next Tuesday ntfy token add -l backups phil # Create token for user phil with label "backups"`, }, { Name: "remove", Aliases: []string{"del", "rm"}, Usage: "Removes a token", UsageText: "ntfy token remove USERNAME TOKEN", Action: execTokenDel, Description: `Remove a token from the ntfy user database. Example: ntfy token del phil tk_th2srHVlxrANQHAso5t0HuQ1J1TjN`, }, { Name: "list", Aliases: []string{"l"}, Usage: "Shows a list of tokens", Action: execTokenList, Description: `Shows a list of all tokens. This is a server-only command. It directly reads from user.db as defined in the server config file server.yml. The command only works if 'auth-file' is properly defined.`, }, { Name: "generate", Usage: "Generates a random token", Action: execTokenGenerate, Description: `Randomly generate a token to be used in provisioned tokens. This command only generates the token value, but does not persist it anywhere. The output can be used in the 'auth-tokens' config option.`, }, }, Description: `Manage access tokens for individual users. User access tokens can be used to publish, subscribe, or perform any other user-specific tasks. Tokens have full access, and can perform any task a user can do. They are meant to be used to avoid spreading the password to various places. This is a server-only command. It directly manages the user.db as defined in the server config file server.yml. The command only works if 'auth-file' is properly defined. Examples: ntfy token list # Shows list of tokens for all users ntfy token list phil # Shows list of tokens for user phil ntfy token add phil # Create token for user phil which never expires ntfy token add --expires=2d phil # Create token for user phil which expires in 2 days ntfy token remove phil tk_th2srHVlxr... # Delete token`, } func execTokenAdd(c *cli.Context) error { username := c.Args().Get(0) expiresStr := c.String("expires") label := c.String("label") if username == "" { return errors.New("username expected, type 'ntfy token add --help' for help") } else if username == userEveryone || username == user.Everyone { return errors.New("username not allowed") } expires := time.Unix(0, 0) if expiresStr != "" { var err error expires, err = util.ParseFutureTime(expiresStr, time.Now()) if err != nil { return err } } manager, err := createUserManager(c) if err != nil { return err } u, err := manager.User(username) if errors.Is(err, user.ErrUserNotFound) { return fmt.Errorf("user %s does not exist", username) } else if err != nil { return err } token, err := manager.CreateToken(u.ID, label, expires, netip.IPv4Unspecified(), false) if err != nil { return err } if expires.Unix() == 0 { fmt.Fprintf(c.App.Writer, "token %s created for user %s, never expires\n", token.Value, u.Name) } else { fmt.Fprintf(c.App.Writer, "token %s created for user %s, expires %v\n", token.Value, u.Name, expires.Format(time.UnixDate)) } return nil } func execTokenDel(c *cli.Context) error { username, token := c.Args().Get(0), c.Args().Get(1) if username == "" || token == "" { return errors.New("username and token expected, type 'ntfy token remove --help' for help") } else if username == userEveryone || username == user.Everyone { return errors.New("username not allowed") } manager, err := createUserManager(c) if err != nil { return err } u, err := manager.User(username) if errors.Is(err, user.ErrUserNotFound) { return fmt.Errorf("user %s does not exist", username) } else if err != nil { return err } if err := manager.RemoveToken(u.ID, token); err != nil { return err } fmt.Fprintf(c.App.Writer, "token %s for user %s removed\n", token, username) return nil } func execTokenList(c *cli.Context) error { username := c.Args().Get(0) if username == userEveryone || username == user.Everyone { return errors.New("username not allowed") } manager, err := createUserManager(c) if err != nil { return err } var users []*user.User if username != "" { u, err := manager.User(username) if errors.Is(err, user.ErrUserNotFound) { return fmt.Errorf("user %s does not exist", username) } else if err != nil { return err } users = append(users, u) } else { users, err = manager.Users() if err != nil { return err } } usersWithTokens := 0 for _, u := range users { tokens, err := manager.Tokens(u.ID) if err != nil { return err } else if len(tokens) == 0 && username != "" { fmt.Fprintf(c.App.Writer, "user %s has no access tokens\n", username) return nil } else if len(tokens) == 0 { continue } usersWithTokens++ fmt.Fprintf(c.App.Writer, "user %s\n", u.Name) for _, t := range tokens { var label, expires, provisioned string if t.Label != "" { label = fmt.Sprintf(" (%s)", t.Label) } if t.Expires.Unix() == 0 { expires = "never expires" } else { expires = fmt.Sprintf("expires %s", t.Expires.Format(time.RFC822)) } if t.Provisioned { provisioned = " (server config)" } fmt.Fprintf(c.App.Writer, "- %s%s, %s, accessed from %s at %s%s\n", t.Value, label, expires, t.LastOrigin.String(), t.LastAccess.Format(time.RFC822), provisioned) } } if usersWithTokens == 0 { fmt.Fprintf(c.App.Writer, "no users with tokens\n") } return nil } func execTokenGenerate(c *cli.Context) error { fmt.Fprintln(c.App.Writer, user.GenerateToken()) return nil } binwiederhier-ntfy-5ad2431/cmd/token_test.go000066400000000000000000000031201517171047500211120ustar00rootroot00000000000000package cmd import ( "fmt" "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" "heckel.io/ntfy/v2/server" "heckel.io/ntfy/v2/test" "regexp" "testing" ) func TestCLI_Token_AddListRemove(t *testing.T) { s, conf, port := newTestServerWithAuth(t) defer test.StopServer(t, s, port) app, stdin, stdout, _ := newTestApp() stdin.WriteString("mypass\nmypass") require.Nil(t, runUserCommand(app, conf, "add", "phil")) require.Contains(t, stdout.String(), "user phil added with role user") app, _, stdout, _ = newTestApp() require.Nil(t, runTokenCommand(app, conf, "add", "phil")) require.Regexp(t, `token tk_.+ created for user phil, never expires`, stdout.String()) app, _, stdout, _ = newTestApp() require.Nil(t, runTokenCommand(app, conf, "list", "phil")) require.Regexp(t, `user phil\n- tk_.+, never expires, accessed from 0.0.0.0 at .+`, stdout.String()) re := regexp.MustCompile(`tk_\w+`) token := re.FindString(stdout.String()) app, _, stdout, _ = newTestApp() require.Nil(t, runTokenCommand(app, conf, "remove", "phil", token)) require.Regexp(t, fmt.Sprintf("token %s for user phil removed", token), stdout.String()) app, _, stdout, _ = newTestApp() require.Nil(t, runTokenCommand(app, conf, "list")) require.Equal(t, "no users with tokens\n", stdout.String()) } func runTokenCommand(app *cli.App, conf *server.Config, args ...string) error { userArgs := []string{ "ntfy", "--log-level=ERROR", "token", "--config=" + conf.File, // Dummy config file to avoid lookups of real file "--auth-file=" + conf.AuthFile, } return app.Run(append(userArgs, args...)) } binwiederhier-ntfy-5ad2431/cmd/user.go000066400000000000000000000344101517171047500177170ustar00rootroot00000000000000//go:build !noserver package cmd import ( "crypto/subtle" "errors" "fmt" "os" "strings" "github.com/urfave/cli/v2" "github.com/urfave/cli/v2/altsrc" "heckel.io/ntfy/v2/db" "heckel.io/ntfy/v2/db/pg" "heckel.io/ntfy/v2/server" "heckel.io/ntfy/v2/user" "heckel.io/ntfy/v2/util" ) const ( tierReset = "-" ) func init() { commands = append(commands, cmdUser) } var flagsUser = append( append([]cli.Flag{}, flagsDefault...), &cli.StringFlag{Name: "config", Aliases: []string{"c"}, EnvVars: []string{"NTFY_CONFIG_FILE"}, Value: server.DefaultConfigFile, DefaultText: server.DefaultConfigFile, Usage: "config file"}, altsrc.NewStringFlag(&cli.StringFlag{Name: "auth-file", Aliases: []string{"auth_file", "H"}, EnvVars: []string{"NTFY_AUTH_FILE"}, Usage: "auth database file used for access control"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "auth-default-access", Aliases: []string{"auth_default_access", "p"}, EnvVars: []string{"NTFY_AUTH_DEFAULT_ACCESS"}, Value: "read-write", Usage: "default permissions if no matching entries in the auth database are found"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "database-url", Aliases: []string{"database_url"}, EnvVars: []string{"NTFY_DATABASE_URL"}, Usage: "PostgreSQL connection string for database-backed stores"}), ) var cmdUser = &cli.Command{ Name: "user", Usage: "Manage/show users", UsageText: "ntfy user [list|add|remove|change-pass|change-role] ...", Flags: flagsUser, Before: initConfigFileInputSourceFunc("config", flagsUser, initLogFunc), Category: categoryServer, Subcommands: []*cli.Command{ { Name: "add", Aliases: []string{"a"}, Usage: "Adds a new user", UsageText: "ntfy user add [--role=admin|user] USERNAME\nNTFY_PASSWORD=... ntfy user add [--role=admin|user] USERNAME\nNTFY_PASSWORD_HASH=... ntfy user add [--role=admin|user] USERNAME", Action: execUserAdd, Flags: []cli.Flag{ &cli.StringFlag{Name: "role", Aliases: []string{"r"}, Value: string(user.RoleUser), Usage: "user role"}, &cli.BoolFlag{Name: "ignore-exists", Usage: "if the user already exists, perform no action and exit"}, }, Description: `Add a new user to the ntfy user database. A user can be either a regular user, or an admin. A regular user has no read or write access (unless granted otherwise by the auth-default-access setting). An admin user has read and write access to all topics. Examples: ntfy user add phil # Add regular user phil ntfy user add --role=admin phil # Add admin user phil NTFY_PASSWORD=... ntfy user add phil # Add user, using env variable to set password (for scripts) NTFY_PASSWORD_HASH=... ntfy user add phil # Add user, using env variable to set password hash (for scripts) You may set the NTFY_PASSWORD environment variable to pass the password, or NTFY_PASSWORD_HASH to pass directly the bcrypt hash. This is useful if you are creating users via scripts. `, }, { Name: "remove", Aliases: []string{"del", "rm"}, Usage: "Removes a user", UsageText: "ntfy user remove USERNAME", Action: execUserDel, Description: `Remove a user from the ntfy user database. Example: ntfy user del phil `, }, { Name: "change-pass", Aliases: []string{"chp"}, Usage: "Changes a user's password", UsageText: "ntfy user change-pass USERNAME\nNTFY_PASSWORD=... ntfy user change-pass USERNAME\nNTFY_PASSWORD_HASH=... ntfy user change-pass USERNAME", Action: execUserChangePass, Description: `Change the password for the given user. The new password will be read from STDIN, and it'll be confirmed by typing it twice. Example: ntfy user change-pass phil NTFY_PASSWORD=.. ntfy user change-pass phil NTFY_PASSWORD_HASH=.. ntfy user change-pass phil You may set the NTFY_PASSWORD environment variable to pass the new password or NTFY_PASSWORD_HASH to pass directly the bcrypt hash. This is useful if you are updating users via scripts. `, }, { Name: "change-role", Aliases: []string{"chr"}, Usage: "Changes the role of a user", UsageText: "ntfy user change-role USERNAME ROLE", Action: execUserChangeRole, Description: `Change the role for the given user to admin or user. This command can be used to change the role of a user either from a regular user to an admin user, or the other way around: - admin: an admin has read/write access to all topics - user: a regular user only has access to what was explicitly granted via 'ntfy access' When changing the role of a user to "admin", all access control entries for that user are removed, since they are no longer necessary. Example: ntfy user change-role phil admin # Make user phil an admin ntfy user change-role phil user # Remove admin role from user phil `, }, { Name: "change-tier", Aliases: []string{"cht"}, Usage: "Changes the tier of a user", UsageText: "ntfy user change-tier USERNAME (TIER|-)", Action: execUserChangeTier, Description: `Change the tier for the given user. This command can be used to change the tier of a user. Tiers define usage limits, such as messages per day, attachment file sizes, etc. Example: ntfy user change-tier phil pro # Change tier to "pro" for user "phil" ntfy user change-tier phil - # Remove tier from user "phil" entirely `, }, { Name: "hash", Usage: "Create password hash for a predefined user", UsageText: "ntfy user hash", Action: execUserHash, Description: `Asks for a password and creates a bcrypt password hash. This command is useful to create a password hash for a user, which can then be used for predefined users in the server config file, in auth-users. Example: $ ntfy user hash (asks for password and confirmation) $2a$10$YLiO8U21sX1uhZamTLJXHuxgVC0Z/GKISibrKCLohPgtG7yIxSk4C `, }, { Name: "list", Aliases: []string{"l"}, Usage: "Shows a list of users", Action: execUserList, Description: `Shows a list of all configured users, including the everyone ('*') user. This command is an alias to calling 'ntfy access' (display access control list). This is a server-only command. It directly reads from user.db as defined in the server config file server.yml. The command only works if 'auth-file' is properly defined. `, }, }, Description: `Manage users of the ntfy server. The command allows you to add/remove/change users in the ntfy user database, as well as change passwords or roles. This is a server-only command. It directly manages the user.db as defined in the server config file server.yml. The command only works if 'auth-file' is properly defined. Please also refer to the related command 'ntfy access'. Examples: ntfy user list # Shows list of users (alias: 'ntfy access') ntfy user add phil # Add regular user phil NTFY_PASSWORD=... ntfy user add phil # As above, using env variable to set password (for scripts) ntfy user add --role=admin phil # Add admin user phil ntfy user del phil # Delete user phil ntfy user change-pass phil # Change password for user phil NTFY_PASSWORD=.. ntfy user change-pass phil # As above, using env variable to set password (for scripts) ntfy user change-role phil admin # Make user phil an admin For the 'ntfy user add' and 'ntfy user change-pass' commands, you may set the NTFY_PASSWORD environment variable to pass the new password. This is useful if you are creating/updating users via scripts. `, } func execUserAdd(c *cli.Context) error { username := c.Args().Get(0) role := user.Role(c.String("role")) password, hashed := os.LookupEnv("NTFY_PASSWORD_HASH") if !hashed { password = os.Getenv("NTFY_PASSWORD") } if username == "" { return errors.New("username expected, type 'ntfy user add --help' for help") } else if username == userEveryone || username == user.Everyone { return errors.New("username not allowed") } else if !user.AllowedRole(role) { return errors.New("role must be either 'user' or 'admin'") } manager, err := createUserManager(c) if err != nil { return err } if user, _ := manager.User(username); user != nil { if c.Bool("ignore-exists") { fmt.Fprintf(c.App.Writer, "user %s already exists (exited successfully)\n", username) return nil } return fmt.Errorf("user %s already exists", username) } if password == "" { p, err := readPasswordAndConfirm(c) if err != nil { return err } password = p } if err := manager.AddUser(username, password, role, hashed); err != nil { return err } fmt.Fprintf(c.App.Writer, "user %s added with role %s\n", username, role) return nil } func execUserDel(c *cli.Context) error { username := c.Args().Get(0) if username == "" { return errors.New("username expected, type 'ntfy user del --help' for help") } else if username == userEveryone || username == user.Everyone { return errors.New("username not allowed") } manager, err := createUserManager(c) if err != nil { return err } if _, err := manager.User(username); errors.Is(err, user.ErrUserNotFound) { return fmt.Errorf("user %s does not exist", username) } if err := manager.RemoveUser(username); err != nil { return err } fmt.Fprintf(c.App.Writer, "user %s removed\n", username) return nil } func execUserChangePass(c *cli.Context) error { username := c.Args().Get(0) password, hashed := os.LookupEnv("NTFY_PASSWORD_HASH") if !hashed { password = os.Getenv("NTFY_PASSWORD") } if username == "" { return errors.New("username expected, type 'ntfy user change-pass --help' for help") } else if username == userEveryone || username == user.Everyone { return errors.New("username not allowed") } manager, err := createUserManager(c) if err != nil { return err } if _, err := manager.User(username); errors.Is(err, user.ErrUserNotFound) { return fmt.Errorf("user %s does not exist", username) } if password == "" { password, err = readPasswordAndConfirm(c) if err != nil { return err } } if err := manager.ChangePassword(username, password, hashed); err != nil { return err } fmt.Fprintf(c.App.Writer, "changed password for user %s\n", username) return nil } func execUserChangeRole(c *cli.Context) error { username := c.Args().Get(0) role := user.Role(c.Args().Get(1)) if username == "" || !user.AllowedRole(role) { return errors.New("username and new role expected, type 'ntfy user change-role --help' for help") } else if username == userEveryone || username == user.Everyone { return errors.New("username not allowed") } manager, err := createUserManager(c) if err != nil { return err } if _, err := manager.User(username); errors.Is(err, user.ErrUserNotFound) { return fmt.Errorf("user %s does not exist", username) } if err := manager.ChangeRole(username, role); err != nil { return err } fmt.Fprintf(c.App.Writer, "changed role for user %s to %s\n", username, role) return nil } func execUserHash(c *cli.Context) error { password, err := readPasswordAndConfirm(c) if err != nil { return err } hash, err := user.HashPassword(password) if err != nil { return fmt.Errorf("failed to hash password: %w", err) } fmt.Fprintln(c.App.Writer, hash) return nil } func execUserChangeTier(c *cli.Context) error { username := c.Args().Get(0) tier := c.Args().Get(1) if username == "" { return errors.New("username and new tier expected, type 'ntfy user change-tier --help' for help") } else if !user.AllowedTier(tier) && tier != tierReset { return errors.New("invalid tier, must be tier code, or - to reset") } else if username == userEveryone || username == user.Everyone { return errors.New("username not allowed") } manager, err := createUserManager(c) if err != nil { return err } if _, err := manager.User(username); errors.Is(err, user.ErrUserNotFound) { return fmt.Errorf("user %s does not exist", username) } if tier == tierReset { if err := manager.ResetTier(username); err != nil { return err } fmt.Fprintf(c.App.Writer, "removed tier from user %s\n", username) } else { if err := manager.ChangeTier(username, tier); err != nil { return err } fmt.Fprintf(c.App.Writer, "changed tier for user %s to %s\n", username, tier) } return nil } func execUserList(c *cli.Context) error { manager, err := createUserManager(c) if err != nil { return err } users, err := manager.Users() if err != nil { return err } return showUsers(c, manager, users) } func createUserManager(c *cli.Context) (*user.Manager, error) { authFile := c.String("auth-file") authStartupQueries := c.String("auth-startup-queries") authDefaultAccess := c.String("auth-default-access") databaseURL := c.String("database-url") authDefault, err := user.ParsePermission(authDefaultAccess) if err != nil { return nil, errors.New("if set, auth-default-access must start set to 'read-write', 'read-only', 'write-only' or 'deny-all'") } authConfig := &user.Config{ DefaultAccess: authDefault, ProvisionEnabled: false, // Hack: Do not re-provision users on manager initialization BcryptCost: user.DefaultUserPasswordBcryptCost, QueueWriterInterval: user.DefaultUserStatsQueueWriterInterval, } if databaseURL != "" { host, dbErr := pg.Open(databaseURL) if dbErr != nil { return nil, dbErr } return user.NewPostgresManager(db.New(host, nil), authConfig) } else if authFile != "" { if !util.FileExists(authFile) { return nil, errors.New("auth-file does not exist; please start the server at least once to create it") } return user.NewSQLiteManager(authFile, authStartupQueries, authConfig) } return nil, errors.New("option database-url or auth-file not set; auth is unconfigured for this server") } func readPasswordAndConfirm(c *cli.Context) (string, error) { fmt.Fprint(c.App.ErrWriter, "password: ") password, err := util.ReadPassword(c.App.Reader) if err != nil { return "", err } else if len(password) == 0 { return "", errors.New("password cannot be empty") } fmt.Fprintf(c.App.ErrWriter, "\r%s\rconfirm: ", strings.Repeat(" ", 25)) confirm, err := util.ReadPassword(c.App.Reader) if err != nil { return "", err } fmt.Fprintf(c.App.ErrWriter, "\r%s\r", strings.Repeat(" ", 25)) if subtle.ConstantTimeCompare(confirm, password) != 1 { return "", errors.New("passwords do not match: try it again, but this time type slooowwwlly") } return string(password), nil } binwiederhier-ntfy-5ad2431/cmd/user_test.go000066400000000000000000000113531517171047500207570ustar00rootroot00000000000000package cmd import ( "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" "heckel.io/ntfy/v2/server" "heckel.io/ntfy/v2/test" "heckel.io/ntfy/v2/user" "os" "path/filepath" "testing" ) func TestCLI_User_Add(t *testing.T) { s, conf, port := newTestServerWithAuth(t) defer test.StopServer(t, s, port) app, stdin, stdout, _ := newTestApp() stdin.WriteString("mypass\nmypass") require.Nil(t, runUserCommand(app, conf, "add", "phil")) require.Contains(t, stdout.String(), "user phil added with role user") } func TestCLI_User_Add_Exists(t *testing.T) { s, conf, port := newTestServerWithAuth(t) defer test.StopServer(t, s, port) app, stdin, stdout, _ := newTestApp() stdin.WriteString("mypass\nmypass") require.Nil(t, runUserCommand(app, conf, "add", "phil")) require.Contains(t, stdout.String(), "user phil added with role user") app, stdin, _, _ = newTestApp() stdin.WriteString("mypass\nmypass") err := runUserCommand(app, conf, "add", "phil") require.Error(t, err) require.Contains(t, err.Error(), "user phil already exists") } func TestCLI_User_Add_Admin(t *testing.T) { s, conf, port := newTestServerWithAuth(t) defer test.StopServer(t, s, port) app, stdin, stdout, _ := newTestApp() stdin.WriteString("mypass\nmypass") require.Nil(t, runUserCommand(app, conf, "add", "--role=admin", "phil")) require.Contains(t, stdout.String(), "user phil added with role admin") } func TestCLI_User_Add_Password_Mismatch(t *testing.T) { s, conf, port := newTestServerWithAuth(t) defer test.StopServer(t, s, port) app, stdin, _, _ := newTestApp() stdin.WriteString("mypass\nNOTMATCH") err := runUserCommand(app, conf, "add", "phil") require.Error(t, err) require.Contains(t, err.Error(), "passwords do not match: try it again, but this time type slooowwwlly") } func TestCLI_User_ChangePass(t *testing.T) { s, conf, port := newTestServerWithAuth(t) conf.AuthUsers = []*user.User{ {Name: "philuser", Hash: "$2a$10$U4WSIYY6evyGmZaraavM2e2JeVG6EMGUKN1uUwufUeeRd4Jpg6cGC", Role: user.RoleUser}, // philuser:philpass } defer test.StopServer(t, s, port) // Add user app, stdin, stdout, _ := newTestApp() stdin.WriteString("mypass\nmypass") require.Nil(t, runUserCommand(app, conf, "add", "phil")) require.Contains(t, stdout.String(), "user phil added with role user") // Change pass app, stdin, stdout, _ = newTestApp() stdin.WriteString("newpass\nnewpass") require.Nil(t, runUserCommand(app, conf, "change-pass", "phil")) require.Contains(t, stdout.String(), "changed password for user phil") // Cannot change provisioned user's pass app, stdin, _, _ = newTestApp() stdin.WriteString("newpass\nnewpass") require.Error(t, runUserCommand(app, conf, "change-pass", "philuser")) } func TestCLI_User_ChangeRole(t *testing.T) { s, conf, port := newTestServerWithAuth(t) defer test.StopServer(t, s, port) // Add user app, stdin, stdout, _ := newTestApp() stdin.WriteString("mypass\nmypass") require.Nil(t, runUserCommand(app, conf, "add", "phil")) require.Contains(t, stdout.String(), "user phil added with role user") // Change role app, _, stdout, _ = newTestApp() require.Nil(t, runUserCommand(app, conf, "change-role", "phil", "admin")) require.Contains(t, stdout.String(), "changed role for user phil to admin") } func TestCLI_User_Delete(t *testing.T) { s, conf, port := newTestServerWithAuth(t) defer test.StopServer(t, s, port) // Add user app, stdin, stdout, _ := newTestApp() stdin.WriteString("mypass\nmypass") require.Nil(t, runUserCommand(app, conf, "add", "phil")) require.Contains(t, stdout.String(), "user phil added with role user") // Delete user app, _, stdout, _ = newTestApp() require.Nil(t, runUserCommand(app, conf, "del", "phil")) require.Contains(t, stdout.String(), "user phil removed") // Delete user again (does not exist) app, _, _, _ = newTestApp() err := runUserCommand(app, conf, "del", "phil") require.Error(t, err) require.Contains(t, err.Error(), "user phil does not exist") } func newTestServerWithAuth(t *testing.T) (s *server.Server, conf *server.Config, port int) { configFile := filepath.Join(t.TempDir(), "server-dummy.yml") require.Nil(t, os.WriteFile(configFile, []byte(""), 0600)) // Dummy config file to avoid lookup of real server.yml conf = server.NewConfig() conf.File = configFile conf.AuthFile = filepath.Join(t.TempDir(), "user.db") conf.AuthDefault = user.PermissionDenyAll s, port = test.StartServerWithConfig(t, conf) return } func runUserCommand(app *cli.App, conf *server.Config, args ...string) error { userArgs := []string{ "ntfy", "--log-level=ERROR", "user", "--config=" + conf.File, // Dummy config file to avoid lookups of real file "--auth-file=" + conf.AuthFile, "--auth-default-access=" + conf.AuthDefault.String(), } return app.Run(append(userArgs, args...)) } binwiederhier-ntfy-5ad2431/cmd/webpush.go000066400000000000000000000033001517171047500204100ustar00rootroot00000000000000//go:build !noserver && !nowebpush package cmd import ( "fmt" "os" "github.com/SherClockHolmes/webpush-go" "github.com/urfave/cli/v2" "github.com/urfave/cli/v2/altsrc" ) var flagsWebPush = append( []cli.Flag{}, altsrc.NewStringFlag(&cli.StringFlag{Name: "output-file", Aliases: []string{"f"}, Usage: "write VAPID keys to this file"}), ) func init() { commands = append(commands, cmdWebPush) } var cmdWebPush = &cli.Command{ Name: "webpush", Usage: "Generate keys, in the future manage web push subscriptions", UsageText: "ntfy webpush [keys]", Category: categoryServer, Subcommands: []*cli.Command{ { Action: generateWebPushKeys, Name: "keys", Usage: "Generate VAPID keys to enable browser background push notifications", UsageText: "ntfy webpush keys", Category: categoryServer, Flags: flagsWebPush, }, }, } func generateWebPushKeys(c *cli.Context) error { privateKey, publicKey, err := webpush.GenerateVAPIDKeys() if err != nil { return err } if outputFile := c.String("output-file"); outputFile != "" { contents := fmt.Sprintf(`--- web-push-public-key: %s web-push-private-key: %s `, publicKey, privateKey) err = os.WriteFile(outputFile, []byte(contents), 0660) if err != nil { return err } _, err = fmt.Fprintf(c.App.Writer, "Web Push keys written to %s.\n", outputFile) } else { _, err = fmt.Fprintf(c.App.Writer, `Web Push keys generated. Add the following lines to your config file: web-push-public-key: %s web-push-private-key: %s web-push-file: /var/cache/ntfy/webpush.db # or similar web-push-email-address: See https://ntfy.sh/docs/config/#web-push for details. `, publicKey, privateKey) } return err } binwiederhier-ntfy-5ad2431/cmd/webpush_test.go000066400000000000000000000016701517171047500214570ustar00rootroot00000000000000package cmd import ( "path/filepath" "testing" "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" "heckel.io/ntfy/v2/server" ) func TestCLI_WebPush_GenerateKeys(t *testing.T) { app, _, stdout, _ := newTestApp() require.Nil(t, runWebPushCommand(app, server.NewConfig(), "keys")) require.Contains(t, stdout.String(), "Web Push keys generated.") } func TestCLI_WebPush_WriteKeysToFile(t *testing.T) { tempDir := t.TempDir() t.Chdir(tempDir) app, _, stdout, _ := newTestApp() require.Nil(t, runWebPushCommand(app, server.NewConfig(), "keys", "--output-file=key-file.yaml")) require.Contains(t, stdout.String(), "Web Push keys written to key-file.yaml") require.FileExists(t, filepath.Join(tempDir, "key-file.yaml")) } func runWebPushCommand(app *cli.App, conf *server.Config, args ...string) error { webPushArgs := []string{ "ntfy", "--log-level=ERROR", "webpush", } return app.Run(append(webPushArgs, args...)) } binwiederhier-ntfy-5ad2431/db/000077500000000000000000000000001517171047500162325ustar00rootroot00000000000000binwiederhier-ntfy-5ad2431/db/db.go000066400000000000000000000071651517171047500171570ustar00rootroot00000000000000package db import ( "context" "database/sql" "sync/atomic" "time" "heckel.io/ntfy/v2/log" ) const ( tag = "db" replicaHealthCheckInitialDelay = 5 * time.Second replicaHealthCheckInterval = 30 * time.Second replicaHealthCheckTimeout = 10 * time.Second ) // DB wraps a primary *sql.DB and optional read replicas. All standard query/exec methods // delegate to the primary. The ReadOnly() method returns a *sql.DB from a healthy replica // (round-robin), falling back to the primary if no replicas are configured or all are unhealthy. type DB struct { primary *Host replicas []*Host counter atomic.Uint64 cancel context.CancelFunc } // New creates a new DB that wraps the given primary and optional replica connections. // If replicas is nil or empty, ReadOnly() simply returns the primary. // Replicas start unhealthy and are checked immediately by a background goroutine. func New(primary *Host, replicas []*Host) *DB { ctx, cancel := context.WithCancel(context.Background()) d := &DB{ primary: primary, replicas: replicas, cancel: cancel, } if len(d.replicas) > 0 { go d.healthCheckLoop(ctx) } return d } // Query delegates to the primary database. func (d *DB) Query(query string, args ...any) (*sql.Rows, error) { return d.primary.DB.Query(query, args...) } // QueryRow delegates to the primary database. func (d *DB) QueryRow(query string, args ...any) *sql.Row { return d.primary.DB.QueryRow(query, args...) } // Exec delegates to the primary database. func (d *DB) Exec(query string, args ...any) (sql.Result, error) { return d.primary.DB.Exec(query, args...) } // Begin delegates to the primary database. func (d *DB) Begin() (*sql.Tx, error) { return d.primary.DB.Begin() } // Ping delegates to the primary database. func (d *DB) Ping() error { return d.primary.DB.Ping() } // Primary returns the underlying primary *sql.DB. This is only intended for // one-time schema setup during store initialization, not for regular queries. func (d *DB) Primary() *sql.DB { return d.primary.DB } // ReadOnly returns a *sql.DB suitable for read-only queries. It round-robins across healthy // replicas. If all replicas are unhealthy or none are configured, the primary is returned. func (d *DB) ReadOnly() *sql.DB { if len(d.replicas) == 0 { return d.primary.DB } n := len(d.replicas) start := int(d.counter.Add(1) - 1) for i := 0; i < n; i++ { r := d.replicas[(start+i)%n] if r.healthy.Load() { return r.DB } } return d.primary.DB } // Close closes the primary database and all replicas, and stops the health-check goroutine. func (d *DB) Close() error { d.cancel() for _, r := range d.replicas { r.DB.Close() } return d.primary.DB.Close() } // healthCheckLoop checks replicas immediately, then periodically on a ticker. func (d *DB) healthCheckLoop(ctx context.Context) { select { case <-ctx.Done(): return case <-time.After(replicaHealthCheckInitialDelay): d.checkReplicas(ctx) } for { select { case <-ctx.Done(): return case <-time.After(replicaHealthCheckInterval): d.checkReplicas(ctx) } } } // checkReplicas pings each replica with a timeout and updates its health status. func (d *DB) checkReplicas(ctx context.Context) { for _, r := range d.replicas { wasHealthy := r.healthy.Load() pingCtx, cancel := context.WithTimeout(ctx, replicaHealthCheckTimeout) err := r.DB.PingContext(pingCtx) cancel() if err != nil { r.healthy.Store(false) log.Tag(tag).Error("Database replica %s is unhealthy: %s", r.Addr, err) } else { r.healthy.Store(true) if !wasHealthy { log.Tag(tag).Info("Database replica %s is healthy", r.Addr) } } } } binwiederhier-ntfy-5ad2431/db/pg/000077500000000000000000000000001517171047500166405ustar00rootroot00000000000000binwiederhier-ntfy-5ad2431/db/pg/pg.go000066400000000000000000000062431517171047500176020ustar00rootroot00000000000000package pg import ( "database/sql" "fmt" "net/url" "strconv" "strings" "time" _ "github.com/jackc/pgx/v5/stdlib" // PostgreSQL driver "heckel.io/ntfy/v2/db" ) // Open opens a PostgreSQL connection pool for a primary database. It pings the database // to verify connectivity before returning. func Open(dsn string) (*db.Host, error) { d, err := open(dsn) if err != nil { return nil, fmt.Errorf("failed to open database: %w", err) } if err := d.DB.Ping(); err != nil { return nil, fmt.Errorf("database ping failed on %v: %w", d.Addr, err) } return d, nil } // OpenReplica opens a PostgreSQL connection pool for a read replica. Unlike Open, it does // not ping the database, since replicas are health-checked in the background by db.DB. func OpenReplica(dsn string) (*db.Host, error) { return open(dsn) } // open opens a PostgreSQL database connection pool from a DSN string. It supports custom // query parameters for pool configuration: pool_max_conns (default 10), pool_max_idle_conns, // pool_conn_max_lifetime, and pool_conn_max_idle_time. These parameters are stripped from // the DSN before passing it to the driver. func open(dsn string) (*db.Host, error) { u, err := url.Parse(dsn) if err != nil { return nil, fmt.Errorf("invalid database URL: %w", err) } switch u.Scheme { case "postgres", "postgresql": // OK default: return nil, fmt.Errorf("invalid database URL scheme %q, must be \"postgres\" or \"postgresql\" (URL: %s)", u.Scheme, censorPassword(u)) } q := u.Query() maxOpenConns, err := extractIntParam(q, "pool_max_conns", 10) if err != nil { return nil, err } maxIdleConns, err := extractIntParam(q, "pool_max_idle_conns", 0) if err != nil { return nil, err } connMaxLifetime, err := extractDurationParam(q, "pool_conn_max_lifetime", 0) if err != nil { return nil, err } connMaxIdleTime, err := extractDurationParam(q, "pool_conn_max_idle_time", 0) if err != nil { return nil, err } u.RawQuery = q.Encode() d, err := sql.Open("pgx", u.String()) if err != nil { return nil, err } d.SetMaxOpenConns(maxOpenConns) if maxIdleConns > 0 { d.SetMaxIdleConns(maxIdleConns) } if connMaxLifetime > 0 { d.SetConnMaxLifetime(connMaxLifetime) } if connMaxIdleTime > 0 { d.SetConnMaxIdleTime(connMaxIdleTime) } return &db.Host{ Addr: u.Host, DB: d, }, nil } func extractIntParam(q url.Values, key string, defaultValue int) (int, error) { s := q.Get(key) if s == "" { return defaultValue, nil } q.Del(key) v, err := strconv.Atoi(s) if err != nil { return 0, fmt.Errorf("invalid %s value %q: %w", key, s, err) } return v, nil } // censorPassword returns a string representation of the URL with the password replaced by "*****". func censorPassword(u *url.URL) string { if password, hasPassword := u.User.Password(); hasPassword { return strings.Replace(u.String(), ":"+password+"@", ":*****@", 1) } return u.String() } func extractDurationParam(q url.Values, key string, defaultValue time.Duration) (time.Duration, error) { s := q.Get(key) if s == "" { return defaultValue, nil } q.Del(key) d, err := time.ParseDuration(s) if err != nil { return 0, fmt.Errorf("invalid %s value %q: %w", key, s, err) } return d, nil } binwiederhier-ntfy-5ad2431/db/pg/pg_test.go000066400000000000000000000023501517171047500206340ustar00rootroot00000000000000package pg import ( "net/url" "testing" "github.com/stretchr/testify/require" ) func TestOpen_InvalidScheme(t *testing.T) { _, err := Open("postgresql+psycopg2://user:pass@localhost/db") require.Error(t, err) require.Contains(t, err.Error(), `invalid database URL scheme "postgresql+psycopg2"`) require.Contains(t, err.Error(), "*****") require.NotContains(t, err.Error(), "pass") } func TestOpen_InvalidURL(t *testing.T) { _, err := Open("not a valid url\x00") require.Error(t, err) require.Contains(t, err.Error(), "invalid database URL") } func TestCensorPassword(t *testing.T) { tests := []struct { name string url string expected string }{ { name: "with password", url: "postgres://user:secret@localhost/db", expected: "postgres://user:*****@localhost/db", }, { name: "without password", url: "postgres://localhost/db", expected: "postgres://localhost/db", }, { name: "user only", url: "postgres://user@localhost/db", expected: "postgres://user@localhost/db", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { u, err := url.Parse(tt.url) require.NoError(t, err) require.Equal(t, tt.expected, censorPassword(u)) }) } } binwiederhier-ntfy-5ad2431/db/test/000077500000000000000000000000001517171047500172115ustar00rootroot00000000000000binwiederhier-ntfy-5ad2431/db/test/test.go000066400000000000000000000033621517171047500205230ustar00rootroot00000000000000package dbtest import ( "fmt" "net/url" "os" "testing" "github.com/stretchr/testify/require" "heckel.io/ntfy/v2/db" "heckel.io/ntfy/v2/db/pg" "heckel.io/ntfy/v2/util" ) const testPoolMaxConns = "2" // CreateTestPostgresSchema creates a temporary PostgreSQL schema and returns the DSN pointing to it. // It registers a cleanup function to drop the schema when the test finishes. // If NTFY_TEST_DATABASE_URL is not set, the test is skipped. func CreateTestPostgresSchema(t *testing.T) string { t.Helper() dsn := os.Getenv("NTFY_TEST_DATABASE_URL") if dsn == "" { t.Skip("NTFY_TEST_DATABASE_URL not set") } schema := fmt.Sprintf("test_%s", util.RandomString(10)) u, err := url.Parse(dsn) require.Nil(t, err) q := u.Query() q.Set("pool_max_conns", testPoolMaxConns) u.RawQuery = q.Encode() dsn = u.String() setupHost, err := pg.Open(dsn) require.Nil(t, err) _, err = setupHost.DB.Exec(fmt.Sprintf("CREATE SCHEMA %s", schema)) require.Nil(t, err) require.Nil(t, setupHost.DB.Close()) q.Set("search_path", schema) u.RawQuery = q.Encode() schemaDSN := u.String() t.Cleanup(func() { cleanHost, err := pg.Open(dsn) if err == nil { cleanHost.DB.Exec(fmt.Sprintf("DROP SCHEMA %s CASCADE", schema)) cleanHost.DB.Close() } }) return schemaDSN } // CreateTestPostgres creates a temporary PostgreSQL schema and returns an open *db.DB connection to it. // It registers cleanup functions to close the DB and drop the schema when the test finishes. // If NTFY_TEST_DATABASE_URL is not set, the test is skipped. func CreateTestPostgres(t *testing.T) *db.DB { t.Helper() schemaDSN := CreateTestPostgresSchema(t) testHost, err := pg.Open(schemaDSN) require.Nil(t, err) d := db.New(testHost, nil) t.Cleanup(func() { d.Close() }) return d } binwiederhier-ntfy-5ad2431/db/types.go000066400000000000000000000011041517171047500177210ustar00rootroot00000000000000package db import ( "database/sql" "sync/atomic" ) // Beginner is an interface for types that can begin a database transaction. // Both *sql.DB and *DB implement this. type Beginner interface { Begin() (*sql.Tx, error) } // Querier is an interface for types that can execute SQL queries. // *sql.DB, *sql.Tx, and *DB all implement this. type Querier interface { Query(query string, args ...any) (*sql.Rows, error) } // Host pairs a *sql.DB with the host:port it was opened against. type Host struct { Addr string // "host:port" DB *sql.DB healthy atomic.Bool } binwiederhier-ntfy-5ad2431/db/util.go000066400000000000000000000016121517171047500175360ustar00rootroot00000000000000package db import "database/sql" // ExecTx executes a function within a database transaction. If the function returns an error, // the transaction is rolled back. Otherwise, the transaction is committed. func ExecTx(db Beginner, f func(tx *sql.Tx) error) error { tx, err := db.Begin() if err != nil { return err } defer tx.Rollback() if err := f(tx); err != nil { return err } return tx.Commit() } // QueryTx executes a function within a database transaction and returns the result. If the function // returns an error, the transaction is rolled back. Otherwise, the transaction is committed. func QueryTx[T any](db Beginner, f func(tx *sql.Tx) (T, error)) (T, error) { tx, err := db.Begin() if err != nil { var zero T return zero, err } defer tx.Rollback() t, err := f(tx) if err != nil { return t, err } if err := tx.Commit(); err != nil { return t, err } return t, nil } binwiederhier-ntfy-5ad2431/docker-compose.yml000066400000000000000000000005701517171047500213040ustar00rootroot00000000000000services: ntfy: image: binwiederhier/ntfy container_name: ntfy command: - serve environment: - TZ=UTC # optional: Change to your desired timezone user: UID:GID # optional: Set custom user/group or uid/gid volumes: - /var/cache/ntfy:/var/cache/ntfy - /etc/ntfy:/etc/ntfy ports: - 80:80 restart: unless-stopped binwiederhier-ntfy-5ad2431/docs/000077500000000000000000000000001517171047500165755ustar00rootroot00000000000000binwiederhier-ntfy-5ad2431/docs/_overrides/000077500000000000000000000000001517171047500207365ustar00rootroot00000000000000binwiederhier-ntfy-5ad2431/docs/_overrides/main.html000066400000000000000000000042411517171047500225510ustar00rootroot00000000000000{% extends "base.html" %} {% block announce %} If you like ntfy, please consider sponsoring me via GitHub Sponsors or Liberapay , or subscribing to ntfy Pro. {% endblock %} binwiederhier-ntfy-5ad2431/docs/config.md000066400000000000000000005037571517171047500204050ustar00rootroot00000000000000# Configuring the ntfy server The ntfy server can be configured in three ways: using a config file (typically at `/etc/ntfy/server.yml`, see [server.yml](https://github.com/binwiederhier/ntfy/blob/main/server/server.yml)), via command line arguments or using environment variables. ## Quick start By default, simply running `ntfy serve` will start the server at port 80. No configuration needed. Batteries included 😀. If everything works as it should, you'll see something like this: ``` $ ntfy serve 2021/11/30 19:59:08 Listening on :80 ``` You can immediately start [publishing messages](publish.md), or subscribe via the [Android app](subscribe/phone.md), [the web UI](subscribe/web.md), or simply via [curl or your favorite HTTP client](subscribe/api.md). To configure the server further, check out the [config options table](#config-options) or simply type `ntfy serve --help` to get a list of [command line options](#command-line-options). ## Example config !!! info Definitely check out the **[server.yml](https://github.com/binwiederhier/ntfy/blob/main/server/server.yml)** file. It contains examples and detailed descriptions of all the settings. You may also want to look at how ntfy.sh is configured in the [ntfy-ansible](https://github.com/binwiederhier/ntfy-ansible) repository. The most basic settings are `base-url` (the external URL of the ntfy server), the HTTP/HTTPS listen address (`listen-http` and `listen-https`), and socket path (`listen-unix`). All the other things are additional features. Here are a few working sample configs using a `/etc/ntfy/server.yml` file: === "server.yml (HTTP-only, with cache + attachments)" ``` yaml base-url: "http://ntfy.example.com" cache-file: "/var/cache/ntfy/cache.db" attachment-cache-dir: "/var/cache/ntfy/attachments" ``` === "server.yml (HTTP+HTTPS, with cache + attachments)" ``` yaml base-url: "http://ntfy.example.com" listen-http: ":80" listen-https: ":443" key-file: "/etc/letsencrypt/live/ntfy.example.com.key" cert-file: "/etc/letsencrypt/live/ntfy.example.com.crt" cache-file: "/var/cache/ntfy/cache.db" attachment-cache-dir: "/var/cache/ntfy/attachments" ``` === "server.yml (behind proxy, with cache + attachments)" ``` yaml base-url: "http://ntfy.example.com" listen-http: ":2586" cache-file: "/var/cache/ntfy/cache.db" attachment-cache-dir: "/var/cache/ntfy/attachments" behind-proxy: true ``` === "server.yml (PostgreSQL, behind proxy)" ``` yaml base-url: "https://ntfy.example.com" listen-http: ":2586" database-url: "postgres://ntfy:mypassword@db.example.com:5432/ntfy?sslmode=require" attachment-cache-dir: "/var/cache/ntfy/attachments" behind-proxy: true auth-default-access: "deny-all" ``` === "server.yml (ntfy.sh config)" ``` yaml # All the things: Behind a proxy, Firebase, cache, attachments, # SMTP publishing & receiving base-url: "https://ntfy.sh" listen-http: "127.0.0.1:2586" firebase-key-file: "/etc/ntfy/firebase.json" cache-file: "/var/cache/ntfy/cache.db" behind-proxy: true attachment-cache-dir: "/var/cache/ntfy/attachments" smtp-sender-addr: "email-smtp.us-east-2.amazonaws.com:587" smtp-sender-user: "AKIDEADBEEFAFFE12345" smtp-sender-pass: "Abd13Kf+sfAk2DzifjafldkThisIsNotARealKeyOMG." smtp-sender-from: "ntfy@ntfy.sh" smtp-server-listen: ":25" smtp-server-domain: "ntfy.sh" smtp-server-addr-prefix: "ntfy-" keepalive-interval: "45s" ``` Alternatively, you can also use command line arguments or environment variables to configure the server. Here's an example using Docker Compose (i.e. `docker-compose.yml`): === "Docker Compose (w/ auth, cache, attachments)" ``` yaml services: ntfy: image: binwiederhier/ntfy restart: unless-stopped environment: NTFY_BASE_URL: http://ntfy.example.com NTFY_CACHE_FILE: /var/lib/ntfy/cache.db NTFY_AUTH_FILE: /var/lib/ntfy/auth.db NTFY_AUTH_DEFAULT_ACCESS: deny-all NTFY_AUTH_USERS: 'phil:$$2a$$10$$YLiO8U21sX1uhZamTLJXHuxgVC0Z/GKISibrKCLohPgtG7yIxSk4C:admin' # Must escape '$' as '$$' NTFY_BEHIND_PROXY: true NTFY_ATTACHMENT_CACHE_DIR: /var/lib/ntfy/attachments NTFY_ENABLE_LOGIN: true volumes: - ./:/var/lib/ntfy ports: - 80:80 command: serve ``` === "Docker Compose (w/ auth, cache, web push, iOS)" ``` yaml services: ntfy: image: binwiederhier/ntfy restart: unless-stopped environment: NTFY_BASE_URL: http://ntfy.example.com NTFY_CACHE_FILE: /var/lib/ntfy/cache.db NTFY_AUTH_FILE: /var/lib/ntfy/auth.db NTFY_AUTH_DEFAULT_ACCESS: deny-all NTFY_BEHIND_PROXY: true NTFY_ATTACHMENT_CACHE_DIR: /var/lib/ntfy/attachments NTFY_ENABLE_LOGIN: true NTFY_UPSTREAM_BASE_URL: https://ntfy.sh NTFY_WEB_PUSH_PUBLIC_KEY: NTFY_WEB_PUSH_PRIVATE_KEY: NTFY_WEB_PUSH_FILE: /var/lib/ntfy/webpush.db NTFY_WEB_PUSH_EMAIL_ADDRESS: volumes: - ./:/var/lib/ntfy ports: - 8093:80 command: serve ``` ## Config generator This generator helps you configure your self-hosted ntfy instance. It's not fully featured, but it is a good starting point. Please refer to the relevant sections in the doc for more details.
    The config generator helps you create a custom config for your self-hosted ntfy instance. Click to open.
    ## Database options ntfy uses a database for storing messages ([message cache](#message-cache)), users and [access control](#access-control), and [web push](#web-push) subscriptions. You can choose between **SQLite** and **PostgreSQL** as the database backend. ### SQLite By default, ntfy uses SQLite with separate database files for each store. This is the simplest setup and requires no external dependencies: * `cache-file`: Database file for the [message cache](#message-cache). * `auth-file`: Database file for authentication and [access control](#access-control). If set, enables auth. * `web-push-file`: Database file for [web push](#web-push) subscriptions. ### PostgreSQL (EXPERIMENTAL) As an alternative, you can configure ntfy to use PostgreSQL for **all** database-backed stores by setting the `database-url` option to a PostgreSQL connection string. When `database-url` is set, ntfy will use PostgreSQL for the [message cache](#message-cache), [access control](#access-control), and [web push](#web-push) subscriptions instead of SQLite. The `cache-file`, `auth-file`, and `web-push-file` options **must not** be set in this case. Note that setting `database-url` implicitly enables authentication and access control (equivalent to setting `auth-file` with SQLite). The default access is `read-write`, so anonymous users can still read and write to all topics. To restrict access, set `auth-default-access` to `deny-all` (see [access control](#access-control)). You can also set this via the environment variable `NTFY_DATABASE_URL` or the command line flag `--database-url`. To offload read-heavy queries from the primary database, you can optionally configure one or more read replicas using the `database-replica-urls` option. When configured, non-critical read-only queries (e.g. fetching messages, checking access permissions, etc) are distributed across the replicas using round-robin, while all writes and correctness-critical reads continue to go to the primary. If a replica becomes unhealthy, ntfy automatically falls back to the primary until the replica recovers. You can also set this via the environment variable `NTFY_DATABASE_REPLICA_URLS` (comma-separated) or the command line flag `--database-replica-urls`. Examples: === "Simple" ```yaml database-url: "postgres://user:pass@host:5432/ntfy" ``` === "With SSL and pool tuning" ```yaml database-url: "postgres://user:pass@host:5432/ntfy?sslmode=require&pool_max_conns=50&pool_conn_max_idle_time=5m" ``` === "With CA certificate" ```yaml database-url: "postgres://user:pass@host:25060/ntfy?sslmode=require&sslrootcert=/etc/ntfy/db-ca-cert.pem&pool_max_conns=30" ``` === "With read replicas" ```yaml database-url: "postgres://user:pass@primary:5432/ntfy?sslmode=require&sslrootcert=/etc/ntfy/db-ca-cert.pem&pool_max_conns=30" database-replica-urls: - "postgres://user:pass@replica1:5432/ntfy?sslmode=require&sslrootcert=/etc/ntfy/db-ca-cert.pem&pool_max_conns=30" - "postgres://user:pass@replica2:5432/ntfy?sslmode=require&sslrootcert=/etc/ntfy/db-ca-cert.pem&pool_max_conns=30" ``` The database URL supports the standard [PostgreSQL connection parameters](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PARAMKEYWORDS) as query parameters, such as `sslmode`, `connect_timeout`, `sslcert`, `sslkey`, `sslrootcert`, and `application_name`. See the [pgx driver documentation](https://pkg.go.dev/github.com/jackc/pgx/v5) for the full list of supported parameters. In addition, ntfy supports the following custom query parameters to tune the connection pool (these apply to both the primary and replica URLs): | Parameter | Default | Description | |---------------------------|---------|----------------------------------------------------------------------------------| | `pool_max_conns` | 10 | Maximum number of open connections to the database | | `pool_max_idle_conns` | - | Maximum number of idle connections in the pool | | `pool_conn_max_lifetime` | - | Maximum amount of time a connection may be reused (Go duration, e.g. `5m`, `1h`) | | `pool_conn_max_idle_time` | - | Maximum amount of time a connection may be idle (Go duration, e.g. `30s`, `5m`) | ## Message cache If desired, ntfy can temporarily keep notifications in an in-memory or an on-disk cache. Caching messages for a short period of time is important to allow [phones](subscribe/phone.md) and other devices with brittle Internet connections to be able to retrieve notifications that they may have missed. By default, ntfy keeps messages **in-memory for 12 hours**, which means that **cached messages do not survive an application restart**. You can override this behavior by setting `cache-file` (SQLite) or `database-url` (PostgreSQL). * `cache-duration`: defines the duration for which messages are stored in the cache (default is `12h`). You can also entirely disable the cache by setting `cache-duration` to `0`. When the cache is disabled, messages are only passed on to the connected subscribers, but never stored on disk or even kept in memory longer than is needed to forward the message to the subscribers. Subscribers can retrieve cached messaging using the [`poll=1` parameter](subscribe/api.md#poll-for-messages), as well as the [`since=` parameter](subscribe/api.md#fetch-cached-messages). ## Attachments If desired, you may allow users to upload and [attach files to notifications](publish.md#attachments). To enable this feature, you have to configure an attachment storage backend and a base URL (`base-url`). Attachments can be stored either on the [local filesystem](#filesystem-storage) or in an [S3-compatible object store](#s3-storage), both using the `attachment-cache-dir` option. Once configured, you can upload attachments via PUT. By default, attachments are stored **for only 3 hours**. The main reason for this is to avoid legal issues and such when hosting user controlled content. Typically, this is more than enough time for the user (or the auto download feature) to download the file. You can increase this time by [purchasing ntfy Pro](https://ntfy.sh/app) via the web app. The following config options are relevant to attachments: * `base-url` is the root URL for the ntfy server; this is needed for the generated attachment URLs * `attachment-cache-dir` is the cache directory for attached files, or an S3 URL for object storage * `attachment-total-size-limit` is the size limit of the attachment storage (default: 5G) * `attachment-file-size-limit` is the per-file attachment size limit (e.g. 300k, 2M, 100M, default: 15M) * `attachment-expiry-duration` is the duration after which uploaded attachments will be deleted (e.g. 3h, 20h, default: 3h) !!! warning ntfy takes full control over the attachment directory or S3 bucket. Files that match the message ID format without entries in the message table will be deleted. **Do not use a directory or S3 bucket that is also used for something else.** Please also refer to the [rate limiting](#rate-limiting) settings below, specifically `visitor-attachment-total-size-limit` and `visitor-attachment-daily-bandwidth-limit`. Setting these conservatively is necessary to avoid abuse. ### Filesystem storage Here's an example config using the local filesystem for attachment storage: === "/etc/ntfy/server.yml (minimal)" ``` yaml base-url: "https://ntfy.example.com" attachment-cache-dir: "/var/cache/ntfy/attachments" ``` === "/etc/ntfy/server.yml (all options)" ``` yaml base-url: "https://ntfy.example.com" attachment-cache-dir: "/var/cache/ntfy/attachments" attachment-total-size-limit: "5G" attachment-file-size-limit: "15M" attachment-expiry-duration: "3h" visitor-attachment-total-size-limit: "100M" visitor-attachment-daily-bandwidth-limit: "500M" ``` ### S3 storage As an alternative to the local filesystem, you can store attachments in an S3-compatible object store (e.g. [AWS S3](https://aws.amazon.com/s3/), [DigitalOcean Spaces](https://www.digitalocean.com/products/spaces)). This is useful for HA/cloud deployments where you don't want to rely on local disk storage. To use an S3-compatible storage for attachments, set `attachment-cache-dir` to an S3 URL with the following format: ``` s3://ACCESS_KEY:SECRET_KEY@BUCKET[/PREFIX]?region=REGION[&endpoint=ENDPOINT][&disable_http2=true] ``` Here are a few examples: === "/etc/ntfy/server.yml (DigitalOcean Spaces)" ``` yaml base-url: "https://ntfy.example.com" attachment-cache-dir: "s3://ACCESS_KEY:SECRET_KEY@my-bucket/attachments?region=nyc3&endpoint=https://nyc3.digitaloceanspaces.com&disable_http2=true" ``` === "/etc/ntfy/server.yml (AWS S3)" ``` yaml base-url: "https://ntfy.example.com" attachment-cache-dir: "s3://ACCESS_KEY:SECRET_KEY@my-bucket/attachments?region=us-east-1" ``` === "/etc/ntfy/server.yml (custom endpoint)" ``` yaml base-url: "https://ntfy.example.com" attachment-cache-dir: "s3://ACCESS_KEY:SECRET_KEY@my-bucket/attachments?region=us-east-1&endpoint=https://s3.example.com" ``` Note that the access key and secret key may have to be URL encoded. For instance, a secret key `YmxhY+mxhYmxhC` (note the `+`) should be encoded as `YmxhY%2BmxhYmxhC` (note the `%2B`), so the URL would be `s3://ACCESS_KEY:YmxhY%2BmxhYmxhC@my-bucket/attachments...`. If you experience upload failures with HTTP/2 stream errors (common with DigitalOcean Spaces and some other S3-compatible providers), add `&disable_http2=true` to force HTTP/1.1 connections. !!! info ntfy.sh is hosted and sponsored by DigitalOcean. I can highly recommend their public cloud offering. It's been rock solid for 4 years. They offer an S3-compatible storage for $5/month and 250 GB of storage, with 1 TiB of bandwidth. Also, if you **use [this referral link](https://m.do.co/c/442b929528db), you can get $200 credit**. For AWS S3, the IAM user needs the following permissions on the bucket: ``` json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:ListBucketMultipartUploads" ], "Resource": "arn:aws:s3:::BUCKET_NAME" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:AbortMultipartUpload" ], "Resource": "arn:aws:s3:::BUCKET_NAME/*" } ] } ``` ## Access control By default, the ntfy server is open for everyone, meaning **everyone can read and write to any topic** (this is how ntfy.sh is configured). To restrict access to your own server, you can optionally configure authentication and authorization. ntfy's auth implements two roles (`user` and `admin`) and per-topic `read` and `write` permissions using an [access control list (ACL)](https://en.wikipedia.org/wiki/Access-control_list). Access control entries can be applied to users as well as the special everyone user (`*`), which represents anonymous API access. To set up auth, **configure the following options**: * `auth-file` is the user/access database (SQLite); it is created automatically if it doesn't already exist; suggested location `/var/lib/ntfy/user.db` (easiest if deb/rpm package is used). Alternatively, if `database-url` is set, auth is automatically enabled using PostgreSQL (see [database options](#database-options)). * `auth-default-access` defines the default/fallback access if no access control entry is found; it can be set to `read-write` (default), `read-only`, `write-only` or `deny-all`. **If you are setting up a private instance, you'll want to set this to `deny-all`** (see [private instance example](#example-private-instance)). Once configured, you can use - the `ntfy user` command and the `auth-users` config option to [add or modify users](#users-and-roles) - the `ntfy access` command and the `auth-access` option to [modify the access control list](#access-control-list-acl) and topic patterns, and - the `ntfy token` command and the `auth-tokens` config option to [manage access tokens](#access-tokens) for users. These commands **directly edit the auth database** (as defined in `auth-file`), so they only work on the server, and only if the user accessing them has the right permissions. ### Users and roles Users can be added to the ntfy user database in two different ways * [Using the CLI](#users-via-the-cli): Using the `ntfy user` command, you can manually add/update/remove users. * [In the config](#users-via-the-config): You can provision users in the `server.yml` file via `auth-users` key. #### Users via the CLI The `ntfy user` command allows you to add/remove/change users in the ntfy user database, as well as change passwords or roles (`user` or `admin`). In practice, you'll often just create one admin user with `ntfy user add --role=admin ...` and be done with all this (see [example below](#example-private-instance)). **Roles:** * Role `user` (default): Users with this role have no special permissions. Manage access using `ntfy access` (see [below](#access-control-list-acl)). * Role `admin`: Users with this role can read/write to all topics. Granular access control is not necessary. **Example commands** (type `ntfy user --help` or `ntfy user COMMAND --help` for more details): ``` ntfy user list # Shows list of users (alias: 'ntfy access') ntfy user add phil # Add regular user phil ntfy user add --role=admin phil # Add admin user phil ntfy user del phil # Delete user phil ntfy user change-pass phil # Change password for user phil ntfy user change-role phil admin # Make user phil an admin ntfy user change-tier phil pro # Change phil's tier to "pro" ntfy user hash # Generate password hash, use with auth-users config option ``` #### Users via the config As an alternative to manually creating users via the `ntfy user` CLI command, you can provision users declaratively in the `server.yml` file by adding them to the `auth-users` array. This is useful for general admins, or if you'd like to deploy your ntfy server via Docker/Ansible without manually editing the database. The `auth-users` option is a list of users that are automatically created/updated when the server starts. Users previously defined in the config but later removed will be deleted. Each entry is defined in the format `::`. Here's an example with two users: `phil` is an admin, `ben` is a regular user. === "Declarative users in /etc/ntfy/server.yml" ``` yaml auth-file: "/var/lib/ntfy/user.db" auth-users: - "phil:$2a$10$YLiO8U21sX1uhZamTLJXHuxgVC0Z/GKISibrKCLohPgtG7yIxSk4C:admin" - "ben:$2a$10$NKbrNb7HPMjtQXWJ0f1pouw03LDLT/WzlO9VAv44x84bRCkh19h6m:user" ``` === "Declarative users via env variables" ``` # Comma-separated list, use single quotes to avoid issues with the bcrypt hash NTFY_AUTH_FILE='/var/lib/ntfy/user.db' NTFY_AUTH_USERS='phil:$2a$10$YLiO8U21sX1uhZamTLJXHuxgVC0Z/GKISibrKCLohPgtG7yIxSk4C:admin,ben:$2a$10$NKbrNb7HPMjtQXWJ0f1pouw03LDLT/WzlO9VAv44x84bRCkh19h6m:user' ``` The password hash can be created using `ntfy user hash` or an [online bcrypt generator](https://bcrypt-generator.com/) (though note that you're putting your password in an untrusted website). !!! important Users added declaratively via the config file are marked in the database as "provisioned users". Removing users from the config file will **delete them from the database** the next time ntfy is restarted. Also, users that were originally manually created will be "upgraded" to be provisioned users if they are added to the config. Adding a user manually, then adding it to the config, and then removing it from the config will hence lead to the **deletion of that user**. ### Access control list (ACL) The access control list (ACL) **manages access to topics for non-admin users, and for anonymous access (`everyone`/`*`)**. Each entry represents the access permissions for a user to a specific topic or topic pattern. Entries can be created in two different ways: * [Using the CLI](#acl-entries-via-the-cli): Using the `ntfy access` command, you can manually edit the access control list. * [In the config](#acl-entries-via-the-config): You can provision ACL entries in the `server.yml` file via `auth-access` key. #### ACL entries via the CLI The ACL can be displayed or modified with the `ntfy access` command: ``` ntfy access # Shows access control list (alias: 'ntfy user list') ntfy access USERNAME # Shows access control entries for USERNAME ntfy access USERNAME TOPIC PERMISSION # Allow/deny access for USERNAME to TOPIC ``` A `USERNAME` is an existing user, as created with `ntfy user add` (see [users and roles](#users-and-roles)), or the anonymous user `everyone` or `*`, which represents clients that access the API without username/password. A `TOPIC` is either a specific topic name (e.g. `mytopic`, or `phil_alerts`), or a wildcard pattern that matches any number of topics (e.g. `alerts_*` or `ben-*`). Only the wildcard character `*` is supported. It stands for zero to any number of characters. A `PERMISSION` is any of the following supported permissions: * `read-write` (alias: `rw`): Allows [publishing messages](publish.md) to the given topic, as well as [subscribing](subscribe/api.md) and reading messages * `read-only` (aliases: `read`, `ro`): Allows only subscribing and reading messages, but not publishing to the topic * `write-only` (aliases: `write`, `wo`): Allows only publishing to the topic, but not subscribing to it * `deny` (alias: `none`): Allows neither publishing nor subscribing to a topic **Example commands** (type `ntfy access --help` for more details): ``` ntfy access # Shows entire access control list ntfy access phil # Shows access for user phil ntfy access phil mytopic rw # Allow read-write access to mytopic for user phil ntfy access everyone mytopic rw # Allow anonymous read-write access to mytopic ntfy access everyone "up*" write # Allow anonymous write-only access to topics "up..." ntfy access --reset # Reset entire access control list ntfy access --reset phil # Reset all access for user phil ntfy access --reset phil mytopic # Reset access for user phil and topic mytopic ``` **Example ACL:** ``` $ ntfy access user phil (admin) - read-write access to all topics (admin role) user ben (user) - read-write access to topic garagedoor - read-write access to topic alerts* - read-only access to topic furnace user * (anonymous) - read-only access to topic announcements - read-only access to topic server-stats - no access to any (other) topics (server config) ``` In this example, `phil` has the role `admin`, so he has read-write access to all topics (no ACL entries are necessary). User `ben` has three topic-specific entries. He can read, but not write to topic `furnace`, and has read-write access to topic `garagedoor` and all topics starting with the word `alerts` (wildcards). Clients that are not authenticated (called `*`/`everyone`) only have read access to the `announcements` and `server-stats` topics. #### ACL entries via the config As an alternative to manually creating ACL entries via the `ntfy access` CLI command, you can provision access control entries declaratively in the `server.yml` file by adding them to the `auth-access` array, similar to the `auth-users` option (see [users via the config](#users-via-the-config). The `auth-access` option is a list of access control entries that are automatically created/updated when the server starts. When entries are removed, they are deleted from the database. Each entry is defined in the format `::`. The `` can be any existing, provisioned user as defined in the `auth-users` section (see [users via the config](#users-via-the-config)), or `everyone`/`*` for anonymous access. The `` can be a specific topic name or a pattern with wildcards (`*`). The `` can be one of the following: * `read-write` or `rw`: Allows both publishing to and subscribing to the topic * `read-only`, `read`, or `ro`: Allows only subscribing to the topic * `write-only`, `write`, or `wo`: Allows only publishing to the topic * `deny-all`, `deny`, or `none`: Denies all access to the topic Here's an example with several ACL entries: === "Declarative ACL entries in /etc/ntfy/server.yml" ``` yaml auth-file: "/var/lib/ntfy/user.db" auth-users: - "phil:$2a$10$YLiO8U21sX1uhZamTLJXHuxgVC0Z/GKISibrKCLohPgtG7yIxSk4C:user" - "ben:$2a$10$NKbrNb7HPMjtQXWJ0f1pouw03LDLT/WzlO9VAv44x84bRCkh19h6m:user" auth-access: - "phil:mytopic:rw" - "ben:alerts-*:rw" - "ben:system-logs:ro" - "*:announcements:ro" # or: "everyone:announcements,ro" ``` === "Declarative ACL entries via env variables" ``` # Comma-separated list NTFY_AUTH_FILE='/var/lib/ntfy/user.db' NTFY_AUTH_USERS='phil:$2a$10$YLiO8U21sX1uhZamTLJXHuxgVC0Z/GKISibrKCLohPgtG7yIxSk4C:user,ben:$2a$10$NKbrNb7HPMjtQXWJ0f1pouw03LDLT/WzlO9VAv44x84bRCkh19h6m:user' NTFY_AUTH_ACCESS='phil:mytopic:rw,ben:alerts-*:rw,ben:system-logs:ro,*:announcements:ro' ``` In this example, the `auth-users` section defines two users, `phil` and `ben`. The `auth-access` section defines access control entries for these users. `phil` has read-write access to the topic `mytopic`, while `ben` has read-write access to all topics starting with `alerts-` and read-only access to the topic `system-logs`. The last entry allows anonymous users (i.e. clients that do not authenticate) to read the `announcements` topic. ### Access tokens In addition to username/password auth, ntfy also provides authentication via access tokens. Access tokens are useful to avoid having to configure your password across multiple publishing/subscribing applications. For instance, you may want to use a dedicated token to publish from your backup host, and one from your home automation system. !!! info As of today, access tokens grant users **full access to the user account**. Aside from changing the password, and deleting the account, every action can be performed with a token. Granular access tokens are on the roadmap, but not yet implemented. You can create access tokens in two different ways: * [Using the CLI](#tokens-via-the-cli): Using the `ntfy token` command, you can manually add/update/remove tokens. * [In the config](#tokens-via-the-config): You can provision access tokens in the `server.yml` file via `auth-tokens` key. #### Tokens via the CLI The `ntfy token` command can be used to manage access tokens for users. Tokens can have labels, and they can expire automatically (or never expire). Each user can have up to 60 tokens (hardcoded). **Example commands** (type `ntfy token --help` or `ntfy token COMMAND --help` for more details): ``` ntfy token list # Shows list of tokens for all users ntfy token list phil # Shows list of tokens for user phil ntfy token add phil # Create token for user phil which never expires ntfy token add --expires=2d phil # Create token for user phil which expires in 2 days ntfy token remove phil tk_th2sxr... # Delete token ntfy token generate # Generate random token, can be used in auth-tokens config option ``` **Creating an access token:** ``` $ ntfy token add --expires=30d --label="backups" phil $ ntfy token list user phil - tk_7eevizlsiwf9yi4uxsrs83r4352o0 (backups), expires 15 Mar 23 14:33 EDT, accessed from 0.0.0.0 at 13 Feb 23 13:33 EST ``` Once an access token is created, you can **use it to authenticate against the ntfy server, e.g. when you publish or subscribe to topics**. To learn how, check out [authenticate via access tokens](publish.md#access-tokens). #### Tokens via the config Access tokens can be pre-provisioned in the `server.yml` configuration file using the `auth-tokens` config option. This is useful for automated setups, Docker environments, or when you want to define tokens declaratively. The `auth-tokens` option is a list of access tokens that are automatically created/updated when the server starts. When entries are removed, they are deleted from the database. Each entry is defined in the format `:[: