Files
BallCrushBest_GP/Assets/ExternalDependencyManager/Editor/1.2.177/Google.JarResolver.dll
T

7140 lines
350 KiB
Plaintext
Raw Normal View History

MZ˙˙¸@ş´ Í!¸LÍ!This program cannot be run in DOS mode.
$PELŻąÚdŕ! nŽŚ  @ ŕ@…K @Ŕ  H.text”l n `.rsrc@ p@@.reloc Ŕt@BHŔŽ«q^(
( s
}*N(
s
}*0n(
(
9( s
}8Gs
}Ť&%,ťo
 8š
{o
o
&X Ži?Ý˙˙˙*0#{s
o
rKpo
(
*2{s
*0"u
9{{o
+*2{o
*.(o*.(o
Ť!%rOp˘%rp˘%p˘%p˘%p˘%r_p˘%rip˘*Frwp(
(!
*6("
( *0(
o o (
oo@wj o
82(
(
o#
9(
( `(
:Â˙˙˙Ýţo
Ü($
o%
8so@] o
o&
o'
:*o'
>
rp8 s
((
o)
( ($
o%
8
rp(*
*:H02(
o o (
s
o@oo+
(  o
8/(
(
( _j;(
o
&(
:Ĺ˙˙˙Ýţo
Ü8xo@lo+
(,
 o

80
(
  (
(-
9 (
o

(
:Ä˙˙˙Ý
ţo
Üo'
:
s8s*DE‰ŔF2s(
*.(o.
*0ş(
Đ(
rpo
(r)prAp(
((((s
s
rpr™po
prąpo
prÍpo
prăpo
(
8:(
((
( &(
(
o
Ý(
:ş˙˙˙Ýţo
Ü(*Đ(
po
(r)pr p(
((9@(95(s
rpr™po
prĹpo
(*(s
rp~
o
p~
o
(*˛Ą"}*{*"}*{*"}*{*"}*{*07Đ(
(
~:
sÝ(
Ü~***(
*"}
*{
*0Ž~ o/
8](0
o1
o2
9Bo3
o4
o3
o5
Xo6
 o7
r<pr@po8
(9
(:
:—˙˙˙Ýţ o
Ü* s~Fr@pr<po8
*0 (r<prDpo8
( 
~ o
8>(
(
o;
9$(
(
o<
o6
(=
Ý (
:¶˙˙˙Ýţo
Ü(*(T|0 (
~ o
8>(
(
o;
9$(
(
o<
o6
(=
Ý (
:¶˙˙˙Ýţo
ÜrDpr<po8
*TfšrHprLpo8
rLprDpo8
(*0$
(rDp~>
ţ&o.
o8
*"}*{*J(& @Bj(+*^rPp((&(?
*2(o
*0" u
9o((-
+*0Š (
9j*Ť&%.ťo
j j (@
8Cš
j (A
Ý&rdp(
(jÝZX Z XŽi?˛˙˙˙**A
N20
sB
oC
8GoD
poo&(
:po&(
8~
(?
oE
oF
:®˙˙˙Ý
9o
Ürđpo
(
*
\i
0ůs
prpo
 sG
rpsH
oI
rDpsH
oI
rTpsH
oI
psH
oI
psH
oI
rpsH
oI
psH
oI
psH
oI
psH
oI
rpsH
oI
r*psH
oI
rHpsH
oI
rdpsH
oI
 *(*"}*{*"}*{*0őp(J
(J
 (K
Ý r˛po.
(?
(
Ý´s.o#(Z8šo
 po;
98Wpo;
9p(<
o6
o%8) rpo;
9 rp(<
o6
o/XŽi?r˙˙˙* * 6JsZ
}(
*F{oL
s
*0*
{oM
:sN
{oO
*0šsP
(6oQ
8(R
o'oS
(T
:ß˙˙˙Ýţo
ÜoU
:*
oV
oW
8 (X

(Y
:č˙˙˙Ýţo
Ü *+>h0O(6oQ
8(R
o29 Ý!(T
:Ú˙˙˙Ýţo
Ü**
0=~
}9(
9(*0*{:
 |:(
t(+
@Ţ˙˙˙*0*{:
 |:(
t(+
@Ţ˙˙˙*0*{;
 |;(
t(+
@Ţ˙˙˙*0*{;
 |;(
t(+
@Ţ˙˙˙*0${9
9 s­
8
*0D{9
8
o˛

:ć˙˙˙Ýţ#o
Ü*$50ňsB
  
o´
84
{+oE
{,ŽiX {* {-`

:Ŕ˙˙˙Ýţ$o
Ü~
o
(
ŤUo´

81
  {, {,Ži(·
 {,ŽiX
:Ă˙˙˙Ý
ţ$o
Ü sd*J^0Ń{;9{;og
{,9‡{+rQprđpo8
rWprđpo8
}+{*(‡ o¸
 8*

 o´

{-9
X%ţ+ o¸
{+o<
 :){+poo
  <Ý 
& (‰
o˛
:N
%{+{+ Xo4
(=
}+ {*{+ Xo6
{,sdo¸
 {:9{:
og

: ˙˙˙Ýţ$o
Ü 9Đţ˙˙{9{*
:{:9{:(eog*˙…˘(‚}}ţ<sf(*0Şo\
9*{,9{+{o]
:!(‡(‰{+{o]
9[((^
{(_
(=
o`
 8
oa
ob
X Ži?ă˙˙˙oa
oc
Ý*T?(
*0˝sB
}K~rprXpod
r p(}Jp(?
({Jr&p}{J}{J{J{}={Jţ}{J}?{JţCs`2o—{Jo*0śsD
}L}M}N}O}P}Q}R~rvprĽpod
rp{N{O(?
({N{O{Qs;{PţEse
(A*0Ó{(ţ
99
rVp8rp p9
p8(,{)(f
98(Ť%Źr< psg
(h
ţAo.
si
 9~rT ppoj
8~r
pr`
poj
*0RsH
}T}U}V}W}X{V9
p8r p r^ p(}S{S}{S}{S p{T{U(?
}{S{S{}={Sţ}{S}? 9
ţŠsf r˛ p{T{U(?
({S{T
{UţIs`{V9
ú8 ô o—{So*0ŻsJ
}Zr^ p(}Y{Y p}{Y}{Y}{Yr> p}{YrJ p}{Y}{Y}?{Y{YţK}
{Yo*(
*0f{Jo“{(:~rZ pr¬ pod
8*~r
prX
pod
p{)(
({Kok
*(
*0Ä{(9
{Lol
*sB
 {&(Z
83 š :{Mo1
o2
+ 9oE
X Ži?Ă˙˙˙om
:&{N{O{P(@{Lol
*rđpo
(
ţFsn
(B*0I:
{Lol
*{N{O{Q{Rs;{PţGse
(A*V{L{(ţol
*(
{So“{T{U{V{W(@{Xok
*(
{Yo“{:
{Zol
*{Zol
*V(
}}*0J{ r*p s
r<pr\po
 (X
{&r`poo
?**0$ s4
 (Z
8 š rvpo;
9 ~o1
o2
9:s.op
oq
o7
o! oo6or
:8~o1
o2
9op
oq
o7
o/8K~o1
o2
92{op
oq
o7
(J
p(J
(s
o1X Ži?őţ˙˙*01!sL
}[}\{r~pţMse
(>*0"sB
ot
8(u
o"oE
(v
:ŕ˙˙˙Ýţo
Ü{prKpo
(
(
prprprpsH
(?*
*7şr(psH
r`psH
r€psH
*(
{[{(:{\{&(E8ow
*0H#(
}!(x
(x
(x
~>
Ś&(y
o<
o6
(3}"*{"*0$s4
  
(Zšo
oz
r¸p(-
9 8Vp(-
 rp(-

 :
9
  8"rvpo;
98 (
9? 92 o(
:" o&(
: oo6 or

:r.po;
  :& :s.  o o1
8{ 9ur8poo


?_
o4
o
oz

Xo6
o
r<p(-
9
o/8rTp(-
9 o%XŽi?hţ˙˙*0f%s4
  
(Z8=šo
oz
r¸p(-
9 8p(-
 rp(-

 :
9   
: :rdpo;
9
Ť&%|ťo
  Ži? (
9 8v ŽiŤ! 
8 
 
šo
˘
X

 Ži?ŕ˙˙˙ šo6s.o šo/ šo%o1or
XŽi?¸ţ˙˙*0y&sN
}]}_(J9(Jo'~ ţţ+}^{!rnp{^9
r|p8~
(=
ţOse
(>*0 ^'sP
}`}a}b{a(, rprĚp(
r—prźp"ČCţQs{
(|
*ZrĄp @Bj(+*(
*0O{]{(:7{^9{_{&(K8{_{&(L8ow
*(
*0®":p({`ol
*sB
{aot
8(u
ooE
(v
:ŕ˙˙˙Ýţo
Ü{b{!r'po
(
{ar+prIprMprQpsH
{`(?*0*Z(
*0%((
9ruprp(?
(sB
(\oE

(}
@Ť!%rp˘%rp˘o~
Ť!%r)p˘%r)pr5p(J
˘
8k š o
84(€
(=
(J
(J
(s
9 ÝS(
:Ŕ˙˙˙Ýţo
ÜX Ži?‹˙˙˙(]  9 (s
9 8**Šr=präprúp(?
(o
*0Ř)sR
}cp(Q 9xsS }fsI}e{eoJ}d{d9C{do'~ <{eţTs
oM8{c{eo
*rúp(Q
9# sCoD:{co
*{c(R*(
*(
*0c{doo7}d{d90{eŤ%{d˘s„
ţUsn
oN8{f{c(R{f{c9 {e8o
*00*
rŠŢpsH
oz
&}1p}2(
*0T+{1
8 
o1
o2
9 Ý!
:Ô˙˙˙ÝţQo
Ü** 6BĘrşÝpţs(
Ť!%rěÝp˘%rúÝp˘()
s
*
*0c,
(o
8/(€
o:r Ţp{2(?
o…

(
:Ĺ˙˙˙Ýţo
Ü*ESJ(r
p}2*0-sV
}m}n}o}g}h}i}j}k}l{mr4p{n(
o…
{n{mţWs†
(‡
:**0r.~Er„p|#o
9{#o68@r„p
( r´p ~$-ţs>€$~$
 (0}#(*(
*0
Y/p(-
9~
(-
9*p(-
9$p(-
:~
(-
9*rp(-
9lp(-
9[sB
}g}h}i}j}ksB
}lr,po‰
%:&~
Ť&%:ťo
Ži;3Ži;*{mr6p{n
ŚA(f
o…
*š}hš}iš}jŽi@ š}k*{h(
:y{i(
:i{j(
:Y{o{#{h{i{j{k{go
{lo
p{n
ŚA(?
o48„p(-
9rp(-
9*p(-
9Ap(-
909(o
9
@{g
oE
*r!p(-
9rp(-
9*r!p(-
p(-
9{9sB
}l8c{lo
83(€
~?p{n
ŚA(?
si
(
:Á˙˙˙Ýţo
Ü*r;p(-
9Ar!p(-
909(o
9
@{l
oE
**­0n0sX
}p}q}r}s}t}uţY
(
9 (
8ţ
s“
s”
o•
*>(Y*0\1sZ
}w
(^

;
(^
;
(^
Ý=~%:,r[pŤ%˘% ˘%(^
˘%˘(Á
(*
 Ý(}
@rDpo]
9 8(rHpo;
:rDpo;
:


 ~
 (}
@rLpr\p rHp
8jrfprpp rDp
rDpr€po8
 (}
:993poÄ
9#9r”prŠppo)
(?
 pŤ% ˘% ˘% ˘%˘%˘%˘%
˘(Á

}x{x

{x

98{x

{x

{x

8{x

{x

{x

9Xo
8,(

{x

(

(
(
:Č˙˙˙Ýţo
Ü{x
:{wţţ+
{x

{x
%:&(Đ
{x
&{w9!{w{x{x
(eogŤ %sB
˘%sB
˘}v9M{x
96{vš(K
oE
{vš(K
oE


s[}zs™
}yŤ%{x
o×
˘%{x
o×
˘(pţ\srţ]s~sv&8šonXŽi?á˙˙˙{x
{y
&s_~
{všo
(
}&~
{všo
(
}'{x
}({&{'{(([})
;
;
Ý&~%:p (f
(*
 Ý9€%*(?[=6''&62rp(Ú
*0DrpŤ%:
p8r)p˘%˘%˘%˘%˘%ŚA˘(Á
*n(}
@
rEp8~
*02(}
@
rOp8r[p

(X {(:{&(Zš ÝNÝG
Ť!%rDp˘%˘%rgp˘%˘%p˘% o.
˘%p˘(Ű
Ý**2MG6*(
~
}+(
}*}+},}-*:~
sd(
s™
}/}0}1ŤU}2*0*3{.
 |.(
t(+
@Ţ˙˙˙*0*3{.
 |.(
t(+
@Ţ˙˙˙*{0*ţ{3:ţos“
s”
(•
*0G84{1{2{2Žiţq
o
&{/
&ţ{39ż˙˙˙*0,4ŽiŤ
 8šsj˘X Ži?ć˙˙˙*0~5{1
ţ{3:Wţţ}3{.9@ŤU {2Ži(ž
{.{0(^

ţ{3sdos{/o 
&*06(
s™
}4
}5
}6  8,š
ţ|srok{6om
&X Ži?Ë˙˙˙(y9(wţ}s“
s”
(•
*0*7{7
 |7(
t(+
@Ţ˙˙˙*0*7{7
 |7(
t(+
@Ţ˙˙˙*0*3{8
 |8(
t(+
@Ţ˙˙˙*0*3{8
 |8(
t(+
@Ţ˙˙˙*01{6
(
{6
Ý(
Ü{4o 
&*
f{5
{4o 
&*0­88€{4
&8^{5
t
{-9+{6 (
{6{*
(
Ü{89 {8os{5
=‘˙˙˙{6
=o˙˙˙{79 {7o*?V(
*0I9s^
}|{p{q{r{s{t(X}{ţ_
(
*(
*^{|{u{{oa*(
*(
*0Z{z{v{*š{+oE
{z{w9,{z{w{z{x{z{x
og*6{yo 
&*0A}~
}}~
}~
}~
}(V
*0 :Đ4(
(X
t4
o×*0´;~
}~
}~
}~
}}}""s5
}"C"HCs5
(6
(7
[k(8
[k(9
{:
"@Z(9
{;
"@Zs<
(=
}*0'<
ţ±
(
*0\=(
:Q
(Y
'j[
{Y !j?*}ţ{9|"};
(Z
*0>Ťb
&{(
:!{9{
Ťb
{Ťb(F
}
sB
8b{o<
Y ([
{pX
?
YX8
{ o4
Ť&o\
oE
 X
{o<
?Ť˙˙˙o
8G(€
(]
s^
(_
(`
oa
(]
Ťb%(b
˘(c
(
:­˙˙˙Ýţo
Ü(T
 Ťb(d
&{~
(>
9{Ťb(K
{~
(>
9{Ťb(K
 (e
: 9?}9 }8 9}{
9 {
*Ü]9J{9(f
{:}{
9 {
*{*0Q(
}ţěsg
~ -ţí
~ *{*"}*{*"}*{*"}*{*"}*0j?; ;8$r`Îp
8rpÎp
8 ~
8o
9{p(9
*&*
*(
%{(=
}*J
}?*"}@*{@*0*@{A
 |A(
t(+
@Ţ˙˙˙*0*@{A
 |A(
t(+
@Ţ˙˙˙*03A(
9
s8Đ(

t
o×*"(*J(
:
*F(
:
*0Q(×"ţ}<~
}=~
}>}Aţ}{ţš
*z}=ţ}<}>*0ľB}{=(
: }Ťb
&{=
Ťb
Ťb
ţ{<"€?(ć
~
Ťb
{>(
9rp"ČBZiŚA(
8{>
*0ÁCs`
}~{?s}}{}}B{}ţ˘{}{}o…ţas` {}{?r!p(?
o…
{}ţ s`{}ţŠsf(W*b{A9 {A***ţ*0H(
}C}Bţ}Dţźsf(}F}G*0*D{G
 |G(
t(+
@Ţ˙˙˙*0*D{G
 |G(
t(+
@Ţ˙˙˙*nŤ&%
ť%
ťo
ŽiY*0Eo\
: {,:*{*:{D{+}D(^
{,
{C
(Z 
8 š {Fo…
X
Ži?â˙˙˙*˛{Fp{)(
o…
ţ}E{G9{Gţ{Eoa}G*0F{C
sB
8{C
t!oE
{C
=Ů˙˙˙{~
o
(
(=
rWpoÝ
?o4
p(-
98>~
p
? Xo4
Xo6
(=
8“˙˙˙}{B>ţ{Dk{Bk[ţ}<ţ{E9~
}=*(
{~{~{}ţ˘*0¸G


8
(
(
(
9
~H
:
o­9~H
8
oF
:v˙˙˙Ý
9 o
Ü*”©
.sü
€H*(
}I}J}K}L*{K*{L{L(s
9|J{L
ţ+*0ŇH{I{K
:$rWp{I
(?
o…
*
ÔŤU 
ioń
&
(x
&
ÝC pŤ%˘%{I
˘%˘%˘(Á
o…

Ý* *d'C?(
*0EsB
QsB
QsB
Q
Ť!%rQp˘%

 š r'po;
: rKpo;
:rqpo;
9
8o
(
9
8y(
:nr'p(-
9Po
(J
oE
8ArKp(-
9Po
oE
8rqp(-
9Po
oE
X
Ži?(˙˙˙*0fom
>?~r™p(Ipoj
prđpo
(
(
(8~r™p(Ipoj
o
r~ p(-
9o'p(=
8o(*0~Is

8Mo

o(Zš o
9r p(9
8 o
oF
:¨˙˙˙Ý
9o
Ü*
bo
0J:(
Ť&%
ťo
šr po;
9*Ť!%p˘%p˘%  8š
o;
9*X Ži?Ü˙˙˙(
:‰
~
~
(
9~
o<
Xo6
80(
9%(
(
:o<
Xo6
(
9l(
(
:W~
Ś& ( 
(
9 8. (

(
:~
Ś&( 
(
9`~
~
Ś& ( 
  (
9  84~
(

(
:~
~
Ś&( 
(
:$9p(f
(8rO!p(?
(*0ĄKsb
s 
}ţcs 
~?o

8((
(
(
(
o
(
:Ě˙˙˙Ýţ,o
Ü
8o
o%Ži(
oF
:Ů˙˙˙Ý9o
Ü8y
 8F o
o%

Ži?Ý$o(Zš 
š  o
 oF
:®˙˙˙Ý 9 o
ÜX?~˙˙˙s
 {o

83 
o
t!r p
o
t o
(
si

oF
:Á˙˙˙ *()>gĐ\,0»Lsd
}‚}„}…}‡(5}†{†o
s
}‰~r™!p(Irą!poj
( o×r×!p(J
9gĐ(
o
Ť%Źsi
%ŹrE"po×rź"p(J
si
:V~rż"pr#pod
rU#pĐ(
o
(f
({„{‰o
*sB
{†o
(´o

8(
(
oE
(
:ß˙˙˙Ýţ,o
Ü}rµ#p(}{}€{€o
ţe
}ţf
}ţgs`{†o
(˛o
s
((
9ró#ps
r˙#po
r$p{…
o
r/$prDpo
(
o
rG$prDpo
(
o
ri$p(É9
r\p8r$po
r‡$po
{r±$p}{}{{{}={ţ}{}?{‰o

Z2X}Ťţhs
9{o8{„{‰o
*+­0SMsn
}~N-ţĂs
€N~N}sB
s
s
}(Eo
8Ho 
{ o!
 o
rő$po;
:r%po;
9 oE
oF
:¬˙˙˙Ý9o
Ü{o"
o#
s$
~3s
r_%po%
&sB
o&
sr


 ('
}™ro%p
{™(

ţss(
()
 
8w 
š 
oz
r‰%p(-
9 oE
8A{ o!
o*
98sB
 oE
o+

X

 Ži?~˙˙˙ (,
:'˙˙˙Ý ţ5o
Üom
>Wom
>Jr»%pr‰%prđpo
(
po
(
(f
(~rú(prx)pod
s$
}o
8b(
(
o*
9D{(
o*
98sB
o~
{(
o+
(
:’˙˙˙Ýţo
Üţos
}•sB
}“ţp
}—{o-
}”}ţq
}{o
*(Săäh05Nst
}›ţu
(
*0ŢOsw
(} { (
:{ (
:P~râ)pr4*pod
rŠ*p{ (
9
rK,p8{ (
(o
*ţx
ţys.
{ ţ*0;Ps{
ţ|s/
(S*0HE
~3 
8) š o0
9o<
o<
Yo4
* X
Ži?Î˙˙˙*J(°(J
*0şQs}
(Es
s1
o2
: o
*~rY,pŤ%Źr< pţAo.
si
r,poj
sB
}­ţ~
(3
*0/R(4
Ť&%.ťo
š
(5
: ţţ*0«S(¸:*(˝:*rË,p(J
(s
9(K
ró,poo
?*r-p(J
(s
:* 9(6
" üDD*9%o
(oo7
o'
>**0˘T
r--poz
r]-po0
9
~
8rg-p(f
(X {(9@rk-pŤ%˘%{(ŚA˘%{&˘%{'˘(Á
(8
 ÝÝ
(8
z**•• 60Us
~M 
8c š (
o
8*o 
(J
(J
(
9 o
&oF
:Ę˙˙˙Ý9o
Ü X
Ži?”˙˙˙o'
> s8*#@c0ŹVrĂ-p(
(oz
rá-po0
:*(9
(x
(J
d(:
:rë-p(
(*(J
r[.p(
(;
(<
(
:(Ýń
& (O:ÝÔ9
ţ+::ݢ rË,p(J
(s
( rÇ.p(J
  
& r-p(J

 
(J
  (s
9

(s
9
 (=
8+rŃ.p(J
 
&  :Ýđ rő.p(J

%:&

(
9U
(>
9?
(?
rý.p(

(;
(<
(
:(Ýu(oos
o7
~O-ţÄs@
€O~OrU/pŤ%oA
˘%oA
˘%˘%oA
˘(Á
(o&
8H('
o%
&rĎ/p(
(J
(;
(<
(
:((,
:¬˙˙˙Ýţ5o
Ü r0p(J
(s
:%Ť!%rA0p˘%re0p˘%r‡0p˘(B
r±0p(?
(r 1p(?

(;
(<
(
:(Ýă (C
Ť!%˘(C8trŽ1p (?
(rĽ1p(

(;
(<
(
:(Ýw:ÝcŤ!%˘(CÝHrú1p(?
(Ý.r82p(
(;
(<
(
:(Ü**AL«^ ^äB6^ţ\.rŤ!%rÇ.p˘%rő.p˘€M*0)R
r<poÝ
?
o4
8*Zr ps
(
(
s_}PsB
}QsB
}Rs
}SsB
}T(
*(
*0aW(
:U{oD
9*{oE
t 
oF
:oE
8{sB
oE
oG
*(
*0{€oH
{{P{(:0oI
? {€:{€9 {9 {o“{„{{So
*0<Xs
{{Qs
(Eo
8 o 

o#
:o
& oF
:Ő˙˙˙Ý
9 o
Üo'
>rŞ2prđps
(
(
(
(sB
o&
8('
(;
o~
(,
:Ü˙˙˙Ýţ5o
Ürě2p(<
(
:({…{{Qs
ţisJ
ţj
*"5W
¤0{}P{(9G~r.3pr#pod
{{‰}Srh3p{)(
({o
*{&{…{|Q{|R{|T{{Tom
>*rĽ3prđp{{To
(
(
({{QţksK
ţlsJ
(C*0:Y{
 ţms` o×
 o—*N{r}4po•*0#Z{s
}S{{Ro
(€
{†oL
:…Ť&%:ťo
s
om
<r­4p(
(Ý] om
? o(
rš5p(-
9 r~ poE
o(
o(
o(
s {{SoM
(
:C˙˙˙Ýţo
Ü{‡9{{R{o
*!Çč0n[{{Q(J9Ms
~rž5prŕ5pod
r$6pţsn
(M8 {o
*N{rt6po•*0'\s
ţ
(
*(
*0Ý9~r 6prě6pod
;Xr,7p((F{…{‡{‚{„*{o
8E~rĎ7pr8pod
(F{{‰}S{o
**(
*^{˛oa*(
*0&?
(9
{o!
o<
Xo6
*0]{oN
>n~ri8pŤ%Źrż8pţAo.
si
%ŹrŃ8p{“om
Y ţAo.
si
rç8poj
*0 Í^
s |”(O
:
8>|”(P
{•(Q
o!
s
(R
o
8(€
 {•o!
o
&(
:×˙˙˙Ýţo
Ü s
~4oS
rI9p{(Q
o!
(Q
p(R
o
(
(f
}´~4o(
o-?@r:p{´r2:p(=
r—prźp"ČCţs{
(|
88žţ˙˙9b{—o’
{“o
8(€
rk;p(=
((
:Ů˙˙˙Ýţo
Ü{o
*f3™(
*0­_
:xsB
(R
o
8(€
(;
o~
(
:ß˙˙˙Ýţo
Ür>p(<
(
:
(8
:{“{´oE
{o
*+J(
{o#
:(T
oz
{™(-
+*(
*’{›ţv
(¸*J*(
*ÚrĐ>p({ ţzs.
*0*`sU
sV
o
: o
*oW
(X
r"?po(o#9rKpo#(
8r?p(?
(o#9oo#8TšoY
:s
o(o
&oZ
so!o[
&XŽi?ˇ˙˙˙(\
:7˙˙˙Ýţ=o
Üo]
9
o^
o_

8\
(`
 s o! p oa
s
(
(
  ob
9r¤?p  (?
(
(c
:˙˙˙Ý
ţ?o
ÜsB

oW
8(X

o(oE
(\
:Ý˙˙˙Ýţ=o
Ü
o
*{ *(*Óý-Ľ2o
*(
*0ras…
:;r@p(,(
9
rp8~
(?
(*ţs
o9*(
*0lb:*o^
o_
(`
s
o! poa
s
(
(
oo79 o2:rlApŤ%o˘%o"˘%9
rBp8rYBp˘%˘(Á
(:od
&8o2:o[
&(c
:˙˙˙Ýţ?o
Üo]
:o
*ţsn
o:*řFo
*(
*0co2
ţ 9*Y oe
Y
ţ kk[ of
r™Bp (
( o#
9(:r·Bp (
({­ oE
Ýî"€?r†Cpof
{­om
:F~rľCpŤ%Źr< pţAo.
si
rDpoj
8q~rTDpŤ%Źr< pţAo.
si
%ŹršDp{­om
ţAo.
si
rľDpoj
o
Ü*C] î(
*0?#~Y:/( 
(
9*rEp(J
rEp(J
€Y~Y*B(Ç~W(J
*B(6
"fĆüDţţ*0Čd
s
o
8C(€
(T
r_%pog
9Ý!(
9(
(h
(x
(h
(9
rá-p(=
(J


(s
  :u(D

(
9G(i
tw  oj
 
ok
 Ý r2Ep (?
(Ý8rKFp
(f
( 9si
(l
8(s
9(m
&
(
:±ţ˙˙Ýţo
Üo

8(


(

(
_
(
:Ő˙˙˙Ýţ,o
Ü*ALĆ(î6Ym5¸0Ue(r
ÝD ~rGpr*Gp(9
r`Gp(=
od
rŞGpo.
(?
( ÝsB
o
8do 
sB
 85 š


: om
:Ý X  Ži?Ŕ˙˙˙ o~
oF
:˙˙˙Ý9o
Ürđps
(
(
p(=
 p o
(
p(=
   (-
9rŢGp(
(* ** D6^0×f(s
:9rHp(
(~rGprjHp(9
rŚHp(=
od
*rĆHp(
((t
~rGprîHp(9
rIp(=
oj
ÝE
~rGpr"Ip(9
r>Ip(=
od
rŞGpo.
(?
( Ý**ZE60 şg(I
~rrIpr¦Ipoj
sB
Ť!%rÚIp˘%r Jp˘o~
rDJp~V(=
Ť
Ť!%rzJpr¦JprîJpr2Kp˘
~VrHKprlKp :rŽKp(=
Ť
(**0 \h(I
ou
>~r°KprŕKpoj
rLp~](
r8Lp(
(~](r
Ý4
~rPLpr´Lpod
rŞGp o.
(?
(ÝĚrMprNMp(?
(rNMpsH
o
8o 
op
9Ý oF
:Ő˙˙˙Ý9o
Ü:,~rpMprĐMpod
r6NprNMp(?
(*:~ráNpr5Opod
*sB
9Xou
>L(6
"šiüDA= Ť!%rOp˘%rPp˘%rPp˘%r}Pp˘%rëPp˘%r÷Pp˘o~
:
 (?o~
Ť!%rűPprkQpr«Qp rçQp˘%rNMpróQprARp(@rRp˘%rĄRpr»RprSp(ArKSp˘
~]roSprŹSp
**IY46ş0
ěi9
: ~
Q*~W:r­Sp~W~X(f
Q*(I
~r\WprŚWpoj
rÎWp~X(=
Ť
Ť!%rXprkQpr«QprXp˘ ~Xr$XprDXp:rŽKp(=
Ť
Q*~
Q*02jsB
ou
>( 9
::++ rbXp(÷
:rfXprYp(
oE
9!rYpoE
r5YpoE
rYpoE
s$
(>

(
o;
9h(
o<
Xo6
 (h


(
: 
9rźYp
(?
8rłYp
(
8rëYp(
(
 o*
:sB
  o+
 (
oE
oF
:-˙˙˙Ý9o
Üo-

8L
(P
 rYpoE
r÷Yp (Q
r p (R
o
(
(?
oE
rYpoE

(O
:¨˙˙˙Ý
ţ:o
Ü9 r-ZpoE
9 rWZpoE
*©Ý†žb0kr…Zp(J
(s
9*(Ç(J
(v
Ý; rłZpŤ%˘%˘%r…Zp˘%o.
˘(Á
(
Ýrd[pr…Zp(?
(* *% 1;60arÜ[p€Ur…Zp~U(J
€Vr\p€Wr…Zp~W(J
€X€Yr@\p€\r…Zp~\(J
€]*0n(
sH
}i}j}ksB
}lon
>%{loE
{lo~
{loE
}m}n*0Úlo
sB
oE
 
R{o9*{p:;{jo;
9}poo
8{iop
9
8 oo
{ko;
9 }p
9D}oR{lom
>)rňFp{m{n(?
({loq
*r(
}r}q}s*J(×{q(J
*{s(×(}
@
rh\p8r€\p(J
*0»m{rŤ%Ź{qsi
9~t(×(O:r\p(
o…
*
(}
;>rě\prř\p(
(X {(9r]p{)(?
o…
**0#nsB
9
rZ]p8rl]poE
r„]p
(
oE

(
:oE
o
8&(
r]p(
(
(?
oE
(
:Î˙˙˙Ýţo
Ür'po
(
(×r®]p(J
(t
Ý&rŇ]p(f
o…
Ý*rB^p(?
o…
ow
**T<° Đ&?0g:~x-ţŕs
€x~x~u  8*š
9 o#
:o!
o8
X Ži?Í˙˙˙*0żosB
o
8}(
(
r'prx^po8
(
Ť&% ťox
(
o<
o6
r'prx^po8
(=
r~^p (?
oE
(
:w˙˙˙Ýţo
Ürđpo
(
*
“ ZrYp
(=
(y
~y-ţz
s
€y~y~w*0pŤ!%rŽ^p˘%rŇ^p˘%r€\p˘%rh\p˘€tŤ!%r'p˘%rHp˘%p˘%r@p˘%r$_p˘%r8p˘€us
r8po
&€w*2rHp(=
*(
*0qs
rbXp(÷
 (>
88
(
o;
9o<
Xo6
({
o
& oF
:˝˙˙˙Ý
9 o
Ü*#Mp
0ťrsB
(
(|

8> š (T
oz
rá-p(-
:r_%p(-
9oE
X
Ži?ą˙˙˙(}
8šo~
XŽi?Ű˙˙˙*0LssB
o&
8('
o~
(,
:ŕ˙˙˙Ýţ5o
Ü**<J(x
(9
(J
*0Tt:(
9r(_p(
(*rł_p
(
r`p(=
(~
9E(s
::r`p(=
(D
(
:r
`p (f
(*(T
oz
o6
s
s€
o
Ý9o
ÜÝ%rk`p(=
(f
(ÝN rĹ`po


o
 8G o„
t€  o…
(>
9&rŮ`p o…
(f
( o†
  oF
:­˙˙˙Ý u %
9
o
Ü(s
:r;ap(
(* 9”s‡
o
rŘapo‰
poŠ
o


Ý9o
ÜÝ9rŢap(=
Ť%˘%˘%˘%˘(Á
(Ý**@ĽĘ´%6]zô»[960usV
o
8K(€
(
9Ý3
 oY
:s
 oZ
(T
o
&(
:©˙˙˙Ýţo
ÜŤ!%rá-p˘%r_%

~
   8v  š

(
o&
8(('
 oz

(-
9
Ý (,
:Ě˙˙˙Ýţ5o
Ü
9Ý X   Ži?˙˙˙(‘
 (=
_(
:9˙˙˙ÝţBo
Ü*(asÝ>¤ŃuBróbps—
€{*0îv
 (
:
(
:rmbp(”
9(  (
:€(}
ţHo.
rbp~
o8
r™bprˇbpo8
rEp(J
r­bp(J
(J
(
9
8r­bp(J
(
9
(
9 r˝bp(•
(
9 rÍbp(
*.rábp(í*.rébp(í*0>?(
:-r5p(\(=
(J
(J
(s
9**0 µ#
 (
:V (
9?rűbprcprÍbp(f
r dp"ČC(|
rdp(?
z8J(] (s
:8rűbprŠdp(
r dp"ČC(|
rőep(=
z*Nr
fp(?
(*0w

ÝrBgp(
s
rÍbp(éo
(X {(9
{)*
rTgp{)(™
o2
9Nop
rTpoš
o7
rbXpo]
:rÄgp(=
rĘgp~
(
s—

9
{)* ~{
9*~rÜgprřgpod
rhp ~{(?
(*
%"(“
*(
*0P~|:
: ( 

;*(˛9::
rĺip(*
€|*€|*0x
€€€‚rŻsp
€†rĂspsH
€‡ţ€‰rýspsH
€ŠretpsH
€‹rŰtp
€Śr up
€Ž
€Źr=uprYupr§up~
rßupsÓ
r'vpoÔ
rKvp(o.
(

rcvpoÖ
Đ'(
(×

r‰vpoŮ
sT€’€“rwp
€”~
€–Đ'(
o
r'wp(Ú
r‰wp(J
€—
€™rżwpsH
€šs
réwpo
&rxpo
&r/xpo
&rYxpo
&r‰xpo
&rÓxpo
&r#ypo
&rGypo
&r_ypo
&r…ypo
&r±ypo
&rŰypo
&€›róypsH
€śţP
-ţ
€ťr'zp~Ź
*(
*š~:( 

@
~*0(y~„
 (
t(+
@ß˙˙˙*0(y~„
 (
t(+
@ß˙˙˙*0,zЉ(
o
9o+
9**~rţpp~
o.
r$qpoÇ
*b(ú9 ~](s
+*b(ú9 ~V(s
+*b(ú9 ~X(s
+*€†*0ö{~†(
:~†*
 (
9 r2qp(J
(
93(  (
9*rEp(J
r:qp(J
r2qp(J
(
:s(
9hrHqp
8Gš
~‡
o1
9"o2
9rlqpoÉ
€†8XŽi?®˙˙˙~†*F
€‰*0{|~]
(s
9
~‰
>~(
:~*(Ç (
9
sB
(s
9 oE
rrqp
o~
o
8´(€
(r
8{šo1
  9" o2
9 rlqpoÉ
ÝH~o1
  9" o2
9 rlqpoÉ
ÝXŽi?z˙˙˙~(
:Ý (
:@˙˙˙Ýţo
Ür„qp~(
(~*ĘR0rÜqp
:8Ą“*N(ú9(+*0(}
 Ť(
t(+
@ß˙˙˙*0(}
 Ť(
t(+
@ß˙˙˙*0(~~
 (
t(+
@ß˙˙˙*0(~~
 (
t(+
@ß˙˙˙*0|
 (
:
(
9
(
:r÷rp(”
9*(  (
:rsp(J
(
9
(
9 rsp(•
*0(~•
 (
t( +
@ß˙˙˙*0(~•
 (
t( +
@ß˙˙˙*0ż~–~~
(-
9Đ”(
r;spŤ%
Śy˘%Ś•˘
t!€–Ý^&€–

 87š


rqsp(-
9
(x
€–Ý
X Ži?Ŕ˙˙˙Ý~*=[^6~—*Z(¨9
(
ţ+*0D( 

; rQzpsÝ
z~{1(r'zp(r´p-ţs>€ž(0€~-ţ 
€ź
~ -ţ 
€ ~ 
(G-ţ
€ˇ-ţ!
€˘(-ţ$
€Ł(-ţ&
€¤( (9(*0g-ţ"
€Ą
-ţ#
€¦
-ţ%
€§
*0l(-ţ"
۬
-ţ#
۩
-ţ%
€Ş
*0;
E 8
8
8 
88(*"
( *j@€“o…
*2~
*0©
o&
8o('
~
87
o1
o2
9r†{p o.
(?
(
Ý 
:˝˙˙˙ÝţQo
Ü(,
:…˙˙˙Ýţ5o
Ü9(*"Mo …Ž0é
 
8) š 
(-
9((8
X
Ži?Î˙˙˙(
8$šo;
9(*XŽi?Ń˙˙˙Ži>!~
>s
(9*Ži>!~
>s
(9**€™*0
9*(ö9
:*~™X€™~™>*rú{p((,
: ~™Y€™rX|p9
r|p8rś|p(
(*0ZĐ'(
(
~:2~
-ţQ
€«
€‚Ý(
Ü*AR0j
(
9ţsn
(189(
:/(˛9%(5
>rŞ|p(*
o
*Ž(
99#@Ź@(*0h
:
s


8 o„
:Ý

o
(
(
rـpo;
9(
r÷Ppo0
+ (
o;
: 9s(
o]
9`(
(>
9M 9(
(
o8
8(
(
o<
o6
(=
o
Ý (
:2˙˙˙Ýţo
Ü oF
:Úţ˙˙Ý u %
9
o
Üo
 8] (
 r߀pŤ%˘% (
˘% (

˘% (
˘(Á
( (
 (


 (
:—˙˙˙Ý ţo
Ü
o
8;o„


:ÝrLp
(9
(`
oF
:ą˙˙˙Ýu %9o
Ü*Ad\Ř4"0RpsăţQO0@(s
:*ró,po
rQp(
(s
s€
o
Ý
9o
ÜsB
o
8&(
r‰p(
(
(?
oE
(
:Î˙˙˙Ýţo
Ürˇprđpo
(
(
(
(9fs‡
o
rŘapo‰
poŠ
o


Ý9o
Ürűp(
(*(6 B
]<™
0r:*~r%prQpod
(6
"@üDA*s
r…‚p(?
((
:(
:o
(*^ozo|((*0E~-ţ
€¬~­-ţR
€­~­
*(*0E-ţ
€®-ţS
€Ż
*0E-ţ
€°-ţT
€±
*(*0E~”~˛-ţ
€˛-ţU
€ł
**(1*0řŠ:*sB
o
8yo 
(;
o~
(x
83 (|
Ži:
(}
Ži9Ý: (;
o~
(x
(
:
: ~
(~
:§˙˙˙oF
:|˙˙˙Ý
9o
Ürď‚p(<
(
:(om
s
(m
ţţ9(
*ŽŁ
Ň~€~´-ţVs
€´~´o
&o
()*0p
~€ (
84~€o
~€o
9ow
~€o
Ý~€o
=Ľ˙˙˙Ý(
Ü9o
*N\0)Ś
ţŤsn
(1*z(
&do
988ă˙˙˙*0?Ť
s 
ţŹsn
(1(+*"(,*0I?(5o
&99 s
&99
s
&*0)Žs
ţ
#
&*0/Źs
s 
ţ
(/(+*0­s”
~€ (
~
€‚~€-ţWs
€µo
&~€o
ţ ~€ţ
sto
Ý(
Ü9()*.0>s—
~
ţsn
(M*0 s™
(† (~:(¸:rp(~o&(5
:DrX„p((E9r†„p((F(.9 ol
*(´9E9?(
:5rŕ„pr …pprŻp"ČCţšs{
(|
8(4*0
s
9p((F8}p((d (g 9U
9#rM‰p(9 ol
*r™‰po.
o.
(?
((F8 rű‰p((5

&r~Šprđp oŁ
s
(
(
(
((I~rÔŠprćŠpoj
ţśs

9
ţ+9
ţ+(.-ţX
€¶-ţYs 
€·9+9!~
€“ţť
(
8G~
€“9!ţž
8ţź
(
*0 "röŠprpr dp"ČC(|
*Brڋp(

(
*0(Đ2(
rĽ‹p(ß
t2
o
*Ú(ö:(5*~¸-ţZsn
€¸~¸(1*(8*(8*(0*:~o&(5o
*Z(<(˛s
s
*2(<(´*0gsB
ou
>SrbXp(÷
 rđ‹poE
r}ŚpoE
o~
rëPpoE
r÷PpoE
*0ÖsB
ou
 s, (
:rłŚpo-?
r»Śp8rŮŚp
9 réŚpoE
s
s

8o
o'oL
9Zooo-<(o'o
  o
&8

o
&8o'o
oF
:l˙˙˙Ý9o
Ü(=
 8r
 r.p
 (
o#
9%rŤp (
(
(
rmŤp(=


ruŤp  (
 (
(f
(=


oE
 oF
:‚˙˙˙Ý 9 o
Ü9 r÷PpoE
*rž,´05sB
ou
>!(o s

(
:s,r—Ťp (-ţţ+9b(
s
o7
o&
8('
rźŤp(
o
&(,
:Ř˙˙˙Ýţ5o
Ü8Ýo
 (€
(No
 8p o 


  o1


9I
o2
9=
rlqpoÉ
o#
:"r·Ťp rÇŤp(<
o6
(
o
& oF
:„˙˙˙Ý 9 o
Ü (
:H˙˙˙Ý ţo
Üo'
>s
o
rŃŤpoE
rĺŤpoE
o
8*(€
rŽpr;ŽprAŽpo8
(
oE
(
:Ę˙˙˙Ýţo
ÜrQŽpoE
r÷PpoE
*4sá†gŇĎ@0w~o&(5o
sB
(?o~
(@o~
(Ao~
po
(
(rYŽp(Ö
} o
*0o
s
}×(
s
om
ţ˘
(3
*0-š
(~
:~
*(s
: r}Žp(
*(s
949"(;
om
9 rłŽp(
*8 r Źp(
*(x
(
: r9Źp(
*ryŹp(?
((v
Ý rźŹpo.
(f
Ýcs
Ť!%˘ţ¤sK
(Co'
9 réŹp(
*(s
: rp(
*~
* *Ł Ż66rŹp()
*2(E('&*Ň(Ë€Do
9(((*0»(†
( s
réwp(®
ţo.
o
p(°o.
o
rxp(¸ţo.
o
r/xp(»ţo.
o
rYxp(˝ţo.
o
r‰xp(Ăţo.
o
rÓxp(Ĺţo.
o
r#yp(Ço.
o
rGyp(É  ţo.
o
p(o
r_yp(~

ţo.
o
r…yp(€  ţo.
o
p(  ţo.
o
r±yp(„

ţo.
o
rŰypo.
o
*0Aśs
rp(¨ ţo.
si
r#p(¬ ţo.
si
(Ho
8%(
~(
o#
9
(
:Ď˙˙˙Ýţo
Ü(˙(
:rCpsi
((
:r_psi
r•‘p(5
ţAo.
si
9%rż‘pon
ţAo.
si
*X;“0]ťo
80o 

o1
9o2
9
ÝoF
:Ĺ˙˙˙Ý
9o
Ü* *EL
0 °ž
 9w9m9c( s,rĺ‘p(-<G rń‘p(=
rprĺ‘p(?
rp•pr’•pr •p"ČCţ¦s{
(|
:ol
*0 Łź
 9q<irę•p(=
r
pŚA>ţAo.
8rť—p(?
r—prźprp•p"ČCţ¨s{
(|
8 o
*0d 
9
(
9ol
*ţŞsn
(K*0ąˇsB

rÉ—p(
(rá—p(
(X {(:={&(Z8š

oE
XŽi?Ý˙˙˙8rő—p{)(?
(Ýr%po.
(
(z*•›60:˘

~
9 ţ
9go
8:o 
(J
(s
9
>
Ý oF
:ş˙˙˙Ý9o
Ü :ÝťrëYprYps
(
(
(
rap(f
(r™p(?
(X{(9 p{)(?
(Ý#Ý r%p o.
(
( z**A4-P}6b( 

@
(
ţ+*0GĐ'(
(
Ý(
Ü~ą-ţ[
€ą(3
* 0+Ł~„9 ~„sy
o}o{o
*0¤9z
(~(~(€o(€o(‚o”(o(„o(„o
*05Ą~9*~s
o.
o.
o
*0+¦~•9 ~•s 
o
*ţ*B9ou+*09R(6
"šiüDDC999/9%:rkp(6
ڤ(
€“*(ü999**˛9 99 **0 <rĽźprćźp9
r p8r p(
r dp"ČC(|
*ę((
9*~9"-ţ\
€ş(*0*Đ'(
(
€‚Ý(
Ü*"(
**"**"**"*08§s]
(5
s
o_(Es
oa(Hoc*0E¨
o
8o 

oF
:ć˙˙˙Ý
9o
Ü
*
$1
0©(x
&~»(s
:%rňmp~»(
o…
ÝÉ



poŞ
rĄnpoŞ
(^(eo
8 o 
r·npoŞ


oF
:Ö˙˙˙Ý
9 o
Ü
rÇnpoŞ
(`(eo
8'o 
rÓnpoŞ



oF
:Í˙˙˙Ý9o
Ü
rÝnpoŞ
(bo
(eo
8?o 
rďnpoŞ
r˙npo­
r op(bo)
o­

oF
:µ˙˙˙Ý9o
Ü



Ý
9o
ÜÝrop~»(?
(Ý*A|4˝
í=*aUbâ
ôô60uŞs
s
}¸s
s
ţs†
(‡
:*s] {¸o_oaoc*0Ϋu(
9(b
ob
ţ+ 9n(bo
8>(
ob(
o
9(
(-
+ :Ý (
:¶˙˙˙Ýţo
Ü9)(^o^o
9(`o`o
+*;0Ь
(`o&
8('
o
a
(,
:ă˙˙˙Ýţ5o
Ü(^o&
8('
 o
a
(,
:ă˙˙˙Ýţ5o
Ü(bo"

8(˛
o
a

:á˙˙˙ÝţFo
Ü*('5P'wnr p(es
(
(
*0i­sB
o
(eo
8o 
r~^po)
(?
oE
oF
:Ö˙˙˙Ý
9o
Ür po
(
*4K
˛r8pp(^(j(`(j(b(k(f
*Vr´prŽpp(J
€»*(
*0v#9np(-
9~
(-
9*rĄnp(-
: rÇnp(-
:rÝnp(-
9p(-
9*r·np(-
9BrĄnp(-
919)o
9
@{¸
o
&*rÓnp(-
9BrÇnp(-
919)o
9
@
o
&*rďnp(-
9TrÝnp(-
9C9;r˙npo‰
r opo‰
(
:(
:
o
**0P®ţG}´
ţG



}¸
(



*0úŻ




lA*


:

*
ŚGţG

ŚGţG
9a



lD;rÎpp

ŚGŚG(f
(


8

*V(
(v(x**"**"*
**"**"**"**"**"**"*0:°ţ-(((((…*0P°Ą-
(~(~@5(€(€@#((@(„(„ţ+*0T±(~
ţo
(€ ţo
a( ţo
a(„
ţo
a*0IrrpŤ%(~Ś“˘%(€Ś“˘%(‚Ś“˘%(„Ś“˘(Á
*
**"**"**"**"**"**"**"**"*
*{×*"}×**"*
**"**"*(
*^9 o
*(
9 o
9 ol
*(
*Ro 
&*(
*0R(
9p(~r”™pr´™pod
(F(.9 o
*(
*6o 
&*(
*ţsn
(2*0&˛
ţ­
((*(
9ol
*(
*z(3*(
*0n
9 ;8 
8
89(489 ol
*(
*0§ł
(
(dof90~rć™pršpoj
r.šp(
(8+~rdšpr„špoj
r˘šp(
(9ţŻ
(
*0F´(5o
9o
9o
+~“o 
*Nţ 
(
*JrŇšpo 
~“(
9
o
+~“o 
*(
*^ol
*(
*0Ŕµom
:*o(
o!

r po0
:o;
:*
o<
Xo6
(J
9Ykk[ of
9; (
90 ("
s
om
X}Őo~
* (l
(i
(#
93($
s
r§ po
&s
(
(%
8
{×o
&om
:i{×o'
>:9/r± pr§ prđp{×s
(
(
(?
(9{×o&
**(
*6o#
*(
*0G9;;888 8ol
*(
*0Ł9;s;}8‰
:(?
:rˇpŚA(
(98o
8"o
8o
8*(
*fţ«s'
(L*0[9;;#80888ol
*r""s5
(V
*j~÷o+
~o,
*š~÷r%˘po-
9
(8(*F~÷r%˘po.
*F~÷rs˘po-
*F~÷rs˘po.
*F~÷rż˘po-
*F~÷rż˘po.
*F~÷rŁpo-
*F~÷rŁpo.
*F~÷roŁpo/
*Î~ó9roŁp~ôo0
8
*F~÷r·Łpo-
*F~÷r·Łpo.
*F~÷r¤po-
*F~÷r¤po.
*.~÷o1
*2~÷o2
*F~÷ru¤po-
*F~÷ru¤po.
*V(°rË,p(J
*F~÷rł¤po-
*F~÷rł¤po.
*F~÷rĄpo-
*F~÷rĄpo.
*F~÷rYĄpo-
*F~÷rYĄpo.
*F~÷r»Ąpo-
*F~÷r»Ąpo.
*F~÷r¦po-
*F~÷r¦po.
*F~÷r‰¦po-
*F~÷r‰¦po.
*F~÷r˙¦po/
*~~÷r˙¦p~őo0

*F~÷rI§po-
*F~÷rI§po.
*F~÷r‡§po-
*F~÷r‡§po.
*0?o3
r…Zp(z
o;
:r…Zp
(4
(
9
(>
949(>
9r˧p(?
(819(>
9:rʨp(
(€ř*0
o3
~
oz
o;
:
r…Zpo;
9r©pŤ
(~
ţ&o.
o0
9o<
Yo4
*0M;"€ÔC"˙Cs5
(6
(7
[k(8
[k(9
{:
(9
{;
s<
(=
*2**0˙ (>
o?
o@
Ťb(A
r˩p(oB
ŚA(oC
ŚA(oD
ŚA(f
Ťb(E
Ťb(F
(>
o?
o@
Ťb(A
Ťb(G
rŞp(ä
Ťb(H
Ťb(I
(J
9
r=Şp8r«pŤb(E
Ťb(G
rŠ«p(ä
Ťb(H
Ťb(I
(J
9
r¸«p8r=¬pŤb(E
Ťb(G
r̬p(ä
Ťb(H
Ťb(I
(J
9
r­p8r“­pŤb(E
Ťb(G
r.®p(ä
Ťb(H
Ťb(I
(J
Ťb(G

r`®p(ä
Ťb(H
r„®pŤb(K
9Qr’®p(°~
(L
r…Zpoo
<
~
8o<
Yo4

:(J
Ťb(M
Ťb(G
rľ®p(ä
Ťb(H
Ťb(I
(J
9rŘ®pŤb(E
8rU°pŤb(E
:
+(N
Ťb(G
rޱp(ä
Ťb(H
{ Ťb(I
} (J
(O
ţ(N
Ťb(G
rбp(ä
Ťb(H
{
Ťb(I
}
(J
(O
Ťb(G
rQp(ä
Ťb(H
{Ťb(I
}(J
{9r ˛p(ą(
Ťb(E
8rk´p(ą(
Ťb(E
Ťb(G
rڵp(ä
Ťb(H
{Ťb(I
}(J
{9r¨µpŤb(E
8rż·pŤb(E
Ťb(G
r„ąp(ä
Ťb(H
{Ťb(I
}(J
{9r¸ąpŤb(E
8 r »p(
Ťb(E
{9rşĽp(ä
Ťb(H
Ťb(G
r˝p(ä
Ťb(H
{Ťb(I
}(J
Ťb(G
rZ˝p(ä
Ťb(H
{Ťb(I
}(J
rś˝pŤb(E
rĄŔp(P
Ťb(Q
r@ÁpŤb(E
rWĂp(P
Ťb(Q
rvÄpŤb(E
Ťb(G
{
rGĹp(ä
Ťb(H
r„®pŤb(K
9nr}Ĺp{~
(L
~
~
Ś&(y
oo
<
8o<
Yo4
} {
:{}(J
r»ĹpŤb(E
{Ťb(M

}{9VŤb(G
rśĆp(ä
Ťb(H
{Ťb(I
}(J
rÜĆpŤb(E
{9VŤb(G
r#Ép(ä
Ťb(H
{Ťb(I
}(J
r‰ÉpŤb(E
{ oR
Ťb(G
r Ëp(ä
Ťb(H
{Ťb(I
}(J
Ťb(G
r,Ëp(ä
Ťb(H
{ Ťb(I
} (J
(S
(T
Ťb(A
" A(U
rVËpŤb(K
9-~rzËprËpod
Ťb(G
r¶ËpŤb(K
9~rÄËpräËpod
r dpŤb(K
`~rĚpŤ%Źr#p(¬  ţo.
si
%Źr Ěp(¨

ţo.
si
%Źréwp(®  ţo.
si
%Źrxp(¸  ţo.
si
%Źr/xp(»

ţo.
si
%ŹrJĚp(Ĺţo.
si
%ŹršĚp(Ăţo.
si
%Źr#yp(Ço.
si
%ŹrGyp(Éţo.
si
% ŹräĚp(Ëţo.
si
%
ŹrÍp(˛ţo.
si
% Źr>Íp(´ţo.
si
% ŹrYxp(˝ţo.
si
%
ŹrtÍp(żţo.
si
%Źr°Íp(Áţo.
si
rčÍpoj
(G9
(J
(S
(S
*0ĆŤ!%r%˘p˘%rs˘p˘%rŁp˘%roŁp˘%ru¤p˘%rł¤p˘%rĄp˘%rYĄp˘%r»Ąp˘% r¦p˘%
r‰¦p˘% r˙¦p˘% rI§p˘%
r‡§p˘%r·Łp˘%r¤p˘%rż˘p˘€ń€ór…Zp€ôrÎp€őr8ÎpsW
€÷*0Ý(
(¸}}}}}}}}}(˛} (´}
} ~s)
} *0Ü(­9 {{{{{{{{{{ {
{ { o*
*(
*6r„Îp(h
*6rÖÎp(h
*0Ŕ·
Ь(
(,
Ý& Ýž(
9ĄA*r,Ďpo;
9r,Ďp(<
o6
rLĎp(-
9*(5
:<Ť!%rVĎp˘%˘%roĐp˘%ţAo.
˘%ruĐp˘(Ű
(8
98**0)¸(i
ڬr„Îp(ď
@**2r€Ńp(ö*0HąĐ(
rśŃpo
:8o+
rÖÎp(đ ?*(*2rśŃp(ö*0gşĐ(
o
:*?r,ĎpţAo.
(=
8rľŃp oj
("
o%
 Ý**B](
*.rćŃp(l
*0,»
 9o
9o+
u!
*.r‰Ňp(ů*.rˇŇp(ů*.rąŇp(ů*.rŃŇp(ů*.rçŇp(l
*0!rrÓp
Ý&
Ý*6.rŠÓp(l
*0Ľ(
:rÔprOÔpr—Ôp(?
(8
*rrÓp
ÝHrrÓpŤ%˘
Ý" ržŐprOÔpr—Ôp(f
(8
Ý**':6@ ` 60˝rÖp(l
: rťÖp(8
**09ľ(
 9$Ťom
: rPŘp(8
*on
*0'¸
rÚpr—ÔprÖÎpŚA(f
(*
*0éż(
rÍbp(
 (
: rÍbp(o
(
: (Ýšr8Űp$op
sq
 or
t2Ý9( Ť%˘or
t2Ý9o
 8@ o 
r`Űpo;
9&r`Űp(<
o6

(5
9 
os
 oF
:´˙˙˙Ý 9 o
Üot
ou
  > Yov
Ý‘rrŰpow
  9  Ťox
ĄAÝ_Ý
rÍbp(o
Ü(

9
r°Űp$op
89( Ťox
ĄA*(**Adl6Ž"°6ĆV4XŚ
0ÎŔs
rÖŰprÜpo
rÜprÜpo
r@ÜprÜpo
r`ÜprÜpo
rÜprśÜpo
r¤ÜprÜpo
rČÜprÜpo
rúÜprÜpo

ţyo.
o
:
ж(
("
Ą¶Ý &Ý*¦ 0[ÁĐ(
r$ÝpŤ%ж(
˘oy
:*( :*Ť%ڶ˘or
u!*0iÁĐ(
rVÝpŤ%ж(
˘%Đ!(
˘oy
:*( :*Ť%ڶ˘%˘or
&*0+ÂĐ(
rÝpo
:*o+
t!*0&ÂĐ(
rÝpo
:*o%
*0?(
9*( *N(:(
*.( 
( *2( 
( *(
*~0*BrŞÝps—
€0*07Ă(
sB
 (
Ť&%
ťo
8˛ š o
rŘŢpo;
9Ť&o
š9IrŕŢpo;
:3rßpo;
:"r0ßpo;
:rVßpo;
98. r‚ßpo0
9o<
Yo4
oE
X Ži?D˙˙˙rđpo
(
((( ("($(&(*0(
o(o(o( o!("o#9o#o{
t^($o%9o%o{
t^(&o(*{5*"}5*{6*"}6*{7*"}7*{8*"}8*{9*"}9*{:*"}:*{;*"};*^(r8p((9
*0[?Ť!%(˘%r8p˘%(˘%r8p˘%(˘(Ű
(!(
:r8p(!(9
*((*0ůÄrš5po0
9o<
Yo4
8rš5po0
9o<
Yo4
8Ť&%.ťo
Ť&%.ťo
ŽiŽi([

8d š š(5
9)(5
9>*<*8og
>*<* X
?•˙˙˙ŽiŽiţŤ!%rá-p˘%r]-p˘%r_%p˘€3s,€4*(
*z(*9*(*9**vsB
}>s
}@(
*0RĹ{>s
~?o

8(
(
oE
(
:ß˙˙˙Ýţ,o
Ü*+B6(1*04Ćs˛
s. ţłs> ~=%:&%:&98€=(|
s}
80o~
 o
?rßp(=

zXo<
?Â˙˙˙}<sB
%:&Ť!o~
r pr˛ßp(J
Ť!%prŔßp(J
(J
˘%rÚßprŔßp(J
(J
˘o~
(
+}>~E{<o€
*ž~=99
~D9 ~=o?*0·Ço#9*sB
 ~Co
8:(
(
o(o1
o2
9(„
oE
Ý (…
:ş˙˙˙Ýţ`o
Üom
>o
oooo!o%s* Pp0˙Č Ť!%rčßp˘%˘%rŕp˘%˘%r&ŕp˘%˘%r<ŕp˘%98rXŕp˘%rbŕp˘% 9r p(
8rXŕp˘%
r~ŕp˘% 9r p(
8rXŕp˘(Ű
(2%:&Ť!s
{>o~
(
+o
s(3 {@o(o
*0És
~Eo†
o‡
8Z(
{@o‰
8!
(

so

:Ó˙˙˙Ýţdo
Ü
:š˙˙˙Ýţco
Ü*07gp†Zs
}@s
€?*0aĘ
s
o
8((
o“
9Ýo”
&o•
(
:Ě˙˙˙Ýţho
Ü*>QV~E9
~Eo—
*0uËs
€?s
ržŕpsH
râŕps™

rápsH
rTáps™

rápsH
rTáps™

€C€Ds
€E*(
*b9 o;*§ÉPK
|„0Sgradle/PK
|„0Sgradle/wrapper/PK
|„0S“=ş$»!gradle/wrapper/gradle-wrapper.jar„»”fÍŇ&Z¶m۶m۶í®.Ľe۶mtٶmwY}űŢóß™ůÎś+±#×ÎČőDdDfl%YP0 (( 0ń) żĐżčż$/®&L/­ Á
¤ôF^n®7‘ż š íe”VWUc—ř-?5)'KĎ0/KO335ۤ´ĺwü0E?&=-?M+M s0K=*ÖˇnÇ$/=*6hÁ9ÇÎ<Ă~pąwţ_ľů"öĎÉý%GËĚëßy`˙‹ÇŇĹŘĚÎü˙ČŠúOVOc''s—˙mU™EŃ_ÖĺżDúź‡9z:Ř9›‘13Ú»şúGËĂ 0!…îZ±ëĐz0Á®r:3đ ۉÚAKKWödÁ"î ˇ9_ňťđLůŐ˝Bôc™řµr¦MúWw¶ÔĚk ]Ęl·˛v´ö˛]PeUŃcQ„„şGŇRÂĐ{_ŠéËŽţřQ
$âÂ$ѱ#«(Ĺ‹ł:@Đ©Ćâő[0Ţ
‰ßŻŚ0dŽND ‚0,fŢťß˙ßdŢ ]Aű».N—Xě˙"ŁŞ·«›ą˝’‹ăß^7ks׿5/oaw7+s7kSc7G—-B‰Ş˝#Š0RUŘčüA…QMĘĆŠŹÚq¤ăĽtL4ł|ĄĽś ˝1¨e­§™cÂCÝc”=Ű=äkQt“P
0ęíŕĚßď)>Ţ®—ĂÓŐ[  / hXpP[ę-ކŘ4U­•|TÝv[„ŃţÖźľpă{ú€vU>3©ĄR#­Jßź^‹üÜô‚ĎÔ&«/ŹŹhrĺ­ĚŐ„Ź¤ä
ĎćkČ*Ţ$$·Í†×•­PÉ«{4Ép+—DHŤ'ż©P†ĽµÍ'íĄwC7“şEŐ<ŻŔƲ˛~Ăj`ĄęŠ\«vPe™¦cBŔá*4|˙üqä@”ĚË_a˛'*ŐËŞ*ŰQ‰Ę»mL5%mĆ„8Pk®™K xBcMŤÁ˘UŚăjĆLךr‘Ěó>vKB ĎWŻ$ëyŮľgc6*´> Ę·€O€ë5P˙ńcĐ|ěK¸z&HÔCčŃ{Î%Ěká=°ý§«ŕO'.ÍhĄů# +W^úSŇĆEDMËÖU;%1)<D•Ż’ů¨¬™«ňüŇ ĂY®zŢĐBř‡óĐcÍ©NaŽlŞFë,҇śś¶NR0ѨąNŤ1ťi–Âr‡ŚrĚqń÷ŽB¶é/…ŤnC§s¸“˛“j˝­Ř~8‡č ~J\\kăĹ–#4)ý†îŻi`{÷ř°šăG%ĘCčéí
ëKŚ˙DÝé•–kĺ_´mţ%’˙Ś:é˙v˙”xĚŻżŠř3u~‚†Ü
cđdrß]*¬ôhĐĆÂ!Ă{á&†Â›‚
5žöůöŰoăĚ÷Ě
* –ś]*éśâTs&™jÝ3ÔpM×R%¤‰”XkŰD99CĂŇןąˇü%D¸ůS{úRt@++ą@©R?qW¸3eěYNŽj'‹ţ.:Q
rR‚ěÁĐ›´—uż^{´»í˙úOIÁ*|¶őţę—ň_ý˘˙Ď’JţMuWs)G{s9GG[w§ ŁŞ«#Śö-‘ żň¤RMŐŇjŁ ¦»®s­ľ84YˇE­h
]ËĐe¦m÷©ŮCfcł0*đ(ÉÎ?¨B;Ü5Ţ1íŮëz25u+(˘5P¤<5îU¸Gť+N
ed ˇ÷$QO´ßÔäŁ,ˇb%? - —¤űţü.Lc¸1^ëXň¸ ¬0›ę±çpşXăbg›¬ŻŇ™q•ďęś`ÚŽˇ5o<ŹÎťĆ”őőI0¶ZlŔÍ5ö´q9č ]}`k·Ř(}I(ĚĄbăČ!Ź.–Ëşĺ´
ŰšĆ
ĂŔôç2¤ÁŞĄţô`ÚĂĎ€M8Wé,łÓ`¬
tIôĚčŰ—°µw].yM8+dşŰř·o [bĹP~ŇgƶÚëd3=č¬Űx–e—ęžü$ŢbĄNTcÖđn”?B&ëViF‡x˛€ţ!wÓPţ‚d‘~–ű!±ŘLłeĄżXĺĺąT—ú÷ŰŇý®Oęý.=­'Vé¦z˙gĐ(Ĺ{•ç6šŁĎźĄÇaÜ‹‘(Ç9ţ¬Ý_`5]ËD·ŃČä,”{†u3ę»4B·ý®ě˙>Śe=´íó“8K41 m^ŠuÓČP7žjÜ+’Lť0šŹ €Ť %IQÇě‘mĐ?íŚńć+Č'T(ˇ˘7$8-žGtŕB;}5”D ŽD#Ü.Nz†Đq9€‚AEńLľxŃW›F­ë§Ş …ÎYńÍ˝t‡á
÷#ŚîyŔáŠ\ÄĄTÝăůßď@sčýo놩¸—©ť»«µ‡ą„µťą°©©ą««Ľ±±Ąů
Y'TsĽ?ö™ÖťöÄBÄJv@ˇÍJATA©k&V:ůđ%ŕčmăúťŰ1Yň˛ţDîwg9E,¤ôZ#Ř’’ŁÁ<‡? †v۲R{ńŢţśŢţyçüţX†B<L"j-hA.Z8–ôD2Ŕ{9Cp‹ś”vľ€Î׼˛ć&Oí%R(ÚŤű 4¦LÎÎ…;ÄęĹ!Ą: îŚ0űQĆD…Ć
lš‰#F ItB™Ń4ë$,
Ŕ
HGY)ŽĄä™u'S˝>őQtw#ű Q9Ma&/Ą•`X±ŐÍL°MPJaŠ ŞÁňČ+ÄT‡Foĺ¨ĚďŞ"–‘)źÉęĚeł[ĆQu~l±X¦*ČSŕľ“yˇZ¤F˛SO+uEW¦h@¸«ż˛˛Fî”ie¶§…řjĄhM4»4d—ąłs8PżuŰ o0š=šăŞň˛éŰOš-‰Č2'gŰ —+:Cˇl:ŕebŁşĐßÔXŮúĐ™âdšWđe©:řZ٦˘Ţ_÷ĽŮMÓóu=˛¦±â,$Č–:!ŕ-čJOA‡?ŤŁĂĺ*~ď3łÂ‡Ď%L/ýA$‚ŢźeoQ‰®ćľ€¸Lä]żÖBí—;٢ÎrbL®ŃO˙ńiO ‡olËłí’ţ.Ľ":˝‰â?_u 7Ě łtk#?šfńtçż<ěľĐŻ>°ˇln˘$f!ĚŻ˝¤¦›Gô껂Đ•mÍŠă’űi2Čĺ*e]CÂJËhĽÍ"ĄU§ÝĚR²R·ĺîÚMőŔB0 €ÝUŻÄ'(ÍŘźXď|o†OmăŁŃb†f4Ie}Ý 9=†…BĹ0–ŢĐMvhŢMbĽ(#ž¶×0b®7T —xŹc–ĐŻĐM|(/×hxóvCŤcâwÚH\Ŕrë:„ …çčüH’ZiX¶3Ó›·3‰ËĐ0«í ˝É·ce{q®ěą Ťó4ď{ůz ű¸OŽK°ĚMŁ
)ýČtF<ČMTÂ@gŻ›¨x†T´¶)„Ź
ULp0OžzšđäÝ9šEĐt&÷¨© 1×´ž']iµcbˇŕóđ$.W~O•űP´ňLĺ©ŇJ/3i§Ę¨ĆPšH{í9Ő~—• SQöňĹ٧×?ŃkRÚ˝…ŻO*»ó«h./cP–Ĺ“ŞĚ+{›°ĄÍ˨‘üSŘú «ţMĺš>¸gqi˝íÉ®u/')Fý©•U2?%V2ü!Žř>µ$_A'F<®€vĹvř HČ(rNă±<$EL.9ťěŹěYĚ·lqĘŮ:`M·Ő“őť“=ym j7Ű$Áá5ďTHjq2ë1ťbޞCHg™ŻŠĐ¶˝.^ Ň€ÇYAoűo¨“gű9™ŕă~R«…é•*qĂwtElQ«ĺ¤PŔ/O P@AöJB2¶ôŽ0îg¨ |ÁMł–c[ÁÔdŚl´s^ĺP”^đHľßĚÓÔ!úv(•Ř=ŕpčőň’^±Mç{ä5'䆎SŰÁ„zSN7µnmąâ»Ł n]`QŚRěo»"Őľ’čPx±p+Ö?P°ľq—:Get†îćř ŕź~·5Ąqgô…űÔvĄżPą®őËqŞ4BC¦ßó•ĽrÖ~Ľ9^ Ă%đŤĆK˛î·‡hČ ń·Ěk‚áďćîPô/>®FZícx·Ťw ŽDuó}‰ć–» ‚4űç>7A2Ć%ŽČĚhä–>Ňq—YLx…żrPÖDłôÇbŚt#öˇ,'qżQRý!Ł6PąĐxÜFnĄď*ÁŕźÜ>l>ó,·éţ»ˇč8ÝCÍÁ«ĘOZmčc@)ĄŻÉ{â˛Ů6[vˇ‹SY–·6±Ë7‹%±i‰ÎŰůž ˙ą+LÁH$üu^Ţ ţ[çEó_Ą¨Ł…µĄ»‹±›µŁĂ9/IöЍÂHŁ6OW‚ I®‰łó÷XˇŐ™ŐáĐĄüDkťRIŹc·ôŮďU­IďC űÍł{tó«7‡8Y›Xç}]ë}|ĚÎťÜQ…ɦŹqDáEĂÝ8 ŽNóqľtx÷O‹ŕDYó™Í=Ű Ţ]ipÖë‡×;[°ŔŹÂD×L?•Á…îĽGžë•”—™ňŘIł—Ńżô°
vÔ~÷gjŮyÄa-^ZˇÄî,±n6ĽZZ§ăµÜ_*r×bźZ}—»_,ŞPw®o2rě›Ţ´ÉPýĽf]©]ĺŘČíŘmžÍőöłóQ8ŇÔ?-Úľńˇ°$ŢňŰ„YačîVŞwśýpQmđikJ-Qž_¤);d¨­¸ŞĘ «üó\)!Ů•h)¶Ž\ŃfąO°««F¨ (9sË/–bŐ^.şxíă»›u Ö˛§ýŤŹ7o`čŔPÇ~ŃĄ;ý~rSĂé
@üM{ĎŽżŞtP:ßázĘ3L©ĺ1<¸śŰ€eţR żŹ@~˝.`„2Dë%óă~5ĘλbĘń š‹»ěsîIćf‰V5ÎţĆ`L—H´‡ŽtI¦6J.dŽVŇ‚P¶ćD×COĂ:ň¦Żř!yrą^źŚ”•dyଇz@~{ďŕ˙–ᚬ—žC4=í4ŕ´DNq'»;á„ωFäŚm¦Í"|ţ·V,Óő‡éó@W&ľŽĄ¬ŁBz‚ȵ8ăT‰(I&ľ®1¬Łb|(Núw1˘”r µ°
Ë+ą”:|b˘pŞtÓd1™ŤL|3śŠfĐ™Í߲Q!sŐ_hÄŚgië öźŘ6ó™ÚMüë”óC1ýgl˙{Ľ+eěđ÷őą;1şŞşęhßŇ\Äx=lRşĹ-!ş*ŚRäÍ4hdč äP%ÄŮa×qi`ǧwC<Ë‹`G„®™Ą4¦±h˙ÉŠ]’Ł• łĆç
[ßë–ľ–U…ď÷Ź8AŕîpG˙łáâ j ¦óAw9Úôű_¤1ŽoůF
$*]{öŕ®0'ţVĹĘÜ R
TĂň„jtŇ^ŐČ“^eČ´Z)©[GĄ[#]*Ý”Ă(ď¤7{˘ŕ™Aî?[×těĽ}ľgH†ĺŽ0b\ł6ü铦ĨNÖP°lňÚ#ór–â˛ćî?ߡٲmAjűű#}'6ň[Ľgž¬<lőŰŇZž’‚µťé[
×Ů1”Öf`€S:^d™µ
DűMžšÍ‚5‡‘ů6 ű(ÔŃ9Ö¦Lé¶i´
ÔNŐst.BŞb[­lŇ’0HĹjÓb‘ß:™—Ý€qÓłŤÔŔ>8\ćEí˛=9¦†ŇfĆ>”µeř,ç®Ű‹žŘRM¨ëôŰnÜ:Z»K‡Ęî#â?cżHclcÉ“S&´äE˝7@bćšRĺ4Ó¸źÎQ^qŤĎ©}9żO‹Ž)+Łôě;Fá™IŤmV,˘Ď-]ýŇ{ÓSZ}~†ç–©ńQĄU¶‡c‚éÄ˝d,łHߔ՚€ęí*GA˙¬-SÓ‘č®"ůY #:âP§ěňóćp(­±ÔÔîś|¦vBUŢ"f ŕ«—Ţj?ył­paá8±ŔqvÉ_«{«â˘>Lq#ť Ň®JaV!uH
Ţ®ŤţRPµ6‚Ŕ(qžź¤ŹNxŠžwŔŠžwř3’ń®$¨NÍ/Ć BqG„>%MKľ$ĆŢ­Žvó“ăRÉŘěrŇ&›Ű#ĺ9EĚ뀚–4xÜMÎDdůĹ$BŤŚ]ď'cëfÓťÁ(Mş/Ȳ „­™’‰¶ÂĆJëU–ß÷ÓŐwúÍŘaÚŽWćŃ –E|ť|Ăůz”ů]âh~ÍM>Y‹śÚ®1T[ᄪ Źą
ŞĄŕ˝ykÎTĺ>Ů`™$­ĄJńÜBDkę'I‚„]Ű…ü(‚á ńC2BoĆ–Č©dä|č7×,!K`Z”á(löňŻŮşxDĐcr<pÉŮ=ˇ[o)As˙ť3É@z ¦@áXx¬&e=şŢŕ,©˝6ŃĄšëAvÎôŕI/ဨč×'q2»ÄłD¤‹ŐŢj¤ű=zßÇ8OQŇ*ÂĽŘcEë žV!{Xkł öLÁ!PČ|h6†WČĄZ'ŘČv€'‚ĺĆ'·›ŕŔÝüQžĎbKŢ÷ŃË‘ľĺ9?7¦ĆË77–ćŰ™d|¤3·ŕ;3Ŕ™m‘Pś÷XŰËaú¨!î}ÜPűňÔ2ĽŚ;V—’ŢĄ)y­Y€¨ű ňŰř
ĽnO3úDZϤYŔ
ýÁřÉ3cCÔ
u]ŇÇľ;2펅zŮ)VňśĽĄ9ÖůńŔRď—-](á®ë*“,“2ťÂ/Ď”Ť?`òg ß߆˙´o%ŢLť˙ďçߨŽđ?Ű79GË˙˝…&}8.(ˇŤöĄŤŇÔ1Ź8ÉĄŁćŔk™)fĐČ„Đ5ÉYµ˛Öh1"„â ~‚~Eź¶ÂŁh5ĹçćşŢrçý¦ůńýýż‡¤$µg’ćDűsłśB9NL?śWd+ʼnH8aÎ(<® Â{
zpu®áBú:ÝŔŢ·»Qđ ®lPŔs§Â?IŁ«µ4s´ŇŠ—+şŁl$¤`©_ßÝČ帨(VbKąłµÖµl‰Ý>§@é:·‚PmXŤ^˙Ľ#Öřś>A ça\ląŽA-/P0bâ÷ˇćîăÇwś:˘Ű…™ŰFĄ@¶Ba
0ŃÂeM^?Q9DŐtzäIţEk_¶đdĂo0›ÍĺÁdZSů¶C“ĂÁĆ+MŃaŤńmgÜĆAT–*
áĂ8€>†Îaůóéřn©WŇ6CaSŮŔřú" Ż'P ë+Ł Ţ‡:¨±łŁ§¦¶$őťmş±#ĄU:śŻ×ś‡~°?ĽhA=#Ůă
ă˙=—ľŽvXüC"űnEÚbśG$$@Hĺš"-€č!ĄŠCŞ–TćĹdŤB™{öˇ;"O^É:gM„ب.]űŤ—$/áXci6_¨clruJUhĺwBć~UšyŰKFŚíKëŁ+ 
éU ţ€=ŰÂËD—ą)šÖ)b0}śů8‹Jó´ÔŇ
Ő„6 •Úž XĂËEÜŮ,Ů!Ém•ÔY’ő˘ďN[€[°á ]`§*Ć^
ĺAďŮş;xţüOHšĽZÓžýu%q€€(ţ3$•ŚÝ¬„]]ÍíMěţçąÂ›!î*ň)íj{:S^#)s9TbŕĘíTÚV°dÚaŚfŚËđ”Ć®Ćů[Zţ…Î˙¤•„­9ĹßľĘ[w×őeóĂ)Ţ„o§}39çÜNeµýůž˝üâ„đ'zź/Z4ąvT©_":z;WS9ůZ^[F†yČhLA»ł°ŢÜĂDiÂCEă0ě„§Ël7ůăô®J€`ňnK Sü˝9rvěsKáĐ•ĹĎ`ŘÝ0ü Š™ěNÍĺťůQ=ˇcxŐü[m7ú@—Ůwů”Qň~›Ş—’ŇPăŢ]PÉÉ®łą“R~´eş%Ň6•\gĄη°ś7vźŠËÝ;ŔÎĹÇĆÝÚŘ&ŕiÂÎÁĆÝŘY€×U[Řď :‹ć^Żť\ĹTąw'6í’öd2¬ädćđQ1ü^A
®;C>Z_—Ě!>ČišĘ—%LA—™zn 2—‹§§”Iu\áá¶Ńť1q’iĚxa+.ú űjľÍaŽoŘ‚O*˙(“ő >ěšŘj|rYŻguíěb)稰^śo8
X=¸¶úĺôň»!ÓÎü’ú‡Eóę´Č𩸧Ű}Bw„Óľť:8ýtł[9Qg)ďH4Äo¶Ë(|ŹŠ!&»%„zŕ ęMŐFo'W=Á\şf5kĂ´ťM ˘ôÝÍ|~^‹Nx=Fr™ŕÎčŹo2±

ňžĽI›śO¶›µj–›-Îŕ0¦|
ŁK+ťĘŻ\ą°+˛ś1ô«őxq'ńÇ
Eńđä˛3ASŮOÓtÓ–PÚgzŤQO$˝uň‡ćĄúÂŃŁÄq_ßÁëVj?¤P&aK"{Ć(hý
ácƠዼÔ!ť•‡iq(îDáWďšeLUÄQÖG=©ěźPžl|9šťŘĂ^Ăt'đşqâ§”ŻÔŘăVŻŐ÷®đ}HçiíE{źĽuN
÷´č}+LÁÚ;[G¤4EűmŻ9‘»¶Ż ßĺűŠŻMA kÓć#Ó"+.1AůďQTŃuAV’żî124ć×rę´j;¬ŻŢš< Ő¨OP5Ćĺíę™PKŐkۡűŘ$†ž«˘Óvď<á=ď3•b~š[îśBđě[¦Á3#QšĆ¬¸ăY­‘?¬ĽôQ"őWrÍľMJRrĆ}vh¶I҇t•ĄňbŚ,V°.»‘ű¦'ÇÇťŘđí,-Źôŕ\Ę´V_Xs×%LLĐbčzňPQź+9X·[fá8ŔŠN~çÇ=0CŔjMjt÷Ő´=Ô·ý˛ő­Pvz˙óÝGiÖób—Ł5Ź÷ö3¦˛é
:!wŻ­NÉE G«Xeć’?$iuÜŚŚ(ś¬é{&¬ռQĄćÝËÔŇya;1m>Ş'8ŽçpW·iuŘ,ĘIjś¸¬ŃŁĎ6WÎB÷#…€
p/"ÎČ#˙üŮŹßÝ™d?ĘÎáopz…Ňtę@d†můŞî–kht}6BÚ~{Z /]+Xo™sçď’ěk…GxxŃ“Ť>łŻ?Q•{AË<#D(â…DXXü&óĘ4Âőóľż˙p m;KŞÄPTwpyD°D$Äę+·$©×ĂHšě'9öÚ'#E¶cŮ‚zó*ŇD Ŕ°Č.Ćđ(¨3śÇA¸&iU…ÔÔA;”är ăRsnĚDítŽ>źŹĽśű,(*™aŽjŞlďßHÁëó>9ů í§›QsÉH(Ëω®
Ôcn şń7o¦“đWŁäX0lx]P´0ħŞÖżé±Ł?@« •ć z%Ş„dúe°Lč…r!‡×÷D˘˛gg[>˙şe#żĂCőÜL}°_j€÷âBSĚ|H,ß>âłłßą˝ËÎĆ‹Čë tq[ăgsäďâęA!)ÜÁyç¬ôr˘l‹’ů„c]ţ°|Sý®őߊqĆ“„4˝1kü8Łó‡í}aţ†ňa‹»iČ.é'gĚLŕyG¦ó=Ű<"Gڵ§n«uű´CŤ{ÚćęIr¸­9؆780`SdQ]lÎ&=lĘýňŁő¦–đ‰Ż|Ië—zÝŘŰ9Ňkc˝‡Ďبh±ôŻţĽ
ě X~ÍáAř8Jll,Ůtg«č⤵Ăćť1Ĺm[Ä\c<;g®źęu&l$÷ŚÚűžŇ{ČsQ%(ďÍĐë2;ŁZsÜřŽkxJÎĎ}ŤždôÂ=CZ”óf7šľ;V"ďl—OŘ>ţ©ÜZćîgľµ×fřçd+ApŐľ§ż§ňŐđ
%4đ»&ţüŰ˝,×Në6.*Đ5ŃsCćŕęflg÷Ż]2GÖí¸E˛k}ťni`ÂVŚÄ;Ś ^:~
)ţމčÂĚ31úŠôf&Q¬F'JfąWIw^Ł:΄^]YzŽjÍĆżőą ĄĄeYĂÖńňş§çĺygóć凅g–Ňcߗʼnoöéźě[?CŻŹEÉ3i#”1$1†™A lŔÖ#ăe8ů,uw`÷YłŕTý¨ćv‰lI zcŞĹ8{$ąůĽíZ™ç0 l)–cźżŻ€fŤĺ÷AÝpfáď°ů}dŠąU÷߀3Aő&Ě+]ŢŞăKU2+ťő¦Ůaď~‹„bŽGgÎĘ˙¨ČK÷MŤÎÁĎ7©}ú
ă]K·çęĄ8{üÄ«JŐË=05sä˘Ä:ľT™Şćôû摍Úďç@ŢkSŢŞ´¤lŕĚáÓ‚Ô]h·ňţ
PÍń}ŔŮěô‚¸¬Łú+Ič¦ŮB+PÍé5°Í~úrľĆţć@Úë›Ę[»\&MčP‹s×@ý©‡`Ř—Ýk‡čŃ5݇xŐäW·j.22EĄť~=Yć+×Í m±4U6Üś‚CňHbu¨'őjľCî©öö^Ő«Í[·ÎŽ˝@‡Îľmz|Śí§cgsA…űâHér'{Ťc‡›čvi\čtÚe×cf8Áeµu ŠEµ+řâ뻝ő9łm´đm†_‚—eY‚Qć<ž˘ŰŠĹŁÓPůąôŮö¶Daé:Á̮Ԩˇ'¦E»¶yřsçý…]}÷ńbdű8¨ăXŽŁ™_…‹Ń;Jd)lžŘ¶SáĘ0ŘăG<üĄ›ŤËíĘV|ű ńżkŘLK["Ďâć/Ůą;ÖĚuÓ»źîë±5¬GcÓWXu%¬›*ń!!ž'Đű $ßş•­^°$ɱęsG9’ KB‘ĂmłŕL»µVAčćPâm{”˘tšŹŇNŕ•eÝă4D´“$óΨyLç+c]ˇZřĘôrR’ȡâ=0V®w7@«Fş”5{śGĄ2ŘĘ‹gPHŠ=˛…CëD=Ź9P´Pc€Ţ†#
0É*Ř<z !‰Y3ˇjc‡Éĺo4Ú±vă–‚ŰE;h§Ş˝˛Ţˇ@V@UçţŮZŘW›Ř
_4di0DĹŰ4NšŤ"±ŕ^L’ JaŞéÍt¤pZ7ňŔ‘–Őđ€‚läË4٦†uçŹT¨ű]WÄ"ě</Cő> 
·ą•‚0ą“e
ČT.?ÓĚĄŻ[ką7Üa{<ň!HŃcěZ=IWp­.ĂK°$3uá#ú Z€\Čąhń©,Úmř(ŕűogPÍILésgoŇhwM&đăG?éKXYŞř55»57S.C8WŠá3ö|ĆdΑ7ÁÇ˝hYěĽâX}şbâÍC®‘ ýDS[ÜÚŹŻŞÔT$;!¶hŤkÎâ4bŠ·,¤¶bç5íL‘Á*ŇgJ,Ť’.Ą„ŻjŔĚoŠÄŤ[’Ł ŻNXj…š4Ă =ó¬7áÄńY“N¦ĹSÔÖ&Ú¨^BUŢnĽ‚ŢRÁ9sk#ĺ?Ĺr%a÷pźćJ®/OžG5Âü~ZßÓM˙ŮSH
ˇĆťÇKľGÔrOuí)pq8_N š\ˇ…¬X=éł,çŔnşVšßRÖl‡‹M©ë¦­ŤÄA(^ ‰*aR–.˝ş}82ťËmÜfżˇDďZ9pŐ3Ą^E~“y4÷7ŢÄ–µŤOÂ1KDĂKFáÂ&ąt}m™^Ŕĺ03U
©ĄÖnâ
s1ĄCgo”Öë`IzŤ”tUu3ˇÚŮNK
NŻ”ŐwMęRCX1˘Ź‹ˇPŁĂśłŹšŃ­7VmşDH]żÉŽ|đÁ”jRĘ­Ć€ˇ}™fśp˙\áÂ
™›h@ť¨ůÉŇŚ‘—˝"í* XA)PgÇĐŮ`0¦ 4ś,wď ‹ęĄB§ˇ›zx:46µ6¶/+ś",?vŰd”.ü~ ’é+đTç‘ű˘ůĘ(X â/ZpÄN©-°U÷ !P?—č%Usš(ś­lÎrP:÷yŻčRďýé¨öF±Stwzth‘ⸯ«ţÍ·yý6$3
Z-}ć/|Ěř–/^›u¶Ňâ®^®ŠöÝ8áűĆćq’íŽě#Ľż©ŢÜWř ů¦ňrŻ?Ćpc<ŕYőÉţÝ9ńrr{ě(ĺš7ń…‚XţIô‡űkî ¦"Ý\"ĆnŔ˘óĘO—’ľMcî$ŤěÔvż=aÉÄYVTŘćÜBnŃÔ?=µ?7
Oن˝”Óp:Ň_ę(s>ĘźgˇŚ~jć˛J"yč‡˙Çń™Ć[–źÜsüÄîÁ—Ż•X¦'
ÝÎctţĂŕ§}Ę
ŃÉcI#ô›FZzVł2}úť‚Žńą‚AáýEYňŽţ%wµŰĹÎG}ŔŠóôBŃvŁĄ-鲺>J“ěŁZS§lLÁ´'}˙©ív†Ž?Ý6e7^˝zÉ/Ť‚°ŤĚĄšĚŚg”BR<ÔTňĚÜ@«ó赫…É–X1ľĘóĚ)ňaxuúHëŽáR@cĄ­tęK†rR¤ ű¦zXôüˇvĹmĚĘÝ#†ĂFčX<&®Â/śPó:%m”đ$ŕjE4ى!aîĚż’OHPő
J°äań*o>+čH¨ [˛ ˙ŰnޞŇđ‹A5ŕ4¬łĐy‰8÷X6­ň“î™FR]`d–úS?ĄŹŇŽßÖ:R§ĘŘ8ĂEá’ ň´9Ö«P#éĚ×`Sí[@09bC9OuÎĽĘcD- ÁĄÂ ő$ĹcǦoÂWI5\,Ő`R× ľâ4ăăĐ–ŁôáÝ‹ĄU”߼A×1ËGĹ©tĽCËEAr(źÂ÷1ť|>}ď—!Ź '12Ő˝™;Üq΄ŕŃ*úw„ŕI^ů§j¨)żyůC\^ß° $ö…Îwů#ń‘ý6őď’üCÍO…‘…˘ ¶”đ„żÁxY%yLżęßí}dfđQ»iĽKç%aţhďŢ?ŃôÍz’´ĺzé
˝eť'ÄKN·Y]AG[ÚżżÂ7&W”ČË?d˙ÔŁÂsžŔSřˇb˝>ĆtNJqŚ×T–ÚIPÝ’d=âv®u#&0#˛Őp=(ŞŃS`Âč˝>şť×ţ€íТŞ1ÓCöűüüP.çr}H‚ăy@ [ĐbyI”+bÎxÜŇoJbfJiw…VćÄś˛.ă ±7>ö
–˘­ŽÁ6H˘â¦ŢAú-˛´×IĚŃ:C/QŽ 7ăĘwĐYĂďzÎ_ZŮ:‰vÇŹ«ÁMGßбˇ ŹÉ2y%.7ŻÇ¤‚ݎÖańKŹt4d] ™%)fŢVRĚ0,'őÚuŠębS˛kT=Ź„sü¨”ĹÚŐgŻQyd¬sÓRď'Z6ž0ů ‚ÂňŚńFÄwçł_b#\DŮ~–!
čë|0=É Śh16ĎŚ‚ó9€»ó–DSV˘ÎÚwíž«÷jI“H“Äęă¤Čn)g’‹u=žzŤ(Ŕ:Ëő–‚©%¤đäCG JŤéśś©qámt*/`¬Ë˛/ęI$é>1Rś…Ńjđać*s7ľŐ¦čĺ’Bę©gd‡~jVµŻ˝¸=űR¸ś\Pđ(źđřNŽ—u}™źb*rR.K>ž¶Î‹;N€»PBłQfŽťÍ
LVˇËPÁŃfńç4µ~`xúž€L
G”Ďĺ´ýAII«ç’WIAţůIkÁąď’^ąžmlĐŃ<RIEßÇEźĎM"šŠ…•ÁâQç|6ׂĂ=}ľăüAÜ“§­á1glguĹxËŻú¨rÔ}óJ\úŠ@Rgf›D–.á2UÂdeđs™ÎČôÚM˙LnŰMĹěÄkĘŘ)/…_[¸çÍľwîřT^÷ŮšBŕÇÁhV´xśDOL1Śu\r2ŢÇĆ)šřĄĐavy˘ľ8os3Ă21Ą ŘńĆÓĄ(Ý9Ňś¦Ĺ[Ňms5bĎYcCĎYR)}zŹą˝ 'PŕRż\ŐĹĺőÂ,Tdß’Ř€“l{„ŃWN&Mejż{…374ÁÓŇVB”—ç•ňKÇĹÄ7Áń¤»›Őb«ÁŹc®ąÔş·›ë‰3
úńdőĘů
Éžq¬­·»ńnCO[Íú»aZL—d¸qîř=˛W?Ż6@śŞK:‘r˘)ŠürvÓŃš¶ş§ű­+6űjű;ŞŰűĂÚBť©/Ď‚á7†÷-÷wÚ„Qo”Ě ŹÓgđD@¦>,ýi3|ĽF•Wę[Ô§đîü‡Ő/3‚Gô7LC×…:z(ŚÇE˝Ű6†r9ť9EK;xšvÇKAB®oĄó˛Dâ¦ę‚q«6‘«(+’`śÍ˝k¶0†Ň·fP@gČ ţ ÔüZiŚŮśů’0…űşŐÇś'˝¸Ş‡ĐŻÉúw¬Š@†ü’GřθĎB·•jÎą/&*|Hâa±
ńÝbP&[bňsâę» ‰^qÄÁęŞţ§MŻßű ž{Ąz ‚"qĄŔżá$ŔlčŹëmd—UÝ(9!­tŤ+^´il«µçw`IĐ&Č<—…UI řć^đÉ€Ž%ćÓÎQą˘äË t•çú¸î$.7C@l:Ćý"ńÖęHE7G-óÍS¬U«¬YlŞt˛ŻöI¸¤…,/]Ń%/7t¤‡ Âp ×+^+Ôlnőžohoˇď«l™Ć|ڤiy‹[Důµ¨r‹¬ĂÖäj_¦Xťăâ2ˇ!a×â òzpl5íH
°ČŤ)ďžĐhb®˛ ĺ7?ĹóFý<]wTÜtN¬Z"Â;˘zBĺ#_ą€°ć®÷K{Y˙°b&hˇW—Lóćź|BIĐPOî+_Á||ZŚô/Ö€đWśźŕŰčä%”
hsăl˛j®ŮÜĎâ-Oî
Ş˙¦ë
ž ŐĘb߸m vŁQďď”lŕq
’؆{}äî>ŽrŇż\x ÎôbdĽä/;•~ô[ĺ¸~ąóÍ5pZ îeÎcI药â¬+ľ_ Ěă‰ß·ŕmßkYQ;­ÚŽSK[v¸×X¶q{ŘÄ9âlżůě:#ă2Ź_Đ’Ĺ|\,š÷zTu¬á˛…¨(±Ź_i˙„˛O–›ŹϲAgŢ=iŐůĄ†§ÓĆĄ„ř®űa}©q„.
…Ů‚—oŤ°iď…Úm°˛–r̲˜Ř‡a”&:×u˙‰äΗ'„ŕÜďŤ^´Ťxą µ&ŕ;b"ćOŔľŇL:ŕ‹tşJÜë(,w+9Äő€ŐL0řZ˙hü ;
4ä Ô˝{(ë· ďôL„Ó§Č8p±jüáa1ĘĎeŚöµ—šŻyÎîŐ‘ę±€xv×h–˛z.yĆk×÷µxÓžýUyZ6‡ű¨Š»!~ć=đČŐł(áś±EYËÓđ:GîĽr^ř¨čé(dZRÜÚőťseÂő ĺ+ęźe΄h–‡´ ¶FesLˇÓőĐ:őÎś
ŽW©ďč
łá‹vĎUo˘i€Î6p¬rY!Ůł
ěnüi¤ű€·uť ők)TT„ëţ Ü#ŠVO´‘8…/:ő;Ůgš5ňZAj >´EŹ|_Č*ż–+Ĺ RBšĺtKv€}­˘ĂÇb׎ř™p˝g<ŹYߥ[ü2ůůzňŁÝÁ± €ŘÇ)îŞČdľXE p®$ĎDč7
r¨k?‡š,Śô(ŁÉr†K$»—Ë#tżWYÚUĽčŘţ5Š \„ďĆm$üŞý̨煚ËůK†3fŤdwŕl“
Ú˛ŕŤďL š~¶ŕ%žy˛d7x…Ě!‡/R+˙žKBásR5¤3Ţk6»E»­ĽőÓßUäĂ·ÓÎŚţń;\ĎA•ý(EÂË Řτľm­ĆźŠ{{G+şs”HÔWâňó*ʡ:…ö/™JÚćš(ü±°ŤÎÄŃĘ$0ś8*=×Q™Ł]ü0˙ T¨Ť,›ż¬;„BőÜŰÓ6Ýŕi‡h¤"÷Çět±:<éóq6˙&|-ś›€/ĺĆÎę»@eČu)›ú‘Ńóe»A#<ÍÖŐřjxľ»H¬\65‘6t¤ ăNÁUÜđ*y6Ü«Şűɉ5¦­—Ą"Đőédx
ÖÁX•2;ăöťő=ű˛‡uţÉře¸1…k„/ÍŽýTOK^fuoIý&<ľ>ýUßÔ”őq~;čézÇ=st1ĂçÉAx;Óĺ˛]Í䚛ż–ó -ěMÇ÷{-ŠGčÁ`ű—x9¬SuăéüźKČŢî—‹JţosšDÝ\Ýţ6䍭TÝŚ]Üţg҇¶î¦˙@#x%Jż3ZÖ°‚Ş n>th=V˘Q*OqT=Ł„Xj9ęY*őîűFZ/# ÎO~÷ń}éÇĽG­Y0çĂ2˘gFŻëĚTŹé×۬##p÷OBóWgM F ˛nFc
Úł­Áîhpşci$3ö¤Öţŕ—ß^bŘ“V
RY˛-ĘŠąť‘ęä“”gÜkýpŘčÓ«Ňä«Öĺ“Ň›‹®f"Š
źjfÁú"ČyDŽ8†yÚ¶cŠŁieÉ>‡ě;=Cí ~yáµ—íZźž–ŹµĆŤÍľ‚:G<Oçâ[ ©ĐS~qfŁY[ťÔˇ*uşZx‡Îć Ń~řy ”˝˛J§Ť~ZJ±e:zĆš'Ëí®\#“¤y‰ ¨‹řtθC/@K(¸J_Ť^$Ź
> µ3szDŽ}X
ËIk*¶¶nDFíÓ  ÄK<MŢ€ŹŚ8ý49µĂN–C±9Ż˝ŰÉÓhǨ¸5Ŕě]“âP(í8]$Űlc_“Ů+Y›ŹV“›Ć×·ŕ6óA÷®4c¸±RpW›Ľ „ÔU÷ÉÁ.FÂ[˛nŽ?´iä>UË×Ř'Ů
"ŞĄö‚lsÓ‹ç–©ř…°€ânµ–t'ö36$Q8ĺÝFVĂŤŇç G|«RüäpŚßr¶jl?pî÷jMäµW¤(°üéÁǦŻ4´$ŚŔ੸Y(Ű\čj‹}ě,¸á-řěű˝Ë`Ć`śŐ[v€¦wŘSíę7P÷ŕ
ËUµ…ĺTv. N)ţRĹěFÝ™
†?ćm5{•‚u˛˝=ď(?$dc02řě=ŘspŕŻ?oÍg1Ů ´ÂG-ÓOę4nŞTz>Ű“´-JőŃęÚ#cŤ5$«Ă:mĄř‚tŞßő‘4Š\u‰ëjQŘj·N
h¤úN‘śA‰ťµ×:r%–žÔMíE˝-tŐ´Ç{MSą÷źĽ˘uP«ů‹ťwß"ËÓeF?uČ·jť-Ş.ä^Őc'Äyl62ťŤ
xýŞŘ˘}w'ĐÄöm{#9T‚‹“ :sőfqŤ©ô–eÉHz
 ôrż›(¶Ő¨‹X±—KĂ„6mJž‘‘·éY*‰´HăءrĹkĎý@WĎţ¬ ~˙ÚŁŹąlŽZ ›»ÂçÜa¸źÍźBńÎ)ŕŐ-Ęš7„ýˇŕŤ8™.H0]ŞÉHBú~}˛?=)ř3Yň‹‡bu 9n¤Đpüp!„sďÉâr$¤ \ţž/“Ň8OĺÇ«ÜGę4&BŮ(4jľSNóíS­ Üöăôś(!P”7¦ 0…a(ó‘Đ.ŮrĐŐ hôBäžhH{ŰË>„Š×¸&ŞĂ|#mĽ‡»c‚C6‰ô㣢ŇŘ6łřă|·[äĘP}ß5Öµ·]\wöst”˝ÉËěľ5ŞŁKĄ·Ţ=äĂŮ'toŕËęiáÝdߏśBÚý>2ż ÓÇOgŤź0°0¨ĹŰTČÝ—Îüe<ňĆÁ`žAc^ÎĚÔ<«rG»ä5aµ‡ü:x;Ú2©ŮbwA»[o˙4‡R+md›¤X@@T˙ÇOq/sS÷˙ńŹWЦ·ž:öůĆqŽĹ‡ÄVjj:rű…ińÉíTRiUś±e»…Ě•ń6íµ«őu(**šB<41ńš6ásđŔBŚaÜŰűPÇ»—i9ަM{řWY/=/=·ŻţŁľ‚0F=(‡ô[ČýşÁTżr¶ĐŰ
ö´;FăÚŔťęđ˝,‘ĐŰĂeđő…ŐŤŔąwé}͸Č?ĚĽúęý'^DŚ3üɱßv%A_ÓýăŻY&!hw!Í˝¨ĂŽy)GżĽČ%‡#GCľP…łc#sâ&ŻTY>Ü€ň c_ďCîđr>Ěžµ0‡Öą°ú“ľü€ ˇö˘€ý¨!ďR€zi&ßî[:C®/ľpŠęYŻ©Ro­„»Đ…»čä»°Ż?ÓźB!ďQ?Ůó¨Ëwpń±o®qđĎńńÖřy¶Ú|­ĽśĘ-˝Ěä„ËoYěëV–TPń•'ĺŠ)8¨µě‹RS=¬ĆŁkŤĚskg¬â$EľO”NÇ8fO"»§ĎZg¶qgřl=Ýš
=č÷vň‡˘đó‚-–2×di(Ňjť¤ç6 ŚÇlńL×éěmdJ-|Ó„±»AŃ#Ü,NˇůăOi-bÓRNH¸úč(·8g5đY?“Q U_˛NEÄB«FQ>Ĺú—JP4™–ýľnőf)µ ŹFC\ľb–ĂqË hj%“‹x ýž~Ó@Óôćăç˙xŇ ¬Úťką’” š•Ž¸»ŠĹĘňŤ§nd@l‹˙śn¸×ö€dOpRŞ@_úź˘·´ ť›zŐ‹ţ1vĎ˝Îýbößµ”§Ŕęćî´ŰX*cWÝM”bĺe%1[’Łâ*đÎ)"*ŃĹ/ěA©nN`6…˝7X>“ú¸wŮ]ji§_ŔbOšÚçó‰R(až^8äe‡¨
”·N-Éâ.ł#kťaT÷ÖR_;Íł×AË Ň%J0AľŘPS@ť},M/šy  řU®x–Љô+Ą›NmnáSDeĄn3µK6‹‘ż“-i‰–ž$®sŐ ăz±ôý^ŠśÜy®,U¬¸4'ÁIŚĆŠ+WĽĺPü°H"*s Úi­[ő±#ń®#Á¨{•Đ~«ÓäąŇ!Ź›)?"Ů52[·ş¸˝Wr’ěôăş#*±ąŞĽ<°Â0Áx5˘ Ć“šjó2ĽÚ»t9OŞlĽmĎŽÉf5ZőO řÓ*Ăző÷źĚnęÚüŽŔ]âM˝F˙ŃŞô!ĆŠN-ů±ť:3©ňWö€A}'/®¤FUźÚzôćNŽP̰—ąt§ĹL7U.‡x9l
­ÝŮkËiş1Ľ´›łQGuľÝÝ&Lm~ŹCsš‘zŮá݆ȴ˝„=tj,šď@Aí-Ő:}Í{Jľ˘÷véá<q}‚Ńx ůĘ×(§OuŽËî¬yé4+6Ö’ÇŘč,u>Z»‹”sŞ˘^śo†®?cN`T9ľÉqŮĹ}Ř®8XĆŰcRďzIú3G’áíşúźŃS_ß ‘?
ůĘĽgĐúŤÚ"O[nб>ßßüśu#Łë§NkĺH°Óž-§ŽhµŐŃJB2¶•ŇUĘŕň?0ÜÎM7_ĎłÜÚxŞ˘_I‡ň(§¨đ±"J8jŢ˝:/FŢ‚FĹăÇž2ÄÔçҸ°wHp¶˛`bčő\éíal+Ľľg‚ZäŻ÷¤ůkÂ^ČÇďÚ 8ž¨MŃKáI— d.ŕ|ą’<ä“&lküáU­‡O5'Ŕz\ĐŰ`ľ'{ž.:L°†ëh€KęŔÔKT`îĐ™>#+id“iúTjh(©dŃÝ°Ś»:ćđlYü:ú•łrWLM˛!Цł˝Ż´‚)}’|•n^ŠŤĺo đ«s}®<—ü˘ŽĹU7čL;ôݬł¶R4hął'{ĽfźvTâ¨vz/#·±Ô sşËÓ8NĺCŞJ÷xŇĚEí*+)ôŁ;”B’ßć»g."Avôx÷5ŢÓu…s7RŇ=–Ŕ
ÖťCşxążŮ9X¬q>\G`"#F(Ü+É]ϧ5fO’˝¬čzýZ=^+Rčö
4¦k‚;h·yŽRŢ,tpmű˛ĆţÝŃđ^2¤ě8°a2k
^ć]âˇhc‘ŚŮšyîmqü«­˙đ,+ĂĂ*ş˘÷cuŞž‚&‹Ňš2Í̢ű\´Y=,@ŁÚ ŰĽíQBĎ#ľ›~söýQ†$Ćßjš®–¬˝’Dp?G+çs±ŔË÷8^ěés¦*Ý7&Z'.ĺŕ1#ęұi¸sűś¶*Ч^
âV¦=ÍŹž.0ŁCˇÉ uD07m˘rĚý1’Š{Ş5Ă*Äę;™­şfzźae¬nDBÉ Ü7˝Ś1Nâ„©1U`B‡öČ˙7¸\z.oŇzH?AS× U‰­A[ŔâáłŮÔ[5;)íîŔk™đČĄ:ś°3ĂPGÓ—ź§ÄYş4SFµćŤŢŔŔq§t°µöGrO€lçŹ2צk++@/ Ŕ mâš×¶uZŃX·Ąä¶Ąäµ56ńÁ¨Ę–ČrŽij]Ѷm\ÍD,0.šôĎ“8-}XĚ?¬}ą™Âß đkť‚4 Ër;Ć].sá·p+ ˘RîÓŐf· ÷¬‰qq źŞJP–čú:7žµóĎmE·ĂĄ©‹ ¨r$7q”Gň'ÁŃ4X8Rźúa»$—Źx+<ă@kŮ*Űů‚<yśđfŇmt,ü‚›8hÎH
5ŘŮëV|‘”7»±3Ü5Ď·FżńÇĐZ…JOŚ:f~h(ĽxřÂ#­‰<iŰq•¸rĺhw`XNLaë¸k#Ŕ+{”ž…ר¸‹µÓôD˛p‹Ď˛¬ÁËěâÍX€ä BçČÂkŰÁŮ AŰ{Tü¶»řä»IëŚĹČAGŢţŞ) 7WxF­<KglČźUPi©Ń¶ó‡ÂL1:%V{ŢĽ±Ű¤Îm Wm® IµpˇnH
…Ŕ]Dzjj?¤sL2÷¤čÉ;ďB}]Z^
<Üš»KÝ?ăęÁÉÜŮ\µeŤŕżIîŢËď벇í0ř9˙€˝î éë…Bk‹ńÖ)ŞT’áiaŔ I_ÖP6_WuÝÇäXŞrď™<'ońâ®mÔ÷śęĚě˝ŢúnüimŢ_Qó= r»×Y9—a»ő˙捅ŰĐë•fvżqkßÖ9'J:QB6
ş…g’ă}Cç"ă9řÓl—}čA'őν$Ů%ť± É@üÝןTĹdÖ xőÁ.ŢbWJÉŹěű“ó€§~ť~X¨XÜř–«d.ě’źnŢŁZ|Aľ¶¸&YíBʆžâ\B1?6•¬‰ÓEĂd˛{=Ŷ‚ĄKą^kťĂîqů#6ż{‡sŃĚĽ†µęFL<ä­Ç^B{®-łQ¨+(YK^›¸;`ë˙aěŁ$ ¶máęŞ.۶m«Ë¶ŮeŰveٶmŰî˛m; ]ęÂëóî}ß;çÜ÷ÝqÄ™ącÄŘ9ö\s®˝bĆ`ÔĹÔőVßP°±ńLęh6}L-=‹7Şl,-µášřĺ
ž—ČÍď%Ζ6ä¸×« —ş2PĽ›'˘ŤřĹí˝ u‹"ŕî§ŕżăśâŞĆż_…˙cš˙năöŇăä
ţłGŇm ýR~cŃJŤ şx( v)~& ¦ˇI …()ß,ж;ăx®ľu­tjT¶±(ŮÄĹ/€–ÍEą)w…F)ďîu;}ŢĂűjîîĘłM/üłqúşŰóŁÇó^AŕX˛CÓşĎ€Ž déčÖe¨SŁčhPsŽU}xÄlő¨Ź\:´>żÜyŰ+*Q4üŠ{zÔErîOĂě.|ëSAč–»÷éŇÝ!NsŻlGĽUÚßŢúA{ŐE=Wi†"kš`•H;¶Âi^â +ËGÂÔŠ™‰ű(Žďău žŚĹĹ•‘;üU¸Ń GŚiĆĆT}đňď¤ř
öT`jŚXsUď°}VâfĄ2g˙Ü˙LÎű™¦01Ä(#ţ—,ŁOśUůůČ
¬–Đ»Oăúm1ř÷ťŹµ©úŕî*ő{)#úę _
týŠĆ^""óĚaüj űĘ7<ó[zŞüíLJşĽ:yžŻ./ŻÖi‘ÎxJóć†ůPnZPć_Ć19Xs›ŰŮóÇ”?¨âş{ŠęZšŞŠř‡ĘĹÖww×çÓ˛Ŕ§Ii¶pb$jlAa// żűŘž0•¤¸ŠŽî,­!“ΗF`+K±ŽA<ŠŞŢčĺĎâÄP€Ż¸eD$%… c±÷“ }}¶$CÜ76…ĚWk$Ů~qŽţ $w
»—k-ąŚ@ľŻra(ęÍtýůQŚĚ>Ä[Č\Vrť¦ľ$)Č$WĹ/˝5čČźŔöŇŔŁ3+I‡cÇ:6úřRĎć–#".†ĚęM6`Úń˝§,)•ą•‘”&Jh“
Ű“ę¤ÝôťOtĂ Đt®ź;e(ÉýTRmAÇ–ćĆÓýVqĹŕí†1:•€\q%¦ŻtÖ(Ąq"Ě#ŹťlŠŇ7
ëďŔ‘ęâ=VÎl+*Ŕ—} âÚTÄěM VĹc„Łq”żz:ę”P%×}ßÉÇ&¤?‰o°U?řÉă­0F˙ˇ*nxđb,«óš#…Ť©Öą€Îj@–Č!~Üť]ĺ1(äp¦&…%ĹšŽU#u€ő–Ţm—sw—| U‰/%f<ŽŚßĆbÁńdžžsIŹKî~jW€±°ĂIřşeÚáf2±v“ÜŞ
k€ÇnT'vźB˝ ľoxŃE­–›ý3…·XŽÚ#†…ší¦O ß7rżçAc5gŽűG[ľ˙ü <P€ů¬Ţg|ˇM˛:ľ^H*Ú~kôíßâ|ú[I Ŕ—ÝŮŔcܨáżFýż§zµ×©¬kFcÎÖoóaÇeĽ1Y8;)=8f=°6msČ5(´‰ë$IGŁłß}N†2ü¨ĽW«¶”ŠÂĹÎÓ—i‹A¦3¨4-śvĄĘ2˙UhŇĄ, ‡.,G]TaW
ŮÔŻ5lGeY'FI”7îHWŃŤ Ë ůĹŢ ůM© BşAY†M‰ĽňĽ™ű†ö?‰RŮ‘–Ç̡GHŚnyXLůç®RfE„©QG+?gÍ\˝{43˛pBz®lěbSAÉQ%®Ń)ľ\şq2żeŐ*™u–y‰ĺl‚±řđÂ0L˛4śĄQ
&Ü&gőľî±–€6=™Ĺs&1.ůQaHiŐw5É‘0ę’…ŞbëBńęůam%Úúľ-mÔČÍŠd<N’ů"%c.´Ľ0˙& 6Ą8k­\ţ_°¤«fĄ’ś›"‹ŽÇě2Ƹhóĺ®…«Jń¶š¨i{bŐiχ<űÝ#˘Ęöń×Ĭ
Ocöá8ʞś1™ťoŻl;‹ËĎNłwü‹®.±ŤK‡,ŚËI5 KéČm ĹÚ€şlčXq ehýjvOSÎ]¬ő{«
ăŢŹXp-·ycZćę«ZMţí†{Hđ‘ăďµ™żÚKĚĂĘ“—iŞôó0ÓFk{TB¦žÎĽ]*5nŢňH­ç5Ăq“ž‹]YÇ
tM×Óç^Ż
@1Ěcę=NJă:ućm>s5?ťŁ5ő9â°îĆQ•ĹľŮîÎPúÓ‡.ŢIpx:ç®[
EY1ô©)XŔ«§©ysîž­ KUSýRýÓ…“Éʨ‡lZ‘4ÉDđ´ëLŃ*“Ż rćO0ۤëᆄ-¤jŘë҇L-~_Ȥh=«„ÓĹ«Čf<Áń¶4ÖÄ»őÔ1דä÷ĘY÷Q y˝Ś
NVN^ú6ëÉÇâ˝­rş¤.Důńĺő™ \ątĘo.¦,©2ÔÖťńrĂ>ÉčCj~qú
wśËÔ·`Qb¬Eě1Zľ ÇńŕQÚř(~‹k^Ęxö‹Ë;ĺú·bîąwۧŃNË®ą§ĘÚw˛BÓaŔWĎYőŢÁ`BRäŚFS¶©ś˘&°„͇{+Ţŕˇ\Îí/ľíŃt›ßŞÂݬřN×ďLŻDEC[_ @÷Żm·Śř
ÇŃ‚uC°Öo@âđopN˘˝™]ŕT~TÖuNţLÖ??
Ş}©©C|Vzb㙎ÚáŃŘdđáťh[€iěyŐfŕKĽč„@"ÄŚ‘ĐŢ>(°ť8”
őYQö·h0
ŵŘ·EŕŢ ‰=Bm,Ş ü{đĄ¶ČĹ9ł~r`*RSOˇú 0o8 PÍhň……bĐ4!ň‰TQ‹š‰âjń”Ëôźů}–(BZĘÍ šlQÚKůLˇ¦"…Ôt§8šĚ)¨Pr†ËŠs‚˨í0ěG-1-¬©·â—8<^ô¶5%Ct¤ #<W¬O‹¶Ćü=MČeőĐmF¬v°úA5\Á´wXÚ¶·1Ľ$;JĽ>q÷ÜÜŇqűĢŻä"÷D„©Eš’ÜχĂá-„cĚ®»Dbn] PÓG*üĐĽŽ»ůT6ÖĄËďň,$e6Ü Űď'U3đ.!ÝŔ¶ÔŢlákE‘|;ĐßIůÁUşŠĆŁÄ%Şpŕ<g‰ř­J2xęí Ňýź<f¸%ż0i,śMµóŻî”}<M÷UkO°ă'pQęużÔąb\ß­aŘ -uYw\u6­©™®ÝýľiěJ«Mňş­í°q”:Z⤕4XÎúRťgžŚBë:Ʋhę,¬y!V39”Ü"ŰŕjŻÍńF\Łz¬pkd¬@ëş®¤ŞÉďęŢX5±čB@]‹żeđËVyú#šukLÄoGžĆ÷fK=čňĹ9ôůĐwu
L#aÝ:!6,vߥm|yđČÝ\ÝÝŘ•“ôbgŘÜÜë˛F×H™W®Ź•4×1<Ă:zť˝ŻšzşĎřOÇ}É[ç&lźës&v§o·źęŚg!ŢPßi
OČ龩ɧȎŕ”:“úâ–¦Ő,µ1Ůşł>3i•ÄŔ'ĎIĘŘ—]7J·€{ďÓBű"'i"5Ąx4ŕ‘Ý8\ď—1|¬!QIďn—»$¦d}XâĹ ä‰ŢĘĺ\5S‡–Č~eŔiţÄťŘĚaxžfx^ ~L°„&—Í䌳›:PľpBî¶Bą,ů÷7dë3Čů Í˙˙ćL˙Qzţ\Ďr4¬Ýq—Ń·Wq´"ů¤đľ}S
űÎDD»&
M&/ŚĘ ÄL,0*§3ş@Çš«$AJY€ß=H:Z’îNd!«]ÍU çVS»ěw%áîźoJc2Ůx@ń[[ŕy‡ő4·é–űŹŔăě—ŹAżř»/v§Łć°»¨ŹĆđł(Ń`x¤1˛‰q8 f ¶ś1‹‡˘×+ŐhI‹(+ńA8”ΰ \‘Cˇ©büŔsp¸+8.ѢtĂmlxŻŽĐj8Äń%qç€ţ6Źĺ4fäˇ{}A•}@}ž‹t×<ĺO!Ţ<+ÔýNIęˇ_ŕű«ž×–Óz­H}_~’]Ý„"ššÔ¶Ăű™ş9Bn†ć
,µĚAËöHË|×),—źs‚ůă1Đ78»Yzޱö!?…ѰFíbŞË7ă->ñ(Á_¤ČÔó(9÷´šĺäWČ<lźď˛|p°T&&řŢO™GPt˘îżEăf§xfa:Gý°ŤÚćlxLJ‰ŁLcŃM1+ÚĐfôRŠRrÇWť{ŰĆkęe1ć>Q´tšz|Â5Vó˙ĺ4¤ĂÖHɬVţó–Čd‹EÁľJ×>ŁŰ&nN§ęÝXŐĐËěßȤńˇ(ąeäJŁK€ĹňÇÍkŽłfőAj×Č+đŐiŚÍyäŰsąq—¸ĽP JĆ-ËI˛eŁčŠţ)ĹP Ƭ«oč2¬†G·˘Îq'€zCx‡ĘŤp2|š9޵µVÚď7‹© Ĺr˝>Ĺ®ďhţrfÂŐq|ŮfâAvLá™U´XkͰíČtÚŕ΋˝ŹßhĺĆ­±UÇÄđ9ýł}ŇyŻŚÇ€éj3 ŽŹ[Ż$Q®ăP+·V}ȱU[„Č8ŻáK…ĎhÜ6˛®Öx•}~ţ­?ŰýËëw»„‹ěd;bÝąľý™‡Ę°Nˇ7î-U7 ŕôňĄ¤Ü?ô'«vŤ‘K§<ßE»kw
ĎÎ$ň»úŘ-Đźđ‘ç3|٧řPáĹů;áe:˛ éŐ©!“ÁF)ŁĽ$.ĹŇďŘĹmě)qő1J.Ěź.ďč§`3"ęD­dý<»%űe/˛c§/Âc»ĂÇtťĆÔIr1쪚M&ČĐN~żđ,Ńj{đ‚¦˝J÷łŔŽrSK!Ĺé{-ěCÇŇNĺüëëAX(¦Ĺ7fÍ6÷ý.ä9¸Ů1**»÷†Ëo!hB/“¦ĺkF˦i–¤5'á·¬ĐÁ˛i#śO5ç[dz;VcX¤YěQ|ćśŔâiÝ{č
쇫i茩W"\rɇ«Ő ¶e;źŁAWjmďĘë2şsŘ*Ć]˛čÓŽNu?vÜÎă!­qoAy
>ĂcNN:­“ŕ5ć˘aj©¤$
ŻÝ=I9B4zÁľ“_€m&Ď»‚^Ł@CÍEÉ@’Ŕúň;K㊓w4îń–ž…|IĹ@·šŰOŮڻҨ­îoŰąx®mÇďCâu„ł"ds7}Pż§:Ňáµaëµ@?víS˝4ÚôśpŽá`c‡‰ĘËëc'D,líÓşŕ
6ul=‡Ô´őťRRźuKŽĹĆO]Âż|×F×7×7Ł0D×vҵÁR:=!č+n°C”ˇm!´is…¸R,r„¬/ŕHçÁy©t¸ Ł} KôĎwĂí ďąä„i˝ěďKÉ—tN‘ř“ß°čMéxĂÖ
X-`Ĺ˝°'i©~izâĐ­DL«3G3—5dÂ˙Ú2mjwabýÄ!Ů ¶(¸Ć_L×\řBwţ ëśÔä'0w4]fňCT)IIČWĂÖ€Üí#îĽi:*ŕuh5+a¬ÂÝ-j‡Öh óÂęW.®1ôXŁ ¸ŹşF'@9ű–l±—ýv[¦ÖÇvFw1úµ˘ĄnZZNXäÁ‚ŔůPÇG2ÓĐűlďÇMď«Ń&oćBsîö#+Č©­®ä‰\Nî‘LŃ/„ëpNďĎF5™–ş?Qâ«ů
Ěyátۧ}¬â‚P…ÜE´vLëÄ}.?/OZ+Ň÷ĘáC-˝:¬ËG˝Ú–*p9óß1F3Ndt1Cɵ++)Ëíř©qU»íëY"
OŐÚă~˛{!`aůtĺů=+)±nő&ů=Cęé+ˇçTL·|Ľ IÂŞ@N¶ Ęׇ%K>0Ôzc6eA^śxqRúęţm˛U|ó7u0®˙Á6d2Y{cCQKg'K#×˙kp“˘¬#+„ö9c¶˝ěRĺŘŇşˇÓěn}ąq ##„ňť¸9ЇJ6Xľs>I.ęKz@X ŘO¨ĆÇ
X(GňYËpţĂŕĽ6هéŇ=RĹ=eP…¨ ÷8…7ëŰý¨DńbË>§šÇ´{™G˘®Ő]‡ňę·UI+Ľ7f/żBâŔɸƧßö·śż•Á÷G~˝Ű1 ňžµő$T­ĽŹ éąxĽ“šź°yß[il%ŁcSĄ„÷–«č†@_A™(űutXhŤ‚a[7óÔb…ŕśR˛G$WRKTâiâ^Ůň‹ĹOg-áő‹Ľ+WŮőáä&oL‡›ňgSÝÄ%Y6Ň:G;ŘKúď!w˙¸«Qm)ŃŤAήĆTµ¦_÷lŐyűw‚*?,řĐpD~TĐm ŘŁ ľfź^ńâµű0Jč*>âĘ?z…?š}ŽľDŔ  ËPšZ2]B¤#Š 553¦Ăx
މN5&-˛k&04­Fó™=ĄĘţ$}¶QŇÜó2•ôđˇ\ëč»Ú‹ŕ×X§ąÎÁ|GéýW$$KăbC€Č ‚€˙÷ć§˙é’ áŹfŽígÖÔĹĘ ÇŤ˘I_
osC“ŘĽDď¶É6@­§čŘČ»N·=ecn­jŰSůŰ®…@­X]'.µŐ†jî@M•O»F]çósé4kű
Y}Šń5öůĎΡwŢ©÷édŠž?xżŰ»Š©qh=÷ü#ŽŽé!•Ú‘Łěh! řZv?Ť@bÔ ©Ńl0
Á „©ŹěčŰ!*M&P
ńPĹču†@éŰGť-OĺÎÓGhóŽ|ž§đz ÍGkDŘ]Gó’9ýâ˛3+Úd_îş«zGź­ZŻ"ŰKťŤ’¨“«
ÄßUňďjÁŔ&^
"_˘ËLůHÇP„˘2J
ăĚ\Çń ńďPc­é®Új˛
»°‡öĎ^"ö»yíÓí(*şRé ż–ŽđUţÜ‘ąË+lŃ EJiň[eÄVeÝDçNă“HCW‰—ŽŤ>ÉáGŚ!\Yč4…¬H—ÁkŻsŮ­ź6×”5ŽöÖśž9léŕ%Î
{ŞsMiž„ôHBĹ.ÇťimË"ëń—vĐë¶ŘŽÖ㻹8ZŹNµ{“E‹Öj;ŻJwš‘˝HÔ msĆË“ô1YŻA>®WcƧ,5±vć ?$ÎÝΧŹÉýĆ»mÁ®.)Ăz†—šĚž,~hm`ŘĆ)lJ¤ˇ–\Cˇ‡0ÇąéT­FłĹÁš4g”ŐR(±ݨ%6岥[·«^NÉżáÍes2šO¸C…žž´3.µ^+Í5ĺóäír±ă>Ä"–Ĺ śM˝ŰřŮÉ\ňň
ĆO˝&Ú˙ZW×ĺ´:UR>aĐnąŻ
iuâKňäLsĎđů™ď*č<챺ęA>)KJtŚđpYcú‘®UC@Á5áŁîs~LE^ă¶\” đëQi€=$ ][G#/-CźRłIW&9¬
v}Ä3RÓťĂ&Zé)‘Š=Çxe±ĺßvČŹ`.4Tes7ÎŽČqßÖő—WůÎxX†ă0'żę@¨±űür×h÷‘ņź=Çf´âŠ
g/2Ĺ@c3ZrĹÁť:ÉKđýQeç^–›ď¦;D‡O:ĂSĎ*ą$ň‚˘ű•ěŻz¨ŤšÂ÷
Ř›ľËˇżëŠ2öfü‰Ţ‹Ě™íÍc묒WSńkQÔ†Ś;al`ş–őH7üaŻř9šÇţn?ţRčŰ—÷»Äů$FąŘňŻţŢ©ž™ŇoC#ŹI˛îô&‡č’R„Óp3Đ۰}ć˛Q”3˙Ľ©Ć~_ĄčŕôDuNwHoH^ĆdXŃ„SEgßIŔŰĘX6ó “ŇYi gÄłĐ9‡†Ö)rĄ1î±^RjŰQ'¨éĽňÔ˝T—Çîß°ź<ú¤bş«
T­ź®ĎUľŽy“.ŰŢPĎdĄŮ{–ŚcŢČÚŚŃÖ„ĄÂ'KX7´ŞR«[éĘ<nhăF¬ÔiĄĚIżuOČjQkŁpT;(©Ěm\ÔŐ§3sŞŚ~xbÜĂ0l^ě)ᮌWS“€ľ¬dQŐáX]BnÂŘÔÇGEŚs±˘r6čmoćÉhť|ŘÖI^xżF­Ňťą¸čÉ›_.’–ýâf.Rç‡1ř<=Í…CRIb°ŻP'ČY˝n—¬Î`ł’äżşĆ toj%Ř‚3źźi?Ęšj6" €čµŁR0Ł+ďŃŇŹŹ6šiÄt!0tĎ!Ĺ#ř©…u±Íş5ţ|čÖ»˝ÂaŔ ÁMpĐ5¦ĂÝWcŐ ixç»ĎE'Ŕ¬/xńűŰÍz”ŻÍ—sÇ꬟ď3JńMnĐő9WLÄ}Wë…&ű®z{Ŕ
,ȆÓńŮ,¤<Ćb ż=‰v[Ś7|źá¶¦sçŃ“9p7 ‡ëd¬mëÔhuĂw4iŃ
BNLOě‚`5âMęţ-ÇÇÉľdµüT‰ö"…Oşu‹ŢFŢąmmwI§ż´9x›żGFłgAqú·ÓÖi†5ce2â\ÔŐł.Ű~OzˇY¶± 9$W®ľĹGµŢtJŐBÖuľ#“Ç7ąX ů9ëI”AÔb⫿ýŰŮI0ç0î0ëíćk^ YĘCÜ*~Rř™Ź?“QĚ(çŢř8öT‹ŕ6ň!mtĘY8^š»%­ÖއÂgw*×~Č˝@9đ-ź9Tś®ĄŢđ…9šü‡G˙Ü'ő6Śzz”v8r
wěm_p—śQą`íW­j‰fsŹ%ůűPO˝Ç7#B"ÜaYÖwCt7#R·Ô[
é®–ńy¤܄ݡťŘďžI¨Ď đ/Dë/P*ŻT†\Rf|bv|"lyä ŚŠ‡|¦uĘnˇŤ«TŢÁŤmĐz‰¸* –™Cü{tâěóBś,ămYžČwŹě.DÖH¤ă0 Ŕ/µoęŘ'U¦éu©Oűô"±ńřĐ„&Ő~ą×rS$˝™ß}ö’5é$óëW3$ż<ÚłT{)·†ÜH¶&ÝćoPő;
<~¸8˝¤š›Ú(°)V矇Q%‰rˇÄîBđˇK8s-žmN±§ż*nx3sw=˛B ô|;^®°)cW‡Ä˘‘Ą‘)x{x*
ü®‹;#6† '=QÔµöRÁšč=Ş/ĐfvŃrńôŚÜę4}BŚn.Yaz騸ą[Lô·
ˇţĺŻă‡ˇs? ţň Ľ˙4Ž˙NA˙źś‚ţS ‡ż“Áá˙ó–ű«fĄĺ¨[ĺĄe'¤–ĺf&Žhh¦i'¦äZŔ˙Éŕćďđ“ˇSĄî‡Ťů۰ţ6#WKz'ScSK“}˛aíÇ~Žłe»Á+¶ć–®î#řͱ0u őŇi[pîť ľéľFEbµŽ"Jtó^ńĽüfjòöhŘźb¶?˛NŁÜ$(ß.ń™ągđî˛űŁňhí>¶ĹÇŰÉ,oKj8Ż¨ËˇkQßĎUĄ˙ öýëÍţłď>âżr,cËńÜ˙G÷řńÇTľżýUŔA@˙kw!Łf»ŘŰÚÚ™ČZÚ™ŠŘŰą™ţßíU={!4~0Ř(ÚÖpŰšÝ9Äă"—M aI¨y áJä…á1SěU[48"˙ÁÝBF¶ůa½8–­xĹÔćGĂÓnďŰ瓝mA˙O‡pR0諳5v¤Řořł)ĎžÜřžřŕřbŹ‘ßşZ¦á'÷epÚŰ·€eŔĺ]’aݴؤ•;´§ĎćE®ö Účň‰Ů›€‚%`¨1Ďŕ…K‡Ą»^Ó
¤ázăÍłWꪒ‰ë.ď©°“’ŮZűÔď–ŻĽŰ3
Ńő*]rŽmR¸±ŽŃ ˝Iç©6´BÍIÖµ®'ě6SnB€d9ŢBckxP­Ô‚5Ă2?ÝxĚ3=ó^ˇµ~˙ÔŔ.$3ZĎYr
v5uč%w`+•Ą “ľoçĎÎ^Îą†1‡Şsž\ň° Ú+KŽÂ_.„45‡ő‘VXťÂ˛ĺ°â‹„0Y}nj„Mżm.K
öۦ\WSDˇ˙HĄsI `Gr¦#–ş)×䢡“S˘Ë!¬WŽ
ňYÂđČďG<B"nΫło FSLÝş\ÍŻž‰DM¬"b4x-KŹÖZo´d?„Ďv‘‰e¦ ŘĄşp´Ä9ÔŰAţÉŁą[Ä@ŕĐ6SŚ}Ó‹ĽÚ–‘̤+š©QĘ-ü#®NÚő
ž‹&MjŞě˛¶uw»Ck"ä ]˝čGZ®Šu*OCmźłSßߥ R¨â\5“ÍĹAyŠ5&9*XúBydÂ7ŇôĂ Ű6˘nĐöĎvU˙€"ËOӸҿ<ů/Ą±˙€â?APŃĐÉůŻNüĎlhh´Đ?΀ű˛hцu;î ·™UDű.6€:ěVNo *őŰ/ EE·ÓAŕAĐlçňĂt) JD4äĚĆ®u϶&˝~\nSZďĆzšŇÓ•ô6ńŻ
ĆÖ¸Ľčß^N&6 )iH)ݦCŹ^>8őLAţî®Ý4ťâO|ž ,ĄqX˛_HZü%)uÁ
ćc~ľ íĺť÷ó˙›>ĂçßÂNYżüoŘ=C€€đýOţ«śĄłłĄťą‚Ă?ô°“ąŠ‹ˇ‹éf
ĐĆľf9:k.Mň‰zY0“{ŚĂ(™ĺŮ ‚4«3Ř·U0v»ďFq?ô% ÷ÂXrËčťqeFS)®ąf_sV›˙·Ł\~::ó‘Ú°Rxůr
JzŞąő´(3î;ÄȆ+ĽŚ(óÓăZRžĂćü5|ZOđÓ¨m}ÖŽĂ3„!ÝőĆŞ‘ĘiÚRý-ćLµ*G%j\áçŠŘ©Ôż"‰áž1†„[ Ř%7š©Qĺ Y¶÷jl®\—ůl'í7¶ MËŮá*#"ŢŔ/ŕ{špĹW
Ü·ęÁWj_ĺŠI(Ыڷą.جúK(5§˝Ł3fęŞFáÖĘŮMvĐÚŞXúH±S-„l\¸<­~„ŻĐ;bŃĚłě.Ëw¸#.â™FP$u
·;g)éš v¶ËŽčĹĎ¦Ł»S°(bóí4˝źbýfăŁXĽ†Í´źD†”ď9ę„F áa±ëĂqqfö»äŃBŐŻźOᆕi¬SO;?˛ĎnL˛Ć\~EĆçvJN žJšˇY#?côEQ])lńö4¶ĺ[Ŕ±†Ą¦|081716ɵ€%±ĹýHĎ>ĺŕźbŔ8ž Ŭ;–ÁmA#"—”yQ/·|Âw…DMńUËhđąĘ#XWŃ^v#e*řŘ V®KG ĐHl˘ŚŻ@|°Đ
žä[Űv†k\Jň”b¤ L&{čQňt§čVAÎc,ű‡1x‹íhů|ü?”bg?ŰRn®`Ť®ŞÂ}DÓ@ĺ I'ëwëÁę?ZMô9ŐÖ¶ę'őK\Ŕ“ôĹ´fY%ŘÁ°E-¸Č-_Qi
żßcŞŠ-°>ŠŇ<!ţktW˱üĂë8řďÂĂ˙?‰€˙€ľŠ‹Óß0ř{ŐÁĐé˙ž€’Ł:«€*„öiÖijh[p_dФ] hBM$)^Ý€Ś
±Sz]
§ĺ6q“úR×?‘é}A1Úäź|7íV#lmĹ岓őÜëy»iżó86˸ ‚v7ŐŹtŹe5ßo< oIçIUË´Q‹ŚUŇźŹd§ć Ěý˛Ű6ÂŞóZć«ŐŢÁUjˇfŃv´@ĘUýCU¶`.y›ó}Áő L'¦Ńۇ„ąť@ÄhŐ‘®Î
ŞM˱°ÝnťĘ¤—$€-«ÍěÁȵ÷ěŘI‘†ó˘ßRZěđ9–̆YIJ!•ŮNxŐă9,GFúbć'é#ż‹¬ÂBŤí|ěTëZ7kđ7Z UđâÜ=Ojx—¬b!Ą^ţy ŮúÁ<™! ©D4ţf¬śţ±qBHŢÖşVŞ<Ú»ůhµ[aÇľ˝l'…/MhŞĐPkĽďů3Öt_§+Öž»î¨b™ź`Ń©ň°č;EĽ™¤Ţét˝ăe§r5=Ćc ÁSt&Ö¦΀á ŔÇě-g€…_8Xü_ ^Z¦Ëp#ĂÄRégű÷/Y„1¨0šqÉ„< 0ÜCEg±{Ń0AbqG2‡Ŕô§oťOČÚ6Ţw·Űť©üÁĚ9¤3:ëÎǹĵ-˝ÂŢ“ ČŚH^ůË–>yź"ýĚScńLJéǨăRhŻhęždÍ+v8ČĘ;dĄÂ‰Ľí"”NUă{ ó“$aŢGř$ą1á}ŲŃ6N@ü7’¦µ‹×߬¶eZ‰TňaÓ‰ÉYęLěěJűrŤ|‰IżSY·!\`F+ bď™ůîšŇam ŚMXŃ…żńE-m|S˙W¬ź‘ÂßK|ý’¬Âúß™ÝŐÖÔÎEĚĂŘÔáźRź ÓŇ`Ěhˇ
o¬E-­Ú¶´7Íj«)AáALíő%\pJ2DYX/¬;hÚß|¨ĄdĐé´¶Žr·ţlŁŢŢ˝AěÁMŁŔ¬±nŠm‹÷sź•ń˝ř+V`*!{}¨:"»Ĺľ‡Ęp}WË!-…pAł,9™ ©lź85"Άě
§Ń<
‹Ť!?…{§±ÄV`ᎇÂ4ĄG<^pĘěŤŇIYXTôé"5§yü)…ŁČx]q`Î×*”ú]‚ţ˝¤wJµż¶ănómr­â[˛R±phţCśň•ßtߤč/ăÖvQXĎXłăSßńőr~»ä.v-ŢČ
é_}DĆ’Wq¸#¨˙®`®ZxË,á˘2Öc…«b1ß>ĂöěéşžąCëČ«çßn¶7„ljźĘšŞ„·v\t[ř7ľ!iń5 †ú?śděěÝíţcúŹ_ţiŢÖ´ö@;F÷ë3IҢ„‚Ş—eĆ›8#~‹šk&.,üŔ•ŤnŢ0t—…ŕdÝĚX˙~5"­s˝­?ǡîݵá(Ť"Ü˝¤__ř{ĄPáëÉóŤĎ÷m7݆ßÜĚ­)k»>BđĎiÖCÎíVŻóź™›‘Ż\˙o?xwRŔÝkóɉ‹PŤQd±‰5ŁĄîď=őmôńôuK¤°Ť…‘±W÷ĘáŔÝ™C™z5÷'e]Údú7˝É|ÔF˝|řŁ˝Mm†|Yzíď'ÚL|pw
owüŁ[?o!»ßă^^¸±ĆŘ®ő/Đţ”žžTŃy÷φŘq{ć˛`ŢAźe^Č«<UëȲ‘«‹­5O¬qOÂC’BÖÓB lë,/Ü„ťń¶‘-®›®Vu˘(W4FGŮXwĚÓßü¦Ý\ş(˛üĂ~tÔ í]LÖżń‰ę!gI`Ü©7aE”L9˛k¤9D¶ű˘B`Ď)o­Đyq¸ęĘż¤¦ř†µ8Ö°ăD¬ 9žŰŚ0YŮý˘`‡ŤuűbŰ ń|cäxSľżÔ¬÷yŇ .ŰłČß&ł'ěëxo*^Đ~Ĺëĺ9cő[Óń~]v!‡·x˛YzPô­:=kÉ&řůËđЦ{’Ą\zŻ÷ü–ţVŔ`ő‘Î:K×uÂRş]'h×ĹĂĐrý–*´5¶g‚Ź#hŐÚsćőÓĄ„®2ýśzź
~•¸‹{ÜÉ”Žľö®C•;ö,…Ë“tFZ#(ąxL˙Fu÷•««Ž3ýL5Ě$ţňµŻcóą­~ă±Ŕ8t쏽Ý/Äs­ěÎm™ýDRŰî懅I }Ďő_ľĐFT`ężbĎ9±˛O.ď-´ą,`žň5ŕŰ
(żŻL…5n¶¶m™żś­Â¸H ¨Űh8ŕ»Q­EÄQź · ÁAł1Ř©đ$ą ˝´}›†ćŃřPŻYYćqµÚZŔ_nÖ]^ľYR›V]ÄŢţp8|Ćç©oÜݓ⸥W8ÄĚŮ.­Ś#ß.Âćpv^*¶ŤÁuäŻÝ1\·˛A^¦G‘§ĺ
ŢĄiç¤őŔ™1’Lîo-dصćB0MÉăv9Î÷WEnš^$kŮ}#ФpC7ÁĚË8{>Ŕč÷GÁřŤ
śmdI·C,[‰wÉźµöšĽ2î?Ł|ćďĹ] î ÇŢ~Ü+Yş>f=ÄÄşięýGj“Â/9~ŻuV‡¦­s/cÇâ¬&µć
/›‘xŐIz¨ čн۾«
î~_2J©ÜCŮAn{˛
Ś%oŤĹ+]wžĽ•›´$z,Ĺdô
ě<ča±`[Ú°¤/łÁZ,_´gŠă_éhş>Ú {xUÂôŘÓńd‘Ţ”—UĄé§mać´ůzxkú9PüâŰ!ě žqg
©p术¦¨C}eýä\¤_wú•`´Íš˛îŮ™O3Vëü2+)Ř 0Nű%÷úř8°–çeŹ­ ±ŚźÍÇ1ŕQüýŞ˝±Žç[Ýl,±FXŃÍ o€÷7cŠňsô­zäh¤G‹c&óŚ:Ó‘ňŕ–DÖŽą­Żź˛ăřÁÝë~i¤M‡€…ÉGĽY–ľŢ ‹ąQRÄłzěó9y ÖŐ¶ËqÖíXp[ŞěE‰źóŔ€C‚Y§ń·ŹBtn—&-•~4'ÝDwh‚…qlÎ
un‡‘Ú™»Ż€™ťŚ`" ¦QÖ†şžl‰…
żD·'QŹb"ŞA•Đç’Á? 6űľ–7ůŻ·^A2ő]Ť‰ačqM!ć<ŻdעԆĄ‡hŇ…F%óÜ!sEŽĐ{‹E´b‹´Áů‹94uŃ*hÚĽ;˛ŃË”x‹aľoZ|‘4wX‘IíŇŮÂ5x1ĐŹČr”ż4žŚ÷„lÜ# ŽK†[ĂřÂkI/źU°qÉăzyb"Ăę-~9žyVă0Ä䆲9 hLĺߏŚZVËJÜÇA3ŘgŹd˘Ŕ%ä·”±¶­Ť )ˇ($ý.kĐĘJóŔč9¨vví}š‚»ł„‹·…tp68DŇR8ä°’’ńŔQK*7ómҤdŠHqÖśšŮvŕŃřMÓŰkPů 8âśË3‚‰VŽĘG!ÍĂWoń"ť;5NmŢíA%˝ßGn[ě€'%Źaz5.µdŞuć]Ó™żŞüÄăxÓćüýjCX8ďŠCř0*_lďgĘŞŰO·Ťęťev‡¬®#ÖżdVgý†›U¦ä|ńá˙jdĹśźčĽĆĆ#=ö&9ÄVHg“@Ah&T*ÔM˙ŮëŠa«ĂQŚŢüü ^{¸ôç‹L1
"V“Tż´şG˛Á˝-j•‰XĚń‚b$ËCł;4éŔV%
ëů…|«L÷yĂݵĺźíä–ŢXöl€j7"”řAľĎŞř
¦Kxîw™ÇzŃÚ‚P‚®” ‡jk$C0jn¨čŕQŐăs4J'Ľkľą;gŃŞŘCZnćk*Â…RĎè8„iÂĹ,]BĘö™.ȵ¸[÷±jCŁăźQ‰?qݰL}ˇíĘi†4ż,ycÂ÷_˙¦Ňń¬1¦˙r¶Íż*ťó®Qţ]ť¤¨Ů*,*˘ůŮ­Î+ń`Ů«ÁEápíM್00™2§éε܆óö÷Ł~öK˝\Ĺ‘änr8×Kď‹xĎňźrĎv<w7ű×ú}@(öÇFłť<Ţk žÓŤ#5PCO˘čKk&$üAÓ—Ň<şB‹Aă˘čłşŘbĄî۲9˝úB4^Ŕů˘-¸gĹ€mżVă§c—ݱOo­âߊ”śů˛ë¦vĚ×Ô'ěđ¬cOÖ‚•[é¶©32//B4+×äőjx7
*ŞŘˇ7çŞEN’NÚ;Y=“ŠĆ‰–ßńÁßâ»B‰€t٤÷¦ÍľýLČ·sAŚ Ď8ĺx–”™VVęz5^±†ËQ1D*‡; ú98~0ű›®•sŁôŕĐŞ/.
Z´hžË· &gµ8®2™|E)_ř-çŘĄoup¸wZdVVś9™˝ĆŔÖq·ĽÓ%–3
J+¶úíŠPęf-®íŢ»
Ę
Ő>ľëń´0łÍ€Î˛VżUwŰ ~–kž×8n„-zŹČCw…Ë.ąŔá¶ŁÝ­!ß ND©¤–FOď9­üŁĂGWŐu'±m‹ÜŔË.Î>ÓĄ4€A(XČrV­đj^cJ"f¤eć´V%‰Ń8°×ľ‡ŤĎ÷ŃŤ
r­ŞmYź- ţţ-řńć@Ú-”81ď{ŢĄł÷śńÄćÚ©lbÇow°Ľ÷”ť Ä×3nĺ+#°Ĺ/˝Ţv˘|Á>+Qß1™©ćrľÄuâ1…)u<BĹ}$UďAKm=pçEű”ťEdŘňl7]'„»%fu ÍSsY©Ęj ,e‘¸Cŕ^°B‡­›a g4]fżĺ‹Ą“
â­ŁŽ˙y±śzą¤#ăň”UˇnL^Çl&I"‰‘lTzŞĐ9űůŻrd´Lą˙7BěţňhÁ˙I„¨ŮY˙7,şGmRůŻŽççź 3dů…tN5µ_@NRR˘†¦Úh°J¦rxfČ”Mţ ü©+‰Géđµ7ş:ËŮYßÍź,LsłůśÝë{3}ôqŰv rä¨#wĂĂ4/T•Í”4x42d9%ęČi
ç´~K0'ňŽě>ŮŮE
w¶ą˛m•6é•ah4â“˝_Xr
“šˇă&Mn‡©!«Sw ~±÷G|7>«µĹádťk˝?¦ Ř/šPhÍ#J_äčŕ÷Ínŕň1_Áś”OĽÄ ®JY(˝8ÉJeĐ?Bko™ŃSą
6Xó¶J”S¸:m}Xđk?ÎýH˦Ov@IĎÝ5=ŰńŐ×wŠ‘–jăWćĚYĎŻ7V\Ö\lî$Ć{łäX¶)D.ěXćŰmF3ë’:ýÚita6âÄę^˛Ő{şíŘ76óSËę§S–b‹k[ś\ÉŽÔ™»Í(ü¨0ćF=ˇńš§śęŽ´#S}$ŞJ4„oČ? Ŕ(jazž]`ZFŰYZ$Jµ•0yŰçŔŚ4d۶bˇdĸµófřyŞúô3Úňmą–Y”páMŹ_ ¦Ü<ţĽD~Ź,YčËÖđŃL;Ď ŰűÓ2ľą?¤ůŠ`pă…ŕź'>ž$+H–ő™ĺĎ÷P_qÎ?AOčeg˛U( ć ţä &źŇşÔŻ´J˛á…ćŽ í<2ú&Rű«-Ţ$$˝ŻÝVżŮöLąâ@2`ă[ăĆłH÷n]
: züRp>*Ięôq¨ĚTôNŽúŚJÇş
0KpF‡¶M[Úł Trş'."Ń\S^ŻëLDQSżdd€ÔĹ-&:ŹJçHĹŮäV^†$T™®PCJůqŠ%c,ů‡'Jmô6:„9Ź>Jţ~ĂJóÝxć€MÍ3‚ĹČĆĚ‘żúýß(‰×„v"8Hü9 áߢGáź’9ę:΋ęHźÉX“
b(pĂűDƨ[ ÉĹŠPm?$ŠĄDňĹÔ$TtµNţô|Ŕv?Ö— 6« OąĽ
żQľ‰lřI¨›¬7Ę”&EĚä.çnŰ»÷ńßú˝á¤ÝŮâń2‘óÄrČşđîśőĂ™…>–zL‘;€=@o
ÓßyČŚnBohŚ…Äbg.*‚âŮ{H =čFóÇ$¨vceÄĄF˝QLŞŽÎRµRçŘý$zŞNhbíŽJŮĚ5…Ç’őŮÔĘŚ¬QžVúđ+ěŕ—éNJńt8ن(=…•®ŤLĄXsÎ!É 6ęqŘ—ś2(˛p\I±Y”ć~yę¸HJ¶U´ć¤[S5B'Ş­˛–¤Ă/Ízä¬IrBuZč¤,TßĐIsmAm4FuÖ`Ŕѧq>n•·4g†:n/QlŹŰˇĚ#o/ĺ$ˇ(źD3K4-‹ŕ¤' a·ŔdRa+Č«¦b°ykwŁö×t[M•·2<ĺ˛XyZ¶śř}ÓU¬UkÄf? »¸ĚĹ4®®+Vđuh훣‹ĂŔźŞ]W_"Ö_ĘžPµ•D ˇj®SZ%±1R˘Ď{j'5¤Â'™é׾pâs‘Ź·–“řłh͢Ę•áDů KvSşěsYŰŇâ4b`¦#l?«ęR”
á˛ŕžÓTt^_Ç^ ‹˛b9TŢĐZÉE óˇˇ­ÝOÖËc¨-4hĆ٦^úY>˝¦Ř>dťŮhŇH¤ ±ř5”&3L]etÚňĐ™ď­0~¬Ü#˛YhĆŘ/ÔÖ7Açm×
îy
· ą9ČŤţC` ;đç凰»±‚‰Oů©ĎŠnÜĄi+ďrá&Ě“a_°"
./ęó‘ů§µđ®!c‹Ě–Áţ©µ;ľëO#ŐŤíN·Ý(µ0§ýŘTw]ĺ©ę·źSš<Ţ„ą]^±ü0?ÁQŚ:Ý-ć\{uÍ&ęSópî˝…»fË‘ő.ÂJ`"ÂVW•°–ňŤylhˇđŐdȧ‹ --ůí”DXŁ‚ŞŇC®ĎçżcąŐŐČI0`đśăkŠR
‘’ň‹a'WR«»pÜş‚wߨL
ŠÚ­‹zĺ¦wźň˛ŽÁv~Ő:ËÁ0ĽąiůŤ’ŁxĆß[ůIđ’č2šć
˙âŮÜRi"{`]áj.Mh˘
—jwrÇG!0Â
m~b ‡«ýa9tUä˙ů±ł‘pčŚhäsSü…Ö9EpŇĄ 8ć+aÖŁ$ěÝf|đeśdi8¤ż„ĂH0}o_Ç#ż7NFŻU›v¬Ó ÎÉOłRçľ ™ćůvÝ`ďE•üg+_Ťň˛DŤ’t©”›d­ Ĺť„žâquŠîľ Ć—í¨÷[uÚ§şq5G˝ŕüą!×i¨{¦ Ę9Çp1a=|Ř*żőGľ_.¬Á
TŠk{iâÍLˇë%“›;Xiv"OpŐĄń\ď°Z˙Ů™J«ÁxnőČą¸irí˙`ý¦×Ô&sš‚3Ę}ęf`–ă7ROLkOíH.ů€účÚ0ĂŤ×zÝśź›Q<6anň‰Ö§Ţ(·.Ąç‰CBź0#řŻ:Oč‡(·S]Đě1pĆ}·°JÖ}ůÖł’tšý+WmW·AZ7Nçh'ůŢ0<ĎÉ?qđ˘Y0K]uĎ%'~km„Ú/§NG‰G'řŔD™?˛8÷?&2ĆQ‹…gě3púI˙xŚú€—1®sůj'ťŐ˛áëuÜŐď8ąPny,8z˘KASv··Ţ[ˇoR­Ô–Ë×öŁ0&-7€ŞIż®)ďŚčŕšú¤,°kt~2ţ묞mŁ;[ö
¤ôżÖ»ţwŞáżˇÔ»ň7i5ąÉÉ5g¸GS‹Sۡý$#±ř“Ŕ÷Â!¸7S7Ł$˙*ę+Vx{+Štçř† kéF0“Óuš;Éďţůţń·‡ôÓǤţ|h¤4,1ĚpUˇşÍlRém цüü]¤—:Ąű‘Wx÷A^4cÄlëX)ËÚňö°Řşw"Äp˙ib\sŰ1jek®n«EY“$—,jlZ3L¨Ü“E3Qôćąăb] ¨óoĎO5Ő҉8Üt2öÉÎc…Ú3…Lúoc1íŕ^EŔ~á†ĎŃ®'#:}Q ĚĄ
íLŘ îÝ‘ZĘ”Ź$®Ň±
Y4°~°}ar=ÔąÂZͬú&Ł}÷Ă}¤¤Y†ş÷o
Ú9]hE$tßâMŤ M_Żóš/ţŐ'
ëW’„!•Ią× ĂUZ¨±9‰'x łŮ“˙Ŕ«T`đz˛‰ďW "Ú©ř÷—¨öfşâöpjCî‘ÂiL:gS:?áłč‘őľ‘(ŇAIľő†ÔÔš˛wx+Ä_¦g6†3żü(D
źţ-ŐŻăa—žü— Ź!˙?—ô˙ý˙ÇÝiÝWýS|s|A´Am,vBm+Ő”@6çQuH!‡·Ií(ĺ 
jM˘ož<?ˇ#-S0ZRž™ęËM!Ęůr7
Ô@ęĺeĹ‘Yigfd=Ýá~ć=ő1ďXüü3&öÂ´ŁŹ
€c
DŠĆ8RJu¤,ďŞ."’ĎŮ® h™”Ňhôŕ#=ÔÂΓÉGÝĽÓEÉ3ĹžĄĽíE‹béMßk`$ź‹M3ńá´Ărôëţ{~ç§fŃM!ďÇQ·ß¨é§â#2zéŘťđ±7c8ËCćĚG†Ż—žŔ~â%6äÚl}E®ČÉÄsĄŐĄh<§"ę"Głĺ÷Â^ł6AÂK&ür­vfHRĚO‰mS)öČ`†ţńdKtȨTm*Ëŕr_ ărĄE(´łŁ;ŚJgAŽ]l42·Zks¤ŮÚŤzÉüKµ™ĘńŔhH0B| }¦Śö¤´Ą†Ť ~[ä˛ŘsQ ‚ątÔYn+Ç@lĚŔ.Nęlj…:»ž]†˙ç‚řŰŚd¸l:¸śÇ,Ь2ę”ýúNNŘëW¶†ŚąŞ ¦µ}ÓČq6Ep’4±o]ČĎ-žq«ĺ]–˛Ű‹ XJü6ÍvôĐăĚŐş…$ŻăY
Č6…ĎĹ/ł§'" ŰB˝n­’#×˙Ç››ćčď¦Ć2ćbŁ­Z´/O6?QWFc+` ]XÔďâM5ʡnŞÜ:¬dάxŠ+Ó`2%kŞ5bĎŐCµ¸Öó ´..“ťź­tĺ)Úü×ăÖŹóY+ŕËU‹ve D¸ś©Ö”]Ť®ŕĽ†©ŇÝCm\==&eÍä5GĎćőŤ!ş{ar „P­Řxođ˘×v/Čtö?g€ŽÄZ5…“őŐć)Í%á!ľ˘ÔĘ
ŠÇ&Ý"™›gŚ‹U(žĎ7Ç_ţ!Uí"-fue+ßóW‡«µZNZŚ;-€±/–ŕawĐz”çíÚZ{ˇ… ˛€´ÝöT\!`(7Z_<vZŤDš@%l
ôî`wSŤg /¸`?"ąÉÍ 'k+»:Ú;”`ę*ǰřŤé»ęŔ,вǑ+űĽâ53ˇkŐC'˘˘_ĺ”±1}j/9ý=HcB%Ř]L h/í=LĽ.Z6äő]Ýô]|€’ąlŻí_Âs;Ú  mYyşŞHă„=.,§V!c'WÚ~”éZV¨«˙ öŹŘ(Ăx{éŹ:zwXÚ;AŐô3%q6şk]®RöP§{K*NféÍ/Î['M§·©xČś|ćl±C&÷2Ń śËŮÜV‘›Ůh[x\xkuň®Ĺ?­ŘÝž”sÁkŕ‹ÚŞĚhs­
~LăoÓ…©“™Jš„>1Á6ö8­•Qgî߇‰ l3‹áş©ÎÖ0]¨¨¦T×=ĺéö=
ôi”dV”ţ˘ńřĐÁşˇ@âÚőłĎ7˘Ő0Žę| &{&ţ5ŔŔdrÓťŘNíŽ[Сµű#Ä(Ůč
âČ•Yľ!Ôč"ńĂZLötµ^nP-»8>¨a“ף~Ń /aGŇđţ_­}Tٶ-îîîîîîN® îîÜťŕ®ÁÝ5¸»»»„ŕŕÓżďűéćv÷íwűăŚĂÔžł¨ÚvÖ^{Nń–ś 1‰H˝Gš[>"íŞň,'[§Ý±•łVçô1Ć®}@
Üeë‚EqüŁÎL;îŚ!Ź aÚ•UŘô[^­ţ0:d’ą<¶i€‹›şá„…“aâßźű“H·8"¬cď]âťđşúÓ+#·06$˘E» ‡ ÖĎĆňä·$ĄŇp<b…<|Uü弛‰oČĆěĂĄŰŇkě Ép©z^>•›Ă…CLń.msśĄÝ®@„ŘîAľlr÷Ý.5Üʉ÷i=űň-
}OŠ8sńxhO]pdË\;mmÎq,ů¶0”ޱo˝őlηú>t ŚĂIr š€šh\†k0ŃMâ™ć蔆"ggśÂJĆb\ĄZ=%†ĂDÜĄ92ť§Ťą?8-#b
=ŹHS;v’™ß#x‚čáËM$hŮôś:†zÂô.¤vm*ĂŐ•.ŽÓϵÜŽl9r‹±I’ö°ŕÂpB˘+żz#Éł»{$Ű
ě ˛¬8O¸Zgš9XĹŚ×jbŕřúşKĽ ¸$rľZ˝Ż
"9ÉŻh»RKC¬M…ôË1döZ˝ą?»ÚT,˝}hFĺÎĽ1}!ŐqŇůšăi"ĚŐÂ.˛ŻQxéÝ=¶|,}Ć1»Bućöűˇb©Y×G¶@ˇ]€‡ś™îcş0?e}©IÂîeŇmCpNŽ$[˝HQ9i^¶¨Ź|„Ř*Ţuő±Ăk­őčN&éÇ÷Ú@¨ë‚ ˘ý‚ «Â,­ gV†bńÚkÉ&ž,Ś•gÖC2iT…S±™´DwNNÜÓvyýű(¸R=‹awĄĆʰă7ďĽ-ť®ăĘJđ›™*µ‚—)´®‚z@žöݬy» ďiV]#:/ÓéďÎN·(<( @Ü;Td„ۇ…#s‰„IÁí/Ľ?®‡ ˛ZxĽNę _'u\0®ŰYę;üô.ţó„ÉôXiů.”€qPţwÝ9'ť XČŽŰÄ
áÔ9$·ÂÜ Ś–A0Ŕ/RŞdt?ź)¶QŠD¶iÎÓ8ׯś
¬Ďé+nŞ4а]-öŞ>Sťâ8A,"#ByŠI¨š;űË(6§U® i—[©ĎłŹiHsŤtčK‰\.Śd` DjĽw­/L:¶_ľXUůîĂ˝$IM{—Eé÷)ŔŞÖ\1XßÎQFíúÎŘÄcz^(Đ?¬ěşSläFý`·Lä ů`,ę€t^ćn…4y,é"2 ‡*čCČ—Ý6ţëą`.
˘ ź%=o©ŮHtÜň˛…P‡ďFÇ:TŇ·Ťł¸Pëu°jĘkß°TÚpĂsWLđ˝Ěa»ľzĂEŘpřĄ;kT­s(1źńcaľ»Ň-KM¶Ś;ĺőËU¬A¶Ç….@+Ě
Cö€fÔŠÚĽŇ8˛Łőžţp ”’!:r`”’,J
ůĺŢ™ĽčúM
“…j˝(€Řß™¨ ëÚJZŮZŮ›::ţq.RľâŻ ±Ě4z1őw꽡 ô-ůzRzB$fBÓ·€`iF‹–N‰}˝‰)w=nÄ1Ďi°e Á…“Ü÷ÇšöÇxťoö+¬×YľńË3I’úđ¶ĹĂ*94šeYmůxHsRqč¦&‡ą¨çއÁÖŢpž–üŕÖźc­H˛îŢŇ1őHĎG•ą)¨yW˝}7uˇś5fH˙-žŮŞ%Žy3¤óc$r[˘Âz=1ţ[󱛾ůIH6m™OM—ś?óŚ2?Äx˘Ž)¬aÜW îć>ť&wޱChc‹ŃŃ]‰|aÎ3ő,­ÂěGu šHř˘šl¬ µ}¨ÇÇç"ŃÝ`ŁýL8:dqă‡<ÝN=‰†ú{1Ĺńś+z@ů\D™:¤˛mG,ŠĺâćMŹÄ9CW+EěŃÖńxVşE+írL1_Y‘ÁM8@(“[¤ ő5Á2[¬3~ĐËd𤋮+&\˝6c´‹Ú[8
ÇťŹkćëľ ĎOŃÉ =>DňăcĘg€+wĚI—äŁĹ9RýFżcc`*{D żĹuż‡ó v';R4
—<µb{é>ĽgLćńbŃ—˛'€Dž¸›™ˇ łZe?±ä¦^‚z×6ŽGΙÁşq¸-'Ĺ9'Ĺ1?şl΋@ˇđ4¶ć3:ýO’úJo[Ą÷ÎŽDžČ_š¨řŹ%ź)Fˇ»@ůň.1ś„Ç =b°wńq ęGžyeŇŘ­˙ľ¶äע#ôQý§`᯵ő˙ůÔą(ÍÖéP_rÄĹ“ÄřńÁęÇ}úĆ$˘Âä"!ë3(“”  đ%g†ęZˇ$磧jQ™Š¨d°BiŮąže‰ç*źĹůéőšć˛»µű˛›ąćaÇMrň ŮÍöö Ż{EŰÜŇńĹyťóÚŹ»&d–0ů˝)¸ďű˘|řűXO´‰ĎrřÇ;ŮŠ\§§ŠBÔ·qŇLµą0Oć»u’çXnLÓRűąö•:ĺîy„¶c¸P/ľđŚíűňĐí0ď0klĄĂ}ĂŔŹš5剚^¨&Á;ßfŢ˝ą—A •äŇîŽóÔ˘!64
—ąľ`1śöô¨ďcv€bŰAŠv,Ö»±M®Ýý9
ĺGµÉ­ČW#"_gĺ„—ŮmżŁuˇ•Žf_×wé 1tÉŞ“e!7ě’-W×*ŚfŢ*RxŮ %íŘüÎí˛ kţȡŠA«ĎŢC‹\…SŢ(áѤP‚óúaEôš(Ö‡4ńc—ü¨cV«č3*ĦĄ~ssiŹŠŽy3Ź"9UmG-‚¶ë­ĐOW@Xö¶ÉçÁŇ5\sŻŘî]jÔöíŇľˇrĄ¶ÎöŹć@ţĚ©é-㳊tŠđ“é1(…*3Ńď-ĹNRNżřH˛‚Ömé)ÇlÖG¬ŃŔ([ά?j3Őď{±!GťLஓŢnĹ=Ý(ݽܣ­ënW‡ˇ>Ů×ŮŔ'¸Ő[|ü‘ĘŽu\ź1¸ŢŘ<×Ň Ę˝Č2BSÁťĄŔÖß´‹“»Ą^¨Žyl¸tNbfkľ‘ŮđÓ’¶ŃĚPtĎŔ0F§W„9cz•Ůőj V=ËĚýzułÓéŇn" Ă˝ŞłsОöĹÇ/Tfuę-%*©¶&¨:,TzÔ-ĄÜúJXŽm)+}5ÂťE«şw“kÂN2 ™WT ™Ő,KĚÂRh KŠ9QJĄN,
,‡č´€2@Ť(P•ńW,ëHFz{°+Y36éGPęŐŇJ•Ú?ˇPŔc/UűĹP±Öňaő0¨e2Ę
Q'd ‡'k
ŁŃśiŁŔ€oK'i‘ć'­8Ć IłA×a5sŐkLÖ A(PŹ™¤cÂť÷dqŻáůc)ňéZ×xHJUřKŃó»GNSJ'í}¶Ŕ±čť˛Pő–N°0Ç»ü
g>ěĚ®9ř©o/1OˇěYu÷fs|¤7ă(ćÖ4!|ŁK™
4Ř™ŽĎD(ɶ*ÍyVű'#äŃ®% ˇúa8ÎŻ¦•µÁJŹ‚sô2°ĆVȶóÉmŚŕ
\–:ŞĐČ®:śWsĚěĽdĚĹÍÜq1»;°Ay±ńęśKş®ößŔ€|bPJ`áw¶kcĂÓ€tTĂUŰ4°Gä,VŚX ś›…U0díŮ,<ěHłHQi€°üÔz&Ë&Cőżr&}p+ü8–ĎX+wUč^P_ŚheŚŠ´l@pu QŰJ7€‡Z`]6„:óĄNL?§ČĽevaÁ4°™`F?`[áľmĹ*Ś)Ć5+A9¦Ľ$+7p@ M÷cŔŔÖË9>Đ.ˇÔgnV÷Ě(%ĹR°˙[zB]öt4­ĂRŕ4ăvŁŰŮDÜ6×m˝KOm”ę”ĎýéBK€Ą<d=őfÇl +ŠqUńÔŐ†ť¨ŚÔĘ.
Nuőˇň}°Hµ2ŁÁŤ*”řLă·€aCúŇéÎ$qÝ+3…cJTGFö5¨a˛©ÜödÓW±Ů‚Y( cgÉŔÔűĂCö5vď&c
ŞÔvH˝FŢÓ`đu öX#ś
Y‡;¦*tCFFaöäĽÇŔp@_µślžÎ˘ź°[tfŠ˙®3‹z~Ú]°¨6Áa5ß8śŐÝŠŚďöŽďśÍ%ÓĽźĚv‹ű€ÚŮ´uyĂŞ}*+č±`+;ŇOđ$¦ëá7Ľ5j~âĚ’äâ žśc
ľGö„Ši—ŽŻ™»Ç°Ď8ëiĂ‘´~Ö;ŔÁ~ˇP~üăěŚĘ0”,mGhęěŰ_ľ,¸ÜoŤî‚­wĂ´îřřÍň‡¨źő>7€ ©´~>dhďgC°őAđ€:żó=aKVúi&é ŞĐŃφĂ,˛*©Ăą“3Ý9W _Ő±aę$„oá˝7ÜďůüÎŃ…y:ť1~đ|ëöŘ źćăďŠ2óč٨€h°bóĂß® &Bî őjOßܨSöőK6‚­ů„Ý(âŘA–ŮëĺŰ‘±b 4Ó˝\– d3†Mvy"ťöUţ»"¦fQ„ب'"ŰAâµ_T(`ć¦1,_źĽéŠţ„|Óüƶú°bađWO$۳êĂÍđÎĆĄŤý;0żÇ{WäňÖ+ J-h>BSŽ>ĚV/…"Ň21ŕĄúdB”m\ŽRĹ3z÷ă^ć‚~#pý^#‰)í_":ĄP4úäÓo
$ŘfG#6HôlšˇÄ¦ć˛Ą°äâ)–)j+á}aΠۧ˝ĚTFJXĐ«ĹĂ`]f?R z®e°«8ŕŃŮĹ»l™1sŇOŤ0–CŔRĂR—7«ŚüŐ`.(«•j ĹvÉÁJO=">°ßÁ*
仳9ę(c­·a+¶…ҦKÁzĹ!¶*†“jÁŤáĆš ěű
Ws¬JwŮl­Ţ§űŢvĂ‚‡Ę_Š1:»Řp ę5ާ=Ů|EącIĚßÜđÜËż?<Ä}O˙ÔzŮ[)ycŰj“U:ÎőEYťßm‚ÖŰŻyĎ8m·ů$Ęd{ŁąŇÁ&™ź¸ąSőÇKyŢ•C~î K@ÉËÜ}_Tňi7…ś'zF~е­!x­ý)Քƫ>¬ŇUŰë,żćI\~±Äx.Ôő{\Ł[•¦6ńíÁeÁ5r'‡äl54Á)mł—VY–´ÉŃÓ­•µů95˘ś0)Ž„-b’éúĘŻşĐ/#§ËéFBIęmó#8}ös5Ah0
j-»Úť´eř6k)ĺR¤ÔÓLäó‹®!ĚÔNU+)mÍW@Ú8®™qľüx’««Ň8Ęř‹F˝
×0_*QX.Km4[µ(a˘Ń!ŮEş$Á÷¨‡vŘÂĽĘŮŠFĆśBy ;倡•§šl2“–rbĘÇ®c4“ŕ`żďÚ˛ëŚČ‹ U“ŚK±îT.˝;@Ţ?ĚŃ.
ňó
ÇiŔ˙(fD”e9qYŞfĎ’äqzO~džYđąuąĚĘ0#8îş@­ź˛ănĆ<4çBđ×cDoX9.ß
ő`'´  ŕń!=%r“;ÁOYv9F-Ö©,N^wřjĎc§Ż|ľąŃ;îb­ň’#&Ł Ť‹Ě ç”rŃŮSĎO
¸T}b%¨VőLô
č´Z™;ěT©?F!’¦ôz}JHá‘AşüçÂm”.ĺ%Ü‚:B'ÔkýR¤·ó]ÄčĹ­Î{®Dg;p_lcTźüŠiăÝůž9š¨·n)&¶–"Ďż™36Mv›¨ó»¦DĆ6$Öę|ç-ĂX «L0ˇŚČł?仂IM;+F)G.e‹ź”Ł9ÎתśNuŁ<Çhš`MZmcٸŘ Ó<Ş,É…tČ@bč3ŠE hk9 ^‡źNd46OĎýb7<5=€‡u­Z¦zŘ@ˇlŞLÇ+Ą÷ ńP}Z±ńŇ}…Ńä_tLp5ŚíĚżË~­(¨¸Xłs”+T Ă•›(6«¨ ¨ţÉÝTFŘ?˘w¶˙Ôův’Ł@Řă˝›WőÄ–|Ŕú´°1ŢůŹŚ.H^– „ÝŰé<2u®¦Mő°Í-<®c„đüuŕ-J^–şľăŰ› ŔŻ˘ďowčϲkJÚŘ )Ś ĘöćÜí¶ •Ń~Í®ü˘DË%=ŮĚ ůľňÚ˝•˛yPĽč„Ő§g&˛"č›RoPV…ĹňůiîŽČĆ殬„ŇŇd äkJÎ Rü#ŐCÚŘQö˘OKĐXŚ“YÄřůq6gĐ—‰si+ôâ @̌卢1Ú!Ô8e~‘Ë*걞Ł_&™ŐŹ ÜBwWźš<vf†ĹM(%UŮ˝ý ŕó /±"=xjr‚öŔI2´¨2"߬G°D˛M*ő¸ĐjˡO˘iH«F‡x/R;*2kËŇ: «KT©¨cóJź^!¶ÔFxßRŕżOĎaʂʗËŕnLĘŃ’˛Í×^‘ŕv%>ݲśMw =Ď/ą7ĄçŹ\ď7Áç—źż(©Í\/ŔľnŽń–gżÄ?Ty¦^íĂź>ĺŚ}Fz䕨´2čV=4ż[“Ś;´ujʶ`*dîΠcK3U<8ľ"9Äă@mš0+Ią´˛ĘQ•ŞžÎšÎňk› JśsCę0żçtă…˙|É]ŮĂ(yŤăĚň°9×Ů!j…+ž ·űAź<ő–śQL73¦Ś­§íÓ3¤Ł—=#fĹç& ‹Ťfl))`:ZP-đtő=[zµ•ýN=üŘ'ŇTĐ–ě¦Ŕ*Y_ě¶Ú¬öÖě-‘şeĺSĘď(MřBRh®Fó.Ŕ_ťĐ÷&žđzÎé<k‹˛»Ŕ±4c:c{}|đ4ěvf
9AçČ’áë“AZFD4aéK}đçşÇ±7Ř'ť‘°BÚ~t'ńF.ŃęüŽô€f˛˘$0˝™I^ŮÍšĺ’¬óuAO ün$ź¤Ęą­¸r:hŔvm\ŇuĎUóBöˇŢqžępĘwͧÚÚ˘ÖÄ1PŹ9 •DV@Đc·ĂÖŔP”ö›I»¤śĚ± Cş/¶Şć3ÝH7”mţ‚­l©ĐŁP•
Áá;z ę!#stMĎ+ ‰ŽSҵtďO˝>ÜyĘaL_tň'—‘Çŕń<R訨Üä(óEůR©±Đ.ĺz«;5˙±ótüúŘÓ!DúŔ`'Ë$ž7ĚI,•ä´v:”ÇW~¶ßÔ˛|“Pš·5ŹąÎ ]-;j®dWę.٧kx…ţťbÉLso-"¶‚Ä™1rý{‰e-—¦6Jy0×8:.Gdţ› …Š„.¤@Ň'âP‰B-łĐȦŘb)gB)R «đerWĎ €7öţ“ʉë„ţ|B2äę…
!ë›n©űÎ÷Zxó“·Mk›ÚWtëRü;Şý?¸žüĺ}Ą‘Öŕrô8(?ŠÎ$‘Ř>2şA·˛Jt¤· [󬚴3>rűßÜ΄ÎN\St­JłÇWĂ‚zaÉż7µ…™Xk|ák «bÝřŇGň%ÎÔg
ţ â^Ë+ŮK„_ éî^ý’ĹfҢ|iMĚęäôˇHŠY2…ÓÄ’×;aęr@YsŽžÁčŇ…¸w›7/źŽ~8äa?Ń$\{F^µ3٨Í]ňŢ|‡V«¦ş4ŞľťŚ…W!iĆ… Ż``ěÇŢ5 ç‰FŢ>PőŚ:°Îü÷S*W>dDö$yh€x/pY®ř—™ /Đź—­M8=łZ«@@ŢY=Q?aßě‰ó>pPyG8ćąťwסđwŻڧfUxűÍT6@F[Ě““'4ŻŠž…ŔO– ĸ;E+„Ý=ŐUŇĆdômϬI *qÄî,Ç^.×ěG˝— ™žŢě†L‘`őbxěóŇX!É7¦wśGąËŰľÍ U˘jů¬s&€¸
C?Ë´Î?iňŔLđ$ś"ďícÉ—3|`MAô,çÎŕLnÍĚ;ĆÁ¸ :ľýERčŃ$C|–1ŐÁd\Đ»Â× ýÄ#ß׉ΑŞ|•¶0?ëIjIž$ë íNŐŽ|=HćţĽçP-@…‡͉?CŮXµ0= ď_7¸÷EşĂYídn*ýĺ«‚ÝŘ7’ü§I]Fxa¦“뙲/Łü~NWďPÔÎř„¬ć™•T0¸ĺ.Ś)®j‹ ÁBýÍvx®žKI<KŃÂqDµ+BôĐsV#¸5Ů—¨'é„ÝQ—xMn}űŤ'tĘ~4úÝ496Łť:bdú;ń/Ťç´á]ŠšđÝ€Ő˛7Ű,Ťű=“Ő˛űYáN\áZźńżÉ›ţĎ7• @ Ŕüw«‚F†vż¦AŘ˙·*űüs¦ű_°ŹŔ°)‚ǡ} ăłs‚< EBZťÍqgËYťE/ď´=C¤rBđ;á
yJr«c|eÝĆ9oWÖ9÷×ě—3;ÚźŢő…‚ˇNcU'’KŞ2–F¸Â’ˇ)Ĺ+Ó0í ň–lą°u»ô˘ĂÖ6î.­:ŽkŐZÚ_¤m°uď8T?Ę|&l;ҡ—č~pŞ1
+lÝ‹5lÜšoŇÜíŠq3×” #ôŢ7üÖo
ԛ׼çZŻćčZbg†Ž†IFH¶uLy¬×
.¸<ŔŔ¤íÚ»n7˝«Ó˝áżÍŞbĆů^‹ĹŔN;¸]řKcĂL²‚)S›{´{Ź]NíízÔ÷ńűµćó§"˛[U0g÷Ůz<É^e0†RÜͤ¸ÁÝJÔřtĐ{*fCHżúMë°ć§Î2ĆĄ]fú°â Víá\ü”PŇŔ]‘ćóşýŽK·´µ]E¦>GTöďj}˛Mú×Ý'¶ő™şw«‚쮪ÍrW•—T¤÷ŚłÇ/Ůş[ew‡N˝ůŘ#´ÇĎr.ź[–oń}¨¤®zG„ę_*O(c˛řLá%MF-ŕC­<Í•@ý®đDBUć&úŹ&Ĺ–Ď(¶@¤8Cb šErŻŢżÇç.…Ů!] eڇ&.Šf ¬AÜF,Ë: đhĘö“2Z¸=¨Ä’¶ś‡«DĚw$ ŘąlÄČ>c5Ź5ó[/4ł „4P§N(ž#4·´S@ăĂ»8‹‰
ĎśŚŕ­\Ćl6L:´ajD±JŤ'cŔ4rŕÔâ%=pŁ‚‰™7ĹĎŰ…źčĹ’fÉIĘ÷Îňá4éx“Ë)>itűZçÓ@˙fť˙í~će(žĘý’ý<
__§=”H‘⫼DkHąE܇…L ö{Ş–`áśşÚ{{ňüY„`˛ü[v¸sµĐ2Čťýţ·ýďţŘČ9?żŕ—­E‚ň¬x2ý‚Aő@{JĄ©¤ |]BXXCÓâ)šŐ í)›ÝŔ·©0MuĽĎ1špΩsFËVöÉşťćAőű±5z-NŤC š'Ľó©”–Ś$f: óŞĄç
Nţ/ çBNߏV·Úi·)’!śO? ®żĺ6¤đŘmîŞŕä9Ő0ĎXŻMáłćč*ć®WľÔ =c3c_÷˙ŔA\ńaApy3sŢ5ě!MúÉż@¨bŰÜe p}Ę•/ł8EôdÚ—EŮ

ý+#Ě…›6`vs­Ŕ7Ť‹ŘŁG(Yk·G/íÖÚ݉~wŞéŕH] .;Ś˝H=ť"—R}LjäŐüĚóe9á;®ŚŹĘý°2Ś•ˇ‘ÇISßâłí(Ź`ú^°ąÝsđFŇř™Ý†E9­rSqá„΂ľrsŻbŰ7ĺß^
ą¶Đ®€Mž:g‘ŁšíŤoň<5Â<ÍaČĆ÷IęČÉ%Ďĺ
EL¤b盤ćp”©_bŘÖxűs:C8eeéC%dÝrúL3ţöýąŚBľ^w(.BogÚRÄ’ď cqŚ4žît—Đ2źT _Ľq-á ÷& y•nŻđůL„ Ă=JNZ™˝)žŕ9XT&9÷GáĐQń
ŘXń®ěäÝ&ý¸ćŤßÔtbrć ÜQîđź+«ěOŤ1]+‡şb[ÍɦĆI˛%SŚ#Tš=yͱ«gĽZ˘Xě¦1ĐżŻâ.d[JA° ¸˙\+ćď,‚–©h:c)Ł<ĂÁČ0%ďůfł’•I Á–՛ҲHMĎ|-
1Ąvú™Śbdc,ňâw^ľëţáÚRKZ5ó ÷Î1Ó‡Ŕ 2_˝kKëfŃřÜÚű1Íón»â
GĐ2QiZ/îZ©Dc<i)ŃhaćĹ$/$f©¤ZŰĹ=B»@ű-ř·|řz°J^[Ź^rîVW-Âő‰žy";çĽó$?vśE=„„ś!†ŘIÇ6•Á’=OŇd’ú(ńßôĚ<Ö n2ڵĆ1Ś(u>ë©G iđ|n°P¤\H-PP–ŐT,3Ě}ŻpEÄŢbqN˘4
Ň­&ɫµňe)%9<8ŮsW $µ
e|©  Q±+ßMĽµ¬
łŔ­TTŃ\ăˇ\Ą8˛x©@OĂ? ył‚K?pqţ8®~Ňîšę”Śi
Z
ĂŞe‚, ·I–ɬ^%˛‚rVd§'ŤI••FVŇ-ĎŠr7Ąů}EJ±!g4PŰ•‰}ŹCP ©H,^řb6®ź’Ąq2~ZÜÁ~Z÷ŃĹfÓ\YŠC·tBcÇg7AK"” XCö’Ď˝NŐŹŰŘ—‹…Ë”_Ëo`›bÖUˇť¶Đ†Ž]íóąsOw·Ľµ»tTé]‹mpnjÄFiľ8łft™xŁ{ú,Ç^°‘aÉ/}ľ +0ů¨ŃŁŹy.Ś“¨  ĐGóAˇŠ:§GőFÄ„éćBDD] ´BX u}ákE'-&L´í§sŰÔsĚ1‡^jb_W.źB*M”l†Óął ©ä|
ŃŮÓ›Ł$/íşl;lŻ1ąĽĚ®K¨íţYŐ5ĹR}5‘C­FúîîÚ’’şŔňŕňă®č“ţzóËÝ˝Ď,E•%[JŠ[„Ł[ŞVŤš] YuĹźŰĘaqgY7Ţ>ĎÍ6źňtĂčΦKŢ*.´ĺ Ď>ôŃ W˘Łš>“Ě<FTş;göM_Ë޸P:Ś“sbś‘˘Ľôr~‹‚čłć­;ź ‘ă]•˝ŰËô{†'+şćî"(č</ËýtŮD+Ç?}dě*Ďu®[nX+µ¤sD/ćŮńµf;Ýş3uń r5ěÝśěÝĽ *6ĆÂóĽ9P]Chű>"QÎW‡i
df¨É¨5ĺ,†SŁV—h´Űgr×[ĹĚ0»X6\Ý`ݧ)DŔĚJ!?fúÍ&JźM014OÁőqڰI‡+} ţ^’ŃVÁŔ>ČxěßTĚĎŃ«Śwľ Äű.@ "C÷tő‡~;E¨÷Ż FCČ·ź°AM4ˇűsKš~gwzgwe} tŤŁŢ"uˇmľď#Ť&i—Ţ$iµAÔ‘šKůýsâţÇĎ4v©S,7H۰ ™×#–qęE§ęBŐ»ę]´B«‡ýÓ߯ůlßqĹĄ·˘¶ľŽÍŻc3ÍßHĘüín‹EÍ˙+-Rß@{J”Ż…"HžM;ŠŢú®„‘Đ´'ĚĎZ[=đ—A™Ńjś¬ý.+D*ZÄóFsü„.EŇ#9ťó1ýÜcť“ąăĹăđ#"5ĄÁ»w
2„ľBđ ™9»ˇ©’4yŃź2úhiČl5˝Îż4RwÜîTçmµ‡‚C!ąŹXŘŞ
Tß$­}÷/Rő?¦Ą>(‚ęÖÓŢ„2jöJô­¤®p‹¬ ßeĘ'‘ęBŇQdů° „ Ywż˘Šć=ifażŹşĚF[¶ŔjdĹ$>`ŹîĘíżC]ŻŘ}D6o^0ń©÷ZąeňŁŠö{K^]M%:SkE¬w Iôi‰"xr"iĽ>)iĽč­ť)łÇÔ‘“f6ĂŠ ńüQ±‘qĄ°ĎŇňvAMŮzf“Ř EĹ«vf?š˘q1Z:Ź|
¦üuA ÍTq‚NĄ±bfmpk ČäJĘSÉؓԯ“úç×ćÇE?±¨64ĄÖXĐ7t߸DŞ?rľ0Ń )Rᙹ€Äň`uIş–O2ńN˛¸~r€ÔčŇoćY•cŤżéV¤4ąyés
4ÔwOś˙”8xÚ¦Yř9ZĽjŤó೸éGm?¨—Áö’.ms–6O™©ÔÁ żźAş)çOr0Drîfśe‰”ďĹâť
\ ň]Âćs> >žäVLP­Rq×Nń”ëÍěăw×E—`ÚѢvz}ZÓ'©Ż>"Śĺű€Ŕ-Źé‰¨Hľy€8…řĂ÷¦HŰ6‰Ĺ׬H)7ó®żHw6qi¶źď˘äŘ!öe+ö:žfĽ;v[×n"§—ŚUĂE ŃT5ŽäRü bĂŃ™z/šŚ“¸ý>ö÷ÁU#Lcáľ÷ÔŘW±ľŔ_Şŕ
~č'öÝĂE,ÖĺÄ˙üňfř®ď¬´OzmĹ`˙+ĹAg];ĂKN/S~ť«* đ6h7ź:Uˇf{m€ë!6Ł@±B!1’Ŕ¦Ě°|őn8Ő@ohŮ;›‹ż€ü±
/+AÂ÷ Ţ0M3Ac*Et+sll$ŮľŔyďěůÇőř'×RňčXX®ęď¦Bą™©XdŚů„ŕ½µ`¨ĚTF¬$ …z:˘1„ęö©˛g3Ň úLá‰Z“, ËFŮFšýZ.Fž—đFź ÷řZO´đĐ˵)HÜFíh^čş»‹l\=Ę»˛,šÍŘHąËŚfQä]f Ţ
–ٶt>|pÂdŠŇyH8¶hÝ#zGý¸RŘÚ~ĘQ°PŰ´źěŻ wĘ´śňlŢ<¸®"űÝß;X#™ęôBµőŁ}ˇĹc—VIS!ŚVőfIDŹŁ“Ö~0kéâăÓA7ßZŠ“fŽ‘•úwő˘,â€Úȵ Ć`f.+}ĄŢśHRšµÉŞPÖŔ€w»Ćí”ő4›÷»*¬Ě0·ĐŇuÜ0ĚäŰ<<řXIk§RpKu˝ŠcŃ„/ôĆE[xŔdÝŞÜÜë:«Ť»¸°N4ó`®mĎô.Ë´—ôĂJ‡ůG
…É—ŁW­']8Ú+!ČZ˘MyôĎĂźy-nż¤góŕ†Obż/t6é¶ëőqĐ ăÍyghR˝?@ŤH$Ĺf)sî‡yBM$ć…?)/Hű%á;
|Ä(AŻŁPĚî—ŔѬ'WČ\ŔK¨{$Tć‚ű‰Í0ÁrĺŞ0ňąÍM¦ňw›T}@Ľ0µ
˘ŰĚ9"¬ žÂ'¸LŕďśóÉ™g\đľ—8+ż©Ę-’«ćĐ<š˘uró±™_fÝn#Ř%ńü0FŤČ5ŚSNůť:N8˛t«MíđÎú÷UžDŔř—`Ä_Vů7óÓYénĎéąľ™Šbňq"
YJ  (ȵ†Ăf IöęŐřg6řgďřFŮl8!ô„tךó6Ý˝ýŰcěNŢ1\Ü4¤4EčrŘěučB‹Ż?â)7;0Ę9v!Ýqĺ]ő€* ą˘†ý˝±’‹šü}±%ł“YÉWf!áĄÔ j•0Ŕlq\n2Üu čYRóVäßv0ňîÇ)°Ą2˛Bć/5Őăć±µ—§÷ˇ.«˘ę…Ľ79čt'żłí0ă)MżËµ)ĎT÷€NÚ4驵^®ć?|:–Záć
Ý5ę´ĺ‡vN]ł¨”*`ňŃ1…V™6őt±Ôđ‚
›µňŇJŠTż
śŤZŹůDŻűwđßß_áI´˝#`čż)c'dhdmg(fjgď č¨÷Żż˙zË{U,UQĽ¬ŞmlkL$`?×/Hř č@ @#F#…XĆł-4ČŞMĎĚ/Z{gógżtŤŐú%Ýh?äżäňçLŰ;ëCU~µ-řp6Ü4λß4žá~ó|}nMgűˇO}$=ÇHG Ă ÍfC@şqě"$‰Ćľb“I…s¬rĚV±Śď3c°ldZ8B=ÇwṥÓók7‡@]cŤĎJ˝ďťK4еfŐkT#VÓ¬L”KĘŐ1…菭čKĺÝş?sě­˛i™Ą
Ą´`ucę.ÍHĄ8ŠÓ*"
%Ö5—i4'±GÄf
#čLžĄ&Ôh:¶LP°z2Q`f«/kT¤^ËaQŕ ´O»˘
NS,îă/6›ÚxŚ1ěD®ŞŐšÄU¤®_ł*+GHÔlVtĐ(h-rľ#óš-†8äú1ŮŔŚË˛·š˛/«Řfʼngn«ĹÖ”ż.EĺZ#Ç}¸çÎDśRkb„™Óv˘
mÔMĄŚsÖ)Ý„šÖě«Ű:lDčJ„Ů»×UÚźş ě"ůeŻ]/é6ÜaŢĹ$)*nĐĺě )(:™šç0?Wgµ˛é K·Žçűą”ĚgˇiĂĽd´AŞM"«1Q˛ľcäiŻ~?FńL S·ąA©¤ô’7‹÷cآ8&lnA7Źş?ł—€·!Ř Óń«Đž2dç˘É{}=Ôq-<®
ŮöĹ`s§jÓˇR§M¬săĺbN<~ë:1[ymv”đ 2. Fe€:jÔ¸ 7=Żęľ, łęwˇqbťá#|ôĽ űąáťŰ’ąCE
Řc!Ô´÷5±4—Ú.kÜ:E*up΋Ô[O—`† ŰóOđw=˛i=ÔDWYPÓÜá ~9­Óđ™_n®nݢŚŘMĎ
uBz˝čŃäOľľ0Źzşd.MëEh ăk
}Ňî7Ŕ.`íŇŹ÷čĆT¨#Ĺîo\¸z`o«‡/¯佲ěőň9Ç|@˙ęy =|E>U~?#q*L×ڍăÚőUď öŠ{ ĺi°‹ä–áĘ?;g!'F‡pÝu)Ç/íŔ(ä6ĽZ9ĽŠ•d‹ÉÂo-Ś3čŮ0Q-¬=RÉ’1%'đ„ ×3~GRë=‰złk#O™ÄŚ˝8­SJ‡M7Z:T7Łôł±Ăŕ¤t8ݶţľ»–­‡VoĐLE´“ń!§GŤÂQ?é…–Ž@šN/ĺ"Î':cBĽnčFŃF†ëLI>Ů'öŘřo&çÜÉżdV˙xíŁ9˙˝Qtµw0´ü{‰ŐĂRÝ(ă %uősfł˘+¬BČ"=čŃhčďéßzĄŕMÇ “M ­I©úBăw!‘›" ö¨§1_ŽżŚ¦5µz·¶vZ$ŔGY d«űŹY f‰xńŤC,=D Ô÷Kd-ă­É¬"†şsŮĹż?·ă¦Rc‘ë)M«üÔ© ˝\ ŠËm˘Ç ®K0نĽ"N ¦}Ö<-ćÔÄ®HŠ ÄŠm¨eí9Ř(ž59÷ĺ &äVĎíëZ_]ďĄćNAio#ó‘Ý®DZ…öNIÍe0'ôş#ŢHT) @(O< §ç]ż*ŠĎ6 ”eą‰WuY> §ŕ©™KYÝd%lŮ´}·ÉͬńLrŽÇŹ~Ö˘eí,:1”™ŘűJpÎë
…a ±ś­j¬d*äĎöŹôĘĆRT{úUp†¨Ôö~CÔŚíPł g$6íWµźŘ:˛“éhAGir¸‹L^ßér4 ŠůĚO4^@~˙HiQM|Á_g Óßţ}ďŁâşőÔ;”g9JhűÎ%dv¶#f Y’”¤hKH#x÷îćxMűeÚţű­02ľ;đ»×o\–‹~ ¦Sř·içűiËëŢ^Ď@6ýbXËlL c9fŰN43´,ÉŞW9óţJm¶B Ü_'HKťxńtÂË(řÜĄV?ü@Îć±”O3rŘ đ_©z—]âĽüB_ÂŐŻą*$ĽîÖľďŕ{ˇ6]˝Ł\8µěߥćqŘbQtp ¸[©sž&˝y'™¦“ÇĂiĆ.©Nß
% É:EcĽAí“&TS)MAö»Vh:BŮŇŽi±
˝ŁKP1Đž>?>eµŁ4ŔÍY;Aňé] } —ɱ%vf&rń ˛lĄű׬Ćs޶»ä¤+
xhu_eod¶MYhwד\“lŃÍŢłłőO‘űgD­j^ßýËzGW),üÜ1ÂLl
čm }Ő7;¨źÔ® \ ťěÔľ‹EŻ=ncSY<ŐĆ
TeČ©•‘1 2‚QUÉšQ^ăîÍk2¤2Ž!Ĺvö,aťů`ŘŕÂëmQź?I©=·4âVˇđˇ1•Ü’NčË+KŢůŽ’yŚɒ‘…TȱÝ`“hIÉW¤Ű[Ë™řH_#Břţűj%VqËű:Ű‚üĂřăź,+ýÉdăřýô;„g9M<@)Đn=Ă,ÚZPÄJJeş÷j˘“˛{°( ăŔ.P=ÖŤŢ%ŰţŘŹÚć8“„B‘NíbŘάqwşő0v®iáěxöx„#E
f™BBťô
–¨¤´‘î¬ü´¬ĹL%Ô™ô‰¨OÔĹVŢ?řBa&ŐzF`h"}*B‹Äx Ä•4v´$&Ż˝ŠĐĽ„RYÍ 7 öO•u¶µźaöŘâą"€T‡¶*ě––Ń%öˇ¸k˘ ôR›:ôBIg0®'sŞĆÎKM©ťŠwE;°ľÇ\‘‘L9÷ŁQ˝Jh4ĚTxĄ=:”zÇ\ĐÖ•<m”¤¬+ ŚlsŁa·ŚuJq9¤SíR«'*Ąl—ŰbŞFÜúPLké.ćô»:­V­©ýWL¶űŤ„y-L<OÎŐjňB)!itĂŮö6KdôoŃ€0ÇĆß7Ó»ĂÔ{7ÝĐwĄĂéý`|4Ć1=‡¨â¨*"™R3đ ˝Ňâ6„K>‰#1’~Ôč‚Ácvŕ4ôÓ™Ś1^j.°6ďŹ0&ýě/Ý8‚›š»äŘú±ČCśTÔ;‚ŐpĆQń0ˇ…u<‘Ąű[ŃRqBŇ 6ňru6NDQ¬Ţ·OˇÝ3-Qĺ°N¶®¸őüwábERAf&á|-Ě
2¬řÉqě÷3DYpc”dÂň‡ŃĄ”ęö/Eť@ĹÄŮmüV­i‚Ü cÉ©Îő
ŞÔKçŠ0G¨:Ł­×ĎŞG]䂢čO»šĽť||ÁöÝ˝űŘŁÇlK˛Ók˛JP|ݨ0ΛĎîčK¦–{\őÁ\7 : ‚ŕ\â7Qaźz'
0»QGĹž>ą“ůfn<ÉßQiÝů<Ü?g~;T) pšl¬·M^>ýÚ‚'q´®ĘvŠÓ¸µ˙é„Scş¶Ćdz8=Ës҇RKś˝ékvOĹP#dCTîš¶Ś˘ÉŹĽŹ˝#púĺűA‹BŤ6tYQI˝ e_8Ń…†Ě:?ASŹ^m *çĚóą ëaz›ő"·%h×€AĆC7
)ŕŮz#˙Ň­ŠňÚ‘^_ř?Ĺ÷_[ä_ ďďţVnřWHŃßkŘCüĎp*řË»¬¨’ ­¤śýŰbÜś÷BŻ'¨ľľP~y>”ż-&+(')&ިD'+ö[„Ű7âů ż!~L˙WóW% Wâëď{¨ż*ü»‚'â‘őŔÄ×Ŕ(÷őÔŮüĎQëř—ÖJ˙Ł›ţ°w-`ĺő’l^˙s‘ßý5ŕŰ9Úëo.®‚Ž&†V¦ú?·F˝eÜ?Qł/~eXřŐůň'Ł+Čű`ţŢę-H‘ŰŞÖëµ*Ľ–¦ýž>č_8Ę+żŽÖ–†2ÖÖćŽ6 ŤłĄ˝Üű
ňőëňîOh(?„uŃ·p´7uzý˛ka(¨Żoho/«kĄklř'÷bVGě=ě{°·×N÷‡ŞżľżN‚ŤLŤít†¬ßB¸Ť¬ÇľŢŢ×¶Äđ;čýöyJĽŽ›váů® Í*żÔdĐ_Ű˙OôÔ?D—±6ţÓ» wgJ}đz°ŕ~ÝäôĚă?;Çý1&ÇZý*ök;yí~‡™Š˙Wn«ڶÚ)Ňóz3?Cľ}NWL&dmíđ˨Ť¬®©Őë÷ç–·Đs
$ÓŻ‰1~5@řMäř«* ęb¨ďř§ŤĚ+ݤúőŁĐ+*ŐďPq„˙˘Qü ű—‹ţcÜ·¶µ?qŃäţމí[Ľ·6?ńn”ţ{ÓŔ·,o-č~˛ü2lüGCş·poťg~©}ř[>4żü#Ż™ź€
ţÜyć-Ę/%~kóëńËŕbđńß—żŢ~k óóâţ˝đ6y ˙Öćă'<žţß7ýx‹úÖPă'*”Á?ł×xËôÖ¸ŕ'Śń?´1xKőV7ţ'Őťéˇ"˙ţ­úOřHó(‡ţ–ę­’ęOŞJű˙ZWő-É[1Ęź$SN˙Xšň-Ů[íľźdnWÉď-ć[娟{Ţ˙˝ŽÔ[–·E?Y¶}ţ®`Ń[Ě·ň?1[Bţ‰XÂżuo¶ě˙ä‰
ű˙µ˙-çŰŤ×?9y#˙î6ě·o3dbdýWů˛o ަ#ţ$XÉýŻ’ßĽMűIĐQđŹRĂŢ˝MŢřIäRňżKĺx‹üvAü'˛Wů?\Kőv!ň'•mŐ˙bYň-ěŰő·ź°“Ő˙l5îߞ›(ýO&Ô†łKó6rü›vŃřßÄ‘ßâż
!ţÄçoůGĹ·DoŁ"?‰fŰ˙cŚäť4(Ř/'3ľţ üŇKwüňé˙PK
|„0Sâ=+č(gradle/wrapper/gradle-wrapper.propertiesmŤÍ
@F÷>Ĺ@kgIÁEˇÔ˘HüŮ2ćED‡{Ç‚žľ"×çśďŰ”3°ÝÜ1?drÉ0ň–%%ó=:­&‹ş™­žĆ˝"ů.9ĄuU¤y}ĽśÓ?#S¶Ź¨Ś@ÎS›ÂNëńŹ®„ËÝ
‡¸·ÖĐ5ďúÄ;Tí|ÂN,e\ré6zäďçPK
|„0SGÇ%Ôpgradlew˝X˙sÚ¸˙ÝĹVńČ«!É}}éĐw\ iz!06˝9zA±¨µe*٦é˙ţV’ml’ÜÝ»ë<Of˘/»«ŐęŁĎ®Ř{ŇJ•lÝpŃbb7T-gď«~Žů8•4¨„ĘŇ%(_ňełX›‹ýwVě«.ěěA'IX„«$1(@g8Ľ~5č÷pfÄT®„\|TÇŕ@D7pĂ€š!g8:m÷€ čc$ ®Śł’…4ᨩ6‘Qn:ëÇťýŢ‹ŠŢĂsbđ U{*𠛜ÚaTmOŮíRâp¨C­ąď˝€I˝ą?i¸5+ĆgË ‚‘j5÷kđZ[µD†ĎŃ7&Ś´ţ¬ăFÚŚ±P±Ęä4ŕRĐĺîVIzĆť ĚwŢöşm2]®)q|ô˝P›˝ ™¶Ľ(ĽpňŘZ%đ†™žkLUDŤěEGËZT3ňsgÜłĂS"Ë|<Ŕ€é“ ŘŚ¦aŻßö!^&<
L˛§ŕS4T1¤ŠÁëÎŰÎő`x9*8uşç=ŰG(,©R#8fÎ×b˛ét{/;oÎ/ŻQĆ(µ Ń>ĽAĂkDĘ-ŹŇčŠňŢ„ě 04Ŕúťw×/»đ¤
ޡ¶š
šŔІ)k:vľM2 huMĄ€:4ŕł=-ă¦÷‰óĹqÎv¦vdŞĂ·<C­·1¨%óůŚű Ňĺ2Ć;WŹR•h„×™˛švą6Ă€±ZŁéř›ůš‹¶é;‘Ú¨¬«$^f=Ďa‘ęsšŕ‚'żž^ť]ěCĂx”ŐË™ţóçřŻk,ć"™ýŞH˙ěâô*—0ÎTç/ăËÁ0—ČÝ* 1E}Ç99ďŚÇĂÎĺ«¶›Ăł57k­%].™Ěş^Öm~ RÇŻË&#.ěyżĆ?Ž"ŤĄüTăŚĘŚŔŰ~ÓÁ«Š đd řôb–Šëi%nË­’µÔ˘ő—Ř‘ÖßśýÜŻ!X»ż@, söN/Ž@M$sdŻŘ§šš´+ě–ůi˘A©
+zµ“>Âî‘uďóÄC:IlĹ‘(Š-=Ůn
؆2éŤFŃ1A_8f¸o.xE8Ţq.™źÄrś\:Î0dnF~ÁJFVTr˝[48•€yŚËXDLÓMü…ÖqňXA<ł’ćX9b‡†ˇ™i[+Qb»sd{´¨ű%NŁOáîîń­Š81îk jÚ@­@•§ đrÎâ»ůf4v›˙żÝăÎüg—f˝2×ÍtŠ eČX*}ňk¦I7C>qíu'Đb‚€GqŘ^ń{ĂŮ­-ŹWpc©ňúü¬vŮž¦!ŹŢĽWxæ[äą˙Ź}‚űË|˛VĚ"9ç‚ß›xł[Úą´u†Đ_L¶ęöÉä?
˘t '9L‰;uŽóUîůRąĹ»v?ĄLnţ˘ĺň^ѶEĆKłüý (&äRţ´éfxmptň ršZ©†Ś0SAěÔÉQ
H)OcĐËY{BĽwZďXgËćşRí ÷cQâůśfôŢäľPBJŰ81`}jÍőYŇdaöqĹEŻ
źâĺÁ
2‚‹ąąőĆu‹őňaőĎç´9đĽě_Äo™®„r‘¬Üf§ÇU
™L'磒F*x™}±Z˛™ăŠÁMĘĂŔÄe1Ł “&¨ś§š Ě~r0n+&\oĹ)d†Ť‘Ń`pŮ=ŤGť«öt†‘ďZŕ!„¶ÄŐ±ŤĂy;Ů,ńx‘ ^´^Ź{C]BČń nÉü¶^.Ż‹ Č›.ÚpQq‹xcôÎöMÍŞ7#¬A0`—˝ŃE›ÔŻ
EF×’T'RéaI‰Y>(âc*AaŞ-ĺ¸Ü®CtÁGŕoÜJ˙®~ßRŁ’\ńé·);{«ŠŁóŕcsSXîARW ź4ćXM¶Vöyű =С'îO¤ň“W˝“_đAbkK#wl.Ů<vGťVőŽSüÝ#SřłßjĄ‚ Śĺ€eg‡EÍb“>}ZŚí¤Ç–Á“gúě1¦7+”% `w‚űP.ź>p3ů\hFŘ^Q˝ĺm<*üQ21Zň`*ám·^ç˙:l4ŞĐ6ő¶ËmˇmżúAĂ$ Ďł…q6zXŚšuÔ©LÝź¶ŤĂŞÜ7 gGU…o˙Š‚m|SŐüîŇ´Ťo«&ľ˙{&l㻪­ţˇ-ŰřľjôÇŻeÔ6~¨Z˙÷W·n?Ë'•M cĚíćGśěńcstgçĄmŢĽ:ëŰ
źJI7Ď…Â0^ëdŞ•Ő‚ańü)Ť=˘+a•ި„'©©dŞß1łTř¦«ôşŻWŃ`™¨zţ..éuÍj
|›+W–w÷Eź=.lłä´“ üć~Ţ+ÚűoŻËy3«(°¦Ů–"Ĺ/ř ×°ňc¸ź ;?˝˙‚äé‡T)Ă&ĺü%ăůkÔţ:re{}š·ó_PK
|„0SÔÄćD·d gradlew.batÍVKoŰFľđ˛ÝH+Ú1r©f"Z¶ŁDŮIŃÄš\I Č]bą”•K~{f¤ÄÄ=4ȡ>Üá<ľůvşĚ×ŕ‘QôćnL<đ<¸déV€XŻOO.%+áןög:·0–4+ÔŠJŐTP§2ݬ…„÷9ĎÄcÝS˙™(śË)(DJ Ś-*fB«-•9}(X
ŹąÚâ?f+¨·¬(NO xAŕ9¬ÉlĺAÍ”ń§#ŕ;Śn–łpäKVť;3'ëŘ>Öó­Y¸X$oÂ8Jś1??ČŻçZÔ:éR ł 2¶¦Mˇŕö~
˘Rąŕ5l™d>ü%H)ššÁmx&óĹ*Ę3/ĂŃ$˛g% ˘uÝs2µÍkwCä(ş
ď&«ŤeĐaąBFŕÝQźí™É‘ĺśe6¬Î6ť˘0»E˝+)JýĽ%k©3ŞŃ‡(88"­ŚŔ`ÇdŤŘŕőěnŻź˝těFËĺ|9‰îى#řÜł±rž+í[×¶o`”‡G¨0G.”ąÍ đ\‡©(K-IESdđ KĄÁcÎáłh$,ÂŐµß÷˝(E˘µ+]R‡mquĆŚďr)xɸŇL—TĄ[măé‚Ň×€
iő5ShŚmS拯ó˛„ŇÜÔŢđif;^muŻC/ ß°~řHÎr~v¸C4ŰçµBş»ůŹ,Z’Ś;ZäXĽąd©ňóŽb˙ź8µą™
#W+¨Ü4:XýlQ˛M;Ä,8üä¨Óf‡‡©Ďăńaâá´ůs?ŤtY»˘ľdČŃßż_ücm^9ŐWł•SCx};;ߊFV†Ş¶~ű`]'żťŽ’ÉÍ,JÂĺX·±–%ń»›Epńťç¤Ö>-®=ůňŇÚ;@X iŁşî;&/ŁGZĂC
±<Xcőř¨±˝Vt»€X¬Ő#•ěÉ@ż×]vÖ7ßsŃ!ť„q¬»8 í%7f?}|”´Ş;úź¨ě&^dCąŤvzŇk ňí¤$®ÂÝűŃô%ŕ
FBn|ËÇHś–Ě‚ę6ú¤éŠâvňH?·@-¨÷ö4ĄŘ"¤Ç±lń¬MFsóĂ[ńxăvlÇo‰q#B'ÓQíîz×ń}¸Y%oçłx>ÁQaú8Ăĺˇ1$v% ń:%Ç»Ěé[F3lfëŐ(¦e¦çśĄ=ĺ_ LŰ„¶vÉq‘Hśp
çŮ~Eč]˙ö iě~ qčnčéÉWPK
|„0SíAgradle/PK
|„0SíA'gradle/wrapper/PK
|„0S“=ş$»!¤Vgradle/wrapper/gradle-wrapper.jarPK
|„0Sâ=+č(¤ą»gradle/wrapper/gradle-wrapper.propertiesPK
|„0SGÇ%Ôpí—ĽgradlewPK
|„0SÔÄćD·d ¤gradlew.batPK Č/*
* Copyright 2017 Google Inc. All rights reserved.
*
* 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.
*/
String helpText = """
This Gradle script performs the following:
- Adds Android maven repositories to search locations for artifacts.
- Adds user specified maven repositories to search locations for artifacts.
- Copies specified set of maven artifacts to the specified output directory.
- Displays the set of files copied into the output directory.
- Displays any packages that were not found.
./gradlew -b """ + project.buildscript.sourceFile + """ \\
\"-PMAVEN_REPOS=[semicolon separated list of repo URIs]\" \\
\"-PPACKAGES_TO_COPY=[semicolon separated list of maven artifacts]\" \\
-PTARGET_DIR=[target directory]
ANDROID_HOME (optional env var, system property or project property):
Optional environment variable, system property or project project that
specifies the install location of the Android SDK.
MAVEN_REPOS (optional project property):
Optional property which adds to the list of Maven repositories to search.
This is a semicolon separated list of URIs e.g
\"-PMAVEN_REPOS=http://some.repos.com;file:///some/other/path\"
Since this property semicolon separated it needs to be quoted correctly
when specified via some command line shells.
USE_MAVEN_LOCAL_REPO (optional project property):
Optional property which, when not set to 1, disables the implicit use of local
maven repositories (see mavenLocal() in the gradle docs).
By default local maven repositories are enabled.
USE_REMOTE_MAVEN_REPOS (optional project property):
Optional property which, when not set to 1, disables the implicit use of
remote repositories (maven.google.com and maven central) when
fetching artifacts. By default remote repositories are enabled.
USE_JETIFIER (optional project property):
Optional project which, when not set to 1, disables the Jetifier tool to
convert references to the legacy Android Support libraries to Jetpack
(AndroidX). This defaults to 0.
DATA_BINDING_VERSION (required when USE_JETIFIER is 1):
Data binding library version to use when applying conversions from the legacy
Android support libraries to Jetpack (AndroidX).
PACKAGES_TO_COPY (required project property):
Semicolon separated list of Maven artifact specifications. This will
result in the script attempting to download the set of artifacts to
TARGET_DIR. Specified artifacts that are not copied to the target directory
are logged to the standard output stream.
e.g
\"-PPACKAGES_TO_COPY=com.android.support:support-compat:26.0.1;\
com.android.support:support-core-utils:26.0.1\"
Since this property semicolon separated it needs to be quoted correctly
when specified via some command line shells.
TARGET_DIR (required project property):
Directory to copy artifacts to.
e.g -PTARGET_DIR=some/directory/to/copy/to
"""
buildscript {
repositories {
mavenLocal()
mavenCentral()
google()
}
dependencies {
classpath "com.android.tools.build.jetifier:jetifier-processor:1.0.+"
}
}
import groovy.transform.AutoClone
import groovy.transform.EqualsAndHashCode
import groovy.transform.ToString
import com.android.tools.build.jetifier.core.config.Config
import com.android.tools.build.jetifier.core.config.ConfigParser
import com.android.tools.build.jetifier.processor.FileMapping
import com.android.tools.build.jetifier.processor.Processor
configurations {
// Configuration used to resolve the final set of transitive dependencies.
transitivePackagesConfig
// Configuration used to aggregate the set of packages we'll copy.
copyPackagesConfig
}
// Class which splits a version string into components.
@ToString(includeNames=true, includeFields=true)
public class Version implements Comparable {
// Version string to parse.
public String version = ""
/*
* Construct a version class from a string.
*/
public Version(String version = null) {
this.version = version ? version : ""
}
/*
* Split a version string into components that can be compared.
*
* @returns A list of components that can be compared either as integer
* values or strings.
*/
public List<String> getComparableComponents() {
// Split into groups of numeric and non-numeric strings.
List<String> components = []
if (version) {
boolean previousIsInteger = false
String component = ""
version.each { it ->
boolean currentIsInteger = it.isInteger()
// Determine whether the current character is the same type as the
// previous character.
boolean currentTypeSameAsPrevious =
(currentIsInteger == previousIsInteger)
if (!component.isEmpty() && !currentTypeSameAsPrevious) {
components.add(component)
component = ""
}
previousIsInteger = currentIsInteger
component += it
}
if (!component.isEmpty()) components.add(component)
}
return components
}
/*
* Split a version string into period separated components.
*
* @returns List of version number components.
*/
public List<String> getComponents() {
return version ? version.tokenize('.') : []
}
/*
* Expand wildcards in this version number to the minimum absolute value.
*
* @returns Expanded version number.
*/
public Version getMinimumValue() {
List<String> versionNumberComponents = []
for (String component in components) {
if (component.endsWith("+")) {
// Strip the + from the version number and replace with 0
String nonWildcardComponent =
component.substring(0, component.size() - 1)
versionNumberComponents.add(
nonWildcardComponent ? nonWildcardComponent : "0")
break
}
versionNumberComponents.add(component)
}
return new Version(version: versionNumberComponents.join("."))
}
/*
* Expand wildcards in this version number to the maximum absolute value.
*
* @returns Expanded version number.
*/
public Version getMaximumValue() {
List<String> versionNumberComponents = []
for (String component in components) {
if (component.endsWith("+")) {
// Strip the + from the version number and subtract the existing version
// number, if it can be parsed, from Integer.MAX_VALUE. This ensures
// 1.2.+ is a larger number than 1.2.1+ since 1.2.+ is less restrictive
// than 1.2.1+.
String nonWildcardComponent =
component.substring(0, component.size() - 1)
int valueToSubtract = nonWildcardComponent.isInteger() ?
(nonWildcardComponent as int) + 1 : 0
versionNumberComponents.add((Integer.MAX_VALUE -
valueToSubtract).toString())
break
}
versionNumberComponents.add(component)
}
return new Version(version: versionNumberComponents.join("."))
}
/*
* Returns whether the version contains any wildcards.
*
* @returns true if the version contains wildcards, false otherwise.
*/
public boolean getHasWildcards() {
return version.contains("+")
}
/*
* Compare with another version object.
*
* @param otherObject version object to compare with.
*
* @returns -1 if other is less than this version, 0 if they're the
* same, 1 if other is greater than this version.
*/
public int compareTo(Object otherObject) {
Version other = otherObject as Version
List<String> thisComponents = comparableComponents
List<String> otherComponents = other.comparableComponents
int componentsToCompare = Math.min(thisComponents.size(),
otherComponents.size())
for (int i = 0; i < componentsToCompare; ++i) {
String thisComponent = thisComponents[i]
String otherComponent = otherComponents[i]
int result =
(thisComponent.isInteger() && otherComponent.isInteger()) ?
(thisComponent as BigInteger) <=> (otherComponent as BigInteger) :
thisComponent <=> otherComponent
if (result != 0) return result
}
return thisComponents.size() <=> otherComponents.size()
}
/*
* Sort a list of versions
*
* @param versions Versions to sort.
*
* @returns A list of versions ordered by oldest to most recent version.
*/
public static List<Version> sort(Iterable<Version> versions) {
return versions.collect { it }.sort(false)
}
/*
* Modify the version expression such that it has looser requirements
* accepting any patch, revision then finally version starting at the
* current version.
*
* @returns Loosened version if possible or the version.
*/
public Version loosen() {
List<String> loosenedComponents = components.clone()
int lastComponentIndex = loosenedComponents.size() - 1
if (lastComponentIndex >= 0) {
String lastComponent = loosenedComponents[lastComponentIndex]
if (lastComponent == "+") {
lastComponent =
(lastComponentIndex > 0 ?
loosenedComponents[lastComponentIndex - 1] : "") + "+"
lastComponentIndex--
} else if (lastComponent.endsWith("+")) {
lastComponent = "+"
} else {
lastComponent = lastComponent + "+"
}
loosenedComponents =
lastComponentIndex > 0 ?
loosenedComponents[0 .. lastComponentIndex - 1] : []
if (lastComponent) loosenedComponents.add(lastComponent)
}
return new Version(loosenedComponents ? loosenedComponents.join(".") : "+")
}
}
// Type of version expression match.
public enum VersionExpressionMatchType {
NONE, // No match
RANGE, // Version in a range of versions.
ABSOLUTE, // Absolute version expression specified.
MINIMUM, // Minimum version of a min-version expression.
}
// Class which holds a version range.
@AutoClone
@EqualsAndHashCode(includeFields=true)
@ToString(includeNames=true, includeFields=true)
public class VersionRange {
// Parsed version expression.
public String versionExpression = ""
// Minimum version parsed from a version expression.
public String minimum = "0"
// Maximum version parsed from a version expression.
public String maximum = "+"
// Type of version expression parsed.
public VersionExpressionMatchType matchType =
VersionExpressionMatchType.NONE
/*
* Get the minimum and maximum version from a maven / ivy version expression.
* This does not distiguish between exclusive and inclusive version ranges.
* i.e [1.2.3,] is treated the same as (1.2.3,].
*
* @param versionExpression Version expression to parse.
*
* @returns VersionRange instance that contains the parsed data.
*/
public static VersionRange fromExpression(String versionExpression) {
// Match Maven / Ivy version range expressions like:
// [1.2.3,4.5.6]
// [1.2.3,4.5.6)
// (1.2.3,4.5.6)
// (1.2.3,]
// [,4.5.6)
def versionRangeMatch = (versionExpression =~
/^([\[\(])([^,]*),\s*([^\]\)]*)([\)\]])$/)
// Match absolute Maven / Ivy version expressions like [1.2.3].
def absoluteVersionMatch = (versionExpression =~ /^\[([^\]]+)\]$/)
// Match min value Maven version expressions (i.e which don't start with
// [ or (.
def minVersionMatch = (versionExpression =~ /^([^\[\(]+)$/)
VersionRange range = new VersionRange(
versionExpression: versionExpression, minimum: "0", maximum: "+",
matchType: VersionExpressionMatchType.NONE)
String minMatchedVersion = ""
String maxMatchedVersion = ""
if (versionRangeMatch.matches()) {
range.matchType = VersionExpressionMatchType.RANGE
minMatchedVersion = versionRangeMatch.group(2).trim()
if (minMatchedVersion) {
minMatchedVersion =
(new Version(minMatchedVersion)).minimumValue.version
}
maxMatchedVersion = versionRangeMatch.group(3).trim()
if (maxMatchedVersion) {
maxMatchedVersion =
(new Version(maxMatchedVersion)).maximumValue.version
}
} else if (absoluteVersionMatch.matches()) {
range.matchType = VersionExpressionMatchType.ABSOLUTE
minMatchedVersion = absoluteVersionMatch.group(1).trim()
if (minMatchedVersion) {
minMatchedVersion =
(new Version(minMatchedVersion)).minimumValue.version
}
maxMatchedVersion = minMatchedVersion
} else if (minVersionMatch.matches()) {
range.matchType = VersionExpressionMatchType.MINIMUM
minMatchedVersion = minVersionMatch.group(1).trim()
} else {
range.matchType = VersionExpressionMatchType.NONE
}
if (!minMatchedVersion.isEmpty()) range.minimum = minMatchedVersion
if (!maxMatchedVersion.isEmpty()) range.maximum = maxMatchedVersion
return range
}
/*
* Get the version range expression.
*
* @returns Version expression.
*/
String getExpression() {
switch (matchType) {
case VersionExpressionMatchType.NONE:
return versionExpression
case VersionExpressionMatchType.RANGE:
return sprintf("[%s,%s]", minimum, maximum)
case VersionExpressionMatchType.ABSOLUTE:
return sprintf("[%s]", minimum)
case VersionExpressionMatchType.MINIMUM:
return sprintf("%s", minimum)
}
}
/*
* Get the minimum version as a Version object.
*
* @return Version object.
*/
Version getMinimumVersion() {
return new Version(version: minimum)
}
/*
* Get the maximum version as a Version object.
*
* @return Version object.
*/
Version getMaximumVersion() {
return new Version(version: maximum)
}
/*
* Get the maximum absolute version number from this object replacing the
* wildcard character "+" from the version expression with Integer.MAX_VALUE.
*
* This facilitates sorting version expressions with wildcard values after
* non-wildcard card values. For example, 1.2.+ will be ordered after 1.2.0.
*
* @return Returns a version string with the wildcard component replaced by
* Integer.MAX_VALUE.
*/
Version getMaximumVersionOfRange() {
return (matchType == VersionExpressionMatchType.RANGE ?
maximumVersion : minimumVersion).maximumValue
}
/*
* Determine whether a version is within the range.
*
* @param version Version to check against this range.
*
* @returns true if the version is in range, false otherwise.
*/
boolean inRange(Version version) {
// If there are no constraints or the version is empty, always match.
if (!versionExpression || !version.version) return true
switch (matchType) {
case VersionExpressionMatchType.NONE:
return false
case VersionExpressionMatchType.RANGE:
return version.maximumValue >= minimumVersion.minimumValue &&
version.minimumValue <= maximumVersion.maximumValue
case VersionExpressionMatchType.ABSOLUTE:
return version == minimumVersion
case VersionExpressionMatchType.MINIMUM:
return version >= minimumVersion.minimumValue
}
return false
}
}
// Components of a package spec.
@AutoClone
@EqualsAndHashCode(includeFields=true)
@ToString(includeNames=true, includeFields=true)
public class PackageSpecifier implements Comparable {
// Group component of a maven package.
public String group = ""
// Artifact component of a maven package.
public String artifact = ""
// Version expression of a maven package.
public String versionExpression = ""
// Classifier of the artifact.
public String classifier = ""
// Type of the artifact.
public String artifactType = ""
/*
* Extract the components of a package specifier string.
*
* @param packageSpecifier Package specification.
* Package specification should match one of the following formats,
* - agroup:apackage:version@artifacttype
* e.g a.b.c:d.e:1.2.3@aar
* - agroup:apackage:version:classifier@artifacttype
* e.g a.b.c:d.e:1.2.3:f@aar
*
* @returns [group, artifact, version, artifactType, classifier] list with the components
* of the package spec. If a component is not present the entry in the list
* is null.
*/
public static PackageSpecifier fromString(String packageSpecifierString) {
List<String> components = packageSpecifierString ?
packageSpecifierString.split(/[:@]/) : []
if (components.size() == 5) {
// Special case to handle group:artifact:version:classifier@artifactType,
// We want to maintain the components list as,
// [group, artifact, version, artifactType, classifier]
// because classifiers are a rare case and more often than not, the parser
// will find artifactType in the second to last position.
// Hence, if there are 5 components, swap the last two to make sure
// artifactType is second to last.
components.swap(3,4)
}
// Fill the list of components with null elements.
components += ([""] * Math.min(5, (5 - components.size())))
return new PackageSpecifier(
group: components[0],
artifact: components[1],
versionExpression: components[2] ? (VersionRange.fromExpression(
components[2])).expression : "",
artifactType: components[3],
classifier: components[4])
}
/*
* Convert a list of package specifier strings to PackageSpecifier instances.
*
* @param packageSpecifierStrings List of strings to convert.
*
* @returns PackageSpecifier instances.
*/
public static List<PackageSpecifier> fromStrings(
Iterable<String> packageSpecifierStrings) {
return packageSpecifierStrings.collect { fromString(it) }
}
/*
* Convert a Gradle ModuleComponentSelector to a PackageSpecifier.
*
* @param selector Selector to convert.
*
* @returns PackageSpecifier instance.
*/
public static PackageSpecifier fromModuleComponentSelector(
ModuleComponentSelector selector) {
return selector.with {
return new PackageSpecifier(
group: group,
artifact: module,
versionExpression: (version ?
(VersionRange.fromExpression(version)).expression : ""))
}
}
/*
* Convert a Gradle ResolvedArtifact to a PackageSpecifier.
*
* @param resolvedArtifact ResolvedArtifact to convert.
*
* @returns PackageSpecifier instance.
*/
public static PackageSpecifier fromResolvedArtifact(
ResolvedArtifact resolvedArtifact) {
return resolvedArtifact.with {
PackageSpecifier pkg = fromModuleVersionIdentifier(moduleVersion.id)
pkg.artifactType = type
pkg.classifier = classifier
return pkg
}
}
/*
* Convert a Gradle ModuleVersionIdentifier to a PackageSpecifier.
*
* @param moduleVersionIdentifier ModuleVersionIdentifier to convert.
*
* @returns PackageSpecifier instance.
*/
public static PackageSpecifier fromModuleVersionIdentifier(
ModuleVersionIdentifier moduleVersionIdentifier) {
return moduleVersionIdentifier.with {
return new PackageSpecifier(
group: group,
artifact: name,
versionExpression: (version ?
(VersionRange.fromExpression(version)).expression : ""))
}
}
/*
* Convert a Gradle DirectDependencyMetadata to a PackageSpecifier.
*
* @param directDependencyMetadata DirectDependencyMetadata to convert.
*
* @returns PackageSpecifier instance.
*/
public static PackageSpecifier fromDirectDependencyMetadata(
DirectDependencyMetadata directDependencyMetadata) {
return directDependencyMetadata.with {
return new PackageSpecifier(
group: group,
artifact: name,
versionExpression: (versionConstraint ?
(VersionRange.fromExpression(
versionConstraint.requiredVersion).expression) : ""))
}
}
/*
* Sort a list of package specifiers by version.
*
* @param packages Package specifiers to sort.
*
* @returns A list of package specifiers order by oldest to most recent
* version.
*/
public static List<PackageSpecifier> sortByVersion(
Iterable<PackageSpecifier> packages) {
return packages.collect { it }.sort(false) { lhs, rhs ->
(lhs.versionRange.maximumVersionOfRange <=>
rhs.versionRange.maximumVersionOfRange)
}
}
/*
* Get the range from the version.
*
* @returns Version range parsed from version component of this class or an
* empty string if no version is set.
*/
public VersionRange getVersionRange() {
return VersionRange.fromExpression(versionExpression)
}
/*
* Compare with another PackageSpecifier object.
*
* @param otherObject PackageSpecifier object to compare with.
*
* @returns -1 if other is less than this version, 0 if they're the
* same, 1 if other is greater than this version.
*/
public int compareTo(Object otherObject) {
PackageSpecifier other = otherObject as PackageSpecifier
List<Integer> compareResults = [
group <=> other.group,
artifact <=> other.artifact,
versionRange?.minimumVersion <=> other?.versionRange?.minimumVersion,
versionRange?.maximumVersion <=> other?.versionRange?.maximumVersion,
artifactType <=> other.artifactType]
for (int itemComparison in compareResults) {
if (itemComparison != 0) return itemComparison
}
return 0
}
/*
* Convert to a list of components.
*
* @returns String list of components in the form
* [group, artifact, versionAndArtifactType]. Missing items are not returned
* in the list.
* For example, without a versionExpression this returns [group, artifact].
*/
private List<String> getComponentStrings() {
List<String> components = []
if (group) {
components.add(group)
if (artifact) {
components.add(artifact)
if (versionExpression) {
if (artifactType) {
if (classifier) {
components.add(versionExpression + ':' + classifier + "@" + artifactType)
} else {
components.add(versionExpression + "@" + artifactType)
}
} else {
components.add(versionExpression)
}
}
}
}
return components
}
/*
* Get group and artifact components as a string list.
*
* @returns [group, artifact] if they are present, empty list otherwise.
*/
private List<String> getGroupArtifact() {
List<String> components = componentStrings
return components.size() >= 2 ? components[0..1] : []
}
/*
* Convert to a colon separated string.
*
* @returns Colon separated string.
*/
public String getSpecString() {
return componentStrings.join(":")
}
/*
* Get group / artifact tuple as a colon separated string.
*
* @returns Colon separated string.
*/
public String getGroupArtifactString() {
return groupArtifact.join(":")
}
/*
* Convert to a valid filename.
*
* @returns Filename string.
*/
public String getFilename() {
List<String> hypenSeparatedComponents = []
String dotSeparatedGroupArtifact = groupArtifact.join(".")
if (dotSeparatedGroupArtifact) {
hypenSeparatedComponents += [dotSeparatedGroupArtifact]
}
if (versionExpression) {
hypenSeparatedComponents += [versionExpression]
}
if (classifier) {
hypenSeparatedComponents += [classifier]
}
String filename = hypenSeparatedComponents.join("-")
if (artifactType) {
filename += "." + (artifactType == "srcaar" ? "aar" : artifactType)
}
return filename
}
/*
* From a set of package specifiers create a map of lists of package
* specifiers indexed by group:artifact strings (e.g
* com.example:my-package:1.2.3@aar would
* become ret[com.example:my-package] = ["com.example:my-package:1.2.3.@aar"]
*
* @param packages List of package specifier strings.
*
* @returns A map of package specifier lists by group:name strings.
*/
public static Map<String, List<PackageSpecifier>> byGroupArtifact(
Iterable<PackageSpecifier> packages) {
Map<String, List<PackageSpecifier>> packagesByGroupArtifact = [:]
packages.each {
String groupArtifact = it.groupArtifactString
if (groupArtifact) {
List<PackageSpecifier> packageSpecs = packagesByGroupArtifact.get(
groupArtifact, [])
packageSpecs.add(it)
packagesByGroupArtifact[groupArtifact] = packageSpecs
}
}
return packagesByGroupArtifact
}
/*
* From a set of package specifiers create a map of package names indexed
* by group:artifact strings (e.g, com.example:my-package:1.2.3@aar would
* become ret[com.example:my-package] = "com.example:my-package:1.2.3@aar")
* Package specifiers without at least a group and artifact are ignored.
*
* If multiple versions of the same package are specified, the highest version
* is returned in the map.
*
* @param packages List of package specifiers.
*
* @returns A map of package specifiers by group:name strings.
*/
public static Map<String, PackageSpecifier> mostRecentByGroupArtifact(
Iterable<PackageSpecifier> packages) {
return PackageSpecifier.byGroupArtifact(packages).collectEntries {
String groupArtifact, List<PackageSpecifier> packageSpecs ->
[groupArtifact, PackageSpecifier.sortByVersion(packageSpecs)[-1]]
}
}
/*
* Get a list of specification strings from PackageSpecifier instances.
*
* @param packages PackageSpecifier instances.
*
* @returns List of package spec strings.
*/
public static List<String> specStrings(Iterable<PackageSpecifier> packages) {
return packages.collect { it.specString }
}
}
// Maps a package to another package name.
public class PackageMapper {
// Map of "group:artifact" to absolute package spec (coordinate) in the form
// "group:artifact:version".
public Map<String, String> dependenciesMap = [:]
// Inverse mapping of absolute package spec in the form "group:artifact" to
// "group:artifact". This is the inverse of dependenciesMap.
private Map<String, String> inverseDependenciesMap = null
// Set of packages that should be ignored when applying mapping in the form
// "group:artifact".
public Set<String> blackList = [].toSet()
/*
* Apply this mapping to the specified package.
*
* @param dependenciesMap Package mapping to apply. This maps strings of the
* form "group:artifact" to absolute package specs (coordinates)
* "group:artifact:version".
* @param blackList Packages to *not* map in the form "group:artifact".
* @param pkg Package specification to map.
*
* @return Package specification mapped via the dependenciesMap.
*/
public PackageSpecifier map(PackageSpecifier pkg) {
String groupArtifact = pkg.groupArtifactString
if (!blackList.contains(groupArtifact)) {
String mappedPackageSpec = dependenciesMap[groupArtifact]
if (mappedPackageSpec) {
return PackageSpecifier.fromString(mappedPackageSpec)
}
}
return pkg
}
/*
* Lookup the inverse mapping of a package to the original "group:artifact".
*
* @param pkg Package specification to apply reverse mapping.
*
* @return Package specification before mapping was applied.
*/
public PackageSpecifier inverseMap(PackageSpecifier pkg) {
String groupArtifact = pkg.groupArtifactString
if (!blackList.contains(groupArtifact)) {
if (inverseDependenciesMap == null) {
inverseDependenciesMap = dependenciesMap.collectEntries {
String sourceGroupArtifact, String targetPackageSpec ->
return [PackageSpecifier.fromString(
targetPackageSpec).groupArtifactString,
sourceGroupArtifact]
}
}
String mappedPackageSpec = inverseDependenciesMap[groupArtifact]
if (mappedPackageSpec) {
return PackageSpecifier.fromString(mappedPackageSpec)
}
}
return PackageSpecifier.fromString(groupArtifact)
}
/*
* Apply this mapping to the specified Gradle project configuration.
*
* Substitutes dependencies that match this mapping in the specified
* configuration.
*
* @param configuration Configuration to apply the mapping to.
* @param project Project to apply the configuration to. This is only
* required to apply a workaround for
* https://github.com/gradle/gradle/issues/5174 .
*/
public void applyToProjectConfiguration(Configuration configuration,
Project project) {
// Workaround https://github.com/gradle/gradle/issues/5174 by remapping all
// indirect dependency metadata directly.
// When #5174 is resolved it should be possible to remove this in preference
// of the dependency closure below.
project.dependencies.components.all { ComponentMetadataDetails component ->
component.allVariants { VariantMetadata variant ->
variant.withDependencies {
DirectDependenciesMetadata dependenciesMetadata ->
List<PackageSpecifier> currentDeps = dependenciesMetadata.collect {
PackageSpecifier.fromDirectDependencyMetadata(it)
}
Set<PackageSpecifier> depsToRemove = [].toSet()
List<PackageSpecifier> depsToAdd = currentDeps.findResults {
PackageSpecifier mapped = map(it)
if (mapped != it) {
depsToRemove.add(it)
return mapped
}
return null
}
// dependenciesMetadata.removeAll(oldDeps) does not work, so
// remove each old dependency manually.
depsToRemove.forEach { PackageSpecifier remove ->
dependenciesMetadata.removeIf {
DirectDependencyMetadata dependencyMetadata ->
return PackageSpecifier.fromDirectDependencyMetadata(
dependencyMetadata) == remove
}
}
depsToAdd.forEach { dependenciesMetadata.add(it.specString) }
}
}
}
// Use the dependency substitution closure to apply replacements.
configuration.resolutionStrategy.dependencySubstitution.all {
DependencySubstitution dependencySubstitution ->
ModuleComponentSelector requestedSelector =
dependencySubstitution.requested as ModuleComponentSelector
if (requestedSelector) {
PackageSpecifier requested =
PackageSpecifier.fromModuleComponentSelector(requestedSelector)
PackageSpecifier mapped = map(requested)
if (requested != mapped) {
dependencySubstitution.useTarget(mapped.specString,
"USE_JETIFIER is enabled")
}
}
}
}
/*
* Create a mapper using a Jetifier (Jetpack / AndroidX) processor.
*
* @param dataBindingVersion Version of the Jetpack Data Binding Library to
* use. All components of the data binding library must be pinned to the same
* version. These libraries are versioned in lock step with the Android Gradle
* plugin.
* https://android.googlesource.com/platform/tools/base/+/\
* f831317e99f/build-system/gradle-core/src/main/java/com/\
* android/build/gradle/internal/dependency/\
* AndroidXDepedencySubstitution.kt#56
*
* @returns PackageMapper initialized with the Jetpack processor's mapping.
*/
public static PackageMapper fromJetifierProcessor(
String dataBindingVersion) {
Processor processor = Processor.Companion.newInstance().createProcessor3(
(new ConfigParser()).loadDefaultConfig(), /* config */
false, /* reversedMode */
false, /* rewritingSupportLib */
true, /* useFallbackIfTypeIsMissing */
false, /* allowAmbiguousPackages */
false, /* stripSignatures */
dataBindingVersion /* dataBindingVersion */)
Map<String, String> jetifierDependenciesMap = processor.getDependenciesMap(
false /* filterOutBaseLibrary */)
Set<String> blackList = [
// androidx.databinding:databinding-compiler has a transitive dependency
// on com.android.databinding:baseLibrary, which shouldn't be replaced
// with AndroidX.
// https://issuetracker.google.com/78202536
// https://android.googlesource.com/platform/tools/base/+/\
// f831317e99f/build-system/gradle-core/src/main/java/com/\
// android/build/gradle/internal/dependency/\
// AndroidXDepedencySubstitution.kt#143
"com.android.databinding:baseLibrary",
].toSet()
return new PackageMapper(dependenciesMap: jetifierDependenciesMap,
blackList: blackList)
}
}
// Processor which simply copies a file to an output path.
public class DefaultPackageProcessor {
/*
* Generate a task to copy a file.
*
* @param project Project to add the task to.
* @param artifact Artifact to copy.
* @param pkg Package specifier of the artifact to copy.
* @param artifactTargetFile Path to copy to.
* @param copiedFileArtifacts List to add copied file and package specifier
* when the copy task is complete.
*/
public Task createTask(
Project project, ResolvedArtifact artifact, PackageSpecifier pkg,
File artifactTargetFile,
List<Tuple2<File, PackageSpecifier>> copiedFileArtifacts) {
Task copyTask = project.tasks.create(
name: "copy_" + pkg.filename,
type: Copy,
description: sprintf("Copy %s (%s) to %s", pkg.specString,
artifact.file, artifactTargetFile))
copyTask.with {
from artifact.file
into artifactTargetFile.parent
rename(
// Rename the file to the target filename and log the copied file &
// artifact so that they can be summarized when all copy artifact
// tasks are complete.
{
String filename ->
copiedFileArtifacts.add(
new Tuple2<File, PackageSpecifier>(artifactTargetFile, pkg))
return artifactTargetFile.toString()
}
)
doFirst { project.logger.info(description) }
}
return copyTask
}
}
// Processor an Android library to reference Jetpack / AndroidX using the
// Jetifier.
public class JetpackPackageProcessor extends DefaultPackageProcessor {
// Jetifier processor.
private Processor processor;
/*
* Construct a Jetifier (Jetpack / AndroidX) processor.
*
* @param dataBindingVersion Version of the Jetpack Data Binding Library to
* use. All components of the data binding library must be pinned to the same
* version. These libraries are versioned in lock step with the Android Gradle
* plugin.
*/
JetpackPackageProcessor(String dataBindingVersion) {
// NOTE: This needs to strip library signatures as libraries will be
// rewritten and without the signing key it's not possible to resign them.
processor = Processor.Companion.newInstance().createProcessor3(
(new ConfigParser()).loadDefaultConfig(), /* config */
false, /* reversedMode */
false, /* rewritingSupportLib */
true, /* useFallbackIfTypeIsMissing */
false, /* allowAmbiguousPackages */
true, /* stripSignatures */
dataBindingVersion /* dataBindingVersion */)
}
/*
* Generate a task to process a file.
*
* @param project Project to add the task to.
* @param artifact Artifact to copy.
* @param pkg Package specifier of the artifact to copy.
* @param artifactTargetFile Path to copy to.
* @param copiedFileArtifacts List to add copied file and package specifier
* when the copy task is complete.
*/
public Task createTask(
Project project, ResolvedArtifact artifact, PackageSpecifier pkg,
File artifactTargetFile,
List<Tuple2<File, PackageSpecifier>> copiedFileArtifacts) {
// If this is a file that should not be processed, (i.e is a new AndroidX
// library or an old support library that has been blacklisted) create a
// copy task instead.
if (processor.isNewDependencyFile(artifact.file) ||
processor.isOldDependencyFile(artifact.file)) {
return super.createTask(project, artifact, pkg, artifactTargetFile,
copiedFileArtifacts)
}
Task processTask = project.tasks.create(
name: "process_" + pkg.filename,
type: Task,
description: sprintf("Jetify %s (%s) to %s", pkg.specString,
artifact.file, artifactTargetFile))
processTask.with {
inputs.file artifact.file
outputs.file artifactTargetFile
doFirst { project.logger.info(description) }
doLast {
Set<FileMapping> sourceAndTargetFile =
[new FileMapping(artifact.file, /* from */
artifactTargetFile /* to */)].toSet()
processor.transform(sourceAndTargetFile, /* inputs */
true /* copyUnmodifiedLibsAlso */)
copiedFileArtifacts.add(
new Tuple2<File, PackageSpecifier>(artifactTargetFile, pkg))
}
}
return processTask
}
}
/*
* Get the group of a version-locked package.
*
* @param pkg Package spec to query.
*
* @returns 0 if the package isn't version locked, index value greater than 0
* if the package is added to the lockedPackages list or an index value lesser
* than 0 if the package is part of a version locked set but is at a non-version
* locked version. For example, if a:b.c:1.0 is version locked and a:b.c:2.0
* is not version locked - 1.0 & 2.0 are arbitrary versions - this will return a
* positive index value for a:b.c:1.0 and negative value for a:b.c:2.0.
*/
int getVersionLockedPackageIndex(PackageSpecifier pkg) {
// Packages that should be version-locked.
for (def indexAndRegex in [
// * com.google.android.gms.* packages are released a single set that
// typically are not compatible between revisions. e.g If a user
// depends upon play-services-games:9.8.0 they'll also require
// play-services-base:9.8.0 etc.
// * com.google.firebase.* packages are versioned in the same way as
// com.google.android.gms.* with dependencies upon the gms
// (Play Services) components. and need to be pinned to the same
// com.google.android.gms.* packages.
~/^com\.google\.(android\.gms|firebase):.*/,
// com.android.support packages all need to be included at the same
// revision.
~/^com\.android\.support:.*/,
// Package group used to test this script.
~/^org\.test\.psr\.locked:.*/,
].withIndex()) {
def (versionLockedRegex, index) = indexAndRegex
String specString = pkg.specString
if (!(specString ==~ versionLockedRegex)) continue
// com.google.firebase.* packages that end with -unity$ are shipped
// separately so they are *not* locked to Google Play services and
// Firebase packages.
if (specString ==~ /^com\.google\.firebase:[^:]+-unity:.*/) {
continue
}
// com.android.support:multidex is versioned independently of other
// legacy Android support libraries.
if (specString ==~ /^com\.android\.support:multidex:.*/) {
continue
}
// Version 15+ of Google Play Services components are released and
// versioned individually.
if (pkg.group && pkg.group ==~ /^com\.google\.(android\.gms|firebase)$/ &&
pkg.versionExpression) {
String majorVersion =
VersionRange.fromExpression(
(new Version(version: pkg.versionRange.minimum)).components[0]).
maximumVersionOfRange.version
if (majorVersion.isInteger() && Integer.parseInt(majorVersion) >= 15) {
return -(index + 1)
}
}
return index + 1
}
return 0
}
/*
* If the specified package is version-locked add it to the appropriate set.
*
* @param packageSpecifier Package to add to a set if is version-locked.
* A version-locked package is determined by a return value of >= 0 by
* getVersionLockedPackageIndex().
* @param lockedPackages Map of sets of version-locked packages. Each set
* is indexed by the value returned by getVersionLockedPackageIndex().
* @param blacklist Set of package set indexes that should not be used.
* This is utilized when a non-version locked package exists in the set of
* dependencies for a package and therefore no packages in the set should be
* locked to a specific version.
*
* @returns 0 if the package isn't version locked, index value greater than 0
* if the package is added to the lockedPackages list or an index value lesser
* than 0 if the package is part of a version locked set but is at a non-version
* locked version. For example, if a:b.c:1.0 is version locked and a:b.c:2.0
* is not version locked - 1.0 & 2.0 are arbitrary versions - this will return a
* positive index value for a:b.c:1.0 and negative value for a:b.c:2.0.
*/
int addVersionLockedPackageToSet(
PackageSpecifier packageSpecifier,
Map<Integer, Set<PackageSpecifier>> lockedPackages,
Set<Integer> blacklist) {
int index = getVersionLockedPackageIndex(packageSpecifier)
if (index in blacklist) index = -index
Set<String> lockedPackageSet = lockedPackages.get(index, [].toSet())
lockedPackageSet.add(packageSpecifier)
lockedPackages[index] = lockedPackageSet
return index
}
/*
* Given a set of package specs, generate a blacklist of version locked package
* set indexes.
*
* @param packages List of package specifications to scan for
* version-locked package groups that should be blacklisted.
*
* @returns Set of blacklisted package set indexes for groups of packages
* that should not be version-locked.
*/
Set<Integer> createVersionLockedSetBlacklist(
Iterable<PackageSpecifier> packages) {
Set<Integer> blacklist = [].toSet()
packages.each { pkg ->
int index = getVersionLockedPackageIndex(pkg)
if (index < 0) blacklist.add(-index)
}
return blacklist
}
/*
* Generate a map of the most recent version-locked packages each set.
*
* @param lockedPackages Sets of version-locked packages indexed by an
* arbitrary number for grouping.
*
* @returns List of packages.
*/
Iterable<PackageSpecifier> mostRecentVersionLockedPackagesFromSet(
Map<Integer, Set<PackageSpecifier>> lockedPackages) {
List<PackageSpecifier> versionLockedPackages = []
lockedPackages.findAll({ it.key > 0 }).values().each {
Iterable<PackageSpecifier> packages ->
List<PackageSpecifier> sortedPackages =
PackageSpecifier.sortByVersion(packages)
String highestVersionExpression = sortedPackages[-1].versionExpression
sortedPackages.each { PackageSpecifier pkg ->
PackageSpecifier lockedPkg = pkg.clone()
lockedPkg.versionExpression = highestVersionExpression
versionLockedPackages.add(lockedPkg)
}
}
return versionLockedPackages.sort()
}
/*
* Lock all packages in the specified set to the same version if they should
* be version-locked.
*
* @param packages Packages to search for version locked packages.
*
* @returns Potentially a subset of `packages` with version locking applied.
*/
Iterable<PackageSpecifier> versionLockPackages(
Iterable<PackageSpecifier> packages) {
// Build a sets of packages that should be version locked and bucket into
// version locked groups.
Map<Integer, Set<PackageSpecifier>> versionLockedPackageSets = [:]
Set<Integer> versionLockedSetBlacklist =
createVersionLockedSetBlacklist(packages)
packages.each {
addVersionLockedPackageToSet(it, versionLockedPackageSets,
versionLockedSetBlacklist)
}
// Lock each group of version locked packages to the most recent version.
return mostRecentVersionLockedPackagesFromSet(versionLockedPackageSets)
}
/*
* Perform a breadth first walk of a dependency graph optionally calling a
* closure for each node in the graph.
*
* @param root Root of the graph to traverse.
* @param closure Closure to call for each node in the graph.
* The closure is called with
* (DependencyResult dependency, List<DependencyResult> parents)
* where dependency is the current dependency and parents is the list of
* parents of the current dependency. This value can be null to just retrieve
* a flat list of nodes in the graph.
*
* @returns List of (dependency, graph nodes) traversed.
*/
List<Tuple2<DependencyResult, List<DependencyResult>>>
walkResolvedComponentResultGraph(ResolvedComponentResult root, closure) {
// List of (dependency, parentsList) tuples where dependency is a
// DependencyResult describing a node in the graph and parentsList is the
// list of DependencyResult nodes that are parents of the "dependency" node.
List<Tuple2<DependencyResult, List<DependencyResult>>> graphRemaining = []
root.dependencies.each {
graphRemaining.add(
new Tuple2<DependencyResult, List<DependencyResult>>(it, []))
}
List<Tuple2<DependencyResult, List<DependencyResult>>> summaryGraph = []
// Map of group:artifact to versioned package specification
// strings.
while (graphRemaining.size > 0) {
// Process current node in the graph.
Tuple2<DependencyResult, List<DependencyResult>> currentNode =
graphRemaining[0]
DependencyResult dependency = currentNode.first
List<DependencyResult> parents = currentNode.second
summaryGraph.add(currentNode)
graphRemaining = graphRemaining.drop(1)
// Call the closure the current node and the current node's parents.
if (closure) closure(dependency, parents)
if (dependency instanceof ResolvedDependencyResult) {
ResolvedComponentResult componentResult = dependency.selected
List<DependencyResult> parentsOfChildren = parents.clone()
parentsOfChildren.addAll(0, [dependency])
graphRemaining.addAll(
0, componentResult.dependencies.collect {
new Tuple2<DependencyResult, List<DependencyResult>>(
it, parentsOfChildren)
})
}
}
return summaryGraph
}
/*
* Add the most recent package to a map indexed by group:artifact.
*
* @param packages Map of package specification strings by group:artifact.
* @param pkg Package to add to the map if it's the most recent versiom.
*
* @returns Map of package specification strings.
*/
Map<String, PackageSpecifier> addMostRecentPackageToMap(
Map<String, PackageSpecifier> packages, PackageSpecifier pkg) {
PackageSpecifier existing = packages[pkg.groupArtifactString]
if (existing) pkg = PackageSpecifier.sortByVersion([existing, pkg])[-1]
packages[pkg.groupArtifactString] = pkg
return packages
}
/*
* Walk a dependency graph loosing the version constraints for the parent of
* each conflicting dependency.
*
* This walks the supplied graph and loosens the version constraints using
* loosenVersionExpression() for each parent of a conflicting dependency.
* The method returns a map of package strings that can be used in another
* attempt to resolve without conflicts.
*
* @param root Root of the graph to traverse.
* @param requestedPackages Set of package dependency strings that were used
* to generate the resolved dependency graph.
* @param keepPackages Set of package dependency strings that should not have
* dependency expressions modified.
*
* @returns Tuple of [conflictsFound, packages] where
* "conflictsFound" is a boolean that indicates whether any conflicting
* packages were found in the graph and "packages" is a set of package
* specifiers from the set requestedPackages with potentially loosened
* version constraints.
*/
Tuple2<Boolean, Set<PackageSpecifier>> loosenVersionContraintsForConflicts(
ResolvedComponentResult root, Set<PackageSpecifier> requestedPackages) {
// NOTE: The version field is ignored in the returned map, this is only used
// to look up the type specifier for each package.
Map<String, PackageSpecifier> requestedPackagesByGroupArtifact =
PackageSpecifier.mostRecentByGroupArtifact(requestedPackages)
// Build a set of version locked package set indexes that should not be
// version locked.
Set<Integer> versionLockedSetBlacklist = createVersionLockedSetBlacklist(
walkResolvedComponentResultGraph(root, null).collect {
DependencyResult dependency, List<DependencyResult> parents ->
PackageSpecifier.fromModuleComponentSelector(
dependency.requested as ModuleComponentSelector)
})
// Map of whether each package is conflicting by group:artifact.
Map<String, Boolean> conflictingByGroupArtifact = [:]
def trackConflictState = { PackageSpecifier pkg, Boolean isConflicting ->
String groupArtifact = pkg.groupArtifactString
conflictingByGroupArtifact[groupArtifact] =
conflictingByGroupArtifact.get(groupArtifact, isConflicting) |
isConflicting
return isConflicting
}
// Map of package specification strings indexed by group:artifact.
Map<String, PackageSpecifier> packages = [:]
Map<Integer, Set<PackageSpecifier>> versionLockedPackages = [:]
// Closure which adds a dependency to the packages map if it is present in
// the group:artifact set.
def addDependencyToPackages = { PackageSpecifier pkg, Boolean isConflicting ->
// Look up the requested package so that the search continues from the user
// requested packages.
PackageSpecifier requestedPackage = requestedPackagesByGroupArtifact[
pkg.groupArtifactString]
if (requestedPackage) pkg = requestedPackage
// If the package is version-locked add it to the tracking set so it can
// be reconciled later.
int versionLockedIndex = addVersionLockedPackageToSet(
pkg, versionLockedPackages, versionLockedSetBlacklist)
if (versionLockedIndex > 0) {
return trackConflictState(pkg, isConflicting)
}
// If this package is part of a blacklisted version-locked package set but
// the current package version is version-locked we're going to end up with
// a conflict across this set so loosen the version of this package.
if (((-versionLockedIndex) in versionLockedSetBlacklist) &&
getVersionLockedPackageIndex(pkg) > 0) {
isConflicting = true
}
// If the package was specified by the user as an absolute version,
// keep the user specified version.
if (requestedPackage &&
requestedPackage.versionRange.matchType ==
VersionExpressionMatchType.ABSOLUTE &&
requestedPackage.versionRange.minimumVersion.minimumValue ==
requestedPackage.versionRange.maximumVersion.maximumValue &&
isConflicting) {
if (!(requestedPackage.groupArtifactString in
conflictingByGroupArtifact.keySet())) {
logger.info(sprintf("Keeping conflicting package %s as it's " +
"explicitly specified at version %s",
requestedPackage.specString,
requestedPackage.versionExpression))
}
addMostRecentPackageToMap(packages, requestedPackage)
return trackConflictState(requestedPackage, false)
}
// If this package wasn't specified by the user, ignore it.
if (!requestedPackage) {
return trackConflictState(pkg, isConflicting)
}
// Loosen the version expression for this package if it is currently
// conflicting.
PackageSpecifier newPkg =
new PackageSpecifier(
group: pkg.group,
artifact: pkg.artifact,
classifier: pkg.classifier,
versionExpression: (
isConflicting ?
pkg.versionRange.matchType == VersionExpressionMatchType.RANGE ?
pkg.versionRange.maximumVersion.loosen().version :
pkg.versionRange.minimumVersion.loosen().version :
pkg.versionRange.expression),
artifactType: pkg.artifactType)
addMostRecentPackageToMap(packages, newPkg)
return trackConflictState(newPkg, isConflicting)
}
// Walk the resolved graph tracking whether conflicts are present.
walkResolvedComponentResultGraph(
root, { DependencyResult dependency, List<DependencyResult> parents ->
// Wrap the selector with a PackageSpecifier keeping setting the version
// expression to the selected package version.
PackageSpecifier requestedPackage =
PackageSpecifier.fromModuleComponentSelector(
dependency.requested as ModuleComponentSelector)
ResolvedComponentResult resolved =
(dependency instanceof ResolvedDependencyResult) ?
(dependency as ResolvedDependencyResult).selected : null
boolean conflicting = resolved == null ||
resolved.selectionReason.isConflictResolution()
// Gradle has resolved the conflict but it still may not satisfy the
// dependency specification, so check the selected version with the
// requested version of the dependency.
if (resolved && conflicting) {
PackageSpecifier resolvedPackage =
PackageSpecifier.fromModuleVersionIdentifier(resolved.moduleVersion)
if (requestedPackage.versionRange.inRange(
resolvedPackage.versionRange.minimumVersion)) {
conflicting = false
}
}
addDependencyToPackages(requestedPackage, conflicting)
})
// Walk the resolved graph again, this time applying any required changes to
// parents or children of conflicting dependencies.
boolean conflictsFound = false
List<Tuple2<DependencyResult, List<DependencyResult>>> summaryGraph =
walkResolvedComponentResultGraph(
root, { DependencyResult dependency, List<DependencyResult> parents ->
PackageSpecifier pkg = PackageSpecifier.fromModuleComponentSelector(
dependency.requested as ModuleComponentSelector)
if (conflictingByGroupArtifact[
pkg.groupArtifactString]) {
conflictsFound = true
parents.each {
addDependencyToPackages(
PackageSpecifier.fromModuleComponentSelector(
it.requested as ModuleComponentSelector), true)
}
}
// If the package version spec can't be loosened any further and this
// was requested by the caller of this method, add child packages to the
// set of dependencies to loosen in the next iteration.
boolean overrideTransitiveDependencies =
pkg.versionExpression == "+" &&
(pkg.groupArtifactString in requestedPackagesByGroupArtifact)
if (overrideTransitiveDependencies &&
(dependency instanceof ResolvedDependencyResult)) {
// Find the set of packages, if any, to override.
List<Tuple2<PackageSpecifier,
ModuleComponentSelector>> packagesToOverride =
dependency.selected.dependencies.findResults {
PackageSpecifier dependencyPkg =
PackageSpecifier.fromModuleComponentSelector(
it.requested as ModuleComponentSelector)
if (dependencyPkg.groupArtifactString in packages) {
return null
}
return new Tuple2<PackageSpecifier, ModuleComponentSelector>(
dependencyPkg, it.requested as ModuleComponentSelector)
}
// Add packages to set to override on the next resolution attempt.
if (packagesToOverride) {
logger.quiet(
sprintf("Overriding transitive dependencies of %s: %s",
pkg.specString, packagesToOverride.collect {
PackageSpecifier unused,
ModuleComponentSelector requested ->
requested.toString() }.toString()))
packagesToOverride.each {
PackageSpecifier dependencyPkg, ModuleComponentSelector unused ->
addMostRecentPackageToMap(packages, dependencyPkg)
}
}
}
})
// Select the most recent version of each version-locked package and add to
// the set.
mostRecentVersionLockedPackagesFromSet(versionLockedPackages).each {
if (it.groupArtifactString in requestedPackagesByGroupArtifact) {
addMostRecentPackageToMap(packages, it)
}
}
// Collate the set of conflicts after resolution.
// This data structure maps groupArtifact of a conflicting package to a
// list of paths through the dependency tree in the form root/child/leaf to
// each conflict.
Map<String, Set<String>> conflictingDependencies = [:]
summaryGraph.each {
DependencyResult dependency, List<DependencyResult> parents ->
if (!(dependency instanceof ResolvedDependencyResult)) return
PackageSpecifier conflictPkg =
PackageSpecifier.fromModuleComponentSelector(
dependency.requested as ModuleComponentSelector)
String groupArtifact = conflictPkg.groupArtifactString
if (!conflictingByGroupArtifact[groupArtifact]) return
List<PackageSpecifier> parentPkgs = parents.collect {
PackageSpecifier.fromModuleComponentSelector(
it.requested as ModuleComponentSelector)
}
String pathToConflict = PackageSpecifier.specStrings(
([conflictPkg] + parentPkgs).reverse()).join("/")
Set<String> conflictPaths =
conflictingDependencies.get(groupArtifact, [].toSet())
conflictPaths.add(pathToConflict)
conflictingDependencies[groupArtifact] = conflictPaths
}
logger.info("=== Updated Dependencies ===")
conflictingDependencies.keySet().sort().each { String conflictGroupArtifact ->
List<String> conflictPaths =
conflictingDependencies[conflictGroupArtifact].sort()
// If only one package is reported as a conflict, it's a parent node in the
// graph of the conflict so ignore it.
if (conflictPaths.size() > 1) {
logger.quiet(sprintf("%s conflicting due to package(s):",
conflictGroupArtifact))
conflictPaths.each { logger.quiet(sprintf("- %s", it)) }
}
}
// Dump the complete dependency graph and the conflict state of each node.
if (project.hasProperty("DUMP_DEBUG_GRAPH") &&
project.getProperty("DUMP_DEBUG_GRAPH") == "1") {
summaryGraph.each {
DependencyResult dependency, List<DependencyResult> parents ->
String groupArtifact =
PackageSpecifier.fromModuleComponentSelector(
dependency.requested as ModuleComponentSelector).groupArtifactString
ResolvedComponentResult resolved =
(dependency instanceof ResolvedDependencyResult) ?
(dependency as ResolvedDependencyResult).selected : null
logger.quiet(
sprintf(
"%s* %s (new: %s, conflicting: %b (parents: %s))",
" ".multiply(parents.size()),
resolved && resolved.toString() != dependency.requested.toString() ?
sprintf("%s --> %s (%s)", dependency.requested.toString(),
resolved.toString(), resolved.selectionReason) :
dependency.requested.toString(),
packages[groupArtifact]?.specString,
conflictingByGroupArtifact[groupArtifact],
parents.collect {
PackageSpecifier.fromModuleComponentSelector(
it.requested as ModuleComponentSelector).specString
}))
}
}
logger.info(sprintf("=== Selected dependencies: %s",
PackageSpecifier.specStrings(
packages.values()).toString()))
return new Tuple2<Boolean, Set<PackageSpecifier>>(
conflictsFound, packages.values().toSet())
}
/*
* Given two sets of package specifications that specify potentially different
* versions, create a map that describes all versions that have changed.
* Only the packages in the oldPackages set are considered, all packages that
* exist in newPackages that are not in oldPackages are ignored and packages
* that are removed are ignored.
*
* @param oldPackages Package specifications prior to the version change.
* @param newPackages Package specifications after the version change.
* @param packageMapper Object that applied mapping to packages when they were
* resolved.
*
* @returns Map of [oldVersion, newVersion] tuples indexed by the group:artifact
* of each package with a modified version.
*/
Map<String, List<Tuple2<PackageSpecifier,
PackageSpecifier>>> getModifiedPackageVersions(
Iterable<PackageSpecifier> oldPackages,
Iterable<PackageSpecifier> newPackages, PackageMapper packageMapper) {
// Track package specifications that were modified.
Map<String, List<Tuple2<PackageSpecifier,
PackageSpecifier>>> packagesModified = [:]
// Bucket old and new versions by group artifact name.
Map<String, List<PackageSpecifier>> oldPackagesByGroupArtifact =
PackageSpecifier.byGroupArtifact(oldPackages)
// This performs the inverse mapping from each new package to the original
// package name so that it's possible to track the replacement.
// For example, if foo:bar:1.2.3 is mapped to foox:bish:1.0.0 this will
// generate the dictionary ["foo:bar", ["foox:bish:1.0.0"] so that when
// the code below looks for modifications to the package "foo:bar" it will
// map to "foox:bish".
Map<String, List<PackageSpecifier>> newPackagesByGroupArtifact =
PackageSpecifier.byGroupArtifact(newPackages).collectEntries {
String groupArtifact, List<PackageSpecifier> pkgs ->
// There should only be *one* new version of the package selected.
assert pkgs.size() == 1
PackageSpecifier oldPkg = packageMapper.inverseMap(
PackageSpecifier.fromString(pkgs[0].groupArtifactString))
return [oldPkg.groupArtifactString, pkgs]
}
oldPackagesByGroupArtifact.each {
String groupArtifact, List<PackageSpecifier> oldItems ->
List<PackageSpecifier> newItems =
newPackagesByGroupArtifact.get(groupArtifact, [])
oldItems.each { PackageSpecifier oldPackage ->
// NOTE: Unlike similar languages, groovy's map.get inserts the
// retrieved item into the map.
List<Tuple2<PackageSpecifier, PackageSpecifier>> modified =
packagesModified[groupArtifact]
if (!modified) modified = []
if (newItems) {
newItems.each { PackageSpecifier newPackage ->
VersionRange oldRange = oldPackage.versionRange
VersionRange newRange = newPackage.versionRange
// Only take into account overlapping ranges if the previous range
// wasn't a minimum value without wildcards. For example,
// 1.2.3 typically means that user wanted to select version 1.2.3
// not 1.2.3 or any subsequent version.
boolean checkInRange =
oldRange &&
(oldRange.minimumVersion.hasWildcards ||
oldRange.matchType != VersionExpressionMatchType.MINIMUM)
// Determines whether the new range bounds are within the previous
// range.
boolean newRangeInOldRange =
newRange && (
checkInRange ?
(oldRange.inRange(newRange.minimumVersion) ||
oldRange.inRange(newRange.maximumVersion)) :
oldRange.minimumVersion == newRange.minimumVersion)
if (!oldRange || !newRange || !newRangeInOldRange) {
modified.add(new Tuple2<PackageSpecifier, PackageSpecifier>(
oldPackage, newPackage))
}
}
}
if (modified) packagesModified[groupArtifact] = modified
}
}
return packagesModified
}
/*
* Attempt resolution of the specified packages, loosening version constraints
* if resolution fails due to conflict package versions.
*
* @param packages Packages to resolve the dependencies of.
* @param packageMapper Package mapping to apply on dependency resolution.
*
* @returns Tuple of [packages, configuration] where:
* packages is the set of package specifications that were successfully resolved
* or the original list if it's not possible to find a set of packages that do
* not conflict.
* configuration is the Gradle configuration used to resolve the packages.
*/
Tuple2<Set<PackageSpecifier>, Configuration> resolveConflictingPackages(
Iterable<PackageSpecifier> packages, PackageMapper packageMapper) {
// Substitute top level packages.
packages = packages.collect { packageMapper.map(it) }
// Select the most recent package for each of the specified set of packages.
Set<PackageSpecifier> currentPackages =
PackageSpecifier.mostRecentByGroupArtifact(packages).values().toSet()
int resolutionAttempt = 1
Configuration userPackagesToQuery = null
boolean resolutionComplete = false
while (true) {
// Copy the configuration to query the set of required dependencies.
userPackagesToQuery = project.configurations.create(
"userPackagesToQuery" + resolutionAttempt.toString())
packageMapper.applyToProjectConfiguration(userPackagesToQuery, project)
// Add user specified packages to the userPackages configuration.
// This allows us to resolve during the configuration phase.
if (!resolutionComplete) {
logger.quiet(sprintf("Resolution attempt %d: packages %s",
resolutionAttempt,
PackageSpecifier.specStrings(
currentPackages).toString()))
}
PackageSpecifier.specStrings(currentPackages).each {
project.dependencies.add(userPackagesToQuery.name, it)
}
if (resolutionComplete) break
ResolutionResult resolutionResult =
userPackagesToQuery.incoming.resolutionResult
// Warn the user of missing dependencies.
resolutionResult.allDependencies.findAll {
it instanceof UnresolvedDependencyResult
}.each {
logger.quiet(
sprintf("Resolve failed due to %s missing for %s, attempted " +
"to use %s, failed due to %s", it.requested, it.from,
it.attempted, it.failure))
}
Set<PackageSpecifier> newPackages = currentPackages
boolean conflictsFound = false
(conflictsFound, newPackages) = loosenVersionContraintsForConflicts(
resolutionResult.root, currentPackages)
boolean packagesChanged = !newPackages.equals(currentPackages)
currentPackages = newPackages
logger.quiet(sprintf("Resolution attempt: %d, conflicts detected: %b, " +
"updated packages: %b", resolutionAttempt,
conflictsFound, packagesChanged))
resolutionAttempt++
if (!conflictsFound) {
// Create a new configuration for resolution with the selected packages.
resolutionComplete = true
continue
} else if (!packagesChanged) {
logger.warn(sprintf("Unable to find a set of non-conflicting artifacts " +
"for packages %s.",
PackageSpecifier.specStrings(
currentPackages).toString()))
break
}
}
// Restore any packages that were not present during the conflict resolution
// process.
Set<String> foundPackages =
PackageSpecifier.mostRecentByGroupArtifact(currentPackages).keySet()
currentPackages += packages.findAll {
!(it.groupArtifactString in foundPackages)
}.toSet()
return new Tuple2<Set<PackageSpecifier>, Configuration>(currentPackages,
userPackagesToQuery)
}
/*
* For each missing package search for a srcaar artifact.
*
* JarResolverLib will implicitly search for .srcaar artifacts in a maven
* package in addition to aar and jar artifacts. Since Gradle doesn't know
* what a srcaar is and it's likely each POM doesn't reference the srcaar
* either, we resolve dependencies during the configuration phase to
* determine which packages are missing, add the srcaar artifact specifier
* to search for srcaar files then search again in an attempt to resolve
* the missing packages.
*
* @param packages Package specifications to resolve.
* @param packageMapper Package mapping to apply on dependency resolution.
*
* @returns Package specifications with the @srcaar artifact specifier for each
* artifact where a fallback package exists.
*/
Set<PackageSpecifier> fallbackToSrcAarArtifacts(
Iterable<PackageSpecifier> packages, PackageMapper packageMapper) {
// Search for all packages, excluding those with explicit artifact types and
// find the missing set.
Map<String, PackageSpecifier> searchPackages =
PackageSpecifier.mostRecentByGroupArtifact(packages).findAll {
!it.value.artifactType
}
Configuration findMissingConfig = project.configurations.create("findMissing")
packageMapper.applyToProjectConfiguration(findMissingConfig, project)
PackageSpecifier.specStrings(packages).each {
project.dependencies.add(findMissingConfig.name, it)
}
def artifactsToGroupArtifact = { Iterable<ResolvedArtifact> artifacts ->
return artifacts.collect {
PackageSpecifier.fromResolvedArtifact(it).groupArtifactString
}
}
Set<String> foundArtifacts = artifactsToGroupArtifact(
findMissingConfig.resolvedConfiguration.
lenientConfiguration.getArtifacts(Specs.satisfyAll()))
Set<String> missingPackages = searchPackages.keySet().minus(foundArtifacts)
Map<String, PackageSpecifier> fallbackPackages =
missingPackages.collectEntries {
PackageSpecifier pkg = searchPackages[it].clone()
pkg.artifactType = "srcaar"
return [it, pkg]
}
// Search for missing packages using the srcaar artifact type.
Configuration searchForSrcAarConfig =
project.configurations.create("searchForSrcAars")
packageMapper.applyToProjectConfiguration(searchForSrcAarConfig, project)
PackageSpecifier.specStrings(fallbackPackages.values()).each {
project.dependencies.add(searchForSrcAarConfig.name, it)
}
foundArtifacts = artifactsToGroupArtifact(
searchForSrcAarConfig.resolvedConfiguration.
lenientConfiguration.getArtifacts(Specs.satisfyAll()))
// Replace all user supplied packages in the output set with discovered srcaar
// package specs.
Set<PackageSpecifier> outputPackages = [].toSet()
packages.each {
String groupArtifact = it.groupArtifactString
if (groupArtifact && groupArtifact in foundArtifacts) {
outputPackages.add(fallbackPackages[groupArtifact])
} else {
outputPackages.add(it)
}
}
return outputPackages
}
def testGetComponentsFromPackage() {
[["org.test.psr:something-neat:1.2.3@special",
new PackageSpecifier(group: "org.test.psr",
artifact: "something-neat",
versionExpression: "1.2.3",
artifactType: "special")],
["org.test.psr:something-neat:1.2.3",
new PackageSpecifier(group: "org.test.psr",
artifact: "something-neat",
versionExpression: "1.2.3",
artifactType: "")],
["org.test.psr:something-neat",
new PackageSpecifier(group: "org.test.psr",
artifact: "something-neat",
versionExpression: "",
artifactType: "")],
["org.test.psr",
new PackageSpecifier(group: "org.test.psr",
artifact: "",
versionExpression: "",
artifactType: "")],
["", new PackageSpecifier()]].each {
String packageSpecifier, PackageSpecifier expected ->
PackageSpecifier result = PackageSpecifier.fromString(packageSpecifier)
if (result != expected) {
throw new Exception(
sprintf("Invalid components %s, expected %s for package '%s'",
result, expected, packageSpecifier))
}
}
}
def testPackageSpecifierStrings() {
[[PackageSpecifier.fromString("a-b:c-d:1.2.3@srcaar"),
["a-b:c-d:1.2.3@srcaar", "a-b:c-d", "a-b.c-d-1.2.3.aar"]],
[PackageSpecifier.fromString("a-b:c-d:1.2.3@aar"),
["a-b:c-d:1.2.3@aar", "a-b:c-d", "a-b.c-d-1.2.3.aar"]],
[PackageSpecifier.fromString("a-b:c-d:1.2.3"),
["a-b:c-d:1.2.3", "a-b:c-d", "a-b.c-d-1.2.3"]],
[PackageSpecifier.fromString("a-b:c-d"),
["a-b:c-d", "a-b:c-d", "a-b.c-d"]],
[PackageSpecifier.fromString("a-b"), ["a-b", "", ""]],
[PackageSpecifier.fromString(""), ["", "", ""]]].each {
pkg, expected ->
List<String> result = [pkg.specString,
pkg.groupArtifactString,
pkg.filename]
if (result != expected) {
throw new Exception(
sprintf("Invalid strings returned %s, expected %s for %s",
result, expected, pkg))
}
}
}
def testPackageSpecifierVersionRange() {
[[PackageSpecifier.fromString("a-b:c-d:[1.2.3,4.5.6]"), "[1.2.3,4.5.6]"],
[PackageSpecifier.fromString("a-b:c-d:"), ""]].each {
pkg, expected ->
String result = pkg.versionRange.versionExpression
if (result != expected) {
throw new Exception(
sprintf("Invalid version range %s, expected %s for %s",
result, expected, pkg))
}
}
}
def testGetMostRecentPackagesByGroupArtifact() {
[[["a.b.c:d-e:1.2.3", "a.b.c:e-f:+"],
["a.b.c:d-e": "a.b.c:d-e:1.2.3",
"a.b.c:e-f": "a.b.c:e-f:+"]],
[["a.b.c:d-e:3.0.0", "a.b.c:d-e:1.2.+", "a.b.c:d-e:2.1.+"],
["a.b.c:d-e": "a.b.c:d-e:3.0.0"]]].each {
List<String> packages, Map<String, String> expected ->
Map<String, String> result =
PackageSpecifier.mostRecentByGroupArtifact(
PackageSpecifier.fromStrings(packages)).collectEntries {
[it.key, it.value.specString]
}
if (result != expected) {
throw new Exception(
sprintf("Unexpected map %s, expected %s for %s",
result.toString(), expected.toString(),
packages.toString()))
}
}
}
def testLoosenVersionExpression() {
["1.2.3": "1.2.3+",
"1.2.3+": "1.2.+",
"1.2.+": "1.2+",
"1.2+": "1.+",
"1.+": "1+",
"1+": "+",
"+": "+"].each { String versionString, String expected ->
String result = (new Version(versionString)).loosen().version
if (result != expected) {
throw new Exception(
sprintf("Invalid loose version expression %s, " +
"expected %s for %s", result, expected, versionString))
}
}
}
def testGetVersionLockedPackageIndex() {
["com.google.android.gms:play-services-base:12.0.1": 1,
"com.google.firebase:firebase-core:12.0.1": 1,
"com.android.support:support-v4:23.0.+": 2,
"com.google.firebase:firebase-app-unity:4.3.0": 0,
"com.google.android.gms:play-services-base:15.1.2": -1].each {
packageSpec, expectedIndex ->
int index = getVersionLockedPackageIndex(
PackageSpecifier.fromString(packageSpec))
if (index != expectedIndex) {
throw new Exception(
sprintf("Invalid package lock %d, expected %d for %s",
index, expectedIndex, packageSpec))
}
}
}
def testAddVersionLockedPackageToSet() {
Map<Integer, Set<PackageSpecifier>> lockedPackages = [:]
[["com.google.android.gms:play-services-base:12.0.1", true],
["com.google.firebase:firebase-core:12.0.1", true],
["com.android.support:support-v4:23.0.+", true],
["com.android.support:support-vector-drawable:24+", true],
["com.google.firebase:firebase-app-unity:4.3.0", false],
["com.google.android.gms:play-services-base:15.1.2", false]].each {
String packageSpecifier, boolean expected ->
int resultIndex = addVersionLockedPackageToSet(
PackageSpecifier.fromString(packageSpecifier),
lockedPackages, [].toSet())
boolean result = resultIndex > 0
if (expected != result) {
throw new Exception(
sprintf("%s was incorrectly added to a version-locked set, " +
"returned %b, expected %b", packageSpecifier, result,
expected))
}
}
Map<Integer, Set<String>> expectedLockedPackages =
[1: [PackageSpecifier.fromString(
"com.google.android.gms:play-services-base:12.0.1"),
PackageSpecifier.fromString(
"com.google.firebase:firebase-core:12.0.1")].toSet(),
2: [PackageSpecifier.fromString(
"com.android.support:support-v4:23.0.+"),
PackageSpecifier.fromString(
"com.android.support:support-vector-drawable:24+")].toSet(),
0: [PackageSpecifier.fromString(
"com.google.firebase:firebase-app-unity:4.3.0")].toSet(),
(-1): [PackageSpecifier.fromString(
"com.google.android.gms:play-services-base:15.1.2")].toSet()]
if (lockedPackages != expectedLockedPackages) {
throw new Exception(
sprintf("Generated invalid set of locked packages %s, expected %s",
lockedPackages.toString(), expectedLockedPackages.toString()))
}
}
def testCreateVersionLockedSetBlacklist() {
Set<Integer> expectedBlacklist = [1].toSet()
Set<Integer> blacklist = createVersionLockedSetBlacklist(
["com.google.android.gms:play-services-base:12.0.1",
"com.google.firebase:firebase-core:12.0.1",
"com.google.android.gms:play-services-base:15.+",
"com.android.support:support-v4:23.0.+"].collect {
PackageSpecifier.fromString(it)
})
if (blacklist != expectedBlacklist) {
throw new Exception(
sprintf("Created invalid blacklist of locked package groups %s, " +
"expected %s", blacklist, expectedBlacklist))
}
}
def testAddVersionLockedPackageToSetWithBlacklist() {
Set<Integer> blacklist = [1].toSet()
Map<Integer, Set<PackageSpecifier>> lockedPackages = [:]
["com.google.android.gms:play-services-base:12.0.1": -1,
"com.google.firebase:firebase-core:12.0.1": -1,
"com.android.support:support-v4:23.0.+": 2].each {
String packageSpecifier, int expectedIndex ->
int resultIndex = addVersionLockedPackageToSet(
PackageSpecifier.fromString(packageSpecifier),
lockedPackages, blacklist)
if (resultIndex != expectedIndex) {
throw new Exception(
sprintf("%s was incorrectly added to a version-locked set, " +
"return %d, expected %d", packageSpec, resultIndex,
expectedIndex))
}
}
}
def testMostRecentVersionLockedPackagesFromSet() {
Map<Integer, Set<PackageSpecifier>> versionLockedSets = [
1: [PackageSpecifier.fromString(
"com.google.android.gms:play-services-base:12.0.1"),
PackageSpecifier.fromString(
"com.google.firebase:firebase-core:12.0.+")].toSet(),
2: [PackageSpecifier.fromString(
"com.android.support:support-v4:23.0.+"),
PackageSpecifier.fromString(
"com.android.support:support-vector-drawable:24.+")].toSet()]
Iterable<String> versionLockedList =
PackageSpecifier.specStrings(
mostRecentVersionLockedPackagesFromSet(versionLockedSets))
Iterable<String> expectedPackageList = [
"com.android.support:support-v4:24.+",
"com.android.support:support-vector-drawable:24.+",
"com.google.android.gms:play-services-base:12.0.+",
"com.google.firebase:firebase-core:12.0.+",
]
if (versionLockedList != expectedPackageList) {
throw new Exception(
sprintf("Invalid version-locked packages %s, expected %s " +
"given %s", versionLockedList, expectedPackageList,
versionLockedSets))
}
}
def testVersionLockPackages() {
List<PackageSpecifier> packages = [
"com.google.android.gms:play-services-base:12.0.1",
"com.google.android.gms:play-services-core:12.0.+",
"com.android.support:support-v4:23.0.+",
"com.android.support:support-vector-drawable:24.+",
"com.foo.bar:do-not-include-this:1.2.3",
].collect { PackageSpecifier.fromString(it) }
Iterable<String> expectedPackageList = [
"com.android.support:support-v4:24.+",
"com.android.support:support-vector-drawable:24.+",
"com.google.android.gms:play-services-base:12.0.+",
"com.google.android.gms:play-services-core:12.0.+",
]
Iterable<String> versionLockedList =
PackageSpecifier.specStrings(versionLockPackages(packages))
if (versionLockedList != expectedPackageList) {
throw new Exception(
sprintf("Invalid version-locked packages %s, expected %s given %s",
versionLockedList, expectedPackageList,
PackageSpecifier.specStrings(packages)))
}
}
def testSortPackagesByVersion() {
List<String> unsorted = [
"a.b.c:e-f:1.0.0",
"a.b.c:e-f:[0.5.2,3.2.0]",
"a.b.c:e-f:2.1.+",
"a.b.c:e-f",
"a.b.c:e-f:1.0.1",
]
List<String> expectedSortedByVersion = [
"a.b.c:e-f",
"a.b.c:e-f:1.0.0",
"a.b.c:e-f:1.0.1",
"a.b.c:e-f:2.1.+",
"a.b.c:e-f:[0.5.2,3.2.0]",
]
List<String> sortedByVersion = PackageSpecifier.specStrings(
PackageSpecifier.sortByVersion(
unsorted.collect {
PackageSpecifier.fromString(it)
}
))
if (sortedByVersion != expectedSortedByVersion) {
throw new Exception(
sprintf("Invalid sorted package list %s, expected %s for %s",
sortedByVersion, expectedSortedByVersion, unsorted))
}
}
def testGetModifiedPackageVersions() {
PackageMapper packageMapper =
new PackageMapper(dependenciesMap: ["foo:bar": "foox:bish:1.0.0"])
List<String> oldPackages = [
"a.b.c:e-f:1.2.3",
"a.b.c:f-h:4.5.6",
"e.f.g:a-b:[0.1.0]",
"e.f.g:a-b:0.1.0",
"to.be:removed:1.0.0",
"z.z.z:x-y:5.0.0",
"z.z.z:x-y:5.0.1",
"z.z.z:x-y:6.0.0",
"com.android.support:appcompat-v7:23.0.+",
"foo:bar:1.2.3",
"foo:bar:2.0+",
]
List<String> newPackages = [
"a.b.c:e-f:1.3.0",
"a.b.c:f-h:4.6.2",
"e.f.g:a-b:[0.1.0]",
"z.z.z:x-y:6.0.0",
"com.android.support:appcompat-v7:23.0.1@aar",
"foox:bish:1.0.0",
]
Map<String, List<String>> expectedModifiedPackages = [
"a.b.c:e-f": [[PackageSpecifier.fromString("a.b.c:e-f:1.2.3"),
PackageSpecifier.fromString("a.b.c:e-f:1.3.0")]],
"a.b.c:f-h": [[PackageSpecifier.fromString("a.b.c:f-h:4.5.6"),
PackageSpecifier.fromString("a.b.c:f-h:4.6.2")]],
"z.z.z:x-y": [[PackageSpecifier.fromString("z.z.z:x-y:5.0.0"),
PackageSpecifier.fromString("z.z.z:x-y:6.0.0")],
[PackageSpecifier.fromString("z.z.z:x-y:5.0.1"),
PackageSpecifier.fromString("z.z.z:x-y:6.0.0")]],
"foo:bar": [[PackageSpecifier.fromString("foo:bar:1.2.3"),
PackageSpecifier.fromString("foox:bish:1.0.0")],
[PackageSpecifier.fromString("foo:bar:2.0+"),
PackageSpecifier.fromString("foox:bish:1.0.0")]],
]
Map<String,
List<Tuple2<PackageSpecifier, PackageSpecifier>>> modifiedPackages =
getModifiedPackageVersions(PackageSpecifier.fromStrings(oldPackages),
PackageSpecifier.fromStrings(newPackages),
packageMapper)
if (modifiedPackages != expectedModifiedPackages) {
throw new Exception(
sprintf("Invalid modified packages %s, expected %s for %s",
modifiedPackages, expectedModifiedPackages,
[oldPackages, newPackages]))
}
}
def testVersionObject() {
// Ensure component parsing of an empty version return no components.
Version version;
version = new Version()
if (version.components != [] || version.comparableComponents != []) {
throw new Exception("Components should be empty for an empty Version")
}
// Parse comparable components from the version string.
List<String> expectedComparableComponents =
["10", ".", "128", ".", "1", ".", "1234", "-alpha", "1", ".", "3", ".", "5"]
version = new Version("10.128.1.1234-alpha1.3.5")
List<String> components = version.comparableComponents
if (components != expectedComparableComponents) {
throw new Exception(
sprintf("Invalid version comparable components %s, expected %s for %s",
components, expectedComparableComponents, version))
}
// Parse components from the version string.
List<String> expectedComponents =
["10", "128", "1", "1234-alpha1", "3", "5"]
components = version.components
if (components != expectedComponents) {
throw new Exception(
sprintf("Invalid version components %s, expected %s for %s",
components, expectedComponents, version))
}
// Get maximum and minimum values.
[[new Version("1.2.+"), [new Version("1.2.0"),
new Version("1.2.2147483647")]],
[new Version("1.2.2+"), [new Version("1.2.2"),
new Version("1.2.2147483644")]],
[new Version("1.+.0"), [new Version("1.0"), new Version("1.2147483647")]]
].each {
Version testVersion, List<Version> expectedMinAndMax ->
List<Version> result = [testVersion.minimumValue,
testVersion.maximumValue]
if (result != expectedMinAndMax) {
throw new Exception(
sprintf("Version %s expected min & max %s, returned %s",
testVersion, expectedMinAndMax, result))
}
}
// Comparisons test cases in the form [lhs, rhs, result].
[[new Version("10.128.1.1234-alpha1.3.5"),
new Version("10.128.1.1234-alpha1.3.5"), 0],
[new Version("10.128.1.1234-alpha1.3.5"),
new Version("10.128.1.1234-beta1.3.5"), -1],
[new Version("10.128.1.1234-beta1.3.5"),
new Version("10.128.1.1234-alpha1.3.5"), 1],
[new Version("01.128.1.1234-alpha1"),
new Version("10.128.1.1234-alpha1"), -1],
[new Version("10.128.1.1234-alpha1"),
new Version("01.128.1.1234-alpha1"), 1],
[new Version("1.2.+"),
new Version("1.2.+"), 0],
[new Version("1.2.3+"),
new Version("1.2.3"), 1],
[new Version("1.2.+"),
new Version("1.2.3+"), 1],
[new Version("1.2.3"),
new Version("1.2"), 1],
[new Version("1.2.3"),
new Version("2.2"), -1],
].each { Version lhs, Version rhs, int expectedResult ->
int compareResult = (lhs <=> rhs)
if (compareResult != expectedResult) {
throw new Exception(
sprintf("Version %s compared with %s returned unexpected result %d " +
"vs. %d", lhs, rhs, compareResult, expectedResult))
}
}
}
def testSortVersionStrings() {
List<String> unsorted = [
"0.1.2-test-za1",
"0.1.2-test-a2a",
"0.1.2-prod-ab",
"0.1.2-prod-12a",
"4.0.+",
"0.1.2b",
"1.2.3",
"0.1.2a",
"4.0.0+",
"1.2",
"3.2",
"5",
"0.1.2",
"4.+",
]
List<String> expected = [
"0.1.2",
"0.1.2-prod-12a",
"0.1.2-prod-ab",
"0.1.2-test-a2a",
"0.1.2-test-za1",
"0.1.2a",
"0.1.2b",
"1.2",
"1.2.3",
"3.2",
"4.0.0+",
"4.0.+",
"4.+",
"5",
]
List<String> result = Version.sort(
unsorted.collect { new Version(it) }).collect { it.version }
if (result != expected) {
throw new Exception(
sprintf("Version sorting failed %s, expected %s for %s",
result, expected, unsorted))
}
}
def testVersionRangeMaximumVersionOfRange() {
[[VersionRange.fromExpression("[1.2.3,2.0.0]"), "2.0.0"],
[VersionRange.fromExpression("[ 1.2.3 , 2.0.0 ]"), "2.0.0"],
[VersionRange.fromExpression(" 1.2.3 "), "1.2.3"],
[VersionRange.fromExpression("1.2.3+"), "1.2.2147483643"],
[VersionRange.fromExpression("1.2.+"), "1.2.2147483647"],
[VersionRange.fromExpression("+"), "2147483647"],
[VersionRange.fromExpression(""), "0"]].each { range, expectedString ->
String maxVersionString = range.maximumVersionOfRange.version
if (maxVersionString != expectedString) {
throw new Exception(
sprintf("Unexpected max version for range %s, returned %s, " +
"expected %s", range, maxVersionString, expectedString))
}
}
}
def testVersionRangeVersionInRange() {
[[VersionRange.fromExpression(""), new Version(""), true],
[VersionRange.fromExpression(""), new Version("1.2.3"), true],
[VersionRange.fromExpression("1.2.3+"), new Version(), true],
[VersionRange.fromExpression("1.2.3+"), new Version("1.2.3"), true],
[VersionRange.fromExpression("1.2.3+"), new Version("1.2.4"), true],
[VersionRange.fromExpression("1.2.3+"), new Version("1.1.0"), false],
[VersionRange.fromExpression("1.2.3"), new Version("1.2.3"), true],
[VersionRange.fromExpression("1.2.3"), new Version("1.2.4"), true],
[VersionRange.fromExpression("1.2.3"), new Version("1.2.2"), false],
[VersionRange.fromExpression("[1.2.3]"), new Version("1.2.3"), true],
[VersionRange.fromExpression("[1.2.3]"), new Version("1.2.4"), false],
[VersionRange.fromExpression("[1.2.3]"), new Version("1.2.2"), false],
[VersionRange.fromExpression("[1.2.1,1.3.0]"), new Version("1.2.1"), true],
[VersionRange.fromExpression("[1.2.1,1.3.0]"), new Version("1.3.0"), true],
[VersionRange.fromExpression("[1.2.1,1.3.0]"), new Version("1.2.0"), false],
[VersionRange.fromExpression("[1.2.1,1.3.0]"), new Version("1.3.1"), false],
].each {
VersionRange range, Version version, boolean expected ->
boolean result = range.inRange(version)
if (result != expected) {
throw new Exception(
sprintf("Unexpected result %b vs. %b for version %s in range of %s",
result, expected, version.version, range.expression))
}
}
}
def testVersionRangeFromExpression() {
[[new VersionRange(versionExpression: "invalid_version[]",
minimum: "0", maximum: "+",
matchType: VersionExpressionMatchType.NONE),
"invalid_version[]"],
[new VersionRange(versionExpression: "[1.2.3]",
minimum: "1.2.3", maximum: "1.2.3",
matchType: VersionExpressionMatchType.ABSOLUTE),
"[1.2.3]"],
[new VersionRange(versionExpression: "1.2.3",
minimum: "1.2.3", maximum: "+",
matchType: VersionExpressionMatchType.MINIMUM),
"1.2.3"],
[new VersionRange(versionExpression: "[1.2.3,1.3.0]",
minimum: "1.2.3", maximum: "1.3.0",
matchType: VersionExpressionMatchType.RANGE),
"[1.2.3,1.3.0]"],
[new VersionRange(versionExpression: "[1.2.3,1.3.0)",
minimum: "1.2.3", maximum: "1.3.0",
matchType: VersionExpressionMatchType.RANGE),
"[1.2.3,1.3.0)"],
[new VersionRange(versionExpression: "(1.2.3,1.3.0]",
minimum: "1.2.3", maximum: "1.3.0",
matchType: VersionExpressionMatchType.RANGE),
"(1.2.3,1.3.0]"],
[new VersionRange(versionExpression: "(1.2.3,1.3.0)",
minimum: "1.2.3", maximum: "1.3.0",
matchType: VersionExpressionMatchType.RANGE),
"(1.2.3,1.3.0)"],
[new VersionRange(versionExpression: "[,1.2.3]",
minimum: "0", maximum: "1.2.3",
matchType: VersionExpressionMatchType.RANGE),
"[,1.2.3]"],
[new VersionRange(versionExpression: "[,1.2.3)",
minimum: "0", maximum: "1.2.3",
matchType: VersionExpressionMatchType.RANGE),
"[,1.2.3)"],
[new VersionRange(versionExpression: "(,1.2.3]",
minimum: "0", maximum: "1.2.3",
matchType: VersionExpressionMatchType.RANGE),
"(,1.2.3]"],
[new VersionRange(versionExpression: "(,1.2.3)",
minimum: "0", maximum: "1.2.3",
matchType: VersionExpressionMatchType.RANGE),
"(,1.2.3)"],
[new VersionRange(versionExpression: "[1.2.+,1.2.5]",
minimum: "1.2.0", maximum: "1.2.5",
matchType: VersionExpressionMatchType.RANGE),
"[1.2.+,1.2.5]"]].each { VersionRange expected, String versionExpression ->
VersionRange range = VersionRange.fromExpression(versionExpression)
if (range != expected) {
throw new Exception(
sprintf("Invalid range (%s) vs. expected (%s) for " +
"expression %s", range, expected, versionExpression))
}
}
}
def testPackageMapperEmpty() {
PackageMapper packageMapper = new PackageMapper()
["com.android.databinding:baseLibrary:3.4.0",
"com.android.support:appcompat-v7:26.0.1",
"com.android.support:leanback-v17:25.2.0",
"com.android.support:support-v4:25.2.0",
"androidx.legacy:legacy-support-v4:1.0.0"].each { String source ->
String expected = PackageSpecifier.fromString(source).groupArtifactString
PackageSpecifier pkg = packageMapper.map(
PackageSpecifier.fromString(expected))
String value = pkg.specString
if (value != expected) {
throw new Exception(sprintf("Invalid mapped package %s vs %s for %s",
value, expected, source))
}
String inverseSpec = packageMapper.inverseMap(pkg).specString
if (inverseSpec != expected) {
throw new Exception(sprintf("Invalid inverse mapped package %s vs %s " +
"for %s", inverseSpec, expected, source))
}
}
}
def testPackageMapperFromJetifierProcessor() {
PackageMapper packageMapper = PackageMapper.fromJetifierProcessor("3.4.0")
[["com.android.databinding:baseLibrary:3.4.0",
"com.android.databinding:baseLibrary:3.4.0"],
["com.android.support:appcompat-v7:26.0.1",
"androidx.appcompat:appcompat:1.0.0"],
["com.android.support:leanback-v17:25.2.0",
"androidx.leanback:leanback:1.0.0"],
["com.android.support:support-v4:25.2.0",
"androidx.legacy:legacy-support-v4:1.0.0"]].each { String source,
String expected ->
PackageSpecifier pkg = packageMapper.map(
PackageSpecifier.fromString(source))
String value = pkg.specString
if (value != expected) {
throw new Exception(
sprintf("Invalid mapped package %s vs %s for %s",
value, expected, source))
}
expected = PackageSpecifier.fromString(source).groupArtifactString
String inverseSpec = packageMapper.inverseMap(pkg).specString
if (inverseSpec != expected) {
throw new Exception(
sprintf("Invalid inverse mapped package %s vs %s for %s (%s)",
inverseSpec, expected, value, source))
}
}
}
// Run unit tests
// TODO(b/79267099): Factor the tests out of this script.
def runTests() {
testVersionObject()
testSortVersionStrings()
testVersionRangeFromExpression()
testVersionRangeMaximumVersionOfRange()
testVersionRangeVersionInRange()
testGetComponentsFromPackage()
testPackageSpecifierStrings()
testPackageSpecifierVersionRange()
testSortPackagesByVersion()
testMostRecentVersionLockedPackagesFromSet()
testVersionLockPackages()
testGetModifiedPackageVersions()
testGetMostRecentPackagesByGroupArtifact()
testLoosenVersionExpression()
testGetVersionLockedPackageIndex()
testAddVersionLockedPackageToSet()
testCreateVersionLockedSetBlacklist()
testAddVersionLockedPackageToSetWithBlacklist()
testPackageMapperEmpty()
testPackageMapperFromJetifierProcessor()
}
// Configure project properties.
project.ext {
// List of tasks that copy artifacts.
copyTasks = []
// List of copied file and the associated artifact tuples.
copiedFileArtifacts = []
// Set of packages to copy, exposed to the copyPackages task.
packagesToCopy = [].toSet()
// Set of packages with modified versions due to conflicting dependencies.
// Maps the group:artifact to a list of modified package tuples.
packagesModified = [:]
if (project.hasProperty("RUN_TESTS")) {
runTests()
return
}
// Get the install location of the Android SDK.
String sdkRoot = null
for (prop in [System.getProperty("ANDROID_HOME"),
project.hasProperty("ANDROID_HOME") ?
getProperty("ANDROID_HOME") : null,
System.getenv("ANDROID_HOME")]) {
if (prop) {
sdkRoot = prop
break
}
}
if (sdkRoot) {
logger.quiet("ANDROID_HOME: " + sdkRoot)
}
androidSdkRoot = sdkRoot
List<URI> mavenUris = []
// Retrieve a list of command line specified maven repo URIs.
if (project.hasProperty("MAVEN_REPOS")) {
project.getProperty("MAVEN_REPOS").tokenize(";").each {
mavenUris.push(new URI(it))
}
}
boolean useMavenLocalRepo = true
if (project.hasProperty("USE_MAVEN_LOCAL_REPO")) {
useMavenLocalRepo = project.getProperty("USE_MAVEN_LOCAL_REPO") == "1"
}
boolean useRemoteMavenRepos = true
if (project.hasProperty("USE_REMOTE_MAVEN_REPOS")) {
useRemoteMavenRepos = project.getProperty("USE_REMOTE_MAVEN_REPOS") == "1"
}
boolean useJetifier = false
if (project.hasProperty("USE_JETIFIER")) {
useJetifier = project.getProperty("USE_JETIFIER") == "1"
}
String dataBindingVersion = ""
if (useJetifier) {
if (project.hasProperty("DATA_BINDING_VERSION")) {
dataBindingVersion =
project.getProperty("DATA_BINDING_VERSION")
}
if (!dataBindingVersion) {
println helpText
logger.error("Project property DATA_BINDING_VERSION must be " +
"specified if USE_JETIFIER is enabled.")
throw new InvalidUserDataException("Missing DATA_BINDING_VERSION")
}
}
// Create package mapper for Jetifier package substitutions.
PackageMapper packageMapper = useJetifier ?
PackageMapper.fromJetifierProcessor(dataBindingVersion) :
new PackageMapper()
// Apply package mapper to predeclared configurations.
[project.configurations.transitivePackagesConfig,
project.configurations.copyPackagesConfig].each { Configuration config ->
packageMapper.applyToProjectConfiguration(config, project)
}
// Construct a list of local Maven URIs in the Android SDK.
if (androidSdkRoot) {
["extras/android/m2repository", "extras/google/m2repository"].each {
File path = new File(androidSdkRoot, it)
if (path.exists()) mavenUris.push(path.toURI())
}
}
// Add Google maven repositories.
if (useRemoteMavenRepos) {
mavenUris.push(project.project.repositories.google().url)
}
// List of URIs to add to the set of maven sources.
mavenRepoUris = mavenUris
// Add the repositories here so that we can resolve during configuration
// below.
project.repositories {
for (uri in mavenRepoUris) {
maven {
url uri
}
}
if (useMavenLocalRepo) mavenLocal()
if (useRemoteMavenRepos) {
mavenCentral()
}
}
project.repositories.each {
logger.quiet(sprintf("MAVEN_REPOS: name=%s url=%s", it.name, it.url))
}
// Set of packages to copy to the target directory.
if (!project.hasProperty("PACKAGES_TO_COPY")) {
println helpText
logger.error("Project property PACKAGES_TO_COPY must be specified.")
throw new InvalidUserDataException("Missing PACKAGES_TO_COPY")
}
Set<PackageSpecifier> userSpecifiedPackages =
PackageSpecifier.fromStrings(
project.getProperty("PACKAGES_TO_COPY").tokenize(";"))
PackageSpecifier.specStrings(userSpecifiedPackages).each {
logger.quiet("PACKAGES_TO_COPY: " + it)
}
// Location to copy referenced packages.
if (!project.hasProperty("TARGET_DIR")) {
println helpText
logger.error("Project property TARGET_DIR must be specified.")
throw new InvalidUserDataException("Missing TARGET_DIR")
}
targetDir = project.getProperty("TARGET_DIR")
if (targetDir && !(new File(targetDir)).isAbsolute()) {
targetDir = (new File(System.getProperty("user.dir"),
targetDir)).absolutePath
}
logger.quiet(sprintf("TARGET_DIR: %s", targetDir))
// Fallback to search for srcaar artifacts when an artifact is missing.
// We update the user specified package set here as this operation should be
// transparent to the user.
userSpecifiedPackages = fallbackToSrcAarArtifacts(userSpecifiedPackages,
packageMapper)
// Resolve while searching for a set of non-conflicting package
// specifications.
Set<PackageSpecifier> resolvedConflictingPackages
Configuration resolveConflictConfig
(resolvedConflictingPackages, resolveConflictConfig) =
resolveConflictingPackages(userSpecifiedPackages, packageMapper)
Map<String, PackageSpecifier> resolvedConflictingPackagesByArtifactGroup =
PackageSpecifier.mostRecentByGroupArtifact(resolvedConflictingPackages)
// Resolve the current set of packages to search for transitive dependencies
// that should be version locked.
Map<String, PackageSpecifier> resolvedPackages =
resolvedConflictingPackagesByArtifactGroup +
PackageSpecifier.mostRecentByGroupArtifact(
resolveConflictConfig.resolvedConfiguration.lenientConfiguration.
getArtifacts(Specs.satisfyAll()).collect {
PackageSpecifier.fromResolvedArtifact(it)
})
// If we were unable to find a set of packages with versions that do not
// conflict we may still end up with transitive references to artifacts at
// different versions which should all point at the same version. So,
// if possible, iterate through all fetched artifacts and explicitly pin all
// version-locked transitive dependencies to the same version.
Map<String, PackageSpecifier> versionLockedPackages =
PackageSpecifier.mostRecentByGroupArtifact(
versionLockPackages(resolvedPackages.values()))
logger.quiet(sprintf("version locked packages: %s",
PackageSpecifier.specStrings(
versionLockedPackages.values()).toString()))
// Build the final set of selected packages.
Map<String, PackageSpecifier> finalSelectedPackages =
resolvedConflictingPackagesByArtifactGroup.findAll {
!(it.key in versionLockedPackages.keySet())
}
logger.quiet(sprintf("non-version locked packages: %s",
PackageSpecifier.specStrings(
finalSelectedPackages.values()).toString()))
finalSelectedPackages += versionLockedPackages
// Determine which, if any, package specs were modified.
packagesModified = getModifiedPackageVersions(userSpecifiedPackages,
finalSelectedPackages.values(),
packageMapper)
// Gather transitive dependencies of all selected packages.
Map<String, PackageSpecifier> userSpecifiedPackagesByGroupArtifact =
PackageSpecifier.mostRecentByGroupArtifact(userSpecifiedPackages)
finalSelectedPackages.each { String pkgKey, PackageSpecifier selected ->
// Gradle doesn't resolve transitive dependencies for artifacts with a
// classifier https://github.com/gradle/gradle/issues/1487 so only use
// the artifact type it's specified directly by user or we're using a
// .srcaar artifact.
PackageSpecifier userPkg = userSpecifiedPackagesByGroupArtifact[pkgKey]
String specString =
((userPkg && userPkg.artifactType) || selected.artifactType == "srcaar") ?
selected.specString :
(new PackageSpecifier(
group: selected.group,
artifact: selected.artifact,
versionExpression: selected.versionExpression)).specString
project.dependencies.transitivePackagesConfig specString
}
packagesToCopy = (project.configurations.transitivePackagesConfig.
resolvedConfiguration.lenientConfiguration.
getArtifacts(Specs.satisfyAll()).findResults {
ResolvedArtifact artifact ->
PackageSpecifier pkg = PackageSpecifier.fromResolvedArtifact(artifact)
File artifactTargetFile = new File(targetDir, pkg.filename)
if (artifactTargetFile.exists()) {
// If the target file already exists simply report it as copied.
copiedFileArtifacts.add(
new Tuple2<File, PackageSpecifier>(artifactTargetFile, pkg))
return null
}
return pkg
}.toSet())
// Packages that are not found will not be added via the above config so add
// them here.
packagesToCopy = (
finalSelectedPackages +
PackageSpecifier.mostRecentByGroupArtifact(packagesToCopy)).values().toSet()
// Add all selected packages and their transitive dependencies to the final
// copy configuration.
PackageSpecifier.specStrings(packagesToCopy).each {
// Add final set of packages to copy to the copyPackagesConfig
// configuration.
project.dependencies.copyPackagesConfig it
}
// Create a package processor to generate processing tasks.
DefaultPackageProcessor packageProcessor =
useJetifier ? new JetpackPackageProcessor(dataBindingVersion) :
new DefaultPackageProcessor()
// Generate tasks to copy each artifact to a unique filename in the target
// directory.
project.configurations.copyPackagesConfig.
resolvedConfiguration.lenientConfiguration.
getArtifacts(Specs.satisfyAll()).each { ResolvedArtifact artifact ->
PackageSpecifier pkg = PackageSpecifier.fromResolvedArtifact(artifact)
File artifactTargetFile = new File(targetDir, pkg.filename)
// If the target file does not exist, generate a task to copy or process it.
if (artifactTargetFile.exists()) return
copyTasks.add(packageProcessor.createTask(
project, artifact, pkg, artifactTargetFile,
copiedFileArtifacts))
}
}
// Task which depends upon all copy package tasks and summarizes the set of
// copied files when it's complete, displaying:
// * The set of files copied into the target directory.
// * The dependency expression for each artifact that was not found.
// * Any packages that were modified from the dependency expression specified
// by the user.
task copyPackages(dependsOn: project.ext.copyTasks) {
doLast {
List<Tuple2<File, PackageSpecifier>> copiedFileArtifacts =
project.ext.copiedFileArtifacts
if (copiedFileArtifacts) {
println "Copied artifacts:"
copiedFileArtifacts.collect { it.first.name }.toSorted().each {
println it
}
println ""
}
Set<String> resolvedGroupArtifacts = copiedFileArtifacts.collect {
it.second.groupArtifactString
}
List<String> missingPackages = project.ext.packagesToCopy.findAll {
!(it.groupArtifactString in resolvedGroupArtifacts)
}.collect {
it.specString
}
if (missingPackages) {
println "Missing artifacts:"
missingPackages.toSorted().each { println it }
println ""
}
Map<String, List<Tuple2<PackageSpecifier,
PackageSpecifier>>> packagesModified =
project.ext.packagesModified
if (packagesModified) {
println "Modified artifacts:"
List<Tuple2<PackageSpecifier, PackageSpecifier>> modified = []
packagesModified.values().each { modified.addAll(it) }
modified.sort({ lhs, rhs -> lhs.first <=> rhs.first })
modified.each {
PackageSpecifier oldVersion, PackageSpecifier newVersion ->
println sprintf("%s --> %s", oldVersion.specString,
newVersion.specString)
}
println ""
}
}
}
project.defaultTasks = ["copyPackages"]
Ź/*
* Copyright 2019 Google Inc. All rights reserved.
*
* 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.
*/
rootProject.name = "androidResolver"
BSJB v2.0.50727lr#~sTr#StringsĐá#US#GUID@6#BlobWź¶ ú3Ämčł~Ą}#Ë }Ři P
;rfp