From 9be1e5a3ac5e0143c29875b15fe1defa60f86543 Mon Sep 17 00:00:00 2001 From: siddharth Date: Tue, 6 Sep 2022 06:58:49 +0530 Subject: [PATCH 1/3] wheel view partial --- .../java/com/example/spinwill/MainActivity.kt | 7 +- app/src/main/res/layout/activity_main.xml | 18 +- .../spinwill/ui/WillDimenProperties.kt | 11 + .../com/example/spinwill/ui/WillGradient.kt | 8 + .../spinwill/ui/WillPaintProperties.kt | 10 + .../java/com/example/spinwill/ui/WillView1.kt | 199 ++++++++++++++++++ .../com/example/spinwill/utils/DimenExt.kt | 14 ++ .../res/font/montserrat_extrabolditalic.ttf | Bin 0 -> 203000 bytes spinwill/src/main/res/values-night/colors.xml | 6 + spinwill/src/main/res/values/colors.xml | 7 + 10 files changed, 268 insertions(+), 12 deletions(-) create mode 100644 spinwill/src/main/java/com/example/spinwill/ui/WillDimenProperties.kt create mode 100644 spinwill/src/main/java/com/example/spinwill/ui/WillGradient.kt create mode 100644 spinwill/src/main/java/com/example/spinwill/ui/WillPaintProperties.kt create mode 100644 spinwill/src/main/java/com/example/spinwill/ui/WillView1.kt create mode 100644 spinwill/src/main/java/com/example/spinwill/utils/DimenExt.kt create mode 100644 spinwill/src/main/res/font/montserrat_extrabolditalic.ttf create mode 100644 spinwill/src/main/res/values-night/colors.xml diff --git a/app/src/main/java/com/example/spinwill/MainActivity.kt b/app/src/main/java/com/example/spinwill/MainActivity.kt index dfdf48d..e3a24a9 100644 --- a/app/src/main/java/com/example/spinwill/MainActivity.kt +++ b/app/src/main/java/com/example/spinwill/MainActivity.kt @@ -30,7 +30,6 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - AppWillRoomDatabase.getInstance(this.applicationContext) setupDependencies() // setupWork() setupUi() @@ -40,10 +39,10 @@ class MainActivity : AppCompatActivity() { // set context, remoteDb, localDb, dao, bitmap load use-case. injector.init(this, RemoteDatabaseImpl()) - val daoConc = SpinWillDaoConc() - daoConc.setDao(AppWillRoomDatabase.getInstance(this.applicationContext).getSpinWillDao()) + val daoActions = SpinWillDaoConc() + daoActions.setDao(AppWillRoomDatabase.getInstance(this.applicationContext).getSpinWillDao()) injector.setLocalDatabase( - SpinWillLocalDbImpl(daoConc) + SpinWillLocalDbImpl(daoActions) ) injector.setBitmapLoadUseCase( diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 8e6be4d..1a39823 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -10,23 +10,25 @@ android:id="@+id/iv_1" android:layout_width="100dp" android:layout_height="100dp" - app:layout_constraintTop_toTopOf="parent" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toEndOf="parent"/> + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toBottomOf="@id/iv_1" /> - + app:layout_constraintTop_toBottomOf="@id/iv_2" /> \ No newline at end of file diff --git a/spinwill/src/main/java/com/example/spinwill/ui/WillDimenProperties.kt b/spinwill/src/main/java/com/example/spinwill/ui/WillDimenProperties.kt new file mode 100644 index 0000000..85e7ccb --- /dev/null +++ b/spinwill/src/main/java/com/example/spinwill/ui/WillDimenProperties.kt @@ -0,0 +1,11 @@ +package com.example.spinwill.ui + +data class WillDimenProperties( + var paddingLeft: Int = 0, + var paddingRight: Int = 0, + var paddingTop: Int = 0, + var paddingBottom: Int = 0, + var padding: Int = 0, + var radius: Int = 0, + var center: Int = 0 +) diff --git a/spinwill/src/main/java/com/example/spinwill/ui/WillGradient.kt b/spinwill/src/main/java/com/example/spinwill/ui/WillGradient.kt new file mode 100644 index 0000000..5db29f2 --- /dev/null +++ b/spinwill/src/main/java/com/example/spinwill/ui/WillGradient.kt @@ -0,0 +1,8 @@ +package com.example.spinwill.ui + +import android.graphics.RadialGradient + +data class WillGradient( + var darkYellow: RadialGradient? = null, + var lightYellow: RadialGradient? = null +) diff --git a/spinwill/src/main/java/com/example/spinwill/ui/WillPaintProperties.kt b/spinwill/src/main/java/com/example/spinwill/ui/WillPaintProperties.kt new file mode 100644 index 0000000..449b9f3 --- /dev/null +++ b/spinwill/src/main/java/com/example/spinwill/ui/WillPaintProperties.kt @@ -0,0 +1,10 @@ +package com.example.spinwill.ui + +import android.graphics.Paint + +data class WillPaintProperties( + val archPaint: Paint = Paint(), + val textPaint: Paint = Paint(), + val overlayTextPaint: Paint = Paint(), + val separationArchPaint: Paint = Paint() +) \ No newline at end of file diff --git a/spinwill/src/main/java/com/example/spinwill/ui/WillView1.kt b/spinwill/src/main/java/com/example/spinwill/ui/WillView1.kt new file mode 100644 index 0000000..51611e6 --- /dev/null +++ b/spinwill/src/main/java/com/example/spinwill/ui/WillView1.kt @@ -0,0 +1,199 @@ +package com.example.spinwill.ui + +import android.content.Context +import android.graphics.* +import android.util.AttributeSet +import android.view.View +import androidx.core.content.ContextCompat +import androidx.core.content.res.ResourcesCompat +import com.example.spinwill.R +import com.example.spinwill.utils.dp +import kotlin.math.min + +class WillView1 constructor( + context: Context, + attributeSet: AttributeSet? +) : View(context, attributeSet) { + + companion object { + const val DEFAULT_PADDING = 5 + } + + private val dimenProps = WillDimenProperties() + private val paintProps = WillPaintProperties() + private val gradientProps = WillGradient() + private var willRange = RectF() + private var mPath = Path() + + private val wheelSize = 8 // TODO for testing + + override fun onDraw(canvas: Canvas?) { + super.onDraw(canvas) + if (canvas == null) return + + var tempAngle = 0f + val sweepAngle: Float = 360f / wheelSize + val rotateAngle = sweepAngle / 2 + 90 + + for (i in 0..7) { + // draw graphics + drawPieBackground(i, tempAngle, sweepAngle, canvas) + // drawImage(canvas, tempAngle, mWheelItems.get(i).bitmap, rotateAngle) + drawOverlayText( + canvas, + tempAngle, + sweepAngle, + i.toString() + ) + drawText( + canvas, + tempAngle, + sweepAngle, + i.toString() + ) + drawSeparationArc(willRange, tempAngle, sweepAngle, canvas) + // prepare for next iteration + tempAngle += sweepAngle + paintProps.archPaint.reset() + } + } + + private fun drawPieBackground(i: Int, tempAngle: Float, sweepAngle: Float, canvas: Canvas) { + if (i % 2 == 0) paintProps.archPaint.shader = gradientProps.darkYellow + if (i % 2 == 1) paintProps.archPaint.shader = gradientProps.lightYellow + canvas.drawArc(willRange, tempAngle, sweepAngle, true, paintProps.archPaint) + } + + private fun drawOverlayText( + canvas: Canvas, + tempAngle: Float, + sweepAngle: Float, + text: String + ) { + mPath.addArc(willRange, tempAngle, sweepAngle) + val textWidth: Float = paintProps.overlayTextPaint.measureText(text) + val hOffset: Int = (dimenProps.radius * Math.PI / wheelSize - textWidth / 2).toInt() + val vOffset: Int = dimenProps.radius / 4 - 5 + canvas.drawTextOnPath( + text, + mPath, + hOffset.toFloat(), + vOffset.toFloat(), + paintProps.overlayTextPaint + ) + mPath.reset() + } + + private fun drawText(canvas: Canvas, tempAngle: Float, sweepAngle: Float, text: String) { + mPath.addArc(willRange, tempAngle, sweepAngle) //used global Path + val textWidth: Float = paintProps.textPaint.measureText(text) + val hOffset: Int = (dimenProps.radius * Math.PI / wheelSize - textWidth / 2).toInt() + // change this '5' number to change the radial distance of text from the center + // change this '5' number to change the radial distance of text from the center + val vOffset: Int = dimenProps.radius / 5 - 3 + paintProps.textPaint.color = ContextCompat.getColor(context, R.color.spinwill_text_color) + canvas.drawTextOnPath( + text, + mPath, + hOffset.toFloat(), + vOffset.toFloat(), + paintProps.textPaint + ) + mPath.reset() + } + + private fun drawSeparationArc( + range: RectF, + tempAngle: Float, + sweepAngle: Float, + canvas: Canvas + ) { + canvas.drawArc(range, tempAngle, sweepAngle, true, paintProps.separationArchPaint) + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + val width = min(measuredWidth, measuredHeight) + + dimenProps.padding = + if (paddingLeft == 0) DEFAULT_PADDING else paddingLeft + dimenProps.radius = (width - (dimenProps.padding * 2)) / 2 + dimenProps.center = width / 2 + + setMeasuredDimension( + width, + width + ) // hence the size for the view will be min(w,h) i.e square + + initComponents() + } + + private fun initComponents() { + paintProps.archPaint.apply { + isAntiAlias = true + isDither = true + color = ContextCompat.getColor(context, R.color.coin_txt) + strokeWidth = 0.01f + style = Paint.Style.FILL_AND_STROKE + } + + paintProps.textPaint.apply { + isAntiAlias = true + isDither = true + typeface = ResourcesCompat.getFont( + context, + R.font.montserrat_extrabolditalic + ) + textSize = 20.dp() + letterSpacing = 0.1f + } + + paintProps.overlayTextPaint.apply { + color = ContextCompat.getColor( + context, + R.color.spinwill_overalytext_color + ) + isAntiAlias = true + isDither = true + typeface = ResourcesCompat.getFont( + context, + R.font.montserrat_extrabolditalic + ) + textSize = 45.dp() + letterSpacing = 0.1f + } + + paintProps.separationArchPaint.apply { + style = Paint.Style.STROKE + color = ContextCompat.getColor( + context, + R.color.spinwill_arc_seperation_line + ) + isAntiAlias = true + isDither = true + strokeWidth = 3f + } + + val padding = dimenProps.padding.toFloat() + val diameter = dimenProps.radius * 2 + willRange = RectF(padding, padding, padding + diameter, padding + diameter) + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + gradientProps.darkYellow = RadialGradient( + w / 2f, h / 2f, + h / 3.5f, + ContextCompat.getColor(context, R.color.spinwill_darkyellow_gradientLight), + ContextCompat.getColor(context, R.color.spinwill_darkyellow_gradientDark), + Shader.TileMode.CLAMP + ) + gradientProps.lightYellow = RadialGradient( + w / 2f, h / 2f, + h / 2.6f, + ContextCompat.getColor(context, R.color.white), + ContextCompat.getColor(context, R.color.spinwil_lightyellow_gradientDark), + Shader.TileMode.CLAMP + ) + } +} \ No newline at end of file diff --git a/spinwill/src/main/java/com/example/spinwill/utils/DimenExt.kt b/spinwill/src/main/java/com/example/spinwill/utils/DimenExt.kt new file mode 100644 index 0000000..e8ac857 --- /dev/null +++ b/spinwill/src/main/java/com/example/spinwill/utils/DimenExt.kt @@ -0,0 +1,14 @@ +package com.example.spinwill.utils + +import android.content.res.Resources +import android.util.TypedValue + +fun Int.dp(): Float { + val dip = this + val r: Resources = Resources.getSystem() + return TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, + dip.toFloat(), + r.displayMetrics + ) +} \ No newline at end of file diff --git a/spinwill/src/main/res/font/montserrat_extrabolditalic.ttf b/spinwill/src/main/res/font/montserrat_extrabolditalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..66ccd46f57e91c1158bb91b32b0199638bc1a3f5 GIT binary patch literal 203000 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�M0;r~D+~ zJeH1G#s7H^LaT-S^s8?|z{@x+F^}EgEyi832_gN47$1J1f5a@$_vAxrE6V8(4XqSw zU={GFDLQ3cyCpOxq@q2nKrr5vSzY*Rft1#Hl-W9+`aLY-(5ioj(E!&qW)2NTlxAPh z4%jc!YBYTI^&v+cPpL8Y;;EI~3q+Qv$FLR?C^cqYJT=X{AZz{#<}@Sp4GN^bl{VZ> z3y=#V@>w~!nihb5@m}M0YrTDbZcb`iRYO(Ugq-zl#J*y?^|ViJrk9VrXo`3jXn>)CAEEy7 zHd?FjFlM*(Hd_0+1%Moo*2#QII6lD&pF;6kg-?i##$aC+)TGc_ISxS#g?x&qH7c}5 z%%^1eR5EJ!qt*LRg%;*|=!;qdPtaWJ2jLXdOQ601ev5M+OoX&Pg=WyI*{iFGAtZtbs(@OZdV)k z0-zA|L*-O^*!1D)f$@e2eR#aFNxF=cprE{&HRO+y(_|SpZf8^k*$t&2@RJbWcTqSV zU>E8G(IcjKwtJ=mjy2g*T)hbO)OyA_u ze9JYIgWZo-kF@Ykp?W_w8I}P=Wdj-RhxH~@JN$bJ;gFsO`KqQrHIf!PvU00KaR~y8 zfK@@oD?3Ss^tXbd(h3qf^2y1}@?vP2al_fKmG&qg3uPaThK`8_kBJ72iNMyygDx`h6uwl2RIF)g7P5a0XX)q*ROYWnVO+Wdw#S^ zdtwM}kI{1N(OAdO2(J{v1=<>uO{1XqQ(A^5_)wZ_F;weAX(qwY7#WS>^n<&W&EDP# z_v5amJa%Cm56tZt51(xJ(|nDgQCVn9a2^a!DI0NKkZ*U9TL#WeolUgoq{jrKR6;I| z;EEXHg*XCq5i%XV{RD1V!7VWH(DdKbP5JST@l*c&u=HQ&s*7KO$4bfX@V}8y$a-l% zjstrh$6-E<1MVR{N_#LG5Aws&PAI+lvLEi_BOng5$#0<_cQX0t9Wb2($|i6J%;D6O zk?O>|Us%xl)a%kKkq^GKc86NfA4{K1=1HB34n~y35xCRDC zis3@o_>As^?x^$xeQLBLl0-c%-I+ddYR0x_r~V-^c29Ve-dL$6FO0lY-)4SPa7nO= zmwBSBOPTFqkFP)>yHrr@FQtY4DkzQQj03Qtw04wLriGIts*65qYJH4a@S)Ux8LIQ4 z)cP2z^`X>K849Bfy8QZ1mW)_tVI=uo7^`Uf~&1g5tsGZ{g zxdA(uGUgMTITX&N2#n7b4ux|mGP>1=a`FX_i3WL5v4>V27~gF&I+lFO6T(N_6WhIf zgiEwe!T1bvDAp+$y2FQZ^2Ku~`W~fKUzSmn1amgV!FMi&9|6I~f%+Ju)p01sVTLC7 zQ0jRM)n>C*VGOng`HK`>IIg@Uvn@Zme1bm6&lbl; zj%%q(jAK_}u4s;BBz@t&Q^}n=-?=g zi9bpMiPfg*9Sh4VimQC*Xi{2A<#RNwKR6#81MkH-@Im-3`knPqs#M+t93~&Xr8I<_ zN&zqVu(OOX=2t!ULB{uYM#DX_@xx0Y+=S@H#l$P&=E_4LCztofwKkHqBY(4+z40aq zM&L*1}OXZ103o*Ey1I{^A$c6&R4`^ug88uIV~ZU<7o+jwdp%w z!Sm5mKFSm9e1-hPc122hzCuPvov)Bl-}wq3ceTcMzG6Ut^A(JiJ6|zCXJRHFEHdZ} zV;5jdytEpSPo8&pzP|Gn10tNSkY(_luNa`21>@^GUok*qAwx%Y7{gbvT=2Yrb%n43bRE{6>WW`t}78E_s zQZf2m1+M{it^#6$Fq2t3f35;z7`q?gt&Gymol1J5XwJl~HRH%|l=Q@ekRq^lV@0*K zHmTjIoT#YSJgswK1q2~_o+4HU=P6*Ftp?}%{^}2ZS2)Mi}C{ycYYM1aA-1TA9 zuqQ}&$vw}*>bej2{$%Q8r1rc3ypMCJZPzC(BMeA@al&1n3jfIT^Htli<5qgdrn=4} zeH|O1V%wMs726yK9MmJPwQsDSI5fSThBG+YGa;n7AiK;^QJGSQ0~}Poa>C?89px(~ zOgV&m3YodZj@qo;qLXDSTLD+XTuy6NiF}MqP?@1WcV4wJf{F8ADyQ18GNSfYMw*je zyGmWe^DS`u6|IY$m+K-6Xk7$a5t2j#x;#%~>EvJ>rwFKvK-&sxdI3>0j46*A848?- zXay**+0?r&*v$zQB6bs82d}hhdmT+pxZ_Yv#FH4THLh*~J@%qp-Gt|$)G>sMG)HBUadiw~7<>cKE9xe&2MqNfK`p#V z=XV?IOGA|fP^g%|tnWpCz`6;b&=N-rs5k*oXlWFx0u-teJPIS{)1|L&a*@s%Ok!W% zgqhI;EJ31|_rez0!xlq%3Wb~HC-)V{h2-=42-a*@tEjF#0+43Gi+ z1#B&u#ey+x4UG=Z$k97A5#1}ZB8r}NhgvfoIUz+)7ltHfq~(OTpD9f^xwd&}TuaW@ zp!yB1#322>tjJkJEYjc0-37(OB)zrcn(C@1dM1griCX%YMNZW)9hK2|kROgVL+RC* z{cs;20dZQ9XEhM;AMOqf&7r-MD)dvnL_@wBo@{>faQp7uuH;$H#=6iryJK}}?X1+u zg5kViYi3?`DAa*!&m2s#?oKjQm94Op7r{O}(flv&%!3bqMJp~S#b?Zaa3ydBN>_d| zianvUY=y>9nyWAl@G1(*!7e;Z#~e|-N3##LbOmR+a+7)Bt})|5S8g)xUlbJ9XkHG~ z9vLmJQUnhaC4}*`Is!EmzCPk`!1pBJCQVcvS(zl)Nv=0Qo#b5pGx7h(JE`;4OWr2y z2<|B$uP*8bUooA0iR~iV%%Q;wI-d5P(W)2<88}D-k~0)*CIY@gE#QxE*GGeA7QF9T zBT(1(znP0C<>(vOcA7t1CLFJa!DL6~@~Yt=%g}HI9+{&rX7e6n@gAHzC;b5q&Vgsa zezX`&PguN++9&Vf>3D_!m^wC1JwbONl^2BEDiOn4PfWl{sg5E6NtDsvIbRQ>4u!3&p&>$}=c8l{A z4%-+C^7&}J@+nV1mB#nPb}t{{oH(fP8C1|y;)4phLqUDqVZFkkCNC|-0IF4#M5yti zs3}?3JO_c}uu`GbaVVU+lt(LpLj?uZ%B{t4t>JvKhsG9aFXC#2I!xhllXyu%!xeNF zo+6ani^xuaGq%7%JP#K4bKk|m*8tU%dw*}ZW3O}~B8lWC^{gT9>ZQMy5W8Ob-as^o zLd|s(BmwMjo=|gG`t#vW_Uw`MA)d#v72(hytvvh{{7S%zuCNDMrEkXey%lxL@8aOz zpd(~}6fRs`wx}+?drtF~mJQodQjLcF2?NOvbK-2Frm4o&^B7ljmDuuh5QPtYNEqTHj!MyngR)nJ{f{OX1wTle%`A4rt5LQpz*p>x)uqOaq0x z!m8J_PS`dhzqDwHB_%1Z#^I_or7W$?$M}N$?-2FSL#S`#Zg+)EMo)5Ru#Co_EDEj3 z!Z^fm9AGUE(;&}hFUKcH;l5XFQ23}SY@pL%(CI^<(_nTY-6HRvD&NGhT7%b+py_)W z`|esgd1hg=qq?F^s3~1OVg8LBH{`VEy68DDNUnw72{mw94bN$+HLKqOvu3>MID#Gl z4UPvNfU}#F7T%|8qOmp@d;%l@xfqo`8v7RvXWV!+nW6C3rzkNA+d<0^KNs$T-^?;5 zLocrU?hPTqNz(U(IP_A|0QobRA6dAk>oC|Gwt^P5oJwe8;}C=rB07yjLltx`hXykg zZcO-SVH{xd9cn7d6O*|og1o4hhY?3)ZElnK*aaUg#3;%~c|v%Gdt$qnk8lEGl+0&P zK{sHGlF=Os>f;VEibEkrFuX)3fdL1Tui+-TaIomI1bV%wG}Ik+?B`A(<+D>c&dL822Y>60oyKcC|O^2UB z&j63Y2z7==KzYq@<(I+aYBg+KYDmlUJ>y3tII5c=nG>D;a3I(Kv zv1S~MxoDk?FGf6usyGg!f@*7R5I2za*U(=P)<}@P%!A1bx5|FL*X2=UMwIl>&-eYY zi4!kez57^EM@xN+1-->Z!k_z81M&FVNl{nc0=xUUH zR%~c%U+bdh+6W&ss%a%v%|~;A@8*6fuS}T*u+J(5S}nUc_My z0QwcSzzEUzw~eLSe|LaRQ+qR9MPXIvs}q?{nJ(Q`sLQ>BOqa67kUQ}^1#;^>axZ>@ z3Yo7La0BH}Ug{?}nYyV=#Pg!(Tkg?acs<$a& zcUV^DK$6~S{@ZoZ(Jk|VGv)9D9i3U!o;zPjk^SXu;H%s@v2k}!UNw;5kEAztN}ml3 z5B%})p?5dF^_}$1k{8il|GG`Wul%6Dy-m5!rd)$Fsf9oc0j|(zh8k^N-$7JOQRWHX z(YC24STx`ZJtV{cjyVy&G)nF7JIZ^$&;I2$YXlrm#GziCy$4aKEdn)4;CbtZHI2`%x#gpp24HtHnFs9V5s5}N8V#uiS5Zy@qoNf<!U%{;@)<*%*Fey4!3L^;^SUBwOY1ey)u-sK zL5t4K(Y7p+HVoYQ(WH-R8}5mX*&JocfY&UC&smaw5BB8)+7UWh-v&HR#|7Kdz_`$J zFVJGWpUlae%$Th(=_1N-*2Y=sDWM%a2-16QB|>uqEwBSEslt4f!=G&MF)`+6vY9CZ_Q^^oP-C=$L4b7ZsP# z43%-%CZl%YDTOcOv}I`d$`iu(+!Ncqe1tb>PRsZVD(F)*r)B644#ia>L*qFV<2FUr zmpK&b7BcGL(6e4tLu3@Brnv;;3sR4v4T0l;Ud?EAb>30?QTPP%h(iBS1Irrg7Kic` zAo-K4%1~xk=ENjf@ft^TPET=YZ0HPoDh#pT*w(D2V>>R$p^t(u0L8e>h3)BrP+*=> zgk$bE*m6I9q+@c>Z>;SCNDTd8sISjFt*_5N(wT|TLZ21BXuk~Yj`gDNDi)yDXcXF~ z=zPJnmcXHcqDw7@;!1$g#*K-_%6gBX-eTi#bNG@tdMtRL(Wvxljn_}an0=1o&y^S;PU4EN!UvV2O{I{BN*U%+&DK4kKPb9&Kr7K!kAt0}y}_{2A?*EW)<+?MZt*G{q2?qirxxzrb0?sCc`pvnMsnq>Wl( z)Dxq@S)Ec)1wU;NdqJKM=o!<~72o>NjQZ9OXiJ0LLT%lB%?q2PCu{G@%+E|Yjw+kd zw5+`S<2T-rl?EP(oQJ4wonf}+K-)re2ZshT6y{No0<4J98qIW0N7*>qct#5=1fEvU z(W3t|4hb@Cy&r8dm>u!_3ud(dzoH-0KHJORD`!7iVO`z)O({strlQULZ<5Ao()!>Z4)0+o(+-F z80@8jn!fUKDB(B+FR zcVAVwG1T4TtXLfu8gwu)$Q&Q53k+!eaDz6ktXg`WH0&J=i;r4XFv-4diP)hvd&NvrPw`J`D0lvl*VQVd(}B z-AE<*(>CQtR$izKP0P*7533xmPP{d&Zu2BkA^onRtf+>RN>A_HgYr>6v@gTV8eQ0z z(P-$HXz-Y5(3ogEhhla_TT@?_QQU(>%`qADxPN$s3^q+LFEF9}Jd8gU$I2NAJ!0!yQH_Z6#fP6Px9kaBnt%CcSPJ5L*L>J;` z8n9$|df`@GY?1dcDtuM29WIFy&RTq<0ed#G-orR~G3v6u`SkEGt&=h|iuS?@Hvg&Y zaro64xGM0(u1ia{689wurfw;g{BvX&dJFe00y2RP*Mf{r{(_E9JlgPF@jMdvaDE>V zhowKhnpFx*V=0dO1OJ01+)*Me1IwWt=s3JXtsy}5XKD?j@gP4Ot&-Bi&i~l-0^%@# z!0{OY>XaxUyFH51Qv+Upo02GG{4id6m2-J+wr+{mZmDrzUQM2qUL(0us{h_q#%N&ZUQpQ2WP?$}b?=e(AZmiY>jsyAvqt$UJS~5em9Ez5~(1=LX z+~?5qC9LQC-oGxMTo)zXWfTJArIpcSrEx9UTzhn_w7c>MNJF1mM*IFZ*7tGHcgBlD zgEcPJssJApzShR z9fzWoGBklh(V`ium0OG9TEpG!iI|hgV~dfIQHLo!?!et_84Xv^8|hrYXd?=7T|^)e zzev4;`<4wXg_e78v6)Vt!16Z5eWYjMBXu&5bALR*n)2r`^?Or~@ zooMqipFsuPjW#c%I~3H%9d<`K6l|W+sxNaW#5b9PN=89G^aL3N`D9J;du=PwIVrF`M=wfU$#RA;A1tV zA-cT(gOLU6!m1m*ufc$diL))qCZ_9FYdNw8m!ZGPJ&mA!(t!oy9r9-MMuyX!yWvs4?jcGWNA zsOu8$Ig&j)xihXfv2c9Qcq_bjT2Hz+Z;jCog@tD4NcTKL&uOWQAop#+$>e=?9+qsR^!fI1| zsk=%a)~J0=qPsJ+Roq7n0DYnN(OuBdDBE2fjk4WUqx3z>t#B~r;a71OE$pt!eA(_Q zLt%GSM%nHvqIW^hMR->sWYNE{yQ=iRi0-c*{zWa|7V9r4LiBtO%eMC+%HvH;$o$sB zLM;%BT<~AVvh&NNPxWL#FMVo&pOJ!ff}oKzlKmqmG?{jTRRA44hs$w}3zpzm{N zyn=p&>tC5ehZhx^ac`5Nb`79(XY;SPv+4OBcAr3h$}{?>AjUD>aQp=?C-Oe7+GPGZ z1^t+MGn2a)_zRwYdd>)2VO*}dbNPA47TCF*obD;^y8dcJk0-MpXf0$(pJ z+&4%pWV^K8E6?XNVzM@RSj(_)$;;l5;HCW!Cr>xXLtv-vwlQ`s@r%E(Yk3HEEw^a1 zlJt(i$`@hRa!SJPSy@@IYnf~&CD%#Sn-_pikOSSd3@D}J1G|>sFCm`W_XjZMQ*$#i-SEm5_?_XF?#DR_PG4c`Fj5sD4c^ZF zJCzFSgvUWDkP&w7yi#!oa6<;3PKrxjSk};Ii-KBEs68XKDy&+l*_-NeS8wcC`7im67h4Gs-vC{%2qWsr!`8tI8SDi7ATWK_jyAp_-U@r#_W zM+R%1PkD5lkU z&k^YYJ2(7WT-p1{`5lX=lcH@8+l54zZ_i@X_Rxx*?kApb@0{)1skmZO z2nGS8m9QQ(CSpAc##G@%@P?Ev`{ON< z4%>c{iROzk7wA_D9p%;WZ@}17l+Hg44Ze)0d-RZ(K#K~k>1(tTJ&Zk%8X1bxiDoaY z`m)Ty?nkRfT6kwxy&szVHCjX(%s-Doi~(zgsLWjfgRatdkbGS~GbO6>d=)i-(CYJR zo<;)*tJ>59CA(*F)Jg5g@ZQt{JT*?aQM>JA)=X-Ds56>_(%kX2(#B z)wDIaW|sz*4?Xgt8dgIa&4Ja>7>d!D$;)bJfQkmJ!ci3O(nu=wN{Z9o&G74;U8ZKJ z(w=DGXqEN=#r7C2*B*_w3}v+{l#SNxWZ78Fj!BFj!X#!jJBDI5%urUdW9S71g_<4h zMGU7OTrGn2DPsq#MVSYyqm6FQC);B*qh{@~I+`8MTj;@-tYcMvy(M7wtu6c>O>+A> zcU1j(2+A2**`ZD6n?mgA*}0*O=Nn?$clOuKHI7f;5C)%zBIBjIb2BpwNvCudglYW! z(9~6~th6+GQ;W7rHN6Bz1#e^jgO1i{Jjf46tD*EzQyZIJKpZ?I6lP&O2W5>%BeO^ZL@KWEWM2$LKBdi<)NJqpatxp*D!2p->lGdSIvBvQKX)uA6Hw zD5~1j`>O}hk#H1fYqU2jnT_S*n2kn*I23zAY1NlG6z2oRK_#OF?9?zt@itA9Dtrvi z0>=aGl=0AUC|VgqwH%5T$ zLN662eUblY;-~pb$hN}6OQgZV!=LUXI|;@vKDp%bHH+9%x`n3s~87grG#nHU+B zZcc`lJD}zFpk?~@(Q3LC?>$#L`rUyfz%?})`YBkQciI8i*7A}n1CN~C03%t zGCIiV41|ih=vw&L4N|4)V^i~!(p#64|4vFzJam5O{9isbe=5Dc_YW&bYoF9jLT|gR zJci61sUyGclOBQZSWUcb4jGWnfaW}(!M8mQ3opxWv|(8sOMY^cgyRz9ns*(@-^7I%%-2dPQwm$>hA!dAq`sZ3hz) zLSrp4iAhJIjM`XzxGv$CJ}I-K*fqHzJ-sEbpu5b%MiRbDcuoa%Da?=v^i@k@hc0%L zfoI{TbO^+sM{b6`+$7Cs8W$_^CT74P(6C0cPIU*JfnX#6M>|1Wt;t$OH4ozt)Q~|Q zrqlf6QqHM5Csq)uqb%zk0urankqsm+V808c2=(Nlj^Rc?6u zmJV$H%=vDz?%soscbcUyCLc@g0O1UZuK0{N;{2Vo zx^&NVO(gE+S9Y8V5%l^DEqP?*gNdCQ^E9DDqTh_7oTz==Ovhv0HFzE*&GRADqCWuL znJ~kc=MB#CAs38eERe}xC_+oT|J?5f-al3FHAon2=WMmt2gDu?xeJf zX<<2Kxsxn&hAs|$uZ=vq`?VMAO5>uWc{n;4uRW{80^p>9w<%J)w!qUGH;w=d=EY?s zZ0T=@R$DE{%p|1@p7~fXjnrNHOy+4Qs8bsV=%I3`=4s$ThXsEk3kP}MH2{V{A_@mC z4qa{;y0|9!bf(ZU@>nMRtOHh$WuldN29N{z90VNj&> zBYV4peDHkF_6FhHhtfmFBCFkc0aU93YZR-16P?B2EgLc`G)rKH$2P1QVcPQby|*lu z9$WUTnQY4}Drt76ZvuAHruOX`4|iUHVNJ2!azXZcSdU^a!TMDiSf{>=UVxq-u#e(5 zQ2Z=;5q^spaRT65wqO%F$P95@z#TBySwx%9{M=a0g1<8HV6>b>o&VdR-7pL!jfE*l|MagLHV!9SvXkIHeui7>8I9IRn@IdO}Ewb=I1xs(^FShj0dy+3M9A$ z-(jUKc7n!5dLNGaaxR^Lyz|b-2GU}Wtd^8Tv7CLT!1sSK)Xf_X01!gbxz##}ThXJiO zezA|sXux_|-Gjxmy(a0e1q1o{Q|((oN0VZt~LXW1aOIZ=E*##;*EJw>D)>DzjQ^ zvNGu}82JC(C4Cj%erQJbv4QILp}y{8t84DG)%E7)Hrj2qy}5Y}4%of;61w;$^ezQUPX!5tAi43ai*jY{p|@tMsH=^;<`A{W*sU35I9P6@z*MfH7?iw(L>)@Ke ztO*6P7nG3pl5Tfc%*&d8ySF z`t~$eUGl$S#9K*LePdY6gW(w!QakD%;y#^uMXZ9NzY&&QhwFrFofO7$Y!{poU9(2| ziDlaGRIF#3@Hq5Z%|?t)*E)H)>}on-Mggm3kP*b1q;0MNU8cP%U!RcSt~7^NuA4g{ zt#<8k#_s5mak_%~6oWNNh>SQ96B1L)e<-<5VR=pK;ovIrP8h z-*;-Hbm%5%O+cr(OW zEjgf-)?%J$@^E>gzOQfOuU^J}*&^`9S?HxJc_UA++$i&S6WMOMZT@|yM_OT$2f4#c z?N9vl7JKc2pX8Y5vpE;N4RmxP)zJp>6Vn}=b-Z}ME&{eK(?g~QIG&J(Ihy=0{3a@= z=X3Ezh)r%*g~9DiH@q?r_QPR1P=Yj`AQjvibvAgi@`^fYKrQVm(P_L7AMCWfx~-SKYc^vx}8E6Yn49XcC6@rF6ghj+UFA8YRc9#?Vojqlu* zw3cP7t+r{ky=k@TtKC)ay;!|ia*-^_wk*rNH*ABAaRFltE?@{PkN}}W0@#4*0n;In zLVbZ0APJBVh;{Y zszrI>>YWL?xkvgNFC7Tvjnp+@Ck{?u|HTatUKwN59!9!c|I` zC?_Xfdp!~Ol+v42>=~7K^qe~G8W_0i{Ca@tucE)u0|DjhdA~NY5Ac+uzboahpkLw8 zb`j()$Q^9~@D)kb3TkUX&RAf29g5ffrt<))tfa?aU!zu@_Fr7uPQ0uczrj^=v-amc9+=wIbB{yNqdH`F43O2 zC6}Me2ZX6Nz_&BJmzOi(A$kcoutl7@xg4T3Bn^ys9_a8GUzJEaZyf`L(K>W2gRetX zkTnMBG}46Mwi72giQ$HY;lvc*;tXJ6%I>VqubHWtVKCYAY&R7&x=PlF3Bko`DlJrB zFy?;e|*}@#)n#AXbTTnm8(&gFcC;D4~;P0SuEDgqSFH&$acabv5 znGl*O{>=}(3$WR z?>T1hD7{#BO)hHS0U?K6vIP|2cyiWtbdS#dv^^rNAg#q5?dx2c&q__lls5hTr}vNU z+w#kM^0L%1w<@E=bu8&b@~>bQ;QAa%hqpP#9OiSePr$kl5Pt3@`t6Y0w-H|8;9J8B7&>3Kv1!sussX~|-sX}Ac_6{4bi^BsTVE_cw&g`%N?T6N>Qb5? zOhysKRSQ~2@+9jBPoyrZIyH`ws+}u zZN+PD?3EskS<{ThfZHa5GG9~hUfv<4+GvKP)jy3>TK(shO{UT~rBv6HRI=PishK?0hnXMa^%D0) zYlTz;u#7B~$a@J--H^yrfi-zN?@y76iIQRNp+BA(^9rwFPD3S+1#a7v!^;e$4MPK_ zl~$dR0%<9w`vtiPHp>UC<>s>ZcuTS(EN!2b#cF2G8s4T6GBnVqMn60g6}@Su3o#4U ztt_9H&fZwP8l8LsMH)O)_u zUE|e1D_>V957axlZW?LWnOvMcl$KFyaeHnzKA)afUSGVylM=Wwa#2t5oQzaQv9o$f zu3mekHU^ixYvZqW*eo_v{6Uk0TjbKYMb0$A^SCvbVzcpC;nq3gea51=B&R-f$**nk zIThV`+9Zv8#!R~}MFTtCfvA=hn}`Xy2)CXvAUnBM@wpY+~FKwJA+m= z!U`sXQW^3RAP8OJT+eSWd#Lk;ieXmpQ1K#G_=I@qHD3;K*3p}UdHjF5ARiqC>Nv4vWV0*ZoRqrbD-HWAt#JPKc;}Y#%k^0> zhP**594@gx;j_xmM-AdUF4hP^vjY^7DW}PV^|en`i~ajq;-16p*Dd*Yi9e(AOlfs) z*5gYq^|NZf2t9J$aMvZ(UE<&W)l-<0oHUR4TF0b}sgh(2m^|qMWbpu;e=dobJ&-Oj z0SFnt_*efF5hL8i5WgZB15Er4IK5<31-@U{sv0U;xze;rYR}A>b}yf_pm8-d zKD(laJ?XF?wJ=lO3_fpb`X;QbtB%ig@AwsrU~d!F)4qXZL&L09jc*hvank`z@@4t* zy!?j}#Eb;?x5KXuFB5Nko?U-H+7yu2j9w%ZjXo*tknDiMpE!leN`hsD+8bWE_#*L= zU$civfC=+QX#)f^k}~!rVn2QNzvZvAx?yLwKRQ^m>*3`)9vQ6O{m@XwiY8BBsJ471 zJ<4u<_}0kgLkl{u8p&_IvY#H;!7Sqq%p&WI7pGaz$g|HrAJpEc6X&lMPiWXGwHP|S zBQtfi2>$zHtF<4~(No9brs(cr3KPjnTA#}0(4@j-UxQYJu_pod0&W|LpM<+hGP+ES zQ&)uRsq-)e$%cw1)9E9NFV9oeK3gA?TUOi>-58vT1MI-{H?$lZ7WcCqZOt{U;yP-P z?luQ6!d4tC&ExOfem{mDVBdi2p*$Do>{6G7); z?#oftJ=+i+D9WD|-FV`}56245qd>Kv;CwuG+k$uMaI5D;h!C!3&{aQ*7Q-(O?>h?H zXGUv^Gqx%*t;&_j7Idrg}z@f7XPr~%Cfa$*mrpJ>7@&}rPG7?ftttphlc;h+`$6sj9 zXwEfNeU}MUqN?;f{QeocYwtpE$m%~MzFLW^T<745O#0TR3w4K7IQ*WW8Ax?QwwY)_J!@ zP7Ax9F=h@_G`LvQiPYNz8&~!Oj_ke=xXC{CRmeQ_PEGc6!WzUpp;ZfyZ4;ct;I(gL z%nwtmC>aeVRG*6ZfF^UYefc6DrMj3+XGRZF_~9#%8rzvlHd zZ>hY-kZIBYH1#{{u)Wp&e%GKo{PT|?+b;lL3J&qToSK?W*y{N zc|DVxa9W>s4yKZSTG#6hPw{T9 zS-hd`$UH~Dn30r_W{u5?y!1f((M>H;={GoM6b!cn@^eQPwC$+9+?-=ePE%Tw<2@OY zl*Ud4-NK|Li@|urM%txEtCME$iL?CEM_5Ad(8fhGJLl}&ux_J0$)MjHx7g-3=obsd z^5XK=#NyIfJ)6xswQA6$Lr8t@JuBp+jWAw6s9%mso-v9qWwZ&#BW|$?Faa*&1n)mF zbHONo-_dCtO05?TknBOvxMv26Myl`iiQ+85xLo{R+=wh=r^XHmIfEb5$$L%6FCdo#6?VytNP55PK$Y2um%MfmEz3ozQo#81%^#i|t`RvP|u<846er)8i7f%~bi(fB)rhBwT zeB`M^hv0c1i|epDyK#$_c~MBc}?)Pte~Fm>GS? zK4Wn1`3*Rsu*iYJ*KT4LNX12xlsa})c!45=^Sn;Qj5MO?{p@Cx4B;)mFa_E&f-|iX zC;%R}-|rqear@})Bd1296P`9yKJews1WdZQ>B+0F4#ctX2$s|aW-^oahaBYD*z53u zydHIfkM#$kDp|U)0EZ6-)_$ppis_1k#Dp1s_UDmPoz{2L&8n0@O@=o4TE-l;Ss!7< z_jyuxbZxG)DI_?_Q&A(WyNhwms)c)xkXQU#D*&laG91##j> zEIC|+nL&c|1E?W_*FdrhNMut0*4WrTIdanZ6mD~T;f2wUPEi~<>6T;g9e(SsRQfiQ z=JPb}p)q|#NFO=bW)=UL3F<_H_qaKQj(v9?6}?B1j!N0P9o#3i9m_@!V(T}vsdKO`f)6U6f+3~0xxD4BY! zP~HrF9Q3n*l;*4bpmgTENkVLCb5TyKnB_med+51+DL=hy(c`<6F>NaXU5nyoug;!t zee~8xr*GUaaAp0b4GRv=I$*Ez6$fnPzS3;*5&7+ByQmk>VFb7HUJXOoNgmf*`TQs^ z>_x%$o9dF+4X7+9E#V0^d%m`2>8X*YV`7%B_{q(w#<-c{Jp@72G#&iuM$|OnMd3wX zgLZjL)~tJGogCSuPP*8{!hM+OO>Fn*M=MscqvF4Uvn+p|_ao><0ha}7`Rii0WVW4Z zvwfP`c5>wGtu${(J?vhw(Su*yMrOocG*_S+ssU6(nukKMUbu(P8TIQb)C~NY^rG-8 zg{wv$RNtq02tB(AY!-c4A@z!&LOdCXC=-WL6TS~#g@*GPC`)Yb{K1N??cy6FC#??X zJ_Q{*wytSbNuOUZ-u_LTRhzjTvrG7LH|il<5NL`tUd;t-i};g?wRQ9kRBme*-(GqW zfqLO|*B;LkhWs1-WHiW0t-ot25fqf9H2?i-S{@6c2VKz>2flz|H7O_c3 zgd_=eKkjQmRzbL0u)E{Mzs2us-csT3ySSlwqkWyGEYV(+8efu^SY_+Zyo@zmbdh*l z@v6GA)op3nfw?Agd`iA8yU=Lu&&)=9V}C_^<>T$q&eerIErRmou6Pz5zrS@;rGLTB zhNeySwc4^oM_v8pj2Tf*~wewLtuayV&7S~O%oY0(N8xThR~A<63U z`)4ZI-{Z1M`;ubvPGwKG!tjRx^oLJX*qp0{hTdK$ZW0jRWaH82KNW98^m&?J+{$n< zZfQ}#(*~LedD>tx9gI8br{x|urcY>RVPts(NjpxMPq^6H)~)4jhv&6#E^j;3Y73Y$ zQ|tjVrufmHJQZHBthVPsYyR@u*;lk4b5^9JWxL8#Q_q`dhDHnx&)f{OXC@e(#RjoSIR-^m3T;B*4;b&B-P6Ju%sF`@}VI z?5}YzM$No5+Gb}FbPEH{hJ5;ug!r5lE#gQ0>*VTz0l*Mit+0vD5U2Fu9C7Ob$>s^Z zk*HyxX=Y0#`R3u1HALtI9r5fpt5^3)?Bi4M;5h%FT^6|lQ2H^y3i1h){3>kRuR`I? zNosCSXUQ2AsS(k?3YA-|I>*gUwKd0NVCt*C%f2*D*c^9eVPluw-qpCUxYGCNqrS>w zmbu}??L$Mi2PNJf!4(!3dI{&A-~_^(LOPe<*bk;Fj>)M4CXiEmA79-6gt2L;!fS9O zD8V>z?dhCA&WzYQrpb*K@j1)~L+NhLslc;{y5K@gx-nC;r`6(u5%#P}d?~Z-?%`o@ zNz#&0CSoi_XhE4U^0NtgIV&c-Dki;PB9^k3jN)_NPIVUCYjvjV`V>vufkoM+Ypy|E z$zsEkM-<`4bdx19a%S8$@j^;ZS?#7)BdF`8u_L6fLQ+6~grwLc+{LNxGw5B=Dj}g^ zcZZI4V6!AwjzCkQ+@vWXHzTi#P%a~0BEOlk1J){m_z*CCQ{2Nj;Ks{j$_e8ovndT1ys9pG(1ln+ZUI? zwYwi5Tsz*`sTw4p1-%S#fwi6FExU%VI7vF4oJSznW|mP=AQCPjR3ChV$2;|HL>$ij=dSzWsF#RX67qCN=~Dy)|y9)0C>4 zbHl>8z6bUvqTAY(LchiBH6&H1OTp6gyT%MC&VYlQrrY0pD1J2qxdi7R~w)x`L z`n9DQvkP*U&8>9NjBC+TXnnu~Z0Mk;2l!1dWK}vE)c)WT7xZw0{uk77rl^4%jh0JH zYhl%!}bQ+05wxO{-Vgs{M_?}yeU2{t}E!efXdl{7&xykJ74cadqLR< znfjJMFb+rizXT0&{!tTD3PZgmtbf22NtETP9K>OxWMTl4$ z$C{d_slB%J0z*-;qY}4hZu}r;Nv+Q4HHr7*YR2vZE&0P$+GN#$!R0gH%FN*9jDUp! z^N2nHbC+@0A7C&YfW`nL*2DP@4zQl{uCrJdfFu zqGX$hHX%%DolQn&{6(UT+$<(moh@ZWHIeZ%O!ip?*SB_8t`=91uRtIC^5vHdyA;!$ z)|4$3jXl?tRxk3uL`oFfkp@aj zL5T6H;5EhY7=OlbYUE_%GcH_LeA$apk-MU8j=N9s)gf*v27G8`O>44op0%GH;e6{|hZkjF8n4^t1HWp>FaKlcou^6iM zQ-dpZZ%TDU&Ad29Exz^b6-kF+E*kwvYFCc?h0rc`%fV6h3uev}B`X=N3BjY0zE-vy ztMGB_8T3M)9u{^skNA=t822(?jo$b@y-PM5D(yyT*cAF`u9eWJ2Z5J%zH;I7M94{e zm1HlhyciWxSa6Pqxf!=z-Rj{nC`|_6j zrNFwl{sgDr!0$*@t8qsn`XRMQz1>3n2s;~x-UTs>QaNVfQ6g7D>nw_ zZ+gjzw+wyK!e^1E*1Rh0CX{q`^HcEbS64 zi%`$3Te_Yc2BE`=8$rVx!opongJbQIvR*H{W_TEDwikdaKSw(X==oFpI5=C97!>}L zJUId^>Wb&8cf28e6IijVuc$N?^ zl=!_3NdnVpHpj%U8LH@**yU=KPOFUBu7L>xXKgS`umF*5LOL}AZccoTJod>8oUfWP ziATWnCltl)TVkhc;Ef4RMVsZ_3{!k*Pq8Ue?G1|w)jCWwVF!#{uwLS|>_&I;_NA9s zAgVqyRpopPiqk`H;rjqWDx@{PSeOP9K4)#P_)3dYAjj5f!mu0n^#?S7~~4i*k@(+Y~WP9lB6TUQ8G;x03}a)Nh~ zPAZhu-rAU0+?z5ZqI9GtZ*fUV%M#IZ`2JYCF86UKE+|dMk8frMQ~Sg}dsoe$ySpZL zq>-!xzY;#^x&JuehGJ$6dC_ zg^AIabk1o*rxKqgQFHpC1#6|L5Tc$2Um&RpdoJXTBvse5i-=NjPuw@~9RCV>m@OEM z72BhHs3g`ELGeDm;71?SNac$4`*Pw<|ABsp)Xr{Ki^+QNC86wK}kT zOIkx`q9x1VbebEgvw>1?c~hOV~3aI9pJLk= za==fVHl-E6%OAA9jqhyi2@Lu26C16be3Qk#Q@=bRS?5lSuS~IT99+67YqmeErlbAJ z7ZUUrMMrB>OeWJ_tvlXio*8v%(%h!3*#SW%v{qEDAkRnANp1$tgb5A*B$+9_le{=V zl0mU{*|>&sGuIoXQ~{0&AzT-KcFOwohkFy3EIIMB(VrcD>~M^cR;^!1dlOTZtDu4B zLF09xaahO3y@1#|tFbl`zdXt6x%Ki{k(7m?M8_%=_6n>*gYQT942s->PqON3{(e@D zYA0496dmdOQ-l71911PFIBu4Ilvf4%15@EbE^q*S#KzxE@Brm-&D>To(Ie5SB9|QhC0gDmoSkkYlg%#gy0a z89N#h$$NF1)GOid95%7ogKg%pI?dnVjVr){0oXl-d~&RuzLoF9>`mGM<^SCdh_yt+ zf3gF9DsKG`hCs{+>0}jv6}Ns!o}c8Jhdt1jP2yi?<*Qhtqzv2-;SU=93=vzVT4_w5 z&`fBNI=N~$zCWOy_R5XnD`bi*`_ zo6FN$hV!PiboS0-tp;%v&KriD^tKxB+|Bt38BSHECn3|W%7_f~7WwCvS;91y-t58# zb|^9?JVt5My1R?>7tcyQsI;cUC#J^X*OiL?1J~J6Xr^K8Ph3m>8l31?gtwu`xh6*U zCf~*H?`^*K!{w=AXW@#?DT=rf`C&pfoJ&!hkUlN# z;kB%i5sW_6U;}!%@ZW-$AvtZk;BwXwRfYY_@p(VB5}cj zh6ByU^mwaHpBX!Cnk{nEDpq`FOjJi(-Lit6I!}Vx5*L%?f+|b)BhE?imy$dzuniFO z?E0~Ge*Y^Y8;H4VlcxBTEuk{8kJ>V&>20=nZ|pRj{J!+a=$rqcJ&Z^$X@N>wG1AE# ztimolE*h3lyY%EzG5pf?yuDIa@BI3GjfNDR#q4uTQ&^Z_82vbEyuH?Xj8B`4@i}OC z^0Bwk8urhjExG7S5O&6)9&^VFvI<0ofQSER>l~^{CMe5li!LtQ&whW`tLdgli`!S4 z6rU}YHky#C;y#RomJfMWVT+U1L4VD6JnS|Pp;FXKEJ)XdPFFskD zQ0ZE*p#Ji6=KHs+SBu(>tA%Oe{tIAOkSj?36AzAK_CzYJM0u)o!!=e}-^$4Yy?+hfft zt!`$7J;4lq`52fcd3ZzHAnne=C|-ixD-{3i>>KRK*X`_e|HcOH=>6E}?w%e25l{H( z;tu$~Vvnsq;3Y9Vxhlg>r6s^UU&przG>R0{RYpVE#_M|)TsJ$;;Wh3tiMtK1vUL5t zs`7rnI>~4_Ve9g@?;rG6Z0ksBs>;`#I27Y8o8_sg%U@XHEb}Q3q16w;+2Pwj`}S2p zY{?iXscqvd-gFfdHhW51$qdMw+l!syC&f;;cL#-hVluYl+@ag%(m4aG7`kl)a8tU13%g$wOx3r&) zNz)efq+jZ=M#Rq$KV&~cU={qQH7tj${4d}F5m>{z04s*IHT>_PO=)N?%Niur!vLCe_x?s-Q(Ir5gR6~8gD z>ixp1#$z}oiMjkExm?OkmN*cMu(-dq#?62Cuvr5`md@^pze1u%H?R^%rz6&IV-mF&!c@% zzsEbr*_VOyXesIKx(_47qd1SI<>%3II*E%z<_k8ncv7FJeYj=!4)&l}mvCbD?i1_9h3Fxjqg#ox82zMem8KsjOF%vH@$ea6 z)L+I=%N3Ml7QV2SoivG;t#54IyJOe*NjZ`PZMZcHff(d4U#O%QjvUO;HiAY3+Tde#?U&S=$`)Ndr(lJxJE6p$Se#)~h029= zb$&xy?qE^tK75#1jLFKl2IYI`KMTbz9GKEPTu86Ii>F zukT@ugkrCIrk>{>N0EuXqw9hHKu;{tbxCd0fu7m)J3F($my%hSy|8I>MeWYE=1t`_ zJ6c>B9vl8gX7=RQ4EoYK@@s~2_GKnJlQNSXp2t1Sfr>s~T5ERs{EQVIr`hUpnrs*j zVoH7`>==i&B(u0ro`iFSas-H=v*)y=BwE+dI%eE_;AHbUcGgY8y4VqfHDl?jf?7}h zP%(g=lqUf@QTX+Rp`DyV&~924gm$u?pe^teu>gymxH%V*HlU$;*`EYh;BYMdiyw~ z*PtixQv#(=mEq&lC{enKrKj2)&XgMM?v(3?t4E3q6$Kv|*%ssQOQvMCCf;FfDQWi1 z@+VeQx{tLV0Tn$1&-Na)4x96NR0L<0bB~?A6eRP4k_%D!Dt_wJ<2vuqDb4WbW7i=* zb(citi>6X}+&N_K&_2>)J(tYU!`IQnxhVbL==|Lur}JRn&ZBei_8^^OhnDYEsA)6!n6e+r3$`kOFTEp|i2U8wKo|A#$;z;cka z^*~_Z-nMNAvIqAS*>XMFRF5^!gFCGbZX@w_#YOacQ+nItK%QUv1xCoK@KX&w7REUl zkE$bgfNQ_Mwc-QZJh5MVl6_4v_m>CsH97K<>)>}PQ){W~-Fs72MQ|VZa z!yTQH?5@;rkMCJuQop*?SX1(K0=t-moyP%TXScR{O6(-<8d`$V?kvXpOY}z?ZBW{A zS@HuaV8)JP-oBLKg2IZlv;o~;qQng*L9hEuYjW*yZs&|zyPKxSy5-_B(7-7A_Y;%_4L}-A?ccewj%nJCq%BAq@|Ton75-s8 zd(k9r*wEN^!}d#OpNMpt59>`o5O$c2bkzRxI0wG4w8QylL|TxPiV2Cq{a09D-=1oF z_0lWnl&!LN8_JShr9O9js35R(O<`MR;czJqb*GmEQmj5B(4ur(XZgjeIy3aTeafg< zTV@evBvPLoNFZ^yrf7d=iaS~7F=(9F8t0Kagby+9bLHJCcAZDu&*fd4R@^m(97ABO z`AWExWA6W}yepZ#tG4a%{BAfgT-E6>$;t4QQ>L9q26A0Xb%!!`e_`j5Q`E6S(yz?(^k{*Q? zza!3<&VM6I)-^Tk>dy{7PMH1Gu0WymOXIKPv`_MmW_6PG-&<1gJLtC?#HZQECea{7 zH9`1s+Q(W2u@SiR1MUAO>E};(xZN2w+FdC>Sz5cYD4{Ip?pSr;bvQ@x*!eao&zPbN-|lOj3J=ds9w3;~y;;a=zOPw*KV%nr9s zUlo1%jDIQFoaloAdrfUlf4DwwPHdb;6&2mM+SAv#+E$p60v|iT?>#iKAN6w{zlbbH zkVy)xXB5`xPp|qcpH(Yginh&InO5Jzm^c>GUtix}^d;Vu#Gc)z>8MDkYqNl~Utwq@cMV(4(&`k#v zLC4ul#a&Z?;vjDACj%bM?&M?@cWv(zE`vsopyRei?gDUJ>DK79mKKMP6e}4w$ZReC9 z|4#LPcY*TyV0rVzcPJ85+8_T;?T1{TylK4r#P@T{kAH{lHdr1zyi@8Q|K2e19X8AJ zzk}8@SR)&Q{agbZDBOqPGY)F!4;LPAJ#+=w*x|616-%SEtBp|?rydT)-!a;i36U2I z&DG}e{yN33UE$U9suS>M`0m}|)ubcu!HM+z>dcH>OW@ADRDW4+n%!?g?sVB6*2;cPK03%fF4{P=f5cT}cUO8`1rB%R z9$SGcwbEtHccoO(ZY$!Ze#LmeKikIawap zLxjM}IXSj!@5dLdOwX^#OwTv_#@I=*O#D~2JH5#7HhE1b``Xw-=7Ig6mnI7@{B}_~ z$R^Xa9?4{B1!lh$QFD&7Ux`)h?|!#A(?nH(`~C|U#(3M3X9$lnKrx))CM1{R$!gx; z_r7S47p~EbK8!!N(_cg%SMS(yH9gr+ckCeO0BRgMm>Y?M2l@1%1Q<&oTmlNs4SA4% zi?hsR$%HjzePQT1@*YzZ8A3ZTlTdg~VezE6v~HKXTDLvr#znPD^9(7z414HBX$2MD z^gMvZ=5<+3HjU2cvbL8rCN=ny3R9gnmu@P!0I%=HW(y|3i?@uPq7g(o@J5D8MkZqI zQp-UI{<&spz9BU$(;j*s`jG0>Cb~RTx{H!;oWa4GmS28bQoYYzfVP}ktJjG>sI>;C zt-ZL3i2$|Nn4OrxZ)s>|M;W4S0uN~KTY=x-Hx{&|-;3s=&8a2<-0BF%Zew7W(?&*im*0`9MKcn8P|1`$n~R@!}t+E%3Tp z*;g!$y#dXzL|1|LYT3(d3Huw~OSKg!xr;TxX+=fn4_l|q%t!95A`kwvhOESlJa1BZ z-hb;Ir2O-;ci9%I33NFz$D3>!KDQ&?_k60;9Y}E|1qe1aSTp_#4&&lj1$Smd-{l@e z_{;C*QKR_bdzhiTVJv(g4(`i7rgE zNG5o4Z)=j8nQkq~3aRkUkeVqiX+w8HluE175~mL}$E{s{T53%vA8(C%qShQzYtR$4 z{3o>h7Ft&DNI394#ks^sS%zWt_SJ^d^4kxMZlV6&i(Dt9T%9;>PZw%^B)(!;yk zLhc3zb!sUd^>br8*kS(OrNKKS=nnP;f1ge7W6$IL0sh|2znA0vGydMgzdwWb#r%Da zrVPFNm+TYyKUoK1`66KXG`0MX>Q7d#l)hkrJmm}fM*1R41F!rAyN=3`&t;lg7}78g z3ZeaAeOSx&bGmfM-eiMpA?2krUk(Ga8Qwf}2t5yeLC!^74>@Iv?q^0jBS*@^|y#>y&94#yG`wyyj?9WICE+BmcPhUalm{sIQ z`M1b|ydF-x2qJs&!2NfAI^&YsXP*(jJ1Bk*7@#bxk@B=^ux+4_ev#+680tii%GpYx1KN}`Yza|C%46(_92E8mdO&}KL!aTjgTF81@A%HH;qS}&yMXsT{=PzssOEsrw+uJ40WX5` z8WH{`xL8=Z^>+)Gdvi+sS=k2PUs$L3vu^@c?DX07X;_2`W8a|bSwfvux)ts1mPp4IYRkmCx2bXq+UBuykk?a$WDSto9oIaf0W_oj5A4*4(R>6Znm3i+8GmA1%#E zv}PG|JnAItF3ddYWJ#C>lx+=YBfSKm8^^XnT(1C!Y3;M2cT%m37d0X?%?gn34r(Z&}nrybh^pUi8ZF`CEshPiqzwKerL9L0KI z{?6@H9Y+_;xzu=5RKVseu==wcd8&P`18-cn;kt0?q|B^}2B+0knv#}lakiD#E|*81 z{R-om9GQY^Jkabc_#gO>XST)b* zm!5u8rV0OynMPwKyKC9-$kL@F!=t|)S-Na^c-c~myK=72HPJ? zRqEV@sdXy~WuapqjIBV3%TGZ!c)S>Dz#EDC`ZTWcM))^ zXzh)CAfC&0L_B$BcfBvY)3GM+_#YQ6*t=kXxcx`T2XoZ`AK+m~cuqf6+>l24v=rnp zNJKc25*DUJuaZ19st&bLmptQk`=LR1SzPz@_~?Yxh?&Yg=DnH}wkPF9Rpj<)t3wE1 zHWV4Pd)hRs!`Ud#9T*TwaV<2?7DCAWGq|FKL6S5>Ik^#XCy{U^`%ZZa;!BICtccO= zFo`$T_w})YW3YA|qxBL|U;^-pA};_|Q@njHz*&gg14QzdFS((!c-_qdL&wrCx3vWP zorRX9rkvDvPo4kr=ZO3G?#_!0f~d4;g~uA?Fh<*ziOEZdB>#X2R`0@l!;9N9+`@}8 zy7Aad-XBsA{DDxewW|reX^Bb`$p3RwIj6gzVVCS13U+bB_WBt!Se-sE!=&@*J$+sA z=E`ftVWse#acjKuwtHb;QLagr&ja4nIcf0gQ4+t)9P-^U3Baij06@GG1g zeXnom?uYIlWHEy~=?4-5a#Fq!SVPg=vBMRlcIbBgpxK?HNpy*B%cE;npD585{jxYJ zp}DlEuQ;mY*8LlBf!(G%dKTQXL41N0)h@_PnO7_RasxL)@|d7<-0L%?ugr!1;)1vd zSXAx5nd!^tp5A}6_-WbPua)vH<=Lm{7l2I`*y}LTyeWvO60MSUA3gSM*i&SQklg}( z!-aDTpOW4o1VV1bGlV=8<%qKmI8l^f6OG9dw1Xp10P(6&3P4PXoh?8tt!h8>?3SVg z2R@0D`{PDGtUObKSiz^3h!4lfedx(}s9;v!*H>Q}m8 z9Zi%2sDg~w|8rpMn-&P8%l%K?#Q?&on9ruYm4|54l)I#0)I4k~! zjhT)e*ye+Kxjo2@&VbAyWirGRB zx+ABP6gV?ScTMoS)%s#I7G$;rVjMn)Dir@2OUA8bYedll=L<3n{%ZVYiJXDg2TKQE zqj)gb5D860Ez&K8(pg9H$AnfwrdiH{Fs2WCpKBau^^Z0#W;M@fDo4Mk zUzWLu{axI~c8-c0#FsJW;8MWupd|~d^A=#U6h*rgZP0p+yh%{Icj}6bO?~mREBA}b zzIA04dR$qCH1Tt1@Gm0A^u*-c)I>vC0uv|xBz-?m%T|D<>d~SC_y%gF zaXdZ$_tg8g2!-+BmE99ce72^H9{gN=dsWY{1q%?6dFAMp zSK@oTEJau(T)}gag%8jk=h^Y>uAhjlM=8HpNo7-n1*6w5kxDY)T8~gE^l_NMecgeG zF=`WgGg@4dz@9Vp9KW{h+Px1Qr&Vnpat=#5OVE>0Xi(Tmw8p>HCu0B$D3 z>i$-VZq^6uB|1zpvA0y>q6GG9!|03Dr^k<6v+$bBZofu6Cc&Rdt{*Qs=-?jpp;S^( zi++O;X%rE_=J@FAyzK4Q+)l;CUs74bIYHSj;g)eItVStE5D!B5`2W~*yhr>!raR%# zp+B(a#GLE*?E{>nWvk)iS`9e@y|x5eHW?RfBv80&3*()jxL_)K!0vO|;`H{gwc*)K z$&M_%#M{HxO%F8o+Orbz;^1FW?DU1Q;R{=#GwB?b(w=lYv1vLdeN<=0A7w}|YaN!7 zIT?VqTlTfk#a<-YHhAH-uN`lD-E_1qH7B+G_4y4D&dY{4&eJMS4zp!Is3iLSZO~hBt~h$Yklk&VUhVLBEv9P~p~`W~`v?={9|`KFMhfq^JAKIs%1ryrs*< z=>>DV#VaavDTjk{#Jim~DaTH0prkZl(Iy-09t-_x&6u5EwX`T>c5daeV(Fs}ACshy zv@+idUAj>C22@6t7GC$WVLS#5#t8?!zXhHKdmbVpqGRLOGwxNQIs~}n+HYR z(?u5>*tB$~@afqu_Rf_ecACdeIiR<{;T+fk&!$_1FMvIn6FM}ejlvT^ftIfDqa6f3 zv5~M?j=P-Dlrv+)%A(pGE#4+yMDDcdp%Jrt4JD>fYirWLHLcdt`J0lpNv4?0B&#D#=-d`iYQsP+o#bI1qh z^tndX`Ty2$NhI7q!LUC;|mIsuG$XE3>kf^iKmU~#$q72>-r zbdh+Lofya!|1!X)Kh8pi#IqnWXxoXC(Zz!@asK({KkFz?u36o`}~V9KEHGO zcFNrV`5Mnesg)9qJQP>ug2>n}7vzYa_p|9wun=nI{eJQDynzaqDE@mftdD}MOr}LE zGlS(+3YQQ5F1V&o&xgW_`B+$&co4qAf~-#FMGTG*Dfghlfd!0%!HMVJ3&hVc80HfH zy@-Vz8OUX-0r8)Yi)V+(#3_Jxx?#x_q;j-3q0qRXcK${h3L9`w8A-j&FX#ltcwVJL z6ABfa{bB(eQu@VzJ|Uh(6Yc#h4&xBtVWEowE;;DgEwAD&kj^L@#Em5yg=L~8VaC3F zHy%GOns|$MvF~|{6RncQDaVYSLaV%dE1%OCKqH_E4bJT6pZ`UC=@7eygJkq0%<;Yh zk<$4j!iYwcFPC~Pm7c^1mM|410FOjjH=yp7a$j(6y%T+-IjTkOqG0YH%+acI=cqu| z16XHCxi0|go{5?nKhs<&BmjQ0)^I@w-}8k1L`^5QMeI>th5C@cQ;yS>0hi+2-@o_!KP*_#FR*%6BR+iS5EMdi@+I(H z`V#sB+Fl=HiCMxfsbZIiTTsj77t)jQ&EfUg@Ll}<(@*m}eWy{rQmsWPZ z^;Q=9Ic}oBm(?<#U|{dlm)6kG)s)QMf9tJt%d}eLo$TjtvG=4hxw0(wKT>Uj4hQ=m z6#01;$_P{1fo6i199|b16JL9vn>W~SFY-*bh&*UhsS5CB>mQ(oS?YbW2|ANKrd$>| zph;cm?(U{uu(|i%OSvX{f?Vi}+^3MbQ~v-uB)(2{$pPtf`Io};xC^LK);2E7Bnt!W z#A17+C`3BeH*N|#$NEin(V+eDhXRB>zw60Gtw&$kc=03s_KNuhv+H9OGu6>I7bv2& z@ixtjs=Y&Vj*aA1@99mQpQ=yWQ043PIm_n;y4o@Zwf3xpboihc(_S68clGKguV|S2 z(`6Og`g6LQ&EA_D#FzDEPkF7Wb$wC6va7o~chBC0BtumR%129LJ0nH z4O?xibd}D@u$HIiwihSFIFby8#GGZbQWsy_jvf}l>*9CNNx*kHm1F^j20_8NZSv!@ zGn+FSF70G1Z$Exu@bUrnxR6-wZ5~WN`;hR=D0UHW`uecY1UYIWf9OFMDUYex8k2O8 zpm_`N8nAOk{wEXupga#*{DR-Y*iefdry5K1oDI8L&2`lYmCj~QR+=NPB+oH>G=E)U zRbrzXPU*R&d5+G?7N^C5ypHOvhdLtcfMQgP$(K?-Cv|#U^bU>E6c-aW6Di3RbHu+G z4BHcQrnp!o@_0R^y_(JlN1PIom+-xGZaQ!=b8J-jMtB@rxl2|-vvmG00HGkQS!iO6 zg0yeJM;II+X;*4eSur4XsBU|&&)>VFu5QPCpTBQ=UG6}wJF$8oFK@6WF|nqxw#ALk{Z0- zd3oJlY))$9l=k>|yE0Cjm!1t?IXMOmd}RHyq92ZfixjRAPL9PDBdK6En`*)u^@91oMio&=LA!SjQj-*n}b9h03O$fM48ux)k41{0mcweSdr5*X(aBzrSC68ud1^h3pYf97S!%YV%y`I)8=5LNi-4GFme; zThlX|y;>(CjcB#Fkif+jrZ#0}G^M3AWn?y`b|YCw$y%KgCm3nnz*;~v;Qr*DrhfFU zN8!YRDDI$%$!{ce@Ri~J{K~s3#rN>T_AnTSM<1eJf0?;bzU?p7S5m3N0aNx;B@3xIDKcwXVe;Zm>EEG`^JOnF)SJ^h~8KBFtWz znoyhj=M5v(CAo`c*BY|ZGYqBG1#D1X-Q-f~e5Ig#57snvIu;g8!5K5eC6=H z#(R@aB|U6M@DlZ4EnWYuX6iQQBtSaJ%5+%WC%`BNdUzUs8n(3gb zDvmwYeEHIXf~A)?H(xPaFuDscaqq0Gzc?i)>lX2D_E}g&>ZZ!d&1oTF@<883H6SHW z+V-Yw2&FoPKLpv0V{XN?*M<&n`rd{OD$|Wgo&_4 zlZ8u?HRG$QuqiP)i0-4$u~G}o8rG}Xp4F6+(^u$gO3vx?s;w$Zyw;{PpKG>0vtq^1 zUFDuYYpSa(Inb8Ut90rT%xZ@=-a=ACCEE`zGM)4g*qZ31xLn1iAL+lWspZrC>=tnj zTPyBEz903n1FVCddBD*i9(pk<^22MN@Wqq-@o;`{wfx`m2>6bCHnS`UlehVv1x1hu zkUsj~;NZZTQ^EHJ$hLz&;3n($%Z-4Cdb{sJ@DSadE0f|HpKFZv73I#3X?%A76Bdwf^u*Y#Hnh-=xNrdidkB6eqfnpRQ{7%<$6u^x6wNLW}8_@eXwM8bYtw6LILX-Oa_ zP8FlptK*q`llV@2e8E6&R#RHuV38%ueRg4T+s;~|@n;a{C|me9aEv(J6ze7Q90*H^ z2eXgONnWeTll2dJnv=4Gc@B#!-DP&AjX!CZ;|%IbqdSun)vyUD6t$4OcLviJO-Zkt zl0G8eFpdLwVy30Ya$@IEWZJrwkN9rn>XcuB-Zun$ZSYSGaHsOA~fgV$?V* z4QR+DoDbT3iH!zrz8L(odbc?t3J#=mXV&NF6U_$v9Wr-Dz0jr9Dh=9M&9S=J1a(~t zVbdMLY@tPdJzz__5ei_xg!hy#;k}eTj`x%G!Uo(P@*ZIVS^V!-vArr` z!$KY->n_;er8b(*X@k;hIc-Vl<1|O z3aKplVzIT!$uZipf!WbXo=l;`ri(QhyG|4t^kxW0#;Vy*;c0$~|bmFex-?57)S2{ESWE>)H}(C8*g+dJlDNn@wEzA=UKy>U8Y?Ai?zMMZ2#RXQk&0tzCEf`FhDQ4|ZX?|WxvcPEIypYMI%{}(uW z`?>d?+s-++4ChxT)>IT68!1YCZ+f`4m0Wy0JUq+NrT9=V=vbqEvjvd*_~Lt@f{lqt z>^TUGT}^PPY0=i)Go_U!tzK}TuffwTAn|6hu~D|gFWxsI(l4NntJKBK6QwfPBDq&> zyI6~})lN5;Txi~%O(k)7bylkK8vAuzPNVt};i0*mkjlem<+j>hVZFWwdc8*gH{X8` zIz30maMSpPI4!Gl7q(3gRj!OkiQzU!U{8!wo$Q#w$RByg^LTHl99a{1>UD&N!l4$@Y4VJYq_J;1)i zDva$P;nSXm!RMjQXO`mgNb~stapqIpppfvAI!nd1;D6z%u#?J|xK%v25oaN-10PO} zLq6bt~c;0e(Alqh%tHJ=X= zN5x!6#muGiKj4d7mw~6Q7H0!$k)o72Nb>=mG1s#)*JD0P--+cLbI&;Y4tFSsi>xzK|%_dwsdZrd&N6?l8!3F7~(ekkP%tsm@UtH3X)Q=U?% z?rJ`qH{YAPFGT%~kC|jn%T6|@=kUFgW8+&|Vofbs&N133gam`pgHfm|A?$;2eM*bI zdGSq~_<6bbxw?8cx|!CvMc+ z0bo#oN#UHdFvgvDjeig9h!Uo8IOl6|IIEr=J-K=)_P?vEah{IDx(MEdSK>H09K+~I z6H8W4Ux`Qq1}H6e0Gv!a#PU?io1Ea3)+QDd^CP(UsF-+Zw8t2}dtQ2AP*7lc9xFFn zi#ve(!raHW7-jcYU9H&U$Jn6vBk;vY|9W(QTifQ5%_98*gJ@sZ)_kvEyp5fiS1&l& zw-p#qjwmZJ|FOMSz2=X3j2|&*5Tk&ZFW_znY!|B5s;hC=OXGrlygh<~>NHGfXinq{ z8hX@qbMx>>t{WR3oq$&T8XT_Szw+p(LgSi7){kp?DlE21WLQj7zJF|k7*kw>7$Y+q z8lshUdKNsPsy+20gX?&B`O`kGnMw5`L+ZGD`3rsU3EQ3l!TzBk9Xt64 zLwIQqhJ_=agBNP(fGhXsrsDHV7}a^W2hkPxFC^^W zGj|(4g)0zV!(3kh-PSSq*l(G|O81rfWq4Z}92)Djf8*u?6mAY-|0tUvjNyYsuJj`& z7026er=b=c-1XFWoil8u0}G~#WP2eP&Xpj-?Ldd-eQy8u{q7*bEBc6 z)ipOhDm4;{dk!bQJ1e|9!@{1VWV@dZMhU7=Tse_=oJ$Dsif<8_7Av{SJc<+?7)Enl zt<56SA~;C4+&{`nm?`($f=RLMGOGjba>*HSljE)(KhCJqg}X=Y;cOT}*m?CXan*6$ zy$?RXnyKNVl8lWl&{dO6;Ku1exHUNkZa2lP@j!4xPC&ROE5YrmrB@_dv>Z15fM1g; z5sv0Te60=O22tSF^h3ngWD2;!&7r0ya)&I%!P5_(gaP#WiDZ^Vcq!kx0#5(UpwW`CPuFJ(E2$VZzJIbHqCn=Nzf6|O!TKTZN zIlto}1XYeyK~}>_O2-`M6xJFI>g-)DhZ+pgE|Yyq_%2<#L`FqM6?9~&mh<27iNf3` zr0PDjug4@YDmuD}G{viw|E?=iMMM{{5oo)IJB^`a4ZF$GL;V^~s`hyz?XyIPbIUfC zYf3ii;-p7Mt~PLnv_-p`Y=1`qY~`|2D+wzgXz!h~JsKKzeKO%Y}sw|BlcmZh`+d;H0K0 zoZUo?D`7sv6`x79e8Rz}OxF1k_)is|sXCw6gkKP6n$Bkt zjeyT|=A*SqnyyX41s`kr<_IosiL>2)NBhUtYJdOcBlbsf9yQMP|JAmJ96%jeAICQO zfsi*s40GqQR=;f^9Ue!a%Ytr~c?8du!5VRq%JhvGth$-+ZpBOh%_9J^wvOI?dKDij;* zKHh5r+yg9K)4R^?AN@Q#e1Y?oO&-33GH743#`+uh*eP>JhdAMtoQz8XwYT%Q`K24W z;R?$@)%ZR7XmqHhb81*@equrwW_aP%rM_!Nx73UY?{Yi2&=_k^Q?uMyX2j>QJL2{m zCjahyJ7z?GwmLoaA8wU=Ucah-LxBB!``>QR3}3K7Ff3fi_A>Q1X`&Qal`)o3bSSF^ z)(^ITXi}bR&-|b7)6^ed-v#gwcWM?b;-@29@v%BLCSW|&{Y7OLRo$7YwPz~g@dBpd zXLYZOlLh~={*MYqckgNJR^BbIdwIe9{=LfonGk=b9NfK|zq4;&lh}he_iVqz(hO() zlGQT(iyJHsx&;2)Yb@`Ej1P&cKR(p!-`->yK6kDVhRYPtZ`ZyL(fGenjunpGh!9}@ z=UWjd54#odqps)t{bt0XMasPhzHreZv?H_&x|8tA7cBHU5NIgu2PNPW(7A}QvshM!T7{#?wl2zpKa7l3Q?Ab7EOa2q_%BZ zNBeN&!)3ZJGe7zJjc1haKPVq;##_p@PTU6|Pv!Q>W2f%bYSndYKPGdmrqIFGK7GH+ ze`3H2zhe9OdyWq~67VYj^yzqK znNJI!);?W*`uhy?sqmTNGv8;W&t{)jeBSjr}ZZ{+;~$ z_z&^l>VM4tw*Mai@d2p;IRPC5dIuB-j0%_-Fgsvrz=nVq1KteS7jQA)M!>IumcWd_ zlE8|sXAZP`M$1q-C#UqYpk1A zH@9x*x_#>otvjY}P2G8QSJZvF?$)~R)ZJhAMBTG>FV($O_m3bN-|*k zuV5+IH@HD?qu|8gjNrDx-Gd8*OM|O|rw12P#WqNibFP`Nuimc?LvEm4hkI^IzDtp z=u@FLu*4f!$3o+VZ33cVTs{s!z+e&4W|tk4UfXza1|yo zJS)6Ic(3r{@X_Iu!{>#s4Bs67ZTQWIfC#+j8Icr`8PP7HN5sO2H4$4Pwncm$aXsRf zh)0pGk@%!@WYfr$$n3}tk-Z`ZN0vucN6w1;B=XD1tC2rN{uL!f`9{@`ij6WywTN06 zwL0qAsMn%)MjeVe8QmR!s-08Tl@?1>wLF^x@)(;MeC?$Wql z;}MO=HJ;XZVdK?}pKbhFrD^}B z%bRX$`f}5^n;vZXanmoFUTb={>4SJV-Y-5hJ}y2XzGZxVd^a2?8y;U7|6%;+&D@$9 zn{{Z`yIFCwQOzbbo6~H0vrWxjHcG~(##CdDv7@oKvDi4uIMMi~ai8(H@r?1J@rLo9 z(PnZp1)9Q5O-#wAEK_?^Pg9Yp%rwC?)3n62-t>a$4bzXN`)0xHZ4NPaG50f<9$lyxc3r)*EzlX5iWRLaGa zYbigc#-y54Tc);2?VdU$bxdka>ipDIsn4cs?w&XElS&;b|UR;+NHFc zX@91R=|1Tp=`rc1^z`(+^e*ZB(o52Jq#sECDE(ae<@8(Wzqb%tc(th4BC5rh7L!}d zZLz$?rWP-^c)P_9Eqz-iwXA9RO3NKB548NK<++xZTi$Bdy?%jG&CjjQEVyjGT;)8ND-VGUjEh$ap$qYsNbn`!h~toXxnD zaVz8ZOd-=NvtDLYX0y!ZnbyosnaeUaX1zVhmNR~%dP*zG-m#ltSC0S#$ zYO>~Kt;l*hYirg!S)XQI$hwwwH|s%mOtvXIJv%SEAbVi;i0pCM)3O(4ug-oxdwcet z?4#MIvcJmyKKtkFhdC}e{y7bD8s#MBWaNy^nUb?0=cAl+IhS*8<@{xptiIL;)<)Ju zYlgM0wY#;@T57GbPPZhZp-z|4a)79Tao*E?(W7k)(`UKe82qA z{J8wW{E_+N^JnBA$iI?*C;!hjVjG_}A#GyXnA-GgQ`Dxc&4e~H+bnLguFdmpwzt{S z=2)B4ZN6@Ez0EIe9<_CC8_>2v+eU4Z+Ge(G*S1I7WorGn;d)2cj=ml1bu@NN>6p>6d&h|#XLsD!@m$9TokBXLcWT{f zP^USaUhlN0)3MI9vqxuZ=bFw7IIM5-_-r(?r(J8+x>X=Gd-jpzCG&qi0v`BM|qFx99M}Y3q9WG zv9HHZJtKQsd(P>(x98!WS9^K&YSpWx*QQBny>-}->FZytOjD1r2Wb|p*XJ(%_`dsZ>uWw1;XZvpLd$I2ieSho6^>ghP(64^K z*nZ}IE&8?Y*R@~&e#85X>GwjvZT)Wc59@F2pVq%)|C;`@`!DUkq5tOt>I{e zEZkjqu<*}8ra`HLtb^JQnlxy~pi4zzMfpY3i{=--Ty&`D-e5A=eQ@2unS)CQuO7T* z@au#36w_j#VpDO4;?c#Ei?0Vq7IpXq&A4dFKTCX&^ba3gY z(($EJOZSwXDZN;Fqx9a$mLqdVb{N@fs3}* zR$8{P?DKMu^1kIO%TJb{FTYZLv;6+3CZm!^WsPb-s^_SpQDvj5N4+`fqtWtc^XLJi zH;;a4^o7y4#)ORNFs5|Ox-r+r*v57myK(HNV=q^DS7cTUtaz$oRmJv-ofZ2lKBzcd zaiQW$#jT3pDr}W5mA;k1m2E1EDwkCruDm?XcU=E*RpX9V1y;4LDy({{YE{*ysu!xZ zRqd#Huj**k$*Qwe7ptyS-LCqr>d|;dsGjs9#%c3dSdm=>P6M7s-LfZr}{|s=hauM zf1M~!44fD}F>&I+i6bY@oVa=7s}qk;{9@w$Np&WrP3kgf@uZI?eKG0Uq@O2qlf5Q~ zOpct~cyi|CPLqdB-ZJ^y$-mS{HPJOWHSKD;)%2|yTvJ+8Q8TUPshSNn&(*w9v#aJn z%?CB7YR=bOt+_izm{Mm-#FY3c&8PI3QZZ%8lr>W}PkCv|_9>rCxjp62snXQCQyWgr zm|8vcov8<=emwR3)T`5kY2njaPHQ`@-?UMG`}fkcuctSdK4$v987?zg&zLe}(~OHV zlV|pwxpd~PncvUyofST-=d8K2_RjiowlF(pcK6v+XV0CzYxaTJXJ=oT{a{X`Ij!dO zoilpQoH@_UIXLIy+_<@&<`&LfKlk>$ka>~w8qdp^S2VAB-t>7N&ySt|!u-ASznFh# zf%}4p1uYkJTTs4W@q*VE99{7Bf_n?y76vagFKoTAU}4F^%7xPxE?&4{;kJbb7Jjzy z`$c^hy|(DYQ%#>*{M3!bfs6AN7c4Gaymj%x#osMyvZQLsf+cI0Y+JHpspr!EOJ^=! zvUJ1JmzKW2^u*HhORp~dWvOkM`?3bhnl5X#tjn_g%c_^XuB^*)tyZ>P*?DE}l|?H{S5~g9SvhCrl9g*$KD+Xjm2a=yxAN%9PgZ`h^4iLK ztAte^t0GrfSB+RTebtgxn^tXKb!gSa)xv7u)yCD`SC_1wv3l$3ovTl;{&w~4)xWK_ zt#MydZ%yo)#5FzFOk6W>&8jt9*1WRjtu=er99nZ?&6zb9)_k|-$2GsK`D?AP)_rZz z+L*P8YdftSv3By>#cMaOePivuwI8hgeC?&Rx7Pl#PF&}^E_hw!x+d!q*R@=ix31H= zUh77zo4juRy4Co1YQ5L`_Uq@a|7=6dhSCksZuoLz=*I3FarIS^rd`{Iga1H99J zC4z9BN!MrHUr1!;*BeG1wnaR8D7gv`p=Xf*${*hruax-N_Wmz`cC_tbfc-Zg{xXUG zClHzwAMttOBeW$PvpY=YKLlwv{~toR?IzD)I`YMvNB;=%2#Z0SJQA*$%&q~~73Die zT$uSEKz>4)q@-_#~lpe!Qtx0mU0lMc~^ zbwFMIr+_oo9T?QkmySc9xP-a@SQvi=_WuNPY~ZvQ7!2q12PnKb4nlIH&a zp@JVt{8tc(cu#`Ar_a#i;~$aMbTb+9IPjNj$M|vhght&Buz`ud9^fhb>r5OCX^0rHah z-ncLOPq3TR=hvaHF;fThd$?;**8e;3yeKRxKxBYz;>5A$=tR-6&$IyNnCH+IT}c0 z2KMp^Ikrc3yWSLV+T7t@i#GZH6P5uVgMY+{GOcA$I}QzJ{n7TV3Zx#l2laCR>Z{ms zTS+x1@sYNl>;T$j+3o*mz7Kr;NDTKraDPDD6_eR(0p{MfN%X&hBZ&7T_;2Y;Nn_yv zF+C3a2-{)4)b`rHf+jYciF^#I(581l!~X#YUlWM||1-ws9TK9L%nlIaV2(#Q{_jBI zrVO*S58P(0d&P>~Wz%d$$_I-gExb3!I6!Qh*t(gYZw4LE^q85Pk{fD zR``m9J`Vg2^xc00Nwz!uV?ciafAbaS`!(RG(gyYT7i@d}7a(j0e-FSs?T+(H4gL{6 zAZ{q1$m>nm={@-8A?^PaypES8GBGX~7?ICvl<}Wn2f_{^&X1bO>>6;{m>)FYC)@tA z+qrDLoyEZ!u_wmW;{9yus={!3aKLSh~VtYsem3c6toJqFyfIM@6J=^~`qK4E9y z6}?O!63A-+8GRqW1#S&!0oKB`wrlLgO$Q7>_&pVbNZS{}A%qzL?I91v!k@|WKR}jW zOmdNj9|PfI)ckB)h$?x!Q z3h05d+#xB#pRj|b4Cnyc$BceL9EoILryrPrR+W(AsuR=wsU_#Gw42;N2qDMrb#seyF3O zBPg*Q(97(gi%Eez&5X8v!(Rlyc!+dx$d3%y1ri}l0NsN~1l?%+nob68$jw4ev@eUR z=^vPWfZ=B{u>yAdI(d}gQ0nbM*f&Z;_*XF3j=`Ap(ZChvY1@1JR1$0lVW;gQKGya< z{|UnEa0~Xe8oXpXja!3mxc|ref-uLs@q2CG@g=awlL&qqg7m;Th@QeViCG3nQtp115FW!fVy6`g)J{%^aD?qq}Ib5ZqKTLlI9hqEfrz4{m zD>nnw(@rbJWO<`q(DrV8h;0`?7Cg&D=qOua?tT+}au4!2Ns{q4Q8fP^=)K>T#~(p? z7J~=HoALZX=$TnLeQa;>+fXJutVVsN*^Vpi^(N+Iw%*J^UZ0Z?*h8oVaYtj`_zB}@ z1LC58DeceNll7CCYFhyRFH9z5X%zVe`PGsy?D^Tvt+q2tUUnYao<|Mlr!Q@1g>Qj- zEA%;r9``lUkXuPw@I7qT z`98MuXcxi{z_^@;m&nGG6!bk`eje75y(A9t8fx+I)i}tU13*hPUX&K^2X33~3&8h) zCjdx~akZD^0Rn;R0Zan(AxtBnCxE>J>;;Gc*_Yeya4kI;6uPkz)fx&wj#FKE&^EDY;b$QyaQn6Wd4`cI3xh}p8+gQ z3Lp;<2QUEY0zv?(fcAjKfM`Glpd-KtU~wA&A_19z0zd+wDS7YF&or3iX%MHG2AvrK zdwcE(zNGdvzM+y0a|&>VK=%@Y@!lI|Q^Mm;?kWCDe5n)ud;!K|0sK#r&NzYCnZ@It zwk_fA+1^ob^uTvtmXp?8e|)hC{y41|!)-#@Hrcjwvurm2Z*ZeYQ*N|v8}}Az&b?_n z#;pad)}rlZp$xNZM}+Ih>z?g*(7BmnpNTqafZZGscVw-i)gay#4t{`=!4`7bQTv`WT zH93nqBOLN#BILzJ^bzLnyXXs`Ip)hGMsL25q-)S#Gb3OI1L^?M08|G)ur~y-G!eoJ z7?;Ov^977qW$ea)rZ3u#3M~=N#_(S3@k}E*B3_c@dlFn!BX|G+W40%056A|z1+)OP z!~AH5$>K0zaacGDtH*%*3G-7=GF*cmFvkLz*<3RnZt8)!KVe)RBCYtkn3H5;W_Xz#+6AZhCTFuzv!0A9ftfChGxj0bU0nJ;$kl`z~ramX-kvf6WOTuJV%_0K#yK zh;Xf8pATpRmgaIfb@7HmfQw>0JsDYEofW!8inqFxK6Y^<=^0WF^0hV)>&>7Ff zIxrApythJUR%Si0y6E8>xb?v3=>Tpx@btkPWwQOsCD~Xz5V{mRC)=xI;pG1ir_ zjd9F)DmIRpoR4vfm#MHG9=C}&d>>|ucyJK=(btt0V#t&~c>_l3IKhBZ>V%(JsvYR<1woYVwh<6D`=Og^sB#kH4j?Ac^L?|nuX(RIGeK!$~kkk`z-(h z@QV_`q;8+0tt2>Pb_0!g;=W2Mso|z@i@9aoGu(E3UH2rug!3c5ix-0TC7SXHd@|pQ zU&im{-^bbVuLUZ22;PF95F$hgaYDRc5>kW}!pp*5VLuI~k+eC@rUPgZ9YHJUVQLfo z#Za-K*euL7%sZ@ZSZG*ySaew9ux4S&VQFFcVO_)egbfQT51SY^D{OJt^03umo5KDu zxEp*7frem1m?6RtV=x*L49yKWhAxIth6#pwhGz`V8D2EJY}jUa)9{XAw_#tne|Vkn zi13*3#^Led-NO5auZ`d%qzLZ_zlgwy;D|7sw{0CUFrqm6ndrBo-;LfEeIWW+^oOxG zUR?MWzEKS-Fgh6UMbGABvqFc>-0PsjVeSmxa=eZ6_F?$0l2N0>F8)3KDE|cx@=KtD zFX#{{#3*z~bkKp|9$OSmqd9aC9Ztv4`ShshBL<66VtklOm`7MZSp6_VSX5Y}u=uc~ zu;yV|VeP_thxHFD4I3XeHSDRdWeOcO8)VSI&k$s&Z!joyFdI@eI#d{@f(}~@FMtlO z7~U|vZP;np>!3p;(4lL1pYSE1g9tkKf)4c@bQm1HIr`1$9npKE_v4<|hq2dRT<{lX zv&oC4xrB&ptP@*P(Vdx(7O`LbAHJeA%7%wDoPX4nx=?&+R`^}`MYxOCBs0-#LiixW z7!UZv8T0?G?Yp-whq5%+dII_?wg%VMUpsOw>FV8U{jcu9zeQIue_pj+qfXpcFJArT z>WQlx;eYhXl`G#8a^)Cc2LN;6l`U6RU#Yy(0~2ctdzwoDm;5e1havH+GD;xIV2p%8 zFOEN9pfCu(gM@Lycwx3MSNKr)NI0#g6iy3Y2ww`fdvLKkA0xb<$?(S?M|HC3_s{S=FYb--Z|(XugOCj9YP61ODt!+N%66 zm2#zaQfuJ*P`WO)m-3LQjRoK%9lDy*-{5-m$XCLDYcQl2h~Dx*D@MBX)bQH zbR-3&m<+}Hs};)Kmgg{UzlgPDAJ&Pluzp;|nsrO+C1psxrQf7Zaw)z^zlD2_dxd+G z`-uCP`<%PL-NZeYU$_U{Bi@y7!pHN?F#4=~d%l<-!jIrf`EgPY>5kM>dQVy=hi zgSFB&=_lz2dARf=og$5t-j{|+H{~+vwzOAjD#gpi(sAjAlqr`;P3TmqOiGoKq~=mv zyf%sZSR|PEk|4b96pnj2@puz2l?=e`onE95i6v9XVlth~Bu|qC(%WPs`3Sthaq=O# zLZ0WdxwW{JvxM7>uZ(ZP{P`kxfO`vb$9vpW?rZKF?h^MZ?}G2ux$z!+EblM9!$tqPt zj~T|@<$flm;IPZM-^fVrSA3oCJ{}4Gi;U-Nq?+f+1fF&N$-GF`f-j!IyW`6Y4agS0 zF?k952wNfNzs#G+c0Psd;9HV+@b1i8d>Yx0ZwkDRy^QzxT=FGfM9xANa}>JN^We`u zz<+)N9`-6eLpFr;5&43)Tl&?ol@;$(VG=Y|G1R2f!fpxuxmmu*j zCdc?rqyzUE$>%;HCEzMI@KMCdodAdVG^r2G-XSFnbQax8U#73p*XTC-B7KRzPM6WebOYT&r(yihpfl+l%mNGOLb`}PMVHczbQ5k} zJx!mX&(i1V3-meq3f)fM5F^A$tQgU_fz?oKA~qG{#b%;eY$>)9GjSs;OUxE?#XQl9 zyIGyZE@C6GvDj6N5!;Gw#P(tbv7^{p%ojU}38GPKA?DDx#BTI$v4FlKcBebU9(0Ll zqCbl(=r7_*I$MmT?}|O?PO%r=CHAJf#XfY8*q81V`_X-3fBK#{fW9vdr2EA}d5OG+ z9u$k{A#pH0EEdxv;t;HEL+LTGgdP`%(GSGo^h0q3Jt3CTkHs>2QY@#R&`-tD^prS8 z97|7&74(c)Nk0?E(a*&yaTGl(j;H6u3G@rGnw}RY(l5nH^ny5uf-|!qBxa) zBTl2=iqq*OaR$9C&ZOUov*;CZHoYp&q1VK@^m}n0y)MqDH^c?>2XP_&QCviCicis7 z;$nJRTte@NOX*MIGJ02BP7jEK=tts6+-_S%e-&3lI(&&V;$DXYxE+$;QAk`&V%`DC z`3&jCeF^E}9O=tlCZo9D@k-O5q>_6`Ch`KlpF+tLUM8FQIPwhN5Zr4dS;t3^SD^{o z#wU@Tdbv5_C+ zx-4BIZ}QD|a<*C9slufAlOGtDOI@*k;p)9+=SUn}sz1KtiSMhcb^$UOduxlur=V67 z%`TE)NP?=r1nRN3DOemA^b$KBSDoD*y!vS^j)%_f$r;c))U;kW4;7`^@%1L5r)Kvh z2BB25*MohbY6oxbA-t;Dsk6*nFm!f1Av2bfQDg#S$YEGxOR&bWH(ZUxgntIo4L-#% z+ap#P!p6ci2LB3`c%5J?$GTihiWGMysf1YqzcGku0Ie9l3g90LUbq?l4Mi?2MkN`9 zb+HIBN5Z!a+@%O9Mpz+M`%?Tidt#mqpXh7A`_AK$mX#|DI7^{p$yabOtVJXRc^Q>| zX~5o&WRkQe;%WL{@I09cf6v=cEBEdS&Bmf6jE3wxdG^vg3EzJ!Lv30aG-{Or_c%~_ z1X|KgbCu#%SpBMyW3>{d#;{X99`qUmO0!lTrnFeDQbyJXy23UDG^|qMus)#1P$^oB zny|hw82**84_4}EKzy~obOi<4A*>_Xp2dak#eun<(k6BcO%V1tg-j?f1GWD>DPMbO z3Q_Aq;A1^z5Pn%XtKeqkFu;%Hn+e?`vsa)G8Xlw0So99o^G6|cEOKP6R0@;z;Gv*Q zN2G7}|0&Ir+V;QolqaRp_v0R@pM8}69Tyla+r76EY#T6spYR6_0U=T31CHkej&dTT zcA0Y_$MCfTH_n~&;5<1maC+Y4HO`0g<@`8*@OuGd8@?ya?$^f_N29x!rUvEp{)3b^iE53VQIi|ftx z!M@`VP=>uKbc*Yb?@SNm3b{dC5gE!2R=%8mh8xP2aKpIa+z76e8_AV%<=iN4G&hDD zOO|pKxvh|LUIka*0$lwyXc@M1Z$RpKi+h`U zhuZ`BIJ*6A%R@xzJng)DtC?hp1aQ7;C_I1=O%XxnvFYn ztsN2pB&~bguiS6keeQSe5AILyFGyYwxksE0?=NvY&kH<-UPdUb%c8-=8Ov@_mwSjVsDH}D(r zrNyWD&HOW1GrK@Sdlua17JPr|dHx0dMgAr5p)d1Wv8!CozskSHZ{uIb7na}P-{jxo z-{#-pcku7xB+WB8u`!w7&F_JB@C~dLx3Pv4@cW?4dY|8qS0fHW``(>D%pbu?x~u## z@_;|if53mppWr_NkN7b(_b2&J_)qy${AvCS{~2DlsNp}yj>S~m0GY;r0Y3OV|0REc z|BC;bzsP^Xf6HIOD-_@HSNN;^HU4`@(!KfX_~O?O{Ev{S`+{e@34Zt%Uf8^Yw<_-9 zyktNA7jVG$@P6fQ{C)m+d{gsJ{xALk|B!#g+n{aZ1YQuJeH5X0lLZ&SRd5sBp^Nks zyr75kfhNvR@W+c6fkGXjt`H>D6M~_et1pBKVR!|@fDgt-KvNebL_=E_3(aLiyo}LU zXd*O)?yi|&gdWq3$K5S>Eh9-thE6k8XfC7)=|T&krO*m5Xk-dmLbi~D7pZcEJfXFa zFSNm{8tsJkLI7=-GlK$T3nV6Uv2AWIs6|j26ZSV}%N#656IJ=$j@8)xtz!k}z4Q5vB-J zg=u)bV}>wOm<3JL9O$Cv3G;;o!a}_0@szMwSRyPHmI=$Dg&j`=r<&Wot=Yh*}zib!ZG2v@By@8C!i1eSU4$sB77>Gf=29& z@R{(ra8@`6-Pn0($1Vt83115rg>Qs!g-gO^;XC1qa1}bU?}h8a4dDmjN8zS$OSmoE zffntq@H2FX_k>@C--P?nC;lP)iTCgy2oHrvf{hZ&QJxBvQjtnjhSt%Qx>0xPK|S%d zm^byIzSNKU(*PQXw`c3pAX*O^=@43xmpwY|6n<;H+ zJKCOhpdD!^+L?BtU1>MGqtc!Bpgn0X+MD*FeQ7`1A3E`Yv=I8>B088B(;;*yEuq7p z9UehT=}1~e%jqaO8oJ`Kv;vy*akPq#rxR#3ok%Cq$lD>?+GZ?NkT z7SkorB`l-M=?c1%uA-~y8oHLQqwAr0U>b&}p<{Rk8ip;=tuNp zdXmZb^b|dfmt#JopVPDS9Q}fxr(eXgCf~RdXN4}f1~%IY1>49r+?5t>0k5#eMlc+H-X?q8eSAcDvF{c z%A$+tD!Pg8qKD`ydWqi9vipjD*mDRF1I0RGT`@?k2fcfUSRcC(VPXT(Acl((Vx$-) zMvF0GtfE_K1kH(EzhV?k(6J=o&6`9q3E%!q5mUwHVw#u^9ZE}RUNWG2$%5u32YQ!W zXkVC)r44j0?KGWBCq)<2RqQ4fh~32=cr~Y&*jwx)_7(ey{lx*|K(SC9Bo^TCq6H}AigNRB)%+e6<@)7KCg+}#MhyFenWgyd`o;=d`H|NzKd6Wc8R;iJ>p(* zAGFf%LoanliT8j$6;Fw$#WUh(;^)v{pA)|j z&qKby0A2Ri;zjWr@mui{wA$Z^SH!F0HSv4#x_CqULHrSV?pxw*@s9WtUKILS{6)Mc z{wn?^-WPut{}BHa{}LaF55-5KO(GH}@sc1>NyPVXWywWymE0tE$wTs#yd-bQNAi{Y zB!4MD3Y6+db)_Jwo)j#FNcE*qDGVbg@!y28uEN-z}rGs-d^fJ z)`K?cE?^L;2hDN_sgJjjx=3B6Zc>5N9h&Q&(0=z;bn5-2{?Y(xpj0Rg zl8U6kQn55d8j4qxhDpPv5mG7i*kw|=Gzyv&rcbGmDy4B!l{8+OAXQ5frAg9csRr*Y zO_ioe)1?{GOlg)hTbd)ymFD3MrUlYMX%RFti=mrY3O)I9XlGVJ^Ril618w;_MI*Bj zx|ye?&15gR2kp$Wk@)mg$TAa6ukMs_94Bo|_!7lPL z*-GBSzWWjECBH*8 zu8~>N_t??6K~_mWNIyz9@qYUq@)Ow!Npmr@{|(4Wyv?~B`xS-cIq4S8dThWB!X2`X ztR>G&Kan-i1Ra&`DtfJZ(y!RRxG()K{UQA+{Utq+9!ifSn~c3=nS+j4fR(_2p1GOl}|>O) z+)XZ!yURV~o^mf}!}~xh-Va*v0nmyULLXiPy?8M+;zQ*UXvv2|GhPa6vYIV?ej6#@(c)+Ut>9*R-IdfPYqsK#@Ju;ht4O|Da4ElHSn1$m_cpbW zqZDcqQ-V@g5Ib3Fr!=6{&OvOWDItrtLp9X0I-+W&NYHY(sQtr~ohfxtQFPFuuq3Lf zElPW!_DO=ZY^X}5>?|!TMe69NrpcP4HD!*LQI6K6IU0%_wajLYN-?Lt(ocG zacpVf*b-guw`iCxYDYGkv!yO7VY=uDlc?3gq?J0+-WBXQSf#Eyq)AHUGx4mITAidM z_pXmMs@bFwEJ;I|q@haE{8QBenNo6TH*`U%o31!&T%*~fkts>5M3Pl1aI}rll#`$| zof%_887o%1nIslCX|47ylQmZ>h}BMe4XM@YS@3sSW84+!X`P%Y7pUD>EMOCjRG@Tb zHRI$IsfR)y_a06%xb_%4tawcE*kNO(9z(|zjw^QWQB?0-tu+!f zlI5mIy%qFsy&oILsb-&iC1gOG_|o#C(hlu%q|ErSV~r;FOvPWbD@0T59tx#0tvW|m zlHOs|JIs2A#o=J{xZ?21bXLg`ido$ml}+*b5Pe>mDf$q#+^l@)>1rvwGVLVPM^wYy zGZl*I1DvG=2F;kll9!jY z79qWztB|fJS!#2*TOTKER;{MdN};V%y7VS}`Ak|Vv_(r7ElaJjl&knjd5Ynl=j@_b z!Pt7N`1|NqGY1Z%$*fk`+qtee05|o!+GaB2CRZr4b0YtX#V4b&UOw6px3Cbt)gmrZ7J1?=t%}9j+1PTbM03HK zs*9hU-?ON*oE?w;UlRYqEw@TfvkNH)R=9tnTVsrca<2PwJtDtBadr z_tC9ziiekDnbYDrNg(x7y?Qx`?xR}+)#SaNK+Y8Xw3n-PF?V%^R1&FuFV{KW81cyw zeTY{4-fI5p;;Gr4bBnigHPxj})y74kgVDeema8tzDzgoy-K4n{1_W+}uf+J#*7Hn_ z&&;$-I|`EyJgI8BOoea45ZCZz+D(n2F($}`8uL-8NjHT~>87w)p{I(C!>|m%M&S(WODiuLNlcZv$ep0b6mPw11rByduD|WV4ylkzy*=lvo#zePbM}8Vb zv>ImFYlz3F^=y<$LupEsi))E9O4demqLSWdPE}YROy9ZEP^E!SoMMeu6jQEyNo^chDiWn(j&??SXr(vjx(-wLscv1`s`au<2iaQrj9L7! z;qox8YQr=EXPAR0M2AdvA6`2uBuHgSQungLQRQPR#*~jLDVEA~XevQW zN9$`=lV|zgxp4H?a((wn)KVwf8#>Fq{BIJEhS{R_b+b7~8l%#8jE*pgS}jaksT1wJ z#GXU0G*&mvl9b9r;;~C2$?jtxYhANRBUqA#GD$;~lq!~%mkq_11Cw(qbcIl3VCL3{ zld6r5B&`Zbxl*O0Ww1Ue@(rSEEn&5r$zr9G(rPEe$kB>nwNqY0YR&bm{5z%Dz|>PZ z8L2dRr&5u3Djj_r>q)9qrS`ijClOq$>@&GkrK|z&6P$r+KTgpaJ2z39phQuXA)0Pd&s5n8b=}BPxgpJA(nZTs z82~NB$>*?{U5VyX=&X`1U8XZCCV5pfQjuip^U6%sr*X1HY#~rWybA3k)JIgq+zXux ztA^WIT42x|+Pa~p*A@@O;ijx0iq+e>m?&=dLMJyS7Zz)2)m27uNQ2dQ>XKr&Gi{j~ zSCJ`=`g$9k1ZS&_ibciju0!muu0kqCbt%$eG-*O+@e_%j<;(&?kDkui`ZmpWQVG$V z4F!^^4zJ=`ME7^vYa$zYoQV% z4N;9!#c)^G3eB#}C5oMO3ASn|4p+8xIJ~i5ICDp9=zC#;T736XWfoPE$mMD~Nh$_c zHft#X?&{R#z-u%mIcdu#F-Hg%I%kex$ep!jttFl)6sbj;chPhWh-dBtHUxt=Py`VM5(*UPG}idC(OU#;oXffEI^ z6G5F=9U+)N?KssbRta%a=2^w+u1>c41X^FHQp45RSF!u(reMXx%P|jYah)WPCa7K$ zoJ9B0P10)e2~QxWCYGtR&DChDPT@)-Ex=x1rou^Z_6@8>TJfvZ{MFfAvpf5+w{yDJ zVNF#L3Ec*i$U}xH0rC)aFi_0>MXvUlA2w~?FLG06BsS}7RyOC`t!P}k6{zi2R7$a` zbA6Flt(jhn#O8Us6&=BDb>e0-yxkW~tXS3Ay~sm1x7(wzlDOLEb-Sm%OzNCo8PKq^ML@H%CBSZVHZhz2?Y{QbQ>XqS58cFHp+z1^zh=$Pj180-{Lr+CGeNjzFICiK8chp-KKoRO5o7=uObSYS$v$Bt!o zSCu7$&Hr)cObNA@-fNhC8rQ0=bTf}(&N)XTl9?64!y$#ip>_qPO+t>^oM!j54?DCh z3m1nCX9+a%OtCsfj;ku9!IQE`UOFL-`Hf()6>72-L9?>;v&dU7vazU`gNj`3%Q0;F zKC3RpMY6gOYsFO1sL0tOZ1+`aWM6=b=txJ1g|#PzBDBa=74sBZ?QEFNO+&;Kb9O5$ zumnj@^TB`vXJ8Lhx^Yu392jzKdh zfM#KR-lP1nW@f^pmJkbu6EoXgK#?A6WY!~G6p>O(gVNZOV*%F{!9KtcfhAIVj+No} zsU>7;VJMywO%pX8DH5G16YYh=2vXWh6+02tODBNB=~`~5tD39DSr&`EET}f~6&a&d zL`UJrrGm+C%r%<*uwm({3ayH*c9SPM$!f9}3**{O3h*7eatETw8y7)lKbV<+thodjj9WD%{zkE@-Hgv~zPr~{3$kVRg#7)U#MMgR{T z^QdK@%#f~j#?kJ{3gDtKjdnk0-5JAZ_qDeJx}>wH%9QT&7^A49P}xLS?M$MEhp~vT zI_51GjXgvSYxl5ZRt!3h{Z!${)y^9hdDY?!i#&9EA!6AF7ah-1PGBkRY+;dCEvB%@ zL&p+orDF`CW@YRk(%SKhP;vX$<_R5fAoJHsqv`;hIN)aF z(8p(l(7Rb_|;-B zl?YxA9#e6G#k5EEc5<64YGoZ|(!W|aS4T`Q2h*pbbZ~x})7~WPwRp8gzJG1jQi;Nv7)|J?zOSCi zbi_b8*;J-;D;%bliG5Pj2RjgI893V0P2oD#s7}^Xb35j74YPd?SDdbl6IE>fwb@ZM zu{w+#`MNR=(GddOzGG~=G8RG!@p3SXnzL5BDkV25tfL-}vu7z2sm0MV-BnJ~5m#d; z9d4AtQ93UNW2pqYjgD-JIQ1K>cXaRE-Z$_hB#s(MLJ0;XZA<#x2G zYo$HJ%fTb4`8pT{2VPa-q~h_f%`!OSC~7A)j<241aKym6?;xa?gN@J!JLn2Uyvp|J zLmiY<=O~4>(1$zvn;Nb#8TxQX)dL@AHyp7voJ@HfLkXsOlFwpNH{2}R;ZlpX8*4FZ zPt;IL1+gTQ~R$jBZ4P-HEwWX(TW!>{dGTT<iEu5wRqIje z5l^EfSF3-nmR>thY01@EB3H{lS4*F(rccyHT%tD8615SKXz%gr?yu3Jp4&tVsrVAj zR%LR)2vl|@v+}xV?yTBw^JC%A`LR=*SzTMJ@l#W3yE8MN=+16kpltVGhES#p&7p3V zXbvnvI0dRYw9}ND13a)J#N<4N#O48ANJ^&8q1)PH(||5Sf7T8IT^|Cj#F3BDs&jw} z&Jc69-l5NwsfL^g^kuW3j8jIXb_!3eoc>UlMR)KNT~1G`9DPBxO(qpVj=EK;IrP-Y z(U;AtN1z@4QqyRMv{Z-gU>EC@y87hmP@|jaLYOiJ)m8_xdWzg=QO{Pu)H=4hQ*N}V z=OK)iRC|1_!zXA{pLR0bqMetpXvgL)+JTb)hr9QH*P^)o|7Z8v-3zxjKoqZ_h}aPB zy@)6_5U^J?MvaPq6~$2Ov1^Q)#NNBumDpPp5wRPhq6QIBu^}RgA_^+c|9#HPmgl+m z0_K-*`|rMHcJ|DfGyTkGXJ&Vsn_P!zaw@j3>&SLvH}ScS(${qqyYU2ieDC<1TnB7& zDzn*j*8^{K$_id`DV9=q}lGY@7?S+Y&37`;_K(~)6d1z zKOU0fdzYX7F8%#oxc)93{at?S1~62-3vV}&pKhNb16_*j-Y-6jy|p!O|jRikrN48v75Gglp1xT=Qcs$ie1YI?3Z(s1o> z(>(H+F-L2f)gfsXhfA|KZJMo1(yV-vX63VKR;Nv~GHRODrR99ggrmo59O{rb#Npx) zr;Wq9Bo5`1IF!%Ep-vlzGHM*+vgOjxVx-<~MDFb#+IkOk&lhk-dagcF2U$qeqQb_Zmh1qIU;vJ52pbQ!yP|XRADfh0Rf;M;&T~Rq5?m z?Nbs_wcH;yip>R%p~ewXmday?k7et0%uuDbsdwq2M;tbRbn_mhEoeI*!kUUJ@NKs% z8+EjJ+nkL$CUqZvA{(fWQF`rR6W9+k>S)>L;F408kkZ(cjShMkyjeCSrEKj-oiJkb zaGAKRu&$9~j+e>W>O`alA2*^VA=topcbXt4tum#EaIJ=Z_Tjy;pG9uG z;^*42ovz{DBFf%&I)r=Mu6wi9e$bw_CI|Md7%_&u)JN06#}6NSVla|@)xqEiW5+mu zr&{d12X9bq7mPk)>~QC)NRp!#~v~KFqiJWOeX35NSnmIcCx6kuhUz7?UM%gija|L3${<6ruNb_ zj~-4Nv{~u1X>{}v$MC{_G;Y+0F~^K7VL!2?NQU>uKJn{J!;hwQk7M_MYe~JEc%xq) z{kdX#XWV@M$ zI`Gr#=Q=3%ldzIMu6Ek0srRd}X|wAkmGCih&^6seI^t=H;ItrZjc6cd`0ra+eZWqq|K zl~9>fXVzcq)cPkynf2G&EhZF1H&A_D+8eVsgRmu*F$h&=8czrF2Nj>*=+^p9Tab@dc*giW99_9%4IZ_CDR+%)qdHBZo?Ya1)An{vgZoa+ILB>WmS<~p|?Hk=>Orx8OX&khfZi13Z zwYznw-*~?uPM%0dl<7LUbo~)0g1vakv2Lx`vXP_M0CvpCQDgDUxYe^`F~R1kCQH^_ zI+eAlsHTiNR#`&tpP@H7H+xnResRbA;*R;n-Q-$`%GZ=-2)&C5{fh}rS%St{Oem0{ zu@`e#8C8<=VZ)CYJ>o=VC{6DxjvF<0{1GFDk7mp5h!blI?vyv!b?=>bR!!Z!?WVPR z=wouPfqQN{Xs5x$diCkoTUrX3q;Ic2)q=~jUR4ED3Ji{MM_)e9_-yACK$8>Y2;=TmRx|klEKL2vq z5cfu$KL4s1jC&|w!}j>n@=;Jm^HpKb{GQY2Yr@CjmM<~;e0B2_+^2H-<}|*7<(b>~ zhNj1Nt^S4mE?+kC_>$2_*dLok*x&J8UeBxYs*Uf}c*O3l$Cq_IZ+))`yRSD0dpmDC zdp4e<1c?zBljjP1BRGPw}tA zzTUqco*Ve9pvRX&pTd6He;UeUe=+VQ{PolGm*v*sKe^rcin*U#H@6k;ZF0L~@0mLa zdo*7$_xX+`CB`=^Pr!X5|BCeZ-X!Vg+mcA;dy;Qs|BL@mdb#)cGp)zh8`~M5FF1C^ zy*B?r_4o$k0PHP;Eun7}P&<5MaVT!Svxs}Afd6_0X9QgeO_=S_SFHoknbB} z^L<0?iNQqd+k-o>?+Wh1z9*Q3{ZQ}__9Of&+T-hnk6}L%{2lx0;2G>G!4%?pHh32I zbHVG_GXhGOZyCOi{Xy_0_BX*d*xv{ICx-75{(_wkBmN%TE-aOQ2#3@=-yd8XyL;FJ zd;M@rY`z+Z%~u1l`C=gUj^U2jJBO4Z|7_R`d!KM0?0v(1vG)rPz&P0UW5VBKj|<0PPY5SqA0M8EeMWd8_Qm0)*q4WwV_(T14m`dAcn$XT z;hos`g@40-Abbe>k&yiIHNR=tFNHI(`CcDCh#D3RXpaMlHPlzg>}ZJ-JMvaAj^zgAqnbnUz z>gc2RPPUby-~A^p;Uq@BR2P}bCpVjM?2OZATr}erXtX+0+I~7Q&Q`fcv_F`B^;Ek( z3(iy8rRPTNTAc0AZ#Ol2=9YQy_=kHR20i=(y(N4Nxffq4KF~kB-E4m>-#cB#w@G`1 zLAxI9A8!9J@u=+f2jddSHYTW0MC$Bz-@-SEbNlua+wY1QhI?51{gfv3N$n?d%Jty( z=W|X}x7;JYJ^!=jtK&n=#e4Wf`kncy&=gZOGle?jOgLyb#Eq>Hrn!8EA zO=`b1D&GyArr!tsRKM~0CExU1O8=y#Jq{Y3eC;!g6FM81S*zk|5H``+O(eC3dL zkolhB>H5EjyXD(~d^hkBz6bbyw5()*+Tb>(N3;i;Jc@QR{rJ*i&uDM1`4UF>^2;*1?~nO6yz?-B!kmw}0COSc&zQep{))K>b1~);%%zyi zFqdPlz+8#B3Uf8)8qBqr>oC`2Zou4#xe0SKW+LV`%6?^c?k0`<`K-Jn8z@WW1he~iTOL`Da_ND$(Uy_Q!vkBredDMOv5~nc>(hx z<|WL_n15iVWB!SG9rFg}P0S3;Tl^chJ*E^>hAGEXU@9?Hm}*Q7rWR9&smFA{bi{PR ztcK}~Ssk+mrVD0GOao>uOjk@d%-WcBFx@fhVtQcK!}P?gkJ$jTA*L7R6wDtmr(#aS zoQ^pIb0+32%-NW8Fy~^ZU;at^2LD@r!>4|I>er`!ed^c$3x@jTf9r4f)UQwd`qZya z{qisRH+<@q|Ea&>Q?EYt>Qk@$r~3_`diAMSpL+GFSN|5wtr+Upr+$6vm;cJX;Zwi- z&-M+U`t_+_pZfKwUw;yY`t_+_pZev$+Hd&OuTTB@)GzDw?~r_l{V80> z-HBs4A$t(Vazgh+H}OYK{u|zx|B^;XC`Cd~Laz(gx^Qd^M^Dvdjp(vQ?i$f$jp(vQ z(;?b6|F38u<~NwbFo$D~z#NSkgBi=$bH{ zgKrJKGRAdd?7TPs4rNuNGJoR!b1lUNo^w6~EBaR*E*S3WOKux$t}thsq9gxH5rNzM zYnYE?I^(m+zaQUauleQqukrh-fc8Q5PTcva#gvx!NcyrRwKWQy%M*IH#I;gKCe%uK ze;q?CIlhu({%85?56M|7`Z7u~-dll~pq{)-wJ`6ca7az7&6!zOs6Ohop( zJbNZbemWFQt&n0#`Cn|>XvaT`W>CK`^ZY?u(#EO(xot}yxVA4(rTp^=ZuuLyxRZG7 zz0%ZA(>9;_aV4042X5>0nTwIK&;OwR4^IQH)MfKSt-C`~kpDa8^MW$quii;L(Hev~ z|8oAj{7lN>OX6Lgr0Zjq@F}@kypl4QuTk1E_$vRQ{j)Z5zj8@waY@R+>Ca3VAd7S? zkoHHa7#(fk{HL*ym=fQ&yxOu)>Q`E(s}(1UyOvTkx0DBMe_kxXwuk)ZiL3%SPTDWp zZZpZCyuQiXGRaU=r!CF&K6PbN<+Pym(sb-_Ix#~@1GnNT%(p2oy4MiW2g$Xz1a)Ob zM*Ww(a>22bQ&KV@|Dq!$7h7I>>%)WI$sVocH>Kql(&pU1q-ljxH)6hlx+a*p#S{rHG7e9KT>+zN|xl6{LVhoZ0h;u0=`D84+;Oc{zIPxE1 zX@7`)^D|;s=2`-$wrg70cjziT@{?nZ{Kqa=|3X#?e{E>>kP@KBP=dBqI6JwwfhbKk zPBQ{55FTr|`-M~QQyzSm6ljeM-b&@ilAWx@+=p>biIb`$NTQR3n#3hz%MVr>F2QTk zy7WlezNGpmNul^+7nEttEmxH)T-thF%UMcamiskhPVk{GHJYE5|CG{I?SuTcFtb$3 z2ZTTh95XTR^4AD{9&SqVujb#CUY-XVn<_%yz&VTBX~<85qe04wm~t`-a@QAI4=45W z{B800k-tGb;ExabPOZ4}-%}TF(Guhzr*bbXtX^Hy^Dh%an17JFkpJCrNYBi_VKq-& zZut+PWqPmhWe+=|NSo5pTKiPoUsB|phS1)}C?)-#5|zAhxY1H*QX@jqu~J;E9gb%n zx_kvXF%22#Mkw)El<`e8fy=x0x72^-u8gi~let*m*gUjkk7ZFhZ?yFNwUpvm)9|T} zEpu({NlB!9))jNR(S4buQfRhh(<+QVFv-z(rHq^LE z^U~`LI{cdgeIaA6;F~Vl+Eh-#IR6w^@gZf5Y}=x=wYk15x=E;LOF58R;`HKjo`{74 z?rgRF%Ba$&#?X*$mZA8zeZ;Y;o`+4^wk@T&pBIPClW+KJxk~A{K4Z(Tm|J;md4Phf zuV5tS(lHB^0g6m$t>DerFTP6b+78;_Wej>h=1s5Yq{32Con-yvF-z|9H*(IRS2pCI zPDAT6$P(6X-2n$@d}puu%eC#4Y7J{Gqib{orZq0fzn-5RBaZwuF#H-43hGQ|4@~|8 z(a){_XI1%#>(?S_o2q}uCbdgkJDA;ec;rJk|XPvxJzw|)ik=aCjp8alt{vny2z{adk%MX8bB#AKeSAUj>_JO74sw- zI}R_>9nQi<&r&2ZHyIa~gHh%)<|j|2ac|Hu6r4x@n8)0h$Z^;KXE)BZz#6mM2<9`A z7olPa!9Tz`v^~tX$kB8aiaYp8E57gLU)TEv?mB}m8k}zr{H#u>LVAhju(K&e7cZ2w z#6sj6=LVN6QKe?eAj=)Q z3sEO_Jc-NB#j0~Niuqj2lyr$?dQ6iMq^r=Ar#iXGAO#s0w8t+eR{9I}QW=lcEOpuy zRPKCahD@-qz4DBYur45$#jX{~Q&broi=ZvysjL%jEerHVJ-y%;jmx$PiTQic>YAby z7i-!n%`fs#XUjm!SxaA1x76XHC8SgOSVpgC3X!S3M0f?EYbmo(^MKb?s(P`_nCA;eKU5T_2Aa3WBTt;_sr~RXqKrLFX<)N+6TC{yljYF*roj4Sq zAU&y72^(v8+Lg55bl%Qs8Yqe!lUX#{W7~(MDSH&<^Zf!p)_}72)?L`kNZ%JJPl4aY z?9l7Rc(sr?Kydnu>+3UcIyY?SJze=Ty*rfGfcEPNQKLOvTRkH;&*>Zupu&3gk92bZ zx|ntI)8%>Cbm1%^Oc!EU-TAh1Nn4KfOp$df%>M?dHFA;`9Q~ppU_gXq~D;)WWM$j<|9P6FUY@7eTf!Yh>PcQ z=+Z`~=KrZ$_FYK@VTJcwG`e6QnPU;1I1k+^YjLGXO~x}i@1qf~u{zP&q7!5Df^EO7 zV=&t-^Uki1%vISE-x8gvk(MII24cCVxV6R2-Fs?FUR$gND#L%N_5VJ9@M|^RDr6__ z<BsVnXU8j%RD@L0P?@o?R`gGPlJ(=6iF8v!qG4)~Dv}pwv81*> zM*8@meSVUW7L)(iToZKlpG}cqreArqt$*6~S#cDur>>Am@-KQxjy6YObO)zsqIjJt z8RZ1`&> zPTd~#7@cE|?~^O((DD&P(Z>3MlOP-`JS3-TzGrm=-Cz&Z_*yy+&q8LNTaby4M%2K! zF5Eor>vQRu3vA8WvMU@p<2tutuop2x$xI`MMMMSKfmw6)(X^#?At9XfCFrIYDWMfq zkgc79z7U6Ht#lEZV-6$L`}wz#BF{bVlHz&!$&8L)F~-Rp!Y7>CLg9WE_fl4kUKbgR zsUK)8<${6<`5mLS8)8$5+Jr5nOW|=8>c-rXwZuiG>!; z(NVCOmgFnQ79IFt{yOnM|9+sOpVYJ9E)F+SS4zw!lpeFG{6H;@c1tjhIoTTX7&3&s( zT4rm9*5fq#mmr{sUQ~D=kpKYFEcft)9To*M%?dHCejY94rx}IuDxjMlJ=_O zFnqKJEyYCNFviLpr`9sEBsa+npK?mbk~o}unn-F@!rJ)Mw)04fbu^ZC>vX5`tig;} zD@Q^2m|yDohj={zj(VFu4eofvo&OQ@i^GWxtq8XyQX;X$dZBf`Y!AqC(2iYe&r)$~ zJr>cp1#`bgIWDElD0hx>Oe+#vrbhZ~=8$ks^NNG^_*MLDrkpC1w)!=7BJOg^Ydzsy z(P87z(unIVqdSFek2Ebx>z46JcqC0Rzh1Sks%ty5o#{>cTwpdaeV~-k!Yi}0&@SBO z?wVe<7JkZ>vvXj*WmXdtfkN!NS{cjmB25f$^2M|Tt&7$TIM76Y2})o?@7EZ zic4-K{#FmlhLKf{74?Of$8xqM%lSGT5#J$MX1p~Pn=eXcCG8-_|4EIf!jh2-xq{;; zMQrzEqV8GTXXg2AQ1Iyo$vFLvqp@q#x(E@wR)F7Qp8RX8{#=pBcX7t|E4sFt>lFp~ z5Ba&;aqZzhBs3$Ym0DTFxY)TPt%$uAm^m2H3h%29c%E6dkC=m^eS;!r36fE*HJj15 z1Rq&V=|qcj`~Sd}U+3q*GZhs06LVahOcUi@qb*eQK}Q|c8W&+Xo#25RkT8M zTKv55zQza&5Udy~7lXLtWJlAd~UJ(n_OEVmj~ zB_z9YHDrUV(%1uDN#8o?H7zsTf_g+h>l2LWKt8+SFW5kiP4JtZe*xDT8mfdGua8b_ zp}mzGOR@68_^z$1&ZAvoxll|)^s$;v>J3IJ+kF!M?l-&EN`s!3gpGw(miKt zyUpm}EbpqjY5zJdq-ks`tm=dBdG3|j?{`VB5x$1*2w3ok&u0WPN-w>)NXD4vHJVAE0Is%=sPLBj_V8e%hRFqEk>&aNiK1>xrjkUJJ$V&g8 zw~MvUe|L&3W|Ua9Rmw9tEyNzW&hi?RqF&9c(xUvEqJQP7Ek+aI*U!-L(qfX?8YigL zi$!yc0H3D)tyRV%qPDyi8mfqi+tznnsMbVx>S)LwaMc#lMwT<0)o5>chCAN)riaXD zOqAa61nrnBuIF_YQASVUdV?_TK&yWiyBWQn{FK&#V#>t!LCG7 zVdciY_R5%|Pqy^dpLoyVz5HE{eqYST={x2wHl+2a!YF4ww$6fL<((L zLawF!QdfeN=g1xSgjGWvQs**HCP#U)7n8M0p(|A|kj&J6f?j$Bo!hK?v1SqeTeEk5 zqVk9(dk*E?P;T;1(Tf(tqxv!bkVWW1cU;;kgp;yNW;oEQOY%o3)i9pUBt{vZ7V_*Q z>Es?gn$(@;i*2pjxv`#1sPcrUzfCrQoLA;v>cga!)^a9o?`P ztoWq*3!jyriG?}f*W*%EE(vKhz2)Y6Ay9a~U3{tOWoY~b$sWyDc@vZQKYV6_GiY1P zH_9BImT@dEd(~2~wV5Taz^$#I$iFpO5lhi+lBa~eG8s~{*&|a+*&34^qr@ z5Ru%2Sbi!Pw`2WZkTk{F;G_bg-hg*l&x(&&-`o2*ow4squlC7Ndxr34g<0Y!fL1Sak?ja-OFJjjfIrj zL(x@yQ*fose_3yZ2emSa z7S5)|fm^$39oe;6=bb(y2%(KR6m1=8k4ww9D2@%-8P$=NDsw1F8EBkKGVR%Col10{ z9`H(AlR1`dOpAGQZ$4;7Mw53b8@|ASYXLOr zk@DPMLQDQwM?%#P@JR3Zl=dk7S#}$85Zh9%qxyJ;OQ>=n|LOd-8iw)B(yXmTFRtU-xVr{;?v)G&M4>$8$f|qb*8MK^Ug*7bSTn~?NN)y zBDBUUb0y{Qh%`NHj-jwu0YbU<4021&P#BEhzYhBX-s7%@Rd?2;RR{HS zavW3U(w^{IuK8yzmD-}tocp}QMH`j_Wd1?ya@YCxn%cS#WdWR%^LNFip4FEr=gM8Q zg4b5g_3v|J=Q+t8HSTI6BQhShcvIKpU&(kR&bUkxLW1434W%QXD@EjdnBmn})BD(E zM_}QMdr$1MqN~#nt~T4?r1ky!b(=P1t&nU}vmzF^yJSTyzrxSfU~2(v577E((PE4F z^|?Xz!1HYr-BW^|LxV5Fo{nEA2DfOx3i=}T=cL;=H)PIou|C-~$cTW9Ul=Doq%6u9 zspOrmp4fBgoAh>i@_VX9R3i{hbS_^MiZwfNbd>a=5t)5(PiZonCF?j6&tlzQGRyUo z_QYF7h*CmGyK2w%9d(z=2#YUst7t>J5B57KU%QzRw{obtVYFT4Lq@fg9&PF$eIsq9 z!B@^umQ`Z5WpWg*Xh`m{-|m$7@SjeeH|N*t1U9YfuC!JX5BmW2_fNJ|N}Y0<+n zY0Qq-q)F!P&<$uy(1Eryt$}Q*;h*{1hIs1kc>)zPw~4$avrsO_(`E&PonqW`>85FRT4hhTV>+y1R_Aahe%Gy0Uvm;*qjr zCX70rUgk|j&55J}oJg;jsXbHn-&8O%ZVx83M<-Sq6peu`yXZLE6^;!lmvok6ZO1DY ziMd|pBH~%_j9;rNVaHf`Bb%&-(VZQAs`40PE4 z&yJC1q|1@LW)SfId`{(Q99=S>acY4+1Bl+5!Slfa!JXLCB#rb!__!{T{>ThAJFxXT zDZhZl*<&Pra#*x2{V&$BxMUaXw~SIt!9JDrQ+W=QUECk>guxdSaSOh+haELpo#B~_ zr@Hu1ZT%VilDY-9|8o68k+o_f%PH-Sn0-dkC9LtV;)&)i=Lu}N!`HDuy{fdY2$7DD zvX9C7&C*=V!f!1IXe-71^6X%D9OYCG6^=}u@C#)Hj=a94`o?KF?!RWFmOZ+%Lpqu1 zc6}q(iSoQ*goi^)iFp)t>zz>KPQrjbK2#rh3$80OBwh7R-e+x~Jih=hbi*AoYKG_~ zeAB0Z_&HnSwpyG#%QG0G%~VQts?5~O+&4AL9%D-HMP$AvPZrP~)0&+je8e@Mwj$ii z;hn1U<-*mFuAsp8i>7-3vXy!QDf5VEmMSgs1j+jG8NNbAh$~D$-gxa%i8P*%92f=PX4+ z=?L&F*R-`uxsjUUL&um`g{oSe_Mq;!)49Y|*&|_l1!eYX@tUrcw<3F0AW~HX% z*7`Pt*fwTx4z!rp(&M>7s9QkkEL6V4-3>lFJ1G54b|vgapOQFNaJX1jz>)RR_L?Q& zwxyLJW>8)0V_`Ac%!K_noU|C)r9G_Hj_+3GTAU-*kXGRg z1vGln-U-hqr0E1gO+!v&{&Y^(26>0!A$sm6?5dW-$B6D4AkuZL5T5ub7l)2ZA+sSo zxuHwCm@~1;+yC|rV$ZMrvcdy_(i4eLz<^ zla|A*yW25nS3f1Fa%E6WBCgbQ)i!Sl{afgJ87qsA*2*%=6PK8zGfmZ!q^9JHGx3qU zRTvY}E68PLde^2am6c(kCAFBT)G|o>a)w*xIQ~x@(t6?+ba^JlF)c$<=ZJ(m4Oh(b zfBHTh)f6*JUzkURM2qX8$f@YLPQviKS5W6N^Cbs;hj}EYjX-+Ehm7j!s8j5_s`p7t zEJ#D!q0!!M1xIFd+@WJpeB-W(yrMM5J+g?sh^u$vy$a2yM=9^MqS(2mijfhi{p~gaqS>Y zzj7^%=^`;H57GNNpUBm31t&HnoDytBhfR@7moVB=u|behllIpn{uPZ23Bqd`Y2i*G zZ6U0}rhM^it0EysmO5kpA?YIpeqYiiT~Eu(NhPkjOH#9{hl?vyX2l^_Cao~F+$Fjp zm85tpy)D2}F1#%jDFboE-_T9U3R>J+1xvS*+LVd^3i7!yo8A@0O!@xXhs@6XA2@i?Nj1jM37TktdD?!&XuW6-98+a{lPqa_@G7PPO-mwC0ATbvAAEmWr zWqWX2JjHoP`Rp2t_!pN_D!14t4J|w=UrM*G)CUPI$KGQ0mE0GU8LMkjlJQZ(2w!*< zX&~_|sK=}{H!dI%BvWvtIVd0(+^lLDgroqyw5o?gR0VA<&NI1}*>SPUkteB^{B*_8 zc0j}(lUhmZt}9RHoun3+i5gtvV>_duN>=N-kEqu!%7{< zUaziBQaZ0JNUNMy-h(S#NQ>wAdT@u^Jq`Hr^RJU2mu$`1GDtn;O}WBD(oj}NDrg7E z4l{V-b};|Hv>ixa_%-c-Q9}>6qUi4I#g>JXpnIC3g@im|xW1vSMB_@vrc$L9U9@d6us zuDd8QeE8eHy?m3VTyf%(q|Iq=-54z^5Go64b6d_@5JSuSXJSj8NpEn{3QJDnNav6l zF@B=fK9@LC35Bi|#+y7ZXgip1Lo$!&a4PvI)iTUw;*=D)|IRpmsdssIu9Ki3PI+4D zoWEb^$yxE1gZwX~clfww>V4cg#ZT*zH)6nD@TEQ(Evoad&q_#mrmqFvN(<66juZc)bMCO%v%(6oaU`DPM6U0eANM<>$hc5KC^9LrdhYyJ_- zMGdt6EYW^dq^y`nW|Pxd72%EbLN*-xgKfS2BD;)YA3GD>M%rSgR<5j!r0XuN`2Tw( zQlsxX73Uy+k3+{0*WT>EFY;G{(Yg{Fqn6g89lh#lm4bL|D_KWVQ-j@r=~%E=!TQOY z-b-|Bgn=jL%{4?zYo&OVQqfjMi`TVq(iZZanE{C?zTC|k9et7+lnwc|6yqTAc1`?S zI_OnN{#*L~=P0(UIwoVHyz86k(M1tSX%-(vw4{}Z){^(>?kftlE0od%ueLphBGTGES}TRNxeI(&&_-<8 zxe^pUt*IoxjO9EB$dT5da?MTZ+WPIHOj1`OOUj@pyZ7u~JM~g4)~|AtEyI)}>l(>T zl51j(>zTbiSvGMy$_naw1!Z7`6{n~8zBo#`Z^>gzE}l#4*jhVqq5j==AiB{WMX|dY zO6o3VORuezfohzXLrPI*)kIR^oRjV{Em~udQ0eMpEJLaC*Ay8a^@y)22Z(M3Yb;r8 z(W3lPAq6gdho3bcQlxf)XXd83<+PH1S0ah7O+vTzY(`$R4 zEG5&jW5Nor*%;bnv`;V2yP#$ZgS4!XLjS_M7O1$;+ub?zlJ&EFH-2_r!k(F~va>j5 zNnJ`wdV1{7Rlj^^`Ls>W%EYp+(+%rW;*^d&GZ3OP=*jkr98XS3Tp5{(Q+?x=6Di+p z8SCs9t0}y{kL*SAl%y$;QTPtl$)x?pJ3@GyP`O@6wH4B|A5wO#63M)u?l~x=&!lL+V0d~K*4X-;4m+O3N$eLtZNBs)gh?YgH zF@z6oL5kv9qHb*J?jr!;~X-31=)jrp4D4q|&h@ z>CBd29Q^;xHO|HV-UMeyC!5MP>&%UR#d*m}(AH4Q@W1xH_U@nOA z(Tkb)c_WqLLVuJ}vMzd1QJJEZrB5wQcBINaaOq)s$cVtZ6YpX3y)NdEqz|)0s#r?Q zj}IDk)sAc}t|)}tP5vdilYf3H=NOBv(sb&+V)w3Z+p>@_v+#>`8Q#&9&En)fqkj@w z>aaV~oCa0$+BP@Iyl1zR`M=GziP`$!iYv{>9=ekDYlN&cpK(jc>LtOpv=nKJvHq9& zP{vAo2sYr5H_A7#6l+s|(=+$Zk2f4<&^mLvgEOPMRl4*K+IMnfW|IWx>g*S-J=2op zokJUoos&pLO-0BzI7y``md&)9;{9Xt#&|Y%0!z-*gSe8uhM&Acw$ejUTFjN0P{1-s$s?@D}7go0>R^!mF0TeT6h)OM6a{7qzSy((Z{Rzb`N!J(D*I zq^4*+XcMtt#5@Z{zAT`vgZt(A`{-2`1wL)Xf=J=YKNh1G+`QicF1By~4ancg`3cf` z^6mlpKuSTMq~vQ(L&EM+Ma2)r-%eTB0lh!-^ zYiHXmQ^qE)8uAUM%pOH0-JpI_I~?e_OgmN*K1r)o0v6?F4=GV`X=?cIFsFpCcQ`Ta z-}c>kLHc}YpB$ynqZ)IISgrVsowmJvQ5$fnD_$$khPBTUzLLbYuJkG%F)fQ$EpO_R zx>QugvObpIqU(x`uPfaQC4Gh{AQs(}7u~nKElg42T}y6PlhnaC@?M2y;2j?Mc7wG2 zq`oLq#rX7uxy*>ky0EP3$rFJ*J=yu3FdhBjDpkBL@BQ$NFq!G4|H=E#m8Mc+B1Ya| z<|^+ofA3;SG#qr%!?Kf+!)g&t)q;X=mPt8wRE}Td8QuO5LGNXsp{@q3pe2>KJZ0W> zjr)Rq&sDz+Cut(@=+6b|KZxPeeu7pIoxwK%;j%6FLtOFES@$E=)55M*oC~@i5@9;RI4KjS;`Ab zx6rf2U8c7b`bkN~hn9St|29L!+*YF`cj|D`1OcR&r8Is&QbWjEp6E+O2^y%S<>FSn z8SlyZ!0M@%%qyWJx>@*Ko00uJ8T6_?XbX;7^|4`ARs#69+6HZC7q4vx*on^8`4ZbY zL_$2HCbQ4k7~|F?e_W08(Arn8<)5srjEXJWpXTpZwr|2nN&Wi6rr6c7wyT2vKwr?j zFgnH??}wi+<-{017aQcRsc2S-jo9+vO*uADTXM*%5P4r*KULrNw0w34Wg}m*Dt9BHM$?LAzi3fPI!3~2YlpAG@fDY)I+F8- z8hNm#(2?*Z^w>U3||juJ>2O_wV@?KOYrKu{b9#%WTQy@1z8@ zR)nf}^#!hr3MJ^6{7>kz1M-`=-S9^JoR}|*;bL0x)jek|rtCg1_FLI~{_iW}_cFWi_Y zs6O7Or}A5dD2!I~74J4K_DY^LB=7m#T?xq79_8y;^EK=$?*O&Jr4PEX5JI5_;mbpe zp4mgk45g)E3jDKUiDEi5Y)7;LZB(^~UB689Kh%ZHQO1ZvMrs)mq(!HPgw4J=X7?;u ze_5Ngt7q}|mu!Eq<9aHiz$IFLRgYN9t(d>KoZ!yr1AS|!5pB>Qx=%`ud5BCIz}=cY zkndl`Gk+2$TeA%=J*r{gvfrl>OyJ&is{n{4!jxV~jZ z&-zL!I()=fMjQM-iGx{Z-Lw4za}P5Fi`f3}_T49J;-Gw)Ur`r%EIbPL4?6r(z?G!R zm1`WHcqQfTUDlYIUP<@Dwn`x7`d{a=Z7QyNl2_D3`#Y@4x5&!1EqaM_o#>V5)u?;)d9*O<5iN?ok9tKvL_bAM zCHt4`A8lrQZy6=EI%BbX$+tbb4A!LV8ccW4xP0v;#~NA>uIsVaAZIq>?8+O+gWw#@ z*@rpyA$$>iC|^Xc=Q}NXBWoYd$oz({XL)9nITZI{<_NQ`Ig+!lIf^qfqs_6n$C`22 z0X+M|^*GF6SENW3zxI$voY;#DE9W=_E2{4cE!EBw+Hr~-d-l>4fFOhjo$tqrR0tBMwvamL%p%M z$9ZR%$UDt8~PiXz~9K<822Xrre*`bpWolCMV}dnJ;)yfeXzf? zS?!^fe4q7SB9@o^H<2*IpGjQr`m=G*@jt}= z$p6#~p|37R+V}qVyUqa?t0?7A$Nm0 zId^03MsrT?rrb@?Z_eFm`seP--D5V)-Ise9`;puur1sI=)24H7a_&Xsyp;Qg*&;VR z_crc#a_^aKaJm?i{io0LX&-lS+!RENP2)4w%RWQV?9}EqK;@&>k0r!r< zj>y?5*wb_l_6iPw{=49JW{cp!V7S=@J$NLPqk=KWJT^EH_esI2q~WySbTcS8BRIp9 z24@CmnhS%og0oDY;OyXBvt97V;E!gb;Jn~`(>}N$xWKFtTo_!4@1KLe8ZWpgxCq~i zgG-=a8e9(Lir@;93$6^V#C=t8l^GaZ9b9cX2G<1Fm|nrP!F6Ws;D+D^_-_nugy*K< zCM4V(+>HB{;1=As2Djp#7~E!>gWH4Kao-W#iTkeLF4HZzJGdKZ_XPJ4%e}#U_)ZEY znJD;M@HewZaDQ+=^ap|mpg$Nq2<4&RA+vMvaPTlOJ`y~F@1wz^q~WpPF*7uHJa`=6 zCxR#NeKL5GeEmIm3is2&(`MUXaxfY9Gr=>YYDzGL(s(v_7RghCsU{4b3!Wn-(}HQ_ z>-pdX(>-`GcoF`Wf|uccC3pqSSA$p0UxL?y*GS1ff`1VE^k6!n{u%re-`9iJ;eR7| zgSg%d-h?tEm_gXLg12zL9lVYEo#0>8%go?i%70ey9uj5;vkCQnFo)EB5PS&dN5Lo1 zKMg)7U-N=_P`(JhAhq*@`MAFfz9fYUg0Bd*Fj#0Rg0F+Gp??#6L#Rc;B0_x|d`k&` z7ko#3Ee;mr`+cy4*nbGv{T2Ke{0QgLU@0ZGELcXoKLtONi(dl1*BdMkmYY8Z`Oq^J zp&y3EV^obySy&SCACItI*v>SD?ZZ+Ng=Jxx$%W-%g=r2e!%8@-!fM<#VT~CO)`qoa z=ddoUgTFrPfP{`=N7Fv+6m~-LYT;^xT|HcbP+h_Xq;(CuLg^NEBh)(KIwlOehuuvR zWBa;hr*Qoc-572ZZe%)y8;2W1Zw#Ao_Y3>M*+1-$y?MB~Str~g+yedq;g+U0+$!7( z`qtsra1IWKnBL*`;SSh4hC7Vc{?{INUqjn^60N z`#||k_#33{8}5tb--f@%cfW8yeD@FcCnX1jzr%fCc%a!TJSaQ}_waByoFl>!gdG`< zB$iR(D6>I$Xm}WM4i689XLNWpF&-0+Az#Oa$C`%l_u*LRCxs_NIVJo9VNVTDg>qVW zIC(& zQ^V)re?EKx`^E4@;(8@~72nsw*YJHSd<)9k;oGJZr1hRTIGi2MHYbMfhwqy|g>%9= z=G^du@B?#P_+j{=85e#Oeq;^{=Z165S>eaw$7a9qlkgKleHwmhE(<>kKQkwVpNF5D z^TT=JJoCr!i|`9`d^kUxZ^nmThF=nPLAb!29ex#lMc9SmLURK6?rU>72ybgMDB334 z#te(LjRu-Eqe0Oi^P6b9Xt3!Q4T*-BG11UysQEo8a0e(mMmw5Qqn)Ci%<0k2(Jp4k zXxC_0_;-tTGrLEe=7MOCXb+_A8SQ1Z6x0a)H_>m*-qF6%zR3S=^jqBfMf;hfqWz=& z%_-3V(E(<7^t#^at4O~8FzbR53NN5`83qZ6VNkaJ>mBJPu-lW?CL zootScPKi!2W1~Mre=r9{r$(nD^R(zR+^0vU<31xg0|{qFXPVQZv!b)i8PVC%*=9s^ zPIM0RbE9+3$moyJAI+iBdC_^e{}lZR_xaKJ_+AiQ0Ou9a6{cf!Wpt%kC%P)S3is8~ z)n@zXn&=wSExI3u0eNgzV&?kbteQ@{fxCMFp zio823^6qQ|dH+F?cc{p_7Ucb&X{Ts=Jw@B~iniBKw7r(1ZC}xLxhH75476QMN>iL& zt~fhXoL#3l+XrWFYwAGQgTS@hfv|lL_8!=Rr$fcl>w>3`H|@L=z|fr(L$Bri(PPy2 zZUIR*E0Qh+Nxuw5@No~t$6dUCc#MUhWORi0j`xl^!26fS?g($T_a#_-fw$0X0(xdO z$@>-z9f6^L!Yzn70x@rBJn->GxHkqRm-@Z@UQh%pM~anKSFF6cV&ziB%3b_j{E;A9 z!OGQ&mDg0PT&-AnZT}QdvZpAy8I=48?nnJ+kURw(>?sZ|1qaVY!W{n#>@WSVu?73C zt=PBLUjp{+qS&_!*tdhJRMeYO)LR1T-NNKDNH?cQw*;hn5OhJb13|PW;XWChS^`eJ z5qFAEbBa(K6rnaKHth&DecQBGJlad~=xK^ayDA=CNAYNt;?bPq(V7e%-AD0giQ>`K z6p!WoZtzL&bujV!`#mf{Wo1{I{XvzcR&tq2fPZkzc6DuUwJexD4|1 z75R-<a}>NA^%087Yn|RUEldcyM?Kv5WvgdWs-7QUqD82y#v4xsE{ok>OFK zU(jT!qRCwpO_qWte@{xrf+?eLTsV%rj1MQ^J}x{C{^LXDfWi~P6Onu}SkqIixu#;x z9^o0`nfRU+o&)_{aAyz2oz>y_;rWEU0Q4Ct`dm}d=PBXE;l;?mB)kNEL88@)M0Zjo z8iiMcS5Qh zpw*2Ot(J!OhWA1j%-TaStEZSXQp`Fbd?0)P-v`47k^fN0d`I|5h;COb>xEB-PeTzz zdt5jroQnH7aP9Hov~U{k=fmfT_XRL+6uuNPeub}sZaroYXW%OscPGWTW#K#FJ7z~k zy8RUC9;`_BSVg)=E7ILhk?wC4>Go5kdz2#GtrY1Vs7Ut=MY_Wk>Hc1k?lFpV_gAF5 zuOi)kigZUS(%njt?m>!i`zprmuNb$3V%!0WaeFGp-BU5{FvYk%72_VN8250+xP27k z4p5A{nPS|rigEiZ#@$#k?q-T{J1EB8TruwMig7nrj5|Ux?nuSB8!N`$B04xa*lZCU z5*-3U6^z?KG495SaXTo+-C8kj2gSHsE5_}q7jN4r?ZfC`~o?_hYigACd7`MA(+)y!Ycg48dDaP%t z7}r;f+g&lP55~RIbXRnHs-oNN6y0`LbbGp@+szc+c8DI19_HCVFm4Ah?laiWMbCjp z1?iS4()FVkqZgqw8*L&*y@M6?hKhQ3Rn&WkqTVAF^@fUi$0+LEL-FpGig!cByT0Px zK8klkMY_8w(%sYq#(;F&Vai#l_WYTF>{$t-pG#P6D`{V{x+yPNuVh=(P;zp~`Ft&C3`P_H*L!Mi})9YngB%;|a; zFn9ZscZv53i1cod=nQ6e-}XND9`e5Me)L|D*;z2@azF59`X#JZd?0AjuLVaQ>8}oI zJjve%ym+O*8#Ad7gC&_a_0MA7bg};@P~eYX#$~y6{O6e6+{*t7oVRe9W{3I}0`nb^#Sl z3U(E&6YMD{2OReVsAd?mV$TG>VczS7U_Y?SE6gkY1C%mcX03uzpp*B5L%|9jHY4EX(H^HYet^}VkmfRYA9^M|_87yR+ z_*<}uQQ@IrF(bj`;0N^nv!N#%Kg^-!XM{ocZa6EfF1fhmV&<)O;I-#d|7VQ15nW3R z`zjN6O#2UCSC+?>#P4}$`cLyTcc%YTSXVkk&tBNQN_%4DzFE!YrQ7J8<6L($5x{e)Im$T5P^qSI}IGvRETKkzjOYg1ytn}W}2TLE9`_gHplVhLa zD}K{rnz%V%sa@WoYw7ESXYIt=iKXvgW{WF1A1$3*Ixl&e+GJrCC>5 z@3P+b71dJN_GJSw@i{PYIf~Rw*{+zd2<%bvyQYyH0LVDh7-QZ_a@Pbh17 zo?7P4ikr&rESpkxzM8Z3I;HF)?k+03qU<{SZc&a&P#(thByD(2d=Y<|UD%;bt`^|#dDS@wPKUbuRE@MV);{?C#gBT{M_=1^$q1y%P&-)OT<>!RpmD*=iT^C zg>rxSqlCcC`BM4x^0(@{mw#41tNcT?Ka*=kP`;r2+w$e*KjKZdhUF}q^6)EMPEFD_%fF0PC!mQ_Z28nHDm zzao#7y(EtOL$ z&sKA)UZ+%^&)xZz7gb(?-*w7yCzMIJp5&ZT`9kGum2XzgtejK%iL>Wd{#m9uJ}s@-eG zVn0=N0A?!ZQ&l%`UR8B2=T%jQR2^P*jNXsu{-mnYai3c=spjFTOR6r!T%vvw!k!bW z?&f@|>VB2gMX6)xFei*6W_tn^$jBy>s=D>OHadtln46k<~|5ABZ`!dZgI3e$A5F zN;zwm)XbN=ns1b5T~P7)xwgL6uWbicef6=`XI39qeG2wv)z?(tTYX;jU(|I|_3hkE ztA4Qh@#@Ld(`roh!kY5x*Tq!7B3E4Rh^d}kJ-2#c^*rIIUJPX!FIq;N=!Vv;rfJgrrLAF{}M>UOT* zwf_A2Idyy1?OQjy{!}#nfpsI%`483|TQ|3Ublq|F2iKonH?8gz&R6QrtUIsnFLjsI zT~l{c-R*Vn)OWADS3^Bm_jui8G`VoT!ud|!>zwc4H@a>vu`H}xOdQL2{U)j}udl6N zt-hhYd;JFWz3VrvA5cHAetS|etbS7ce#CYi*GctHay=A@V{xCrd20RHr1PTsH|wv! zTqoME{!Zn57~U!MFL1tw9`);I;`d4Y{Q7U|m(>5`lazA6w z&9OS;-;;Y6d#xY`mYl<06wkj`Z0`-VpHhrDMd=SJ|H;DdeXab9f^yv7sy#{hPg8rT z+5>|!e5*BVqf)*Qo8N>>yf16KTZ$Zio1h+hYmwu>rJU2%{z&NF?A$LBqf#yv+rLfS z_pAM&QX%5$ySR}0;{ITso)=%YM;(6F}&#d|8pjxujI3FS>t z&Z#+e0(euz*Sx9pPRhgLK9rwSW_y*u@&c5l8mgVTXDPo?O1B()MZ7UeDf2(WJz2u~ z-IVg2ja}1oj^=b%&FNIl=?l42;eS+PnW*;ZD)UZ_{T9vjsVe7orQEK*(^P@luk(k(!26MZP~IH;{BbnH!CLyULuT@m{0xKCLx)gT}Z{?tW@*nbZg~ zA>_z>rMWAYoSJ#+en|83yh?aXQ~SKOG4^>P|1B-&t`gQCs%aRk<*;t77ycxNRu^;xAC=b2cdqI4? z2mOWE7x|Lw7uaEa>Ds%^}UIGcb@lht^)hToam_Oxec&y7JlzS^1Oud@6}w4 z*Iay|xp+n6{VI10@y^!t-=OlRtAv*{-rH5e&1%2wBun{xDS7mVEBy|&A5`D_Rl=W? za;8#lQu){BE+EwD>ib*u{iCMvIHio&luwKYS@3O%)eWi8up*s zmY&g6t)?m5MmYUbRnAbA^LLeVy~?>m{Y|A^tI{TG+c;5W-l!?OOx>?(3w%r4 z#!IY4(_6KL3{`1kv~BF9(taz_%-b4ju*zIp-8-nXP1L=QrgL9)Pt#DZXnL+w%2ee% zM`JvTRc_BaNaK1+zIReP4$%;Ac?zfx{e`#Pn} zR74Rdp} zozqcuiAo66o!61{MD_i%+UKeLsoHkz8zFA`7qkz>AB$q%UgSEb*i@~=~w=P2b~Ey+nrzf>s~sl7z)i^cZq)O~{5 zW7WP=CETf!?^gFi>V8DsPlz@{3=xMoABoD;Zd_ zovA7rTQc6%!gn&^1|xSU?+pyrHwK2W>T-%X#GJ}1%L(Rs)?BVIvg`kPb{#!nZqSvN zyL9Dcx~{yup(`)%u=295`Bc|jR%6YjkJp(smL_j)*_H3D!)~EnSb5pa+r!)3+snJj z+me-+dsun7kM)&HS$%m4m#n``V&&ya?|v|K;JxTa{yN_K{<^HW{G@9x)w<@gny$HQ z#hS~-?Bco9zuX_e9-RmMLs@-!*gu2ym&N{>$;!)Cth~sYOFP*)p6e`o#&heix8^wB zA31^bl`V2tvi|a0_I=;Oz8hJ8Ig0g{H*({0GgyWBtFFSZvpZNbcV(~^t1vTl6=s&~ zkI8*1J7aPS*%LE3w}>^C9dgT9V>vSS3%g-X4c62ZnT>QsW@A=lt_*s!7IRIo4ZB!w z3C!g4LqJ*9p4AX>$=Pdtjk2fA9P*j9Clqa1n04fV(s8^U5mMrwU{k~YuNFy zP4KsHU^pmvK=wDV79*=L56f-_)?(NL8$70KF^}si%oDl_^CYVMG1Dva5jg7g>w>Cu=b$2CuV|;N)NiI|)t;-eO(mtl%B?4O|es%l?2%gE_i7^Z&K? z^>H>;`~T~+)_yoMdCJ2W4>2@`JexT)bB;WdBuSFGl01bp$weh3B*~TARbN-GT(|V( zb|sZ0NpvMik}Ihs2}$azB#Gbq^Vw&gJ;O0(GQDnp{LXou&-v`n`mD9rT6;b1_1XLL z{*0dkuy(PfANHDmz&f)>tTPAMW)B<9^RUqzVr#wi9jx`Q!(Ia$Jj(VqzHEcvjAxSB zQsc7q)J}3Aa38Rf-P!JJJd4a|Cq41&jkew&ZGMO{YFL4vmAfE*OllPL#^5&{zX|wF ziSaY>kEayS2MAB&VNHuSKJcat)ka^2y$@8@=ZfDYBkD>^(9OsF#ytB$8$BM2+mpJdk-P^N3d$I6m%kS-i@Sk5`k- zo`Lh;`z)xJNLEggjq63yA{mi}5%@+a4wqHExG@Sp$LZ7K+(uwM_dWraRsB?15bANo zDN*71D@rKmC#$xftMFl;%W7OGS1&7|(LmC6KzRwz30$iVBr&9bFzdENV=Wr=5m$(RA);Nrgv!qsv!DZc6oEWSd z9mteFg>$)sJT3IW{*fUbUpSXFsc3q?T`DD$gM|4T7OxHAf^|v2u|{N+zdkq{E^Ef` zCzYTaS#$h4I0F}3XQAB}9^(m~S^1MyGTi*LOD~waW4U_6`$zuP`&^`I(YUNlr|Kn? zZ9P@bTcu@vjMmhdL(j~GC;NHtH>$z_+x zt{6VXDV&bW)_!Pq$mjUq`$U(7r=2|)PW}C)5|k)h!!M=Bh3ki#hR3t)BrZLHEYKU_ zrxG0(o#gQ)&4uTdWXj>3XlyN-p9{C}%Mose*3vLLGdmK+TI}>(cMmvSO zhI@p2#m~_<&c#<+Ufr`iAD0)`lNy)Mc#Y@NOC%dzFmAM7v~i?!v^mD0VsPQf#f?$; zIZmG*=hmC^3Uc18R#0}bUU5oPc>anK%6aj7G`I)&m_NbZS9q2uL0zK_d7nfax0jPc z6UxwrypO-*f%}CGzg`x8;ncW+%;Un#!>hb=gr5p8ip=8}`D8&TxKm;jkcHQJXNyja z#@4oH$7PT4R>(z9rT8&QBB!XY_%#Y|_G`Sz+>UsRqH^1c8zXzBAL9(%Y+o<>MD!Vt zFPsbSE}GtNmrBXxz{_8-dI;|if9vh>1TyB%w2p`_i`CkaU(aP%{q=F9@$;5UDx97- zH)gl;=fQ+rT7u9-vW)zCUR`B(;Q#C)*~7AX3)eZjTXxTrWI-r%{S$-+vQZq0F&X1f z_Jp(Nvd0uRmEy-JiJYPir*LWcQ&cV*zlSX5_>yo|N<0C7wW44CEx$JdC)BEjGDVZE3%3t;tzh3fj+kIK?sylC&DzZay?ugIvzxTKTsr=!Q`lr-18L{jb^&uPGQ$uG-o zm)j|~Yiv_e_G&M6zXZy_F@x#rK+Xg7gBJa5CJm-9zJ1b|G zXr3K6t=Op)KgO@lDe7ULSKeZ9-^XJVl{;AM7)RqV3gvQrHO#Bg*eq}c&MBf^;pv@C zDrXb7@LZMmt0Px9US$NI-1I1BKK`5)SL1h-O1wnDIwH5JS4NbwaISt4^;+ca_cU`$ zhRZp-^n$rNmaAUza`g4NqFS#5y}+WKPnK6Oz1;Dr(-ABy0yjE=ULc$7rJVaf?ksPw z>MXfw#ZIO8F-jn(sJTbIk{5%UTkIH5#bXrCVO{5aqREkv#|2L+`eFJ1BNhFzGZ7bP z2K&!}>}Zo^stYxkmmA`xGgxk#%>2b^uWFXR7wcZMfD zr5EYx>zyuFemGL@9Pp=dxtm!QlrrE7>YiN6+#N`Hl*Em5L5$qpNHaEq1=2Hdx!?L4 z`MAU0E_Xa6emz*?T_fg#))a7&G91F6d@ZM{CxI-^`4Y%ZTUS9nC*pz>0xr0!fvg}G zoGq|Y2B2Z^{qJ1VR7;P`C0Xfme|?StPy;b6s! zhS@q-@DuIsA4labHL?zMurV%cb1LUcivAz;lc*J0;KlQ-zLABI#gU~fiENMT4DNap zrJbmTyd5QpznW>j^2SSEFs+kI8QJ282b?cS{9iDqkpsRKbCE-lBa!1#%a@(}ALNfi zylW&}yfp>wDrhf3Dv9dA3uT*TaDAg~{5Xj?KP>ToG`6pU{B`j)f>sijtVH;FK8hyb zAiYMy3S5Qg(0J_mKIi`jsrZtD|3S&UD|k|9>}i6)#)ljPwx_r?Bd}}uTy$mh4Zj?P zaY%2Df6nOqIJYSQ7o0cXVmU~3Hl&;=l|UA}MY4;}7Tp&;=%4kJf1)NQF2nmOX$T>8 zkOtt56uv1WwVtjA--dar$U2mA;t!DXJu6Xbk$kH0{u$jYlH3y)f!`>SD2J+UqLVJv z=D7MCdIs{%bRYQg@)lf<#N{0nyh|gR&4spLeY#HMm$5{5627K{wiCXV{}H-GG+z|n z5k4fjlC!ICMY2ai`!a>kaHj29t}bFt^$u`)h!#o8&x?GWNS+qSi;@~i3eO3hC277a zd}-!&GtR%sV12q!O?QGroL7*zmQm~B~;$i)I(Ten)7+} zl}t@1PDk_1Nt)+Hc&`xsam*91M~SM6d<))^BnkWK6%N&d zC7sVCg|{TuN1}OL_#cJ7FR`@HI-<$*KDT7lo7yFEyc3H&Skf!&D(;ojC7owQzLJJQ z@-MmsI*X;GKZ|^a&{w<^gu0UFeJodRh@^`83H(~A0b&U}2yofcSw~ktfj02&{eu4G*d-BQs`Eu1Y}dtt9TTm!7{>h6TTeF^>v~-T6Er*G4r1yKPEI& zG6LnoKQ<48!_%cH87fA<+ zRYmw*q2nb~#suI5@VPE#Y8LVMWBpmm%kOP#l}D>VodUjctGhMfE4P+gTh$i7x#{9J zw>9!zRb{A#>Lz%_y;}AH-3jkkKS%rMC%iZPh<+8AT6tzPJpQ-Do5ic_en8H+ z9H;L5Klu^0LfKFKDe8v&@UKJc-#`8>{?AnQ!p}*uH+wzrrk*bz_&CM2$WdMJc5xow zo1YHEyk%;;`W7$dr%)Q@P)F)Xd1!f?Xg1z%-$Z+WT2Wrt!?m8SX5yWGycujQ;a+EP zyVUS-JPy*SI9?1d1R9)&`c7s&v^3ty_m79dbA!g&W5?DE3Fnqx4nHFCX=ODQtu(Y3 z?_A;$%Hr0qMUnz!67~Uw9C#}}s#tvQ?09pUwaf>g`OX#dH8fgubKo_>D_^d` zj9?xqs7vC>#vIb^B!zOyE4BFN@n&PZ$ItQR7mVlm$1xpZ@%)+p%i|p3Tdk?C$0pQxmCT#YX(7vW4AHJrlxK)b-tVJW~(}G#BHuJ+!k&tb%Bgl4b>$mSi}F(5Az4{FC+Hv zAO9BrXDVai=k&cM2jfZ$cp;c4-wE(Run^or{4-sQ?{xfT;=4GeGduRbK*E;-ag)C* z@LP@FIyv%W8!|ycO<#`=@ zQoMh8e#ktZWS$?g2gTFdTJezgrqI>mC-2`D-!uG4ypb(1gV67Xm?ogj#2eY;;*IQS z_LfJh#arGK@r`%6c=cPuzVYxaW4hYB&QQv9=-8!)syN_|5qT;#uivO)R1ssG0=B5# z?&9ugs(ZUDJEf_~?K@qSre<7rX@@j5`^xU^($sq3+nx}g5QJ85ur_hv9wh{iDygap z`cpNaG}TZwRhp`Ww9ZF=WPNXyTTuU;LSty@%N$o@#d!Ku&Mh>RMCYw^+8E7MQrlh^ zrKzFq+xAFPbK7?Z-FRu+UTLH*ySz&pWp?e-A&mxhzx=W^n$-h3w5~_@OVj9RfjY6y zqE3=eo43=|V(DVXC|m3p<%%7HN6zB4h6=@wQL)%DQi>g;@@ZqF_v@E8N^KvIIdXv7 zHK5w7<|HLWc<*C3FlD9zhds;q<56GGgE`nm(NQheiy@8%1+Q zBDb_)JyHWTRuLcN|?S@>!~OAF;0m}28edEvc#z;lH!B~;d9 zXiuyu_hmq8X5PE+z`TL{WB@UPW%WUg%Ep>9EXSBNAU#j0+-IpQ;dvA!j8se;s9d1> zZGm@O_^Yijxx(QJhuJf0r45xfq}-OWAZ2^XzLaAr$12x|e={r3ulz#g?Ulbzt(sad zH79jYYKPSBprcZk;Jdy``6}TmJ*y0>GNsDADl4ixHTu`=QFBzyxi#meAE;Bc4m?B3 zc|$;us-a5(*{m|qEULiwR5erGoCkEXnkLQEGPU7psikQJRI^J=XLG6PVlIQ{r2%Fj zaC!%uA?8Li6yBEd7^&BcGk2Qt<}NeAOf-|s-Da}6$4oKznyKbKGtKkQ9yW8#-^^TiaRN#j{5U;o9y1Hf1Zx4ko(KwNvgZK()2J_nV#lq za}7L4^@3li-ta5c2cD(+#maXBaEFJRKbjHnBQ*+G9=Dm>;cW`|!zEBoF6I1UmGcUq zko;s0n6J%2^Nsn|{MQ^Z-(Ht>9nWN@sbIkl=jsr~u0M?ds+fm94%M0Dp@I3Wh>RHVpX-OS=Hh3ss{VW0>*J|>wGKS zs$*qXb**~V1wfW-U^N7?Tw|*VykIr6GOa8t478FQAk0O8RMMQ$<#4Ck%4!Y&SZ(1Q zt37;UT?Efq7c<5Q{9#=RZ&;TBujF#8n{@>|U|k8MlB=wq@Pc)X^#>r8Tx<0P4ssvs zdaEz6O8Nr_c_7eA23doxA=Zu7P#_}bSvOn5;3I3e^+#)jH4=WZZnbWMpRCc=9l)&{ z3nY^};kD}*c$ET}A^b@h8;~YIISVnm8ROXk*91tmz%?lk-&#k3Yy$jR;FeVeYHbxp zD+5;9d3FuECeX@i!B^E{pjtf(Z&l0emw{$A*IoextA7BwYNeozJPr(!C+(+zGy>dI zpjW*K?5ckOvkHE#7(Er(sqetA)w}j4`#pHKdLIZ=UjPwmFOZ(qe;Lvnhd<69>8Mi1Dw&mKpE}t40Ub-`qDi> zIl334|1zY$jWO?Z9pX1ZB!7;F3-Hy3OC zsN3AV5Uc!_ZY#I7+s19{j&$3*ce|6_d)z7Rz3x=^J|O&Pbv;Hd-p6C?`XoWSEQ4K$ z9=Jmt43wV~+%u2FnrjmL%hiT|xfg(gxfDp2J+LqHvFatbmDd6@av|^_8F76e`-oFF z0HbHS8Z6k5x6(o2LEb~h=!BZ4Nr%)7oviDtS@8eYLcOG0>Go=!zCquhHVVq)yLzl1 zt2PNb<9mY3_&)YYTBvV;H-0gNOjpyB&PA{8M^!N{wqG5F}(%+ zu*>Leco^(Wo16j8K>7g4UW4gFV0Ya{+no*02HNRtbT-mw&L(FQ?Q%9do9T1lPVJ-J zj3Y&R_^y)n0vD(rFoVp+eDM_Kh8N6o>^rPA8_Z_2&FnC{&3=rOhs`mJg&~Z46*0!8VLWSy zu`7acssqNPZWw=hW2_m1ab*<7kO|fl;9AZ^8<>Y{zYzG6ORW{wYIg;2lr{q0al5tC z+5=q1?=gBPpeUAtN4`{y80mI>yD6??3;5vcWOv2Y>IICyK|t>tfh#oLo@`G8qTVcw zA&+9jSY*Edth!YgH8x;m*alp=-53$RwGZ3J9PNY{Oah}pZKs~o*aXFndX=u`zq-jZWk`^W{Pg>WbJ12Kb?wQ;>xj$OwclxMx7sj{m_0OO` z=wqOV^)H}5>f@kCG~f6AgeI)jQNwqdKVyGMt7Gt*tJN>EXLTGttF<~|uo@*e<^&~! z6%}cd1ZoVh)5tRCfZFhLtI2_{X-zKft~ExgvY<(ZF?*BExuEA5`17PvrUGbbQxUWb zP-iujHR+(`gq~~afG=+{Kr0y7PN<^6P9#-=?_5nOraow8(*QIT_xYNtm`0#g;d5J4 zHQcLfs&1Nso@bhY)-ai%HBA<1n!z46)iT+jwM`D_`6d@M-9$j^7+}3ohG`C37s$7o z>Y3J{7nnAn^-WvQ2JkelsUh|PG&M3EKpPuI7;a)Zf;Kf5gEli=K{HKn&@A{9)|3sO zz?yQ*m7uw%2WZ4x1sXLyL7SVaK`%7dfVMDy0Bvb{fwnT&g0?o-fwnPyK-&U$S5rIF z7qq?U2in2pfnH>80quxA3t%0aKZ15Lqd_k*BS1Twk)W5FQJ`JSt)Q1-PefB!b35qe zqS?*d0saaz2DCf&7qxl`78*@gV%E{r!z=~8%De>H(=0>FdY!H|FXQMMvmEpf*dx@` z%K&SZt~Dz`dz;rluQRJa`;au*_JZDR_JK||UxMCa_Jd9_z_q2Yxk4Fuf0Z7n@8lk+$8!(VcX1EY6SxP$ z59|rhN!$bV-P{B9WbT2Q{Z?x|g?pgBmwTX|$~{ou$30L_;~uF0#63_?=N_o<=N<@e z^5}v3&)fs`1Kb1kU$_VAncM^QgWLo4L)-)P|8Wn5ulb6gf8`#iXPX+J51Ta5Ii?oq z-%M@Lx#oP(N4RI|dE7Jg-??Y%`P?)0Ke%TCtpPn#KgK;1-tEyd_2b+#^%LAP^^@E) z^;6t4_0!xl^+N8MK+ebneTI9c{ulR5y@-3JewKTtUd%mHKgT^&FX5i4pXZ*bU*Mjp zU*vYFm!f|ftgt?p9``l(3;h!I?6h8neL$^WHbX#{n;Su2F+)LDn43UflS z$bpux*K^C)Z*$An8@T1`cev&2jok9}yWH~iCT{uqJ#P7WGq-&GKDT_mg=9aI&;FhoVaLduKrKH*fry-8iC8IBLwhaH9WNe!${GI9L1{i8!pCET}M;AG+WpnU{um=xT_ z)OXNs?T;MvR{LWIz19B2L2tEpI4HgSspEp~bV8t?IZ2?qoMh0?0Zymw-A*ZGu;S?f z@7LPNcCG@w-MJHVv@;&`4(Be=F%DWL)-fYMJHQ{d#@-9@PA&FgGVtF}wa48{N7WU( zF;}TUsuk?5H>qy$4?Iy_p`O6^di5f{eX+~_k?JSjuqVPB_8~O|nD>vWS@3ZEPqhS| zt>0453(ox}`UuZzyazn{19riDzzot}RT{opFK(>xhb;h)&^X!Z4j#L9U z#0M!2*BIj_@POM=D@OLE)jsT-DAIMyiB0m#_DICiOEt%8?v$jf4NuUzd~u8S3ZGFFhKvBt09R>nHA zid&U+XrBByRWE&l#R}LNavpET4rib#U?IlFe5azybIqyq+&U;NquEYUX;OcDzoPLBK?HZW z7+;acPN1GupCmp>e3JMi@k!#NCQ*lV;hmk3n`vCLNYUFTWXlJa7q*cY$49Qnyfb!( z&F$CSx1X;3!IKE3fZEGtE+=`eCV8$dd9HyL5W7dC`l_r-M_cKnx~qX`L8D=tdIrym zY=WKXfI5ulH4N&e3}B`(hPjsW3#fKZfL1^`EEnaCap>{jxb&r5^mxAih=-wfyL?8= z#T@MNJ))%PV*W)-!(5Cjg;^N!{g4z1L90awW@A^!LoUEk6Sp2{BUm)Gd!eL@*)_&t zZUyJ%19L0(Lom0-!Z4e<4dN+b4n<11-na&sNulGPy_JMuMnyY&8IO|G{%VrMm=a? z)GMHIFOHkIQ$ZWK_kp%Xi_>myzBKL@jme^Mk7!I04X%6i1MCLn$9t}UdP+uXMJUEU zt!`irJ1rVx1GnU>>63W>AhB+9KXFhVqVJ&LQ9$d0AIir<721^F&w1pjl<&yFPCE3Q zws9HT*(~*vdL76~c=`+ci)t0d)J|~?#!A3`0?x)y%y}(WW1qb;X4W4uqt3=mI!E^E z9>M(i_t<{jW0*Pp-MXhSZ~hZ;D`QN45Lm|P7=!EC4edr4f1BVQJ`;N~IT(d6#2!pr z_NdRJuzf}RY@7o;^$L4GkF0(U$|)PWh0kIBW>k7u`t9>2U8Ivw3-g;;_iE&jh)j zYP!U3C@Fif>w-sox;LJ#X9MBgMaVJJ?Ur=4nus~oFO9Sc>n>{o{~*PTq9($=odnJ= zJ-1tK7nbt_R-;J{w;sZiIDQ(qYF-|(UOFhT{Fu&(U2^W9u;TD?87mVkGhUuf(noz^ zocHp|voenTvuItBTzypktdHqm^l^OxQ!W{8jIoT3oh=s_7D*=AoP#~C(x!|lYs#5( zvD;O_R5X=Nv1RZMSYU-oH+4*gscY()3$QQNz%(?COk>joJ7mp(K%Qm7CL4QYxh7(w zra3S%*lN=nxEZIngmi_?Be5;SvxM}G+d_EH?PP0@XB`=xz&VT=1c4;er2vWX?Olk zXS{QlGoiqa{Lk1=8!2m2p5+grTVT&s9pXJ#^*z>Zx2d17Kevwz=Hzs;WCh2o1Fv0{ zbW8g6?WjeOTGE-UYC&7NA%W%abe6XNO-l;e(JQ~RmXwUUk^^WU2VpB2gl)$5YBcUO z#;R9}*S2tP&=NML?yxdlmC&+uJMOaXz};2cs#L-&({r(-jhTk;V{n%T`vb;p*dNq6 zY=2Ot`OXHA%CJAE@@#)l71;iObtmi(suJuEdsT|8=PS#4{Crv4)|ItwrmStVWNn+B zZ+^gCi8nv!AF!hN503b4f?)orD&ewH1a=wji1d%3-nwQ3!eYJBY^8nbJG?pb1D+)P z5zkxwgy+bAR>#yYc=GB55+%aEFIi-hLoS6ViIV9YDn+HKj6CCeE|sSWRFNv-+0x3C z3XG+yRE?_Bc~paHQX18w+Q3>$r#h5Db*Ub3nCeplAkH+R#?%D(OU)<~m`vGtDm9lP z6a^O3h13GLG_9yLwE<33J0R6`po{R#>cx1P_!8<&mr@rXH+996#od72)E(GOJ@71h zPr90}p+8VBx|Vv=b<~Hhr@qvW`qKa!NH@?R8cajzMjA>t;n~-lX&Bu?!|9JSf=1FP zx|MFD+i5i2L1SnvjiWnhJl#bTXd<4Hy_+V}Jv4>F*x$PoyLxx&3E0V-r0>>~^*wru zzE@Ax_vvZ+PkOq(U(e8g)(-#$Y9>&i9s&;3Ed5s?K|Ksh(cko3JOe#X|6R}5|Im-> z$MgbVvp%7p)KBTB^+Nqm*pdFF7wKp9VmwX1L_ZJYs2BB8U`H*}FYD#{6}>{g3M8D z(S+EpQ6Jeax?c8+?vnkY$+BPckn9&Nmi?mVWWQ*m>=C^yyF=S#U+6>G7y60!g@6ux zSpP_+*^13p9@7Fg6t-e_5G(d&V#V$$R_wlF#qK9o?3=}kJxr|FGsKGhpjfdV#U0Hw zdQ7a?Ps(1?KgE{)3~bqt(7(i%{hZjcmx?X>C9z*G6Z`ecV!wXPV*B;$V!wVv?AQMm z`}JDbuWQqrxKC<8>u{gcj5dh1dK2!FTGD&CL%M{vh=uw?u}5zgd-P7RNAD7Q^cP}} z-Xm7yy}@{jI~dpfi#rDv#|Pbq-2ZcDA EKY`)J*Z=?k literal 0 HcmV?d00001 diff --git a/spinwill/src/main/res/values-night/colors.xml b/spinwill/src/main/res/values-night/colors.xml new file mode 100644 index 0000000..71bf6c7 --- /dev/null +++ b/spinwill/src/main/res/values-night/colors.xml @@ -0,0 +1,6 @@ + + + #fbb42a + #12770E00 + #80E08720 + \ No newline at end of file diff --git a/spinwill/src/main/res/values/colors.xml b/spinwill/src/main/res/values/colors.xml index f8c6127..829b48c 100644 --- a/spinwill/src/main/res/values/colors.xml +++ b/spinwill/src/main/res/values/colors.xml @@ -7,4 +7,11 @@ #FF018786 #FF000000 #FFFFFFFF + #fbb42a + #12770E00 + #80E08720 + #FFC87E + #F4C21A + #FDE79E + #770E00 \ No newline at end of file From c49c5b62e2e39b66c8bfacf59a52995c0af48dd3 Mon Sep 17 00:00:00 2001 From: siddharth Date: Thu, 8 Sep 2022 08:12:11 +0530 Subject: [PATCH 2/3] added willView1 --- .../java/com/example/spinwill/MainActivity.kt | 31 ++++ app/src/main/res/layout/activity_main.xml | 3 +- .../{ui => models}/WillDimenProperties.kt | 2 +- .../spinwill/{ui => models}/WillGradient.kt | 2 +- .../spinwill/models/WillPaintProperties.kt | 11 ++ .../ui/DimenAdapters/DimenAdapter1.kt | 25 +++ .../spinwill/ui/WillPaintProperties.kt | 10 -- .../java/com/example/spinwill/ui/WillView1.kt | 168 +++++++++++++++--- .../spinwill/ui/adapters/WillItemUiAdapter.kt | 9 + .../ui/defaultImpl/DimenAdapter1Impl.kt | 56 ++++++ 10 files changed, 283 insertions(+), 34 deletions(-) rename spinwill/src/main/java/com/example/spinwill/{ui => models}/WillDimenProperties.kt (86%) rename spinwill/src/main/java/com/example/spinwill/{ui => models}/WillGradient.kt (81%) create mode 100644 spinwill/src/main/java/com/example/spinwill/models/WillPaintProperties.kt create mode 100644 spinwill/src/main/java/com/example/spinwill/ui/DimenAdapters/DimenAdapter1.kt delete mode 100644 spinwill/src/main/java/com/example/spinwill/ui/WillPaintProperties.kt create mode 100644 spinwill/src/main/java/com/example/spinwill/ui/adapters/WillItemUiAdapter.kt create mode 100644 spinwill/src/main/java/com/example/spinwill/ui/defaultImpl/DimenAdapter1Impl.kt diff --git a/app/src/main/java/com/example/spinwill/MainActivity.kt b/app/src/main/java/com/example/spinwill/MainActivity.kt index e3a24a9..327e9a0 100644 --- a/app/src/main/java/com/example/spinwill/MainActivity.kt +++ b/app/src/main/java/com/example/spinwill/MainActivity.kt @@ -5,6 +5,7 @@ import android.graphics.Bitmap import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log +import android.widget.FrameLayout import android.widget.ImageView import androidx.work.* import com.example.spinwill.adapter.WillItemAdapter @@ -12,6 +13,8 @@ import com.example.spinwill.cron.SpinWillWorker import com.example.spinwill.cron.SpinWillWorkerFactory import com.example.spinwill.database.local.SpinWillLocalDbImpl import com.example.spinwill.di.SpinWillInjector +import com.example.spinwill.ui.WillView1 +import com.example.spinwill.ui.adapters.WillItemUiAdapter import com.example.spinwill.usecases.SpinWillBitmapLoadUseCaseImpl import com.example.spinwill.utils.Resource import kotlinx.coroutines.* @@ -33,6 +36,34 @@ class MainActivity : AppCompatActivity() { setupDependencies() // setupWork() setupUi() + setupWheelView() + } + + private fun setupWheelView() { + val layout = findViewById(R.id.frame) + val willView = WillView1(this, null) + layout.addView(willView) + scope.launch(Dispatchers.IO) { + val result = injector.getLocalDatabase().getAllWillItems() + if (result is Resource.Success && result.data != null) { + runOnUiThread { + willView.setItems(result.data!!) + willView.setItemAdapter(object : WillItemUiAdapter { + override fun getRewardText(item: SpinWillItem): String { + return item.rewardText + } + + override fun getOverlayText(item: SpinWillItem): String { + return item.rewardText + } + + override fun getRewardBitmap(item: SpinWillItem): Bitmap? { + return item.rewardBitmap + } + }) + } + } + } } private fun setupDependencies() { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 1a39823..f25536a 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -22,7 +22,8 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/iv_1" /> - constructor( context: Context, attributeSet: AttributeSet? ) : View(context, attributeSet) { - companion object { - const val DEFAULT_PADDING = 5 + private var wheelSize: Int = 0 + + /** + * list for the will-data items + */ + private lateinit var items: List + + fun setItems(items: List) { + this.items = items + wheelSize = items.size + } + + /** + * adapter for will-data items. + */ + private lateinit var itemAdapter: WillItemUiAdapter + + fun setItemAdapter(adapter: WillItemUiAdapter) { + itemAdapter = adapter } private val dimenProps = WillDimenProperties() @@ -24,34 +53,51 @@ class WillView1 constructor( private val gradientProps = WillGradient() private var willRange = RectF() private var mPath = Path() + private var mRect = Rect() + private var mMatrix = Matrix() - private val wheelSize = 8 // TODO for testing + private var overlayDimenAdapter1: OffSetDimenAdapter1 = OverlayDimenAdapter1Impl() + + fun setOverLayDimenAdapter1(adapter: OffSetDimenAdapter1) { + overlayDimenAdapter1 = adapter + } + + private var textDimenAdapter1: OffSetDimenAdapter1 = TextDimenAdapter1Impl() + + fun setTextDimenAdapter1(adapter: OffSetDimenAdapter1) { + textDimenAdapter1 = adapter + } override fun onDraw(canvas: Canvas?) { super.onDraw(canvas) - if (canvas == null) return + if (canvas == null || ::items.isInitialized.not() || ::itemAdapter.isInitialized.not()) return var tempAngle = 0f val sweepAngle: Float = 360f / wheelSize val rotateAngle = sweepAngle / 2 + 90 - for (i in 0..7) { - // draw graphics + for (i in 0..items.size) { drawPieBackground(i, tempAngle, sweepAngle, canvas) - // drawImage(canvas, tempAngle, mWheelItems.get(i).bitmap, rotateAngle) + + val bitmap = itemAdapter.getRewardBitmap(items[i]) + if (bitmap != null) { + drawImage(canvas, tempAngle, itemAdapter.getRewardBitmap(items[i])!!, rotateAngle) + } + drawOverlayText( canvas, tempAngle, sweepAngle, - i.toString() + itemAdapter.getOverlayText(items[i]) ) drawText( canvas, tempAngle, sweepAngle, - i.toString() + itemAdapter.getRewardText(items[i]) ) drawSeparationArc(willRange, tempAngle, sweepAngle, canvas) + // prepare for next iteration tempAngle += sweepAngle paintProps.archPaint.reset() @@ -64,6 +110,48 @@ class WillView1 constructor( canvas.drawArc(willRange, tempAngle, sweepAngle, true, paintProps.archPaint) } + private fun drawImage(canvas: Canvas, tempAngle: Float, bitmap: Bitmap, rotateAngle: Float) { + // get every arc img width and angle + val imgWidth: Int = getImageWidth() + val angle: Float = ((tempAngle + 360 / wheelSize / 2) * Math.PI / 180).toFloat() + + val x: Int = + (dimenProps.center + 5 * (dimenProps.radius) / 9 * cos(angle.toDouble())).toInt() + val y: Int = + (dimenProps.center + 5 * (dimenProps.radius) / 9 * sin(angle.toDouble())).toInt() + + // create arc to draw + // setting the value of Rect + mRect.set(x - imgWidth / 2, y - imgWidth / 2, x + imgWidth / 2, y + imgWidth / 2) + + // rotate main bitmap + val px: Float = mRect.exactCenterX() + val py: Float = mRect.exactCenterY() + val ar = bitmap.width.toFloat() / bitmap.height + + mMatrix.postTranslate( + (-bitmap.width shr 1).toFloat(), + (-bitmap.height shr 1).toFloat() + ) + mMatrix.postScale( + imgWidth.toFloat() / bitmap.width, + imgWidth.toFloat() / ar / bitmap.height + ) + mMatrix.postRotate(tempAngle + rotateAngle) + mMatrix.postTranslate(px, py) + canvas.drawBitmap(bitmap, mMatrix, paintProps.bitmapPaint) + mMatrix.reset() + mRect.setEmpty() + } + + private fun getImageWidth(): Int { + val sweepAngle: Double = 360.0 / wheelSize + val angle = Math.toRadians((180 - sweepAngle) / 2) + + return (3f * (dimenProps.radius) / 4 * cos(angle)).toInt() + } + + private fun drawOverlayText( canvas: Canvas, tempAngle: Float, @@ -71,9 +159,22 @@ class WillView1 constructor( text: String ) { mPath.addArc(willRange, tempAngle, sweepAngle) - val textWidth: Float = paintProps.overlayTextPaint.measureText(text) - val hOffset: Int = (dimenProps.radius * Math.PI / wheelSize - textWidth / 2).toInt() - val vOffset: Int = dimenProps.radius / 4 - 5 + val hOffset: Int = overlayDimenAdapter1.getHOffsetOverlayText( + tempAngle, + sweepAngle, + text, + wheelSize, + paintProps, + dimenProps + ) + val vOffset: Int = overlayDimenAdapter1.getVOffsetOverLayText( + tempAngle, + sweepAngle, + text, + wheelSize, + paintProps, + dimenProps + ) canvas.drawTextOnPath( text, mPath, @@ -86,12 +187,27 @@ class WillView1 constructor( private fun drawText(canvas: Canvas, tempAngle: Float, sweepAngle: Float, text: String) { mPath.addArc(willRange, tempAngle, sweepAngle) //used global Path - val textWidth: Float = paintProps.textPaint.measureText(text) - val hOffset: Int = (dimenProps.radius * Math.PI / wheelSize - textWidth / 2).toInt() - // change this '5' number to change the radial distance of text from the center - // change this '5' number to change the radial distance of text from the center - val vOffset: Int = dimenProps.radius / 5 - 3 + + val hOffset: Int = overlayDimenAdapter1.getHOffsetOverlayText( + tempAngle, + sweepAngle, + text, + wheelSize, + paintProps, + dimenProps + ) + + val vOffset: Int = overlayDimenAdapter1.getVOffsetOverLayText( + tempAngle, + sweepAngle, + text, + wheelSize, + paintProps, + dimenProps + ) + paintProps.textPaint.color = ContextCompat.getColor(context, R.color.spinwill_text_color) + canvas.drawTextOnPath( text, mPath, @@ -99,6 +215,7 @@ class WillView1 constructor( vOffset.toFloat(), paintProps.textPaint ) + mPath.reset() } @@ -115,9 +232,18 @@ class WillView1 constructor( super.onMeasure(widthMeasureSpec, heightMeasureSpec) val width = min(measuredWidth, measuredHeight) - dimenProps.padding = - if (paddingLeft == 0) DEFAULT_PADDING else paddingLeft - dimenProps.radius = (width - (dimenProps.padding * 2)) / 2 + dimenProps.let { + it.paddingLeft = paddingLeft + it.paddingBottom = paddingBottom + it.paddingTop = paddingTop + it.paddingRight = paddingRight + } + + if ((paddingLeft == paddingRight) && (paddingTop == paddingRight) && (paddingBottom == paddingTop)) { + dimenProps.padding = paddingLeft + } + + dimenProps.radius = (width - (dimenProps.paddingLeft + dimenProps.paddingRight * 2)) / 2 dimenProps.center = width / 2 setMeasuredDimension( diff --git a/spinwill/src/main/java/com/example/spinwill/ui/adapters/WillItemUiAdapter.kt b/spinwill/src/main/java/com/example/spinwill/ui/adapters/WillItemUiAdapter.kt new file mode 100644 index 0000000..9e12b03 --- /dev/null +++ b/spinwill/src/main/java/com/example/spinwill/ui/adapters/WillItemUiAdapter.kt @@ -0,0 +1,9 @@ +package com.example.spinwill.ui.adapters + +import android.graphics.Bitmap + +interface WillItemUiAdapter { + fun getRewardText(item: T): String + fun getOverlayText(item: T): String + fun getRewardBitmap(item: T): Bitmap? +} \ No newline at end of file diff --git a/spinwill/src/main/java/com/example/spinwill/ui/defaultImpl/DimenAdapter1Impl.kt b/spinwill/src/main/java/com/example/spinwill/ui/defaultImpl/DimenAdapter1Impl.kt new file mode 100644 index 0000000..0f6c10c --- /dev/null +++ b/spinwill/src/main/java/com/example/spinwill/ui/defaultImpl/DimenAdapter1Impl.kt @@ -0,0 +1,56 @@ +package com.example.spinwill.ui.defaultImpl + +import com.example.spinwill.models.WillDimenProperties +import com.example.spinwill.models.WillPaintProperties +import com.example.spinwill.ui.DimenAdapters.OffSetDimenAdapter1 + + +class OverlayDimenAdapter1Impl : OffSetDimenAdapter1 { + override fun getHOffsetOverlayText( + tempAngle: Float, + sweepAngle: Float, + text: String, + itemsSize: Int, + paintProps: WillPaintProperties, + dimenProps: WillDimenProperties + ): Int { + val textWidth: Float = paintProps.overlayTextPaint.measureText(text) + return (dimenProps.radius * Math.PI / itemsSize - textWidth / 2).toInt() + } + + override fun getVOffsetOverLayText( + tempAngle: Float, + sweepAngle: Float, + text: String, + itemsSize: Int, + paintProps: WillPaintProperties, + dimenProps: WillDimenProperties + ): Int { + return dimenProps.radius / 4 - 5 + } +} + +class TextDimenAdapter1Impl : OffSetDimenAdapter1 { + override fun getHOffsetOverlayText( + tempAngle: Float, + sweepAngle: Float, + text: String, + itemsSize: Int, + paintProps: WillPaintProperties, + dimenProps: WillDimenProperties + ): Int { + val textWidth: Float = paintProps.overlayTextPaint.measureText(text) + return (dimenProps.radius * Math.PI / itemsSize - textWidth / 2).toInt() + } + + override fun getVOffsetOverLayText( + tempAngle: Float, + sweepAngle: Float, + text: String, + itemsSize: Int, + paintProps: WillPaintProperties, + dimenProps: WillDimenProperties + ): Int { + return dimenProps.radius / 5 - 3 + } +} \ No newline at end of file From 24692490f1fdb1123bec588c7255ed7798823459 Mon Sep 17 00:00:00 2001 From: siddharth Date: Sun, 11 Sep 2022 11:33:46 +0530 Subject: [PATCH 3/3] wheelView fixes --- .idea/misc.xml | 2 + .../java/com/example/spinwill/MainActivity.kt | 17 ++- .../example/spinwill/RemoteDatabaseImpl.kt | 32 ++--- app/src/main/res/layout/activity_main.xml | 9 +- jitpack.yml | 4 + spinwill/build.gradle | 15 +++ .../spinwill/adapter/WillPaintAdapter.kt | 7 ++ .../spinwill/models/WillPaintProperties.kt | 33 ++++- .../com/example/spinwill/ui/SpinWillView1.kt | 46 +++++++ .../java/com/example/spinwill/ui/WillView1.kt | 116 ++++++++++-------- .../ui/defaultImpl/DimenAdapter1Impl.kt | 3 +- .../src/main/res/drawable/bg_spinwill.xml | 6 + .../res/drawable/ic_spinwill_pointer.webp | Bin 0 -> 2036 bytes .../main/res/layout/layout_spinwillview1.xml | 26 ++++ spinwill/src/main/res/values/colors.xml | 2 +- 15 files changed, 230 insertions(+), 88 deletions(-) create mode 100644 jitpack.yml create mode 100644 spinwill/src/main/java/com/example/spinwill/adapter/WillPaintAdapter.kt create mode 100644 spinwill/src/main/java/com/example/spinwill/ui/SpinWillView1.kt create mode 100644 spinwill/src/main/res/drawable/bg_spinwill.xml create mode 100644 spinwill/src/main/res/drawable/ic_spinwill_pointer.webp create mode 100644 spinwill/src/main/res/layout/layout_spinwillview1.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index b50a2dc..72ac3b7 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,6 +4,8 @@ diff --git a/app/src/main/java/com/example/spinwill/MainActivity.kt b/app/src/main/java/com/example/spinwill/MainActivity.kt index 327e9a0..e1bb644 100644 --- a/app/src/main/java/com/example/spinwill/MainActivity.kt +++ b/app/src/main/java/com/example/spinwill/MainActivity.kt @@ -2,17 +2,20 @@ package com.example.spinwill import android.annotation.SuppressLint import android.graphics.Bitmap +import android.graphics.Color import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.widget.FrameLayout import android.widget.ImageView +import androidx.core.content.ContextCompat import androidx.work.* import com.example.spinwill.adapter.WillItemAdapter import com.example.spinwill.cron.SpinWillWorker import com.example.spinwill.cron.SpinWillWorkerFactory import com.example.spinwill.database.local.SpinWillLocalDbImpl import com.example.spinwill.di.SpinWillInjector +import com.example.spinwill.ui.SpinWillView1 import com.example.spinwill.ui.WillView1 import com.example.spinwill.ui.adapters.WillItemUiAdapter import com.example.spinwill.usecases.SpinWillBitmapLoadUseCaseImpl @@ -35,18 +38,26 @@ class MainActivity : AppCompatActivity() { setupDependencies() // setupWork() - setupUi() + // setupUi() setupWheelView() } private fun setupWheelView() { val layout = findViewById(R.id.frame) - val willView = WillView1(this, null) + val willView = SpinWillView1(this) layout.addView(willView) scope.launch(Dispatchers.IO) { - val result = injector.getLocalDatabase().getAllWillItems() + injector.getRepository().fetchAndUpdateWheelItem() + val result = injector.getRepository().loadBitmapAndSave() + if (result is Resource.Success && result.data != null) { + val list = result.data!! + Log.d("MainAct", "result size " + list.size) + runOnUiThread { + willView.getWillView().paintProps.textPaint.apply { + color = Color.WHITE + } willView.setItems(result.data!!) willView.setItemAdapter(object : WillItemUiAdapter { override fun getRewardText(item: SpinWillItem): String { diff --git a/app/src/main/java/com/example/spinwill/RemoteDatabaseImpl.kt b/app/src/main/java/com/example/spinwill/RemoteDatabaseImpl.kt index b108805..a479118 100644 --- a/app/src/main/java/com/example/spinwill/RemoteDatabaseImpl.kt +++ b/app/src/main/java/com/example/spinwill/RemoteDatabaseImpl.kt @@ -10,28 +10,20 @@ class RemoteDatabaseImpl : SpinWillRemoteDatabase { Log.d("App", "23") val list = mutableListOf() - list.add( - SpinWillItem( - rewardId = 1L, - rewardAmount = 100L, - rewardImage = "https://images.pexels.com/photos/2014422/pexels-photo-2014422.jpeg", - rewardText = "100 COINS" + /* + when number of items is odd it creates repetition in color of arcs + */ + for (i in 0..5) { + list.add( + SpinWillItem( + rewardId = 1L, + rewardAmount = i * 100L, + rewardImage = "https://images.pexels.com/photos/2014422/pexels-photo-2014422.jpeg", + rewardText = "${i}00" + ) ) - ) - - delay(1000L) - - list.add( - SpinWillItem( - rewardId = 1L, - rewardAmount = 100L, - rewardImage = "https://images.pexels.com/photos/2014422/pexels-photo-2014422.jpeg", - rewardText = "100 COINS" - ) - ) - + } Log.d("App", "19") - return Resource.Success(list) } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index f25536a..b64577f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -10,6 +10,7 @@ android:id="@+id/iv_1" android:layout_width="100dp" android:layout_height="100dp" + android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -18,18 +19,18 @@ android:id="@+id/iv_2" android:layout_width="200dp" android:layout_height="200dp" + android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/iv_1" /> + app:layout_constraintTop_toTopOf="parent" /> \ No newline at end of file diff --git a/jitpack.yml b/jitpack.yml new file mode 100644 index 0000000..1bfc0d7 --- /dev/null +++ b/jitpack.yml @@ -0,0 +1,4 @@ +jdk: + - openjdk11 +before_install: + - ./scripts/prepareJitpackEnvironment.sh \ No newline at end of file diff --git a/spinwill/build.gradle b/spinwill/build.gradle index 7176542..471180e 100644 --- a/spinwill/build.gradle +++ b/spinwill/build.gradle @@ -4,6 +4,7 @@ plugins { id 'kotlin-android' id 'kotlin-android-extensions' id 'kotlin-kapt' + id 'maven-publish' } android { @@ -58,4 +59,18 @@ dependencies { testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' +} + +afterEvaluate { + publishing { + publications { + release(MavenPublication) { + from components.release + + groupId = 'com.github.sidsharma2002' + artifactId = 'SpinWill' + version = '0.1' + } + } + } } \ No newline at end of file diff --git a/spinwill/src/main/java/com/example/spinwill/adapter/WillPaintAdapter.kt b/spinwill/src/main/java/com/example/spinwill/adapter/WillPaintAdapter.kt new file mode 100644 index 0000000..0024599 --- /dev/null +++ b/spinwill/src/main/java/com/example/spinwill/adapter/WillPaintAdapter.kt @@ -0,0 +1,7 @@ +package com.example.spinwill.adapter + +import android.graphics.Paint + +interface WillPaintAdapter { + fun setPaintProperties(paint: Paint) +} \ No newline at end of file diff --git a/spinwill/src/main/java/com/example/spinwill/models/WillPaintProperties.kt b/spinwill/src/main/java/com/example/spinwill/models/WillPaintProperties.kt index 2910339..e0d8ec3 100644 --- a/spinwill/src/main/java/com/example/spinwill/models/WillPaintProperties.kt +++ b/spinwill/src/main/java/com/example/spinwill/models/WillPaintProperties.kt @@ -1,11 +1,34 @@ package com.example.spinwill.models import android.graphics.Paint +import com.example.spinwill.adapter.WillPaintAdapter data class WillPaintProperties( - val archPaint: Paint = Paint(), - val textPaint: Paint = Paint(), - val overlayTextPaint: Paint = Paint(), - val separationArchPaint: Paint = Paint(), - val bitmapPaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.DITHER_FLAG or Paint.FILTER_BITMAP_FLAG) + val archPaint: Paint = Paint().apply { + isAntiAlias = true + isDither = true + style = Paint.Style.FILL_AND_STROKE + }, + val textPaint: Paint = Paint().apply { + isAntiAlias = true + isDither = true + letterSpacing = 0.1f + }, + val overlayTextPaint: Paint = Paint().apply { + isAntiAlias = true + isDither = true + letterSpacing = 0.1f + }, + val separationArchPaint: Paint = Paint().apply { + style = Paint.Style.STROKE + isAntiAlias = true + isDither = true + }, + val bitmapPaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.DITHER_FLAG or Paint.FILTER_BITMAP_FLAG), + + var archPaintAdapter: WillPaintAdapter? = null, + var textPaintAdapter: WillPaintAdapter? = null, + var overlayTextPaintAdapter: WillPaintAdapter? = null, + var separationArchPaintAdapter: WillPaintAdapter? = null, + var bitmapPaintAdapter: WillPaintAdapter? = null ) \ No newline at end of file diff --git a/spinwill/src/main/java/com/example/spinwill/ui/SpinWillView1.kt b/spinwill/src/main/java/com/example/spinwill/ui/SpinWillView1.kt new file mode 100644 index 0000000..f5f5278 --- /dev/null +++ b/spinwill/src/main/java/com/example/spinwill/ui/SpinWillView1.kt @@ -0,0 +1,46 @@ +package com.example.spinwill.ui + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.widget.FrameLayout +import androidx.annotation.ColorRes +import androidx.annotation.IdRes +import androidx.constraintlayout.widget.ConstraintLayout +import com.example.spinwill.R +import com.example.spinwill.ui.adapters.WillItemUiAdapter + +class SpinWillView1 constructor( + context: Context +) : ConstraintLayout(context) { + + private lateinit var willView1: WillView1 + + init { + val parentView = + LayoutInflater.from(context).inflate(R.layout.layout_spinwillview1, null, false) + willView1 = WillView1(context, null) + val parentLayout: FrameLayout = parentView.findViewById(R.id.container) + parentLayout.addView(willView1) + addView(parentView) + postInvalidate() + } + + fun setItems(data: List) { + willView1.setItems(data) + willView1.invalidate() + } + + fun setItemAdapter(willItemUiAdapter: WillItemUiAdapter) { + willView1.setItemAdapter(willItemUiAdapter) + willView1.invalidate() + } + + fun getWillView(): WillView1 { + return willView1 + } + + fun setTextColor(@IdRes color: Int) { + willView1.paintProps.textPaint.color = color + } +} \ No newline at end of file diff --git a/spinwill/src/main/java/com/example/spinwill/ui/WillView1.kt b/spinwill/src/main/java/com/example/spinwill/ui/WillView1.kt index dfb5209..9433e58 100644 --- a/spinwill/src/main/java/com/example/spinwill/ui/WillView1.kt +++ b/spinwill/src/main/java/com/example/spinwill/ui/WillView1.kt @@ -7,6 +7,7 @@ import android.view.View import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat import com.example.spinwill.R +import com.example.spinwill.adapter.WillPaintAdapter import com.example.spinwill.models.WillDimenProperties import com.example.spinwill.models.WillGradient import com.example.spinwill.models.WillPaintProperties @@ -15,6 +16,7 @@ import com.example.spinwill.ui.adapters.WillItemUiAdapter import com.example.spinwill.ui.defaultImpl.OverlayDimenAdapter1Impl import com.example.spinwill.ui.defaultImpl.TextDimenAdapter1Impl import com.example.spinwill.utils.dp +import kotlin.math.PI import kotlin.math.cos import kotlin.math.min import kotlin.math.sin @@ -27,6 +29,10 @@ class WillView1 constructor( attributeSet: AttributeSet? ) : View(context, attributeSet) { + companion object { + const val DEF_BORDER_PERCENT = 3f + } + private var wheelSize: Int = 0 /** @@ -49,8 +55,8 @@ class WillView1 constructor( } private val dimenProps = WillDimenProperties() - private val paintProps = WillPaintProperties() - private val gradientProps = WillGradient() + val paintProps = WillPaintProperties() + val gradientProps = WillGradient() private var willRange = RectF() private var mPath = Path() private var mRect = Rect() @@ -76,7 +82,8 @@ class WillView1 constructor( val sweepAngle: Float = 360f / wheelSize val rotateAngle = sweepAngle / 2 + 90 - for (i in 0..items.size) { + for (i in items.indices) { + // drawPieBackgroundBorder(canvas) drawPieBackground(i, tempAngle, sweepAngle, canvas) val bitmap = itemAdapter.getRewardBitmap(items[i]) @@ -97,7 +104,6 @@ class WillView1 constructor( itemAdapter.getRewardText(items[i]) ) drawSeparationArc(willRange, tempAngle, sweepAngle, canvas) - // prepare for next iteration tempAngle += sweepAngle paintProps.archPaint.reset() @@ -121,7 +127,6 @@ class WillView1 constructor( (dimenProps.center + 5 * (dimenProps.radius) / 9 * sin(angle.toDouble())).toInt() // create arc to draw - // setting the value of Rect mRect.set(x - imgWidth / 2, y - imgWidth / 2, x + imgWidth / 2, y + imgWidth / 2) // rotate main bitmap @@ -148,7 +153,7 @@ class WillView1 constructor( val sweepAngle: Double = 360.0 / wheelSize val angle = Math.toRadians((180 - sweepAngle) / 2) - return (3f * (dimenProps.radius) / 4 * cos(angle)).toInt() + return (2f * (dimenProps.radius) / 4 * cos(angle)).toInt() } @@ -188,7 +193,7 @@ class WillView1 constructor( private fun drawText(canvas: Canvas, tempAngle: Float, sweepAngle: Float, text: String) { mPath.addArc(willRange, tempAngle, sweepAngle) //used global Path - val hOffset: Int = overlayDimenAdapter1.getHOffsetOverlayText( + val hOffset: Int = textDimenAdapter1.getHOffsetOverlayText( tempAngle, sweepAngle, text, @@ -197,7 +202,7 @@ class WillView1 constructor( dimenProps ) - val vOffset: Int = overlayDimenAdapter1.getVOffsetOverLayText( + val vOffset: Int = textDimenAdapter1.getVOffsetOverLayText( tempAngle, sweepAngle, text, @@ -232,18 +237,17 @@ class WillView1 constructor( super.onMeasure(widthMeasureSpec, heightMeasureSpec) val width = min(measuredWidth, measuredHeight) - dimenProps.let { - it.paddingLeft = paddingLeft - it.paddingBottom = paddingBottom - it.paddingTop = paddingTop - it.paddingRight = paddingRight - } + val padding = (width * DEF_BORDER_PERCENT / 100).toInt() - if ((paddingLeft == paddingRight) && (paddingTop == paddingRight) && (paddingBottom == paddingTop)) { - dimenProps.padding = paddingLeft + dimenProps.let { + it.paddingLeft = padding // paddingLeft + it.paddingBottom = padding // paddingBottom + it.paddingTop = padding // paddingTop + it.paddingRight = padding // paddingRight + it.padding = padding } - dimenProps.radius = (width - (dimenProps.paddingLeft + dimenProps.paddingRight * 2)) / 2 + dimenProps.radius = (width - (dimenProps.paddingLeft + dimenProps.paddingRight)) / 2 dimenProps.center = width / 2 setMeasuredDimension( @@ -255,49 +259,53 @@ class WillView1 constructor( } private fun initComponents() { - paintProps.archPaint.apply { - isAntiAlias = true - isDither = true - color = ContextCompat.getColor(context, R.color.coin_txt) - strokeWidth = 0.01f - style = Paint.Style.FILL_AND_STROKE + if (paintProps.archPaintAdapter != null) { + paintProps.archPaintAdapter!!.setPaintProperties(paintProps.archPaint) + } else { + paintProps.archPaint.apply { + color = ContextCompat.getColor(context, R.color.coin_txt) + strokeWidth = 0.01f + } } - paintProps.textPaint.apply { - isAntiAlias = true - isDither = true - typeface = ResourcesCompat.getFont( - context, - R.font.montserrat_extrabolditalic - ) - textSize = 20.dp() - letterSpacing = 0.1f + if (paintProps.textPaintAdapter != null) { + paintProps.textPaintAdapter!!.setPaintProperties(paintProps.textPaint) + } else { + paintProps.textPaint.apply { + typeface = ResourcesCompat.getFont( + context, + R.font.montserrat_extrabolditalic + ) + textSize = (dimenProps.radius * 1.5 / 9).toFloat() + } } - paintProps.overlayTextPaint.apply { - color = ContextCompat.getColor( - context, - R.color.spinwill_overalytext_color - ) - isAntiAlias = true - isDither = true - typeface = ResourcesCompat.getFont( - context, - R.font.montserrat_extrabolditalic - ) - textSize = 45.dp() - letterSpacing = 0.1f + if (paintProps.overlayTextPaintAdapter != null) { + paintProps.overlayTextPaintAdapter!!.setPaintProperties(paintProps.overlayTextPaint) + } else { + paintProps.overlayTextPaint.apply { + color = ContextCompat.getColor( + context, + R.color.spinwill_overalytext_color + ) + typeface = ResourcesCompat.getFont( + context, + R.font.montserrat_extrabolditalic + ) + textSize = (dimenProps.radius * 3 / 9).toFloat() + } } - paintProps.separationArchPaint.apply { - style = Paint.Style.STROKE - color = ContextCompat.getColor( - context, - R.color.spinwill_arc_seperation_line - ) - isAntiAlias = true - isDither = true - strokeWidth = 3f + if (paintProps.separationArchPaintAdapter != null) { + paintProps.separationArchPaintAdapter!!.setPaintProperties(paintProps.separationArchPaint) + } else { + paintProps.separationArchPaint.apply { + color = ContextCompat.getColor( + context, + R.color.spinwill_arc_seperation_line + ) + strokeWidth = dimenProps.radius / 55f + } } val padding = dimenProps.padding.toFloat() diff --git a/spinwill/src/main/java/com/example/spinwill/ui/defaultImpl/DimenAdapter1Impl.kt b/spinwill/src/main/java/com/example/spinwill/ui/defaultImpl/DimenAdapter1Impl.kt index 0f6c10c..8e86eab 100644 --- a/spinwill/src/main/java/com/example/spinwill/ui/defaultImpl/DimenAdapter1Impl.kt +++ b/spinwill/src/main/java/com/example/spinwill/ui/defaultImpl/DimenAdapter1Impl.kt @@ -40,7 +40,8 @@ class TextDimenAdapter1Impl : OffSetDimenAdapter1 { dimenProps: WillDimenProperties ): Int { val textWidth: Float = paintProps.overlayTextPaint.measureText(text) - return (dimenProps.radius * Math.PI / itemsSize - textWidth / 2).toInt() + val h = (2 * dimenProps.radius * Math.PI / itemsSize - textWidth / 2).toInt() + return h / 2 } override fun getVOffsetOverLayText( diff --git a/spinwill/src/main/res/drawable/bg_spinwill.xml b/spinwill/src/main/res/drawable/bg_spinwill.xml new file mode 100644 index 0000000..e44d071 --- /dev/null +++ b/spinwill/src/main/res/drawable/bg_spinwill.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/spinwill/src/main/res/drawable/ic_spinwill_pointer.webp b/spinwill/src/main/res/drawable/ic_spinwill_pointer.webp new file mode 100644 index 0000000000000000000000000000000000000000..505dbfaf5e626bcc5b9e6917f9344d5d7fd5def7 GIT binary patch literal 2036 zcmVJyn3VsIWD=fD9EGf!xla(sRt(qv8&%?BZ3$+i_Zj%GWT8ELT?^ z$L9fRe8^@XY8}kPB|}e!3y(dhc`u8mCS9hc3@qNE_IDQaCL_Vgy9Rr8v;oio~~)s8>m?vL1!! zNd7s2G01SVHt!q`Io`UCAT5P^>`C_GGF0!4YA*7g3afrH0$oQhN4#>KL zB8PZh@pfv~A@j9L;>x*|$EkRT>>nzag96SnE2Kbzf)I0VqlmZ77>+`YFyxynMXsNb zYbfSb1I19U}k z2LNoB=P>0RIgxmm|;hf3Qi8IbhH&SBgY?BQRfzkzm;7kqlQY zjDg2*2|hW1xiNYCGJ?VUcKn)x$`Rapf!fWy)`IGjoKAuIB_=MW6`-?Q36GL)ptn&H zhonZJ+xHc{XTG4{{tUGM0#(c5@l^f{vjoESGcze#oAR+|- z0I(eZodGIT0B-<3Z7z~VBqFM$toEDHPz{M@25@755DJl-ZuURQE`07l?+4@tXcvk8 zxBg4+JGW=scen@XXX{^CuP`2XzJmP#KWF;DJpeqhe{a4IKXQL?F&}@ueE>lL*pz1q zwwc$D8Z3Q%`T!${^r?^boBG|_zPY#_Br82uhi0rwbtRb#`bP)YBu$!eHN%-&i})Rx zIyWvk#K$z#i4Q>kAFNiJddc_^y?lCDobB75B1ric(N{LqTVgl4lJ(J; zKTOgQ*~dq+8C}oJusGew5_2;{hwAHweG_E+)&at9T74sVd@G2khjD(sQCsQ(zKzG% zu=sbL!O zVo0S~CM5C^?7LS}WQrwJXJBc_thU)IKM;wXGyoGk2G9jiTblIz)Abdueg3}ug)98u z-sH~Ye}lICNP!XH#n956StL=1Gk#7%^(+1Zx%HCk`w7|Rd6i)q{$_9biiRlx&>1&S zI9EBT8(yz___aVUWr`8;58pssAV*-A$v>K&NCZud{J-N$n7?GA?uoI4aG`q= zZ#su8E2v)gtpm8G4Y=avXg`3W9s)wR(0Yn=(a=@UhL4g)9gyS9uQG@Rq7xUx;8XSi zyMGR674P-u|JJnj>dK-YyT-3VeSynKQ$w8Ea3N-^^F3O{y!{>(2VJ%P|6EFt>Jk5w zMF?Q8my|z1W1a6TF|(whYbq{Q%~qzN>|XQ=Vbi73x7{wr0=hmDvMurO$BH6~ly*Z& zxAtczCR+AN7@-%h+(|-Y|KC$BYDaNuCC8}WOL-opk8QTjehWbxV7aFSIB5%jc zVvMCg{)_DnEx;yLbi4JLU*J>+)1x$=>~~2v_rcNirL0FZYKftkrd|Au6vSq2ix4cR znjPZXTG$bTUB-uXrHk;!h4Wb?mog8;&~jIY^3JmR{5Slwga7}xfDM1XZU3U~7D11Y znRN40ehT{!WXY8)0q#qQJ0?JJYI%&=wImXHJECZzXV8yC%2EXJ15fYK9ej@r8-u~m3Tic}9 zgedo~(L{C~UYQPK@TGgWL~(9Thm-f81L7swX-s1hus zYX=zqKi~;PeK<-czWsnDqiv;BpZw!QH + + + + + + + \ No newline at end of file diff --git a/spinwill/src/main/res/values/colors.xml b/spinwill/src/main/res/values/colors.xml index 829b48c..e917c79 100644 --- a/spinwill/src/main/res/values/colors.xml +++ b/spinwill/src/main/res/values/colors.xml @@ -9,7 +9,7 @@ #FFFFFFFF #fbb42a #12770E00 - #80E08720 + #FCDEA667 #FFC87E #F4C21A #FDE79E