From cbe91c84e9037c06e3c649c0addf9ec379e1ec47 Mon Sep 17 00:00:00 2001 From: 18401019693 Date: Tue, 4 Jul 2023 16:02:45 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BA=A2=E5=8C=85=E5=85=A8=E6=9C=8D=E9=80=9A?= =?UTF-8?q?=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/event/AllServerNotifyEvent.java | 13 ++++- .../yunbao/common/views/CenterImageSpan.java | 52 ++++++++++++++++++ common/src/main/res/values/strings.xml | 1 + gradle.properties | 8 +-- .../live/presenter/LiveGiftAnimPresenter.java | 42 ++++++++------ .../yunbao/live/socket/SocketRyClient.java | 13 ++++- .../yunbao/live/utils/AllMsgTextRender.java | 51 +++++++++++++++-- .../main/res/mipmap-mdpi/backdrop_luck.png | Bin 0 -> 9414 bytes live/src/main/res/mipmap-mdpi/icon_luck.png | Bin 0 -> 5054 bytes 9 files changed, 152 insertions(+), 28 deletions(-) create mode 100644 common/src/main/java/com/yunbao/common/views/CenterImageSpan.java create mode 100644 live/src/main/res/mipmap-mdpi/backdrop_luck.png create mode 100644 live/src/main/res/mipmap-mdpi/icon_luck.png diff --git a/common/src/main/java/com/yunbao/common/event/AllServerNotifyEvent.java b/common/src/main/java/com/yunbao/common/event/AllServerNotifyEvent.java index c4baf0d10..c4580cd8b 100644 --- a/common/src/main/java/com/yunbao/common/event/AllServerNotifyEvent.java +++ b/common/src/main/java/com/yunbao/common/event/AllServerNotifyEvent.java @@ -34,6 +34,17 @@ public class AllServerNotifyEvent extends BaseModel { //主播名字 @SerializedName("ancherName") private String anchorName; + // 是否是红包 + private boolean isRedPacket = false; + + public boolean isRedPacket() { + return isRedPacket; + } + + public AllServerNotifyEvent setRedPacket(boolean redPacket) { + isRedPacket = redPacket; + return this; + } public String getAnchorName() { return anchorName; @@ -137,6 +148,6 @@ public class AllServerNotifyEvent extends BaseModel { ", blindBoxId='" + blindBoxId + '\'' + "\n" + ", boxType='" + boxType + '\'' + "\n" + ", displaySrc='" + displaySrc + '\'' + "\n" + - '}' + "\n" ; + '}' + "\n"; } } diff --git a/common/src/main/java/com/yunbao/common/views/CenterImageSpan.java b/common/src/main/java/com/yunbao/common/views/CenterImageSpan.java new file mode 100644 index 000000000..73b6ed654 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/CenterImageSpan.java @@ -0,0 +1,52 @@ +package com.yunbao.common.views; + +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.text.style.ImageSpan; + +import org.jetbrains.annotations.NotNull; + +public class CenterImageSpan extends ImageSpan { + + public CenterImageSpan(Drawable arg1) { + super(arg1); + } + + public int getSize(@NotNull Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) { + + Drawable d = getDrawable(); + Rect rect = d.getBounds(); + + if (fm != null) { + Paint.FontMetricsInt fmPaint = paint.getFontMetricsInt(); + int fontHeight = fmPaint.bottom - fmPaint.top; + int drHeight = rect.bottom - rect.top; + + int top = drHeight / 2 - fontHeight / 4; + int bottom = drHeight / 2 + fontHeight / 4; + + fm.ascent = -bottom; + fm.top = -bottom; + fm.bottom = top; + fm.descent = top; + } + + return rect.right; + } + + @Override + public void draw(@NotNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NotNull Paint paint) { + + Drawable b = getDrawable(); + canvas.save(); + int transY = 0; + transY = ((bottom - top) - b.getBounds().bottom) / 2 + top; + canvas.translate(x, transY); + b.draw(canvas); + canvas.restore(); + } +} + + diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index 118d24ee2..dfc5465a4 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -1247,4 +1247,5 @@ Limited ride And limited avatar frame 很遺憾 與紅包擦肩而過 查看大家手氣 + %s 在 好運紅包 中抽到了 %s diff --git a/gradle.properties b/gradle.properties index 3265ac671..a5066c177 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,8 +19,8 @@ org.gradle.configureondemand=true android.useAndroidX=true android.enableJetifier=true -systemProp.http.proxyHost=127.0.0.1 -systemProp.https.proxyHost=127.0.0.1 -systemProp.https.proxyPort=7890 -systemProp.http.proxyPort=7890 +#systemProp.http.proxyHost=127.0.0.1 +#systemProp.https.proxyHost=127.0.0.1 +#systemProp.https.proxyPort=7890 +#systemProp.http.proxyPort=7890 #android.enableR8.fullMode=true \ No newline at end of file diff --git a/live/src/main/java/com/yunbao/live/presenter/LiveGiftAnimPresenter.java b/live/src/main/java/com/yunbao/live/presenter/LiveGiftAnimPresenter.java index f0e3bfa81..214e22522 100644 --- a/live/src/main/java/com/yunbao/live/presenter/LiveGiftAnimPresenter.java +++ b/live/src/main/java/com/yunbao/live/presenter/LiveGiftAnimPresenter.java @@ -913,24 +913,32 @@ public class LiveGiftAnimPresenter { mGifGiftTipGroupAllServer.setVisibility(View.VISIBLE); AllServerNotifyEvent serverNotifyEvent = bean.getEvent(); - switch (Integer.parseInt(serverNotifyEvent.getBoxType())) { - case 1: - bgAllServer.setBackgroundResource(R.mipmap.bg_kirin_notify); - mIvLook.setBackgroundResource(R.drawable.bg_all_server_336cf7); - break; - case 2: - bgAllServer.setBackgroundResource(R.mipmap.bg_phoenix_notify); - mIvLook.setBackgroundResource(R.drawable.bg_all_server_fd5a9d); - break; - default: - bgAllServer.setBackgroundResource(R.mipmap.bg_dragon_notify); - mIvLook.setBackgroundResource(R.drawable.bg_all_server_fcb50e); - break; + if (serverNotifyEvent.isRedPacket()) { + mIvLook.setVisibility(View.GONE); + bgAllServer.setBackgroundResource(R.mipmap.backdrop_luck); + superNotice.setBackgroundResource(R.mipmap.icon_luck); + textRender.redPacket(mContext, mGifGiftTipAllServer, serverNotifyEvent); + } else { + switch (Integer.parseInt(serverNotifyEvent.getBoxType())) { + case 1: + bgAllServer.setBackgroundResource(R.mipmap.bg_kirin_notify); + mIvLook.setBackgroundResource(R.drawable.bg_all_server_336cf7); + break; + case 2: + bgAllServer.setBackgroundResource(R.mipmap.bg_phoenix_notify); + mIvLook.setBackgroundResource(R.drawable.bg_all_server_fd5a9d); + break; + + default: + bgAllServer.setBackgroundResource(R.mipmap.bg_dragon_notify); + mIvLook.setBackgroundResource(R.drawable.bg_all_server_fcb50e); + break; + } + mIvLook.setText(R.string.participate_in); + mIvLook.setVisibility(View.VISIBLE); + superNotice.setBackgroundResource(R.mipmap.icon_blind_box_headlines); + textRender.blindBoxText(mContext, mGifGiftTipAllServer, serverNotifyEvent); } - mIvLook.setText(R.string.participate_in); - superNotice.setBackgroundResource(R.mipmap.icon_blind_box_headlines); - mIvLook.setVisibility(View.VISIBLE); - textRender.blindBoxText(mContext, mGifGiftTipAllServer, serverNotifyEvent); mGifGiftTipShowAnimatorAllServer.start(); mGifGiftTipAllServer.postDelayed(() -> { if (mGifGiftTipAllServer != null) { diff --git a/live/src/main/java/com/yunbao/live/socket/SocketRyClient.java b/live/src/main/java/com/yunbao/live/socket/SocketRyClient.java index 66360c995..427a8439a 100644 --- a/live/src/main/java/com/yunbao/live/socket/SocketRyClient.java +++ b/live/src/main/java/com/yunbao/live/socket/SocketRyClient.java @@ -384,6 +384,17 @@ public class SocketRyClient { Bus.get().post(new LiveAudienceEvent() .setType(LiveAudienceEvent.LiveAudienceType.BLIND_BOX) .setAllServerNotifyEvent(allServerNotifyEvent)); + } else if (action2 == 89) {//红包 + JSONObject mCt = map.getJSONObject("ct"); + AllServerNotifyEvent allServerNotifyEvent + = new AllServerNotifyEvent() + .setUserNiceName(mCt.getString("user_nicename")) + .setGiftName(mCt.getString("giftname")) + .setGiftIcon(mCt.getString("gifticon")) + .setRedPacket(true); + Bus.get().post(new LiveAudienceEvent() + .setType(LiveAudienceEvent.LiveAudienceType.BLIND_BOX) + .setAllServerNotifyEvent(allServerNotifyEvent)); } break; case Constants.SOCKET_SEND_BARRAGE://发弹幕 @@ -834,7 +845,7 @@ public class SocketRyClient { chatBean.setContentColor(map.getString("contentColor"));//文字内容颜色 chatBean.setAtUserName(map.getString("atUserName"));//@名字 chatBean.setAtUserID(map.getString("atUserID"));//@ID - if (map.containsKey("guard_type")&&!map.getString("guard_type").equals("undefined")) { + if (map.containsKey("guard_type") && !map.getString("guard_type").equals("undefined")) { chatBean.setGuardType(map.getIntValue("guard_type")); } try { diff --git a/live/src/main/java/com/yunbao/live/utils/AllMsgTextRender.java b/live/src/main/java/com/yunbao/live/utils/AllMsgTextRender.java index 8c3d979b5..2f82bff2e 100644 --- a/live/src/main/java/com/yunbao/live/utils/AllMsgTextRender.java +++ b/live/src/main/java/com/yunbao/live/utils/AllMsgTextRender.java @@ -15,6 +15,7 @@ import com.yunbao.common.custom.VerticalImageSpan; import com.yunbao.common.event.AllServerNotifyEvent; import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.utils.DpUtil; +import com.yunbao.common.views.CenterImageSpan; import com.yunbao.live.R; import com.yunbao.live.presenter.LiveGiftAnimPresenter; @@ -128,6 +129,46 @@ public class AllMsgTextRender { } } + public void redPacket(Context context, TextView textView, AllServerNotifyEvent serverNotifyEvent) { + String space = " "; + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(); + String extractTo = context.getString(R.string.lucky_red_envelope); + extractTo = String.format(extractTo, serverNotifyEvent.getUserNiceName(), serverNotifyEvent.getGiftName()); + spannableStringBuilder.append(extractTo); + int indexImage = spannableStringBuilder.length(); + int endImage = indexImage + space.length(); + spannableStringBuilder.append(space); + + int giftNameIndex = spannableStringBuilder.toString().indexOf(serverNotifyEvent.getGiftName()); + int endName = giftNameIndex + serverNotifyEvent.getGiftName().length(); + ImgLoader.displayDrawable(context, serverNotifyEvent.getGiftIcon(), new ImgLoader.DrawableCallback() { + @Override + public void onLoadSuccess(Drawable drawable) { + + + spannableStringBuilder.setSpan(new ForegroundColorSpan(Color.parseColor("#FBC870")), + giftNameIndex, + endName, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + + drawable.setBounds(0, 0, DpUtil.dp2px(25), DpUtil.dp2px(25)); + //用这个drawable对象代替字符串easy + CenterImageSpan span = new CenterImageSpan(drawable); + spannableStringBuilder.setSpan(span, indexImage, endImage, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + textView.setText(spannableStringBuilder); + } + + @Override + public void onLoadFailed() { + spannableStringBuilder.setSpan(new ForegroundColorSpan(Color.parseColor("#FBC870")), + giftNameIndex, + endName, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + textView.setText(spannableStringBuilder); + } + }); + } + /** * 盲盒字体组装 * @@ -161,12 +202,12 @@ public class AllMsgTextRender { //用这个drawable对象代替字符串easy ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); spannableStringBuilder.setSpan(span, indexImage, endImage, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); - blind(spannableStringBuilder,textView,serverNotifyEvent,giftNameIndex,endName); + blind(spannableStringBuilder, textView, serverNotifyEvent, giftNameIndex, endName); } @Override public void onLoadFailed() { - blind(spannableStringBuilder,textView,serverNotifyEvent,giftNameIndex,endName); + blind(spannableStringBuilder, textView, serverNotifyEvent, giftNameIndex, endName); } }); } else { @@ -181,19 +222,19 @@ public class AllMsgTextRender { //用这个drawable对象代替字符串easy ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); spannableStringBuilder.setSpan(span, indexImage, endImage, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); - blind(spannableStringBuilder,textView,serverNotifyEvent,giftNameIndex,endName); + blind(spannableStringBuilder, textView, serverNotifyEvent, giftNameIndex, endName); } @Override public void onLoadFailed() { - blind(spannableStringBuilder,textView,serverNotifyEvent,giftNameIndex,endName); + blind(spannableStringBuilder, textView, serverNotifyEvent, giftNameIndex, endName); } }); } } - private void blind( SpannableStringBuilder spannableStringBuilder, TextView textView, AllServerNotifyEvent serverNotifyEvent, int giftNameIndex,int endName) { + private void blind(SpannableStringBuilder spannableStringBuilder, TextView textView, AllServerNotifyEvent serverNotifyEvent, int giftNameIndex, int endName) { switch (Integer.parseInt(serverNotifyEvent.getBoxType())) { case 1: spannableStringBuilder.setSpan(new ForegroundColorSpan(Color.parseColor("#336DF7")), diff --git a/live/src/main/res/mipmap-mdpi/backdrop_luck.png b/live/src/main/res/mipmap-mdpi/backdrop_luck.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d2e84b41024a03f4ca0ad69282e5714617bcec GIT binary patch literal 9414 zcmV;%BstrOP)7uf6&8y}Ip{MD!LS`cWeKZX$XU5uJ^{iilo)oSOp& z4m^2qva9F$Z^El7eCA}EIb9ArZ(x=pi4tcMu>Jgh=F8s8Hg7v!D?IOre!%yut?PG& z`Z@1Uoa;H|I@MPuI;C7U=VPNEQqR>7X7L*Ql8#}sec5^f8@ak9n@;EBqyZNXTpwwj zbgd&LYtJT#=eZS2%hy0Uv!$Lvzrv0!{O^TYU-!_ak`H5kZPhj`->aXt>F@s`qAwHC ze-Y7Vi0Ge*=;K862_pJRj|%vsU#D;AVJMU4pCO`OAfg{9qF40jqo?#+J#gT;<1v1( z3=9Mzq)iTiv3UOXawf}} zbV@Tgm?k!IuG@fsUkw9Em-;h#Rv*rFTw6s#zDX)H(k!-;^8@eJq&AGVd&b<2JlB$y z(qyRxbIYwwm`Y_*p@W~&4}7pq4clwWFGb1bSUt65yM>h3)HBykjm^Gzb^iBlMD)F2 z`Kv_qcSQ8(MD*86rf0TisRI2PBKmbA`ZXeYanHQ+jWdXNpQR5Nsg8qH_CsP&GCs+>u=leQ*+T%a?Yz zeL}h}^+TONvag4Qev0jI{g7^n?AloCVvxd6Jrv#bd|AWpJ?mZ*ttxmg+)r)&91;Bi z5q*e=UTQ6TR-jK6$CYp{_p3zoSt9z~{gLNGx85V30(D$>d=pws%q#463ML4G8@qZ6rJO@!=&%4-|R`e zYuU-kzt=w}`NkUBA(ICs-npKu5*_;L(l1`MMgs26iE9h?e*@x49(uq~gB}ApPIUH$ zp*9Z9Pvf>N+EgNXJ?)O!TRQ%F*f?ZnRG#mrwnoB3=rAD%;? zzmteQNkktZqSv zPAIC|Fk@_&{4V-Fb0Rxb_x%aTYcrqyhsfqp9yeVT}VV7bo+rf?A31Iw}P z+3hiAcQyT0!kCoLW~L|yWbS(B1V| zktPRWGm=gs7ZYr(eBdskp%tKd2SO>TwpuvdhDr!2Pd7w0#zd#EFG0$Xl*2vf)@BaW zNK6o(5!=C;xSNoi93KwhDXOfGsA;{G$7pcK{^%qAULzRn6y`LeSWLhGV|BNLzSI!y z8fA2>d<*t`gT0GtJ%U<)ZXZxJ)-$1;_r`4J z$HJoq_8b9Af{wpfry|3hT{}A~vYAvXF$Ho+nNVt)I`#5a@Rk(K{-R>xzRE9O#X)d)_^<)Tcd8^zPHoooZ!x46muzlEpxa8ZC7KNnnj@ zPENc|IU@y<<|MJmNSG;*af+&pCXKWDRei?X%=XV>uR*=$LOq1vg&kwsz2uLPEE|`w z4EcS5FXB6>+X?H=OU-4W<-U64Cprob8N5{XMV-_BgJNr#CwS zd*aL@73(!0LL%fFq_WLQ*2G>QMDm|hk@xwjnL*iRNNdO9hvme!aP1&diEU{c=6fC*Ok;y=jabUo7~AKB z)UhL`6z{1M5qA$wbZYCYL2t5JLxQKmboMeH<&t(Y(OQ5d{oVHN!}~NQx_~hPeSRD9 zkDtS3;W5<8c_c7#_h|nmKm$Ckbs)CEM&c5nHAe9NJlGpL96G zX~52FJ&h$Sy74Y3yB7BH1KhN43YE2xv$?*;N!e6f`j}cC%MbZDM*h3@`N{(ceI1(| z^o)0JY7!59J%9QW&CU^Q4iV_{_CK>11|OT8-M@7`JlOh5dJy&l4>Stm<2_Ymebxtz zZN@_gVvG|QO@-KG4edb1bt;Sjh_yy#YnX^Bz)YTC$0fL(5QIvxBf+qbj7T#yM3wW) z_N=FK@R`83o6d%?4lL&m4#a*4Q#azC%GXdG_p;Gj$=eGdpA)LlYO57-9L*)_Tv@)< z243qN%}5U^s4bVm1*p{iF2B!;YepMh$b9$|`+tZ)|MEFi9Yp1I^P~o)OYYM}?NsTh zwfXV1$N4xW6TNWPQN{V?JRpez3_-XAC8T6z_>y@eIk6Y7ogCtgEuVC>4kT7n*d+~` zPC#lkWnM0y*pv4}=~n4wxc`bRz4SniYiTI@mMnxLfsK?*fsQXT+LGjhfWWF!$WI zP@GM)!d33a=hV%=63v$g^m+a8-&@U%3h>h!etq|>4yPl_t2&#;TNrTBWj;U^|~#ao%d#btSAxaw-eFpI#s;@ z+m4DoJdHbW;K0T}1(kwY8*a=gAMCcD-xd?I*2(eElZk%g>^CW0c=832K>rjGeRH>}4jeeJD%QAHr^2T#aF=%< zR6PZD;MlJx%MxV~SM*~I`>>FXxE~c_#+3z$yxa}UnvuOQD`A!YYtjlK$|R)OmM1}# zdyv>_*aths+SK_3N;kU~{}Qw(25Ok^vA;R%*S|tmIjh1+3F~ElB6mEFV&v<5f=~!q z1Vt2ECBLWu8!1&ann>01%fAy9;+a8JW~oso0p2Dqy)Aw?rhH1b z-5V>H-hRET1se+APY;d#aa9SO}=avO*x*yPY9~EFDP3m9U53G#f$ZlX)iPT(0Lp zK5woK33@4kAGD(%I2XuNuW*Q2{!~bbvy{_bSMC8jOU&1j&D!!cHfqBoN+B&ZZEXp^ zXtg~DJ)ZOo`BrUvh7)V4`qTCP1QETG0)hVFOroC!4)wf04q|&?IaVIU7(yU~6IR^w zgE)CU2wyC_gjZ+9F6X!kQ;>~xySiQI1`zCIYV%p$z9`cWV!^0P6TXnh`rTAsP=Zs5 z#OKzcFiaM!tZg8a(yfoskj0Hdos4_Da&HRyTx>C3LR05H{*LyB(9|Rz{aWQ;k(kc` z4yIujoBW&O+F0GSeOseK^T07Z$HJ21w?t3hwtNDWCVtmtoO$wFC=lo$TjcPrFx`8H zdfunT$C-#cD*ZpEHMg*s1m%UwYV1Zm6hJ*JTNbfbsLI%TuRg}cSZR2a-0;@@hk1ylZv5&os;Z>^hZ&nE%0tyWEM zsi21xv6sMgsjk3*6orwx@NEsAx~)k(RvK=NVk?RsVK9xv{RC&IlZ;t2c+r zq9h#mKzuMu9%duY*BsCm_ssM%kXIn*94_3bTs!J&Bsghy3t54XEtCUDvP;S58K{xDIRkUq%A`?F*`Y z_BeFD18ZQ9$6)9^XNM zK!59|P9B(z$56YEDaU~=0r`hjk%j7k9CL!q6HIyaKzlJyvQXGdd!+fD6(`Dzt{|aK zg&QhdspCq5j7RXz^<2VE5)fJ?*O8z@L0#BIznfnSDe6*6T7V%In$<`S3CUjG2uX$5 zaFyz(e*RmkwJl0&ZLIE`N695D>4!aDV)t_M+O%&9m9?n1bA64MnJLwKOf8S)hkP9S z9dzyUl?PJk34^clMG6G^HS2m*gM(DnVDZzEUEtP}=NSfbpdZ37!;wg1c2`no;YX6! zf~AmKe%eA5k|W6Yf}zjNti<<**a}g$6myKkT~uVLpY6rQ%ioibbv7bgT#yBLxzs@z zZ|rkHC;UIucMabN3N)JqB+3_pUmyjHci!Rz0x=N>x%2`tyL>}@W~w}H!2C_w(v5to zd{6YY-GdAsXzyzt>ideZ&4u#ueAG@Xm!RiUgBFx02j4`2K!4+Q9t~mHujF38v8NOX zJnd<1Tl%;8m_BWVNA2k#xoCPW{0nivLhyhTx=;%_M!Sn4cXU3=EqU!ps?WGV&bD!S z@hN{|3k*@k+f`;cpz(O~6A8O~fNd`GM^MexHzUzP%2|6assBcf3okTc^-_8=d}3l; z^1wyD=E5Hz$<`cS>(|UftIXG^hHEM+b8OFfj6a37FIlaAEg>5%V|aB^GqYo3vC)Zf zz+T4yV%o`Y&SV}^ySW$ZaM6*XVl7|&R9#*p6yhv|+S+N9SH4?ZGihjss@W{0 zUbXnlizRf0yzdYv;!+7GtK0QYDP3CYMZ2Ve)!10=<}l;8)KX;1?tY3{^(7+<15pkM0Z=(EMPqoM}|Iw0}%X3$`kmdjIXjE4?%>E=<%`n%SfVf)h zHA?9@KQx8(cutuP&tZY&8_5U_oNp}a1B^gP3fTE)3H zN|TSZ>#V6GlFKFj%pDUgx)IN)XXxoc-0_qi4i2`dVS8=)r6~E@GSR#B>xMx8$4ahO z;3$m zBq05re0NzZz;}Gvk2SR(s?boEt2enDJ^GgN^5QJMf!dsOLcoq3Yg#n$-v zR7cx7aqjQ+RASt(&ru-I|30^x<=E=k(t!g9_J?Ix$lGw$tQe+P)q07 zseujb6^wU8bgxCdT#A|@))LMX%e12V2njs@Exs3?K zS;Iw6B5(hK>vMD^LzYVJmPQl(CO!6t9#3Fjy8Z~qrg;YAtOXe_L3l}uwkmJF0=v)u%wDh zKvOPRY^a+JrfB`yknD%_n*s?j|#R(A~vUh_iHvtL@2$l7{q>@~H4 zZ@;$oL6Mlx!GN71!dRp1FLkY!tj?)BUZaM}47Iyed0x_%>Pi~XXVQD-$)BV^pwAos zwvU%nIH=3>#QlRAj&O9y|6bN@ zm@LCcZGso_@+KguoM0gpA@>fjvLbmh?OsrndfgiJY;38tTlC{KTEzZMIo2})S5XgHCg|Rl)wtwyfaLuPj!@hhj^W+O6fj)`*F{K@bktEU={*(gi%ZoV;AEP}X{z#~OADly7uy5T; zj7!w#NumhY>M`~ZwwgCr`CQ@55Xo5DCtF_rN{ZlE)1S(vd8kb_{%<*vYw@FX|B`x! zLTYM#n}-kMyMmEGpYb6g`tMb$KCn9Wu8XcQDUUXHb&op$=y+x{2eL3fd=bvSgr`I> zWU-Ld{Vbe;jZ_0+y%BO9aYPbpO0nGwVVQ2tY{BLg*bvp*sn6I3r>-Z>vf;8~C=t%V zA*a0UL`I~QoRh1>%}0=+v#Iyqon*{?&sgJv(9-6iV{0FAFY#fBWNfXjBAUm`)IvPL z;BFM!iAsk;1#0?sFE{!rKkn&g?If#yYS7t0~t`cjEj|Mv|i=u?(sa+@tl=EQ^Ky1Ohs^KAK*oSeL zjZAk{1~#%QIi^D&Fb5(ZUNn>}Ag;^V>X8=-fzX>RpDWsJC)p2jS&tt=acC4a-t$L? zC-KsGmE(EH=i>GhKBmFlPxbd8Y0mpKYHJ|YeHl8 zg5G1DK6RhIZ0)J1OJnZk`M!E=FVCV5>>ipH!<1CQ5p<&j zTZ1kiPp~>*ieU#ykGrOT^WzYSxP?>rvN4oF?P$6;B&aFpq-L*hcVsc1b<0H@9E;kfddB) z%)<3bh_B|k+{r4|f?6Avuug3Go$*;b67385JeiuU$}^_+$aP>i28xTEU*JP!+s89Q zj%Lk}!8g7W_!R$Ph7Z#8cdW!#+L_c((UMbcpDE7xvZ5^_V?GiQgpS|@W&piN^_()T z3fi3g&3>U`-&(d2OZsdt#7{6g?B@;`Q?W~JT5BA%s?I#Ie+v|SE^NHtxqc6&3lFx5 zA-wxAMWD}kKM{R!MF)3*x-q@&S$tZP!n(dW0yOrI`<$bRI}iJ-y%OTQUz4@LLL*mh z2r94f=A4?%GFgZfRJAzQb3-7>NURa*Y$0W$&!nU_F*(JTWkC~Zi}-yCs+#)iRm|J_ z9=tF~K1+ytEUEIaARF)YnKlv@%Aa9W%#BZNDYy2ecFdPrBGO8T)@~EeI5$01+##E- z`w*)<4H&Vr#C~nxaroOCbL=kd*UBiaK@@#1Y^pSLyHBfl3-y!sYF=s}CtQ9F(1oC@B z6p|j37-N>n!ad}LJ|U3Ba0dL&>Yu98;YBkw0mR+E92gdQ!5C^1-ymE=`zVDvSo2J4 zajZ|eCFPWUD8+}qAdJoCLi?$5Fx39|x0u1Ts_0|K?dhV{>dVma&F3H$eq#ljVUM&mOgd67Y<_hh&ayb*j-`G-r)jc(=)ssKu6}CGAu%Ea{ur?ok&7DygIH-;*>ON2Ia63Tg)VT3n}rWU7@McD)0&W zAp|=ni`V9x#Mh;hL4HZ`(vYZCKlk!zek-MBtMHZHXeQP?ecs}PBib4(zi8ZqiEj_p zwN&rDZx_+8G_r5)y0^qoyKBd=Kkkc^=;t!uokUFt2jUzH@_j_~k9X{@JK!Kv&lC5* zlRdkT7YReq|6|w$TMVu$#hg`CB#tTbMBC2#-IQMre?_%Tuw?c%2Q$X~S_(SmaB0YO zTZo1%*uoaxaij2x54KFUZ8T{s1%fOpbz)0F#{~UDSXP$%#wEd_zx;yTH~sEbSdlVA zB)ana-W_{ZYHEq(Ru>0USbOx#9KYw(J5*26R)bSdMa7HPCc)CMi<-J=!^z`VyK9a& zeEPy~nf|KQuT}zm#=jEL4-wJZiRh&n<)0v)9gW!?p6eNSc2hSEmq<=__2iJQSvkTD zf{{4Jv~ZjTUNQ_T3u>G&KK9KDc*vui65X&0S@v3d)g@XOh$k+et@Y+@3HFJC9NV4= zzN|JVBD$*TutYd%NC`VHiKD470`T@=2Q?S92F#8M`Mugefv($Iz%o<5k@WmGim1|*|yTXDn zI*B0P20yt77#ku(>Q@W4xbe2CaeEH0Si5YEUqklSP(7plr(knU)STO~Hmx-wtF^mD ze|uj(pZV(>FMO6Sytc{4TmmgPFKhTaMD&L9!Yf4dF(Ufkg*NYiLt(xb_TKYbT$lIR z2itmOB-ZNIybvxKge(}6Ka;4-rnVw!O_0ag)!`OG(Etg*E&P>i8W_6468^vz|Lll# zAQdUWF~axVve=n8qn|-pcA+Oql#>$U1Z8jUU1B2{r@;u7&_A>I){>!vWrr&7Ndm`6 zUyr)CdW?N9UqnMM!rnlMeVFe9LZ;w*t^kp4E0O6vlQtiTk|b0Lnh}UOF6+xU zeUoA6(>fu2Vuh+@g}Oft^Ex#zInS%>MAuQ;5?<`7()yrC(6-E^0$YGWKWc;Fo$dIXI@nl=%% z@KSb6n!tl8Q=(cD0j);7OWTP^nMNu7q*^1WIb<7xo~3Oodt^juA$+waJ$j(bzhd@UNg0kM^C1XBARnthiCAC(y-__ zSFOHgDi`XjwmnJcR~<3K&LJ=(4btkz(4Jc4(mC|3N4|a@2c>kUBHn=ko${C)WNUSw z8hJ{P91E4T1@U09g}SBoEdW)2Z}hzKDkR4<2+fZr>o z4Go}PUf8}2+w-j#ifPbuYyOp?=Ly4aYX_O5q33%+@YlQpgM6dA(2old7qxwW?KuF^ z76JkZju6s;_DX}1ISl<8rNMxu^j9#N=K0~aV`0PPJ7K#6n=NAD%iO8fprh30InR^v zx&|Si@$F{P$h6ADh*!podhE3RQLJ;kx;#T#2XXEwN zKQn{X^tNYNJ2*Zv;?3DkjrmYBqBV;EZbUkpwnyKq3_X?g8gnY2SK&ix%d`82e}Q&_ zsUQmdjGq=j?fNXV^#M#0<{20+F0?=Y>j_Ux>!f5BwP;+sRU?B0Ou>tKq9dqB(^Gh< z9BpY`pCjS1cAWNT(T-?)d3hXmkwfORho*tiHs!$!mK@(kW%Bl7iBQY!*@kB-<~4(r zAVJVVyBx14hW76O1k8LHLCVI(MvIv7DAp6#;lJ^; zl9%vcRXdICD5~0))O%`1tnPzq^LrQ3M?|_6=pmX#Pep@Bf2CUEJSl1aXSV+OHfWxQ zSZ|*1_<7Hm&n0otSYBKBC%Ed3fHg5$20fi1T_o*z6wC`{zLU_70|a z=18?{(YKNYi)6qQkT?nwqOB7lQ^`VH$9)?-OuoZkGo3c^=JX2PO-9Jp0oEr)&l1|s z6T6V>?0q)tbsUPkbshYcN9tR&ouovdxWx-k z8S^A%+6gF~UzMlOOz3fj#4k%6b>ni(+)-g?qJk|6*#)JmsWV4c$meCylhW1+XBYta zdao({7l)pAFs(C{?YU=Y+%%5cHkIdLoMdLe>{)z{L*ZISeI`6mY9q}BVG*{_lnR-T zj}fxQj*i6w8TNqD??1pcuviRJ*`08Lc@(DnfNjC%sf-1_DzapTZVS--$$T32&-rs z){~j9Gao-5dP?5EN(9T&&cWMU-|l?f4XCo`?3`>J`Zi(k2B(bH;$FCtd9<0Jziv=m zYj{DVVGNpS{Ijj>2rONujw(8VPrk!*6UvF#(d6y;vYIXs=&w_bf8FRgi_WB(Lckhu zU@fRKFGW9;cYuLW0*{#93SDbft|)Y@2ZRzEZ7Dq9GpgG*l3Qe&qMl;tganFK59eHd#ED6eP!_Zgg43oInanSRrkggHS5;`HTDE`7i zHZ1~5X2t<6Gb^um3w@#K5s(82*h8X)xplNFGgYBM^N{P_bGy7tY_uiwk^-a9>F0u- z;iS7kwq90P#Fw`y6c(y>Xth@@Y}viMs@$}lU#Z@Yp8W6Qp=T)_H}5IX71m+Hw!EzQU2A)~Woph@ zv4bs8mm|=#n-}i3H916dD@q=ityP>FKTDRzT|t`~5V*5QTf0|G=u;h|lZH^^H{qdu z-WgMNPab4w$0f8CFMFt9mkZ05p_?N?vjA((DSLE4#k7LU5=g`cz5r}&WyUY#&yd36(u37L(hYEf>1fjA{rf$ZROlf z)}>&dJx8?NITGng5~=YgLFI@ay7L4Ty=-{k7ei0Z_I$(CF=JJ!ZZxbCmYk6FJlFWV z#YB8^d3(EIb5itVY*v;Jx4C&vC+fvIZ@A@HIYbL?eGH-Jpx?%}7pFEVGcvh(iq>qZ z%RD5C-}n(;Ar&>Vb2ld_Y5wHsS>O#dzZ+k6IC^qr-}0*GP^8cBd0F%qm3hx24G3Jm4Z>PSgJ@T(jW=B)Ca|j7sCYl3{7}z_ zx{)ZMAG1GdG;NyyMWH8G=N#16v&gPKglQPU=PVo&YQFIX=8t-IberGYam{gc^$WKnMOpL(how<4c(bw20?mMUhD1yBlVOBS$%t7x|7RoWsW>x z1)JI6Y^DR4Q;md^pRwB;6oOkeLVw&BTgptDa~Z)i4mX-J>M|-Gix7Z z>*C@&IMYNzz&*H@V>RC`2Hz#<$xXu?*o6hEPsq}Ej<(`kA7|cE_8MZk6X7I*)Dbr? zn~$?0FK97h*;AoTVR;OlU&HYON|TX~sk~1>2l5yv;7=2wZ@0pmITEcG#o#)sY}ro? zQY~TLGw$#w4DB|FyL!2IUEnoEw9>j&KK?T3xdM~u!D=Xl&Y%!?w-Vi|HeLzB3z_P1 zhH#@1Y=$(Aykr|^|N9Io=UU*?_aLc|SB$D0kFN?nY5iri8?skSs}p`<0ipjy>Xy+{ z+HGG#TY-RMXnWt)HJCx2u)J5T5xA1Ip>F?~TXTCo;l@w4(GAXu%7lk~1Q@*gv8#Ph$OxKd z=sav@whExM6*LAPa+()Vi5E@NOxhnCJ-6X@QiNd6ZO^Sr+4=RT<><-P{WZ*c&OGX4 z!Ipgr`1h3&EV`I}MNVZ)f}lG7hNJiht~;4wI?|Xw;p*CO`cR!9pr0ke*^`EObsh6j zpliU%z+YpON4^uLWADjj3}xuaJ1QvpJu?^REg~C?p8cYYZRhAI|Gs!Y&yfiDBItPu z^Lp{S?zDi6orU6SrS&;8J#xoS{D&YQ+HYJc-Lx1w$pJnl{>W`iYn%Y5)a{=<3@1>k zMmP)jg^!cinuM2Y^ZfwyykP}RC$_+}=*dkue+NHi$cYuubK|$-<28L-D#`vkcIxQ` z?9YCWZsI`UQ7Ih=*@as-U$J?DNu8>W3A&O4TuulJU*Q)l?*A=)4E&X7O=x@a_ay}+itMMEt&#_}8>Og_q#lLhof6tWJQ}!oZO)dnLKTft=I=Us z;V!td&Z!%e@9f``0z(9p=iT_WQS>~(Go^!yJ2Cg%j9S{G1`aQ8doH3?>2rVB=(Ok= zsn_iLN>@x=KwFxKhYQa9xR5WeR8(Uf=eb?rC1Ae%KJ13BM$bLEI3wgQVD7T;%#h9* zVn=|FO0~jWza2ug?}*K1RXDfK(Ft36SWcK_r=8(DZ0m6kno$+w@>Dq8QD$8E9UPdt zhZQi)h-ErTj10TP4mc!>tiu^4q4T0+$f6JVUH)=Iqn4~`cC;66TJ)U5AS-DyFnFe$ z9gXJl7932{O{(tNVyupj6|Okh(l_{fBec6>mI=-(PDZ{3L{FC`c1I?Z3R(-c7U`++ zlO&^3{D6ioUhkNmn01a&GOHH)JbWZVcGMU0?6thiN(H~Ba}T_8SMJ6PlY6(!4|*Yk zn#A_R$YDD||DDa{=o#%Xgq08c?V1XX7C1%6GSC6@0tTIQ4WZbH2}&3A!0lCE_R zdWlIi2SE{SOCKPMY9w!A54dFWE*Ka31vnHQ2cl<5n|cNr)N#0FQoQ;l@eINVXI&UU z*d=Q4N3z5Y^E>37LnwX^i2q2l!1iy=rd45OMS)%rJe6C zp4`jr+i`CWXANiZUvNjwDH+j>3iU)s0~0RL7MPYisSr?^XKSd70*W8V<~@+?fSy7i zopOh42OBo@<@mfctns{)Zo?g2SK1PJ8a`bHakkAQ$2b0mbRID4w9u0a8>a` zf}X-AR>bE5(eNsArad-Df~Md_xGPN$*m#{J+*3oF1hP6J>$-64RzHzL;Z?& zN`b%8y@~qD9TOKF)I)wSK@w1up1WUeJu!MJa1<=;m9pM`WmTdI+cS2Mt!)Qp${p8p zo1$m1&9H#FWoZxg9`S-UWYdJy_TT@AqczP99CI$?zR8&FSaaS$m^|pNM12| zx=c5vah0EI64GViZ`i4ke!g`2A_z)Fr!PQbHmw*v?cX2%$&`N$ui-TuFDRw{4-Q>~ UD}A@~kN^Mx07*qoM6N<$f-!^Ho&W#< literal 0 HcmV?d00001