From 59adc142f12128d32d6849cad33d75a7b49d5e71 Mon Sep 17 00:00:00 2001 From: fanhuitong <981964879@qq.com> Date: Fri, 17 Sep 2021 10:01:53 +0800 Subject: [PATCH] version:1.6.9 fix: add: --- app/build.gradle | 15 +- app/src/main/AndroidManifest.xml | 17 +- .../info/sn/Statistics/StatisticsInfo.java | 12 +- .../com/info/sn/activity/GuideActivity.java | 93 +++ .../com/info/sn/activity/SNUidActivity.java | 71 +++ .../info/sn/activity/main/MainActivity.java | 192 ++++-- .../info/sn/activity/main/MainContact.java | 21 +- .../info/sn/activity/main/MainPresenter.java | 566 ++++++++++++------ .../selectegrade/SelecteGradeActivity.java | 371 ++++++++++++ .../selectegrade/SelecteGradeContact.java | 31 + .../selectegrade/SelecteGradePresenter.java | 357 +++++++++++ .../com/info/sn/adapter/SNUidAdapter.java | 60 ++ .../info/sn/bean/gankao/AvailableProduct.java | 6 +- .../sn/bean/gankao/GankaoBaseResponse.java | 15 +- .../com/info/sn/bean/gankao/PowerUser.java | 129 ++++ .../com/info/sn/bean/gankao/UserProduct.java | 130 ++++ .../info/sn/bean/gankao/UserProductCards.java | 17 + .../com/info/sn/bean/zuoye/SNUidBean.java | 53 ++ .../com/info/sn/manager/ControlManager.java | 4 +- .../info/sn/manager/NetInterfaceManager.java | 47 +- .../com/info/sn/network/HTTPInterface.java | 2 +- .../java/com/info/sn/network/UrlAddress.java | 14 +- .../com/info/sn/network/api/GetGuideApi.java | 15 + .../info/sn/network/api/GetGuideApiTest.java | 15 + .../com/info/sn/network/api/GetSnUidApi.java | 15 + .../com/info/sn/network/api/SaveSnUidApi.java | 4 +- .../api/{ => gankao}/ActiveUserApi.java | 4 +- .../api/gankao/CancelUserPowerApi.java | 19 + .../api/{ => gankao}/CreateUserApi.java | 2 +- .../api/gankao/QueryPowerUserListApi.java | 17 + .../api/{ => gankao}/QueryProductApi.java | 2 +- .../api/gankao/UpgradeUserPowerApi.java | 19 + .../network/api/gankao/UserProductsApi.java | 22 + .../sn/receiver/InstallResultReceiver.java | 2 +- .../com/info/sn/receiver/MyJPushReceiver.java | 275 ++++++++- .../java/com/info/sn/service/MainService.java | 77 ++- .../com/info/sn/service/ManagerService.java | 19 +- .../info/sn/service/MyDownloadService.java | 19 +- .../com/info/sn/service/RemoteService.java | 3 +- .../main/java/com/info/sn/utils/ApkUtils.java | 21 + .../main/java/com/info/sn/utils/JGYUtils.java | 128 ++++ .../java/com/info/sn/utils/TimeUtils.java | 8 +- .../main/java/com/info/sn/utils/Utils.java | 6 +- .../java/com/info/sn/view/FlowRadioGroup.java | 72 +++ .../main/res/drawable-hdpi/applet_qrcode.png | Bin 79870 -> 28017 bytes app/src/main/res/drawable-hdpi/main_vip.png | Bin 0 -> 3466 bytes app/src/main/res/drawable-hdpi/phone.png | Bin 0 -> 15787 bytes app/src/main/res/drawable/bg_selecte.xml | 17 + app/src/main/res/drawable/bt_disable.xml | 7 +- app/src/main/res/drawable/bt_normnl.xml | 2 +- app/src/main/res/drawable/bt_pressed.xml | 2 +- app/src/main/res/drawable/bt_unactivation.xml | 13 + app/src/main/res/drawable/edit_background.xml | 9 +- app/src/main/res/drawable/radio.xml | 10 + app/src/main/res/drawable/radio_checked.xml | 18 + app/src/main/res/drawable/radio_textcolor.xml | 8 + app/src/main/res/drawable/radio_unchecked.xml | 20 + .../main/res/layout-land/activity_main.xml | 293 +++++++-- .../main/res/layout-port/activity_main.xml | 246 ++++++-- app/src/main/res/layout/activity_guide.xml | 15 + .../res/layout/activity_selecte_grade.xml | 279 +++++++++ app/src/main/res/layout/activity_sn_uid.xml | 22 + .../res/layout/fragment_applet_qrcode.xml | 7 +- app/src/main/res/layout/fragment_qrcode.xml | 6 +- app/src/main/res/layout/item_snuid.xml | 80 +++ app/src/main/res/values/strings.xml | 6 +- app/src/main/res/values/styles.xml | 20 + 67 files changed, 3637 insertions(+), 430 deletions(-) create mode 100644 app/src/main/java/com/info/sn/activity/GuideActivity.java create mode 100644 app/src/main/java/com/info/sn/activity/SNUidActivity.java create mode 100644 app/src/main/java/com/info/sn/activity/selectegrade/SelecteGradeActivity.java create mode 100644 app/src/main/java/com/info/sn/activity/selectegrade/SelecteGradeContact.java create mode 100644 app/src/main/java/com/info/sn/activity/selectegrade/SelecteGradePresenter.java create mode 100644 app/src/main/java/com/info/sn/adapter/SNUidAdapter.java create mode 100644 app/src/main/java/com/info/sn/bean/gankao/PowerUser.java create mode 100644 app/src/main/java/com/info/sn/bean/gankao/UserProduct.java create mode 100644 app/src/main/java/com/info/sn/bean/gankao/UserProductCards.java create mode 100644 app/src/main/java/com/info/sn/bean/zuoye/SNUidBean.java create mode 100644 app/src/main/java/com/info/sn/network/api/GetGuideApi.java create mode 100644 app/src/main/java/com/info/sn/network/api/GetGuideApiTest.java create mode 100644 app/src/main/java/com/info/sn/network/api/GetSnUidApi.java rename app/src/main/java/com/info/sn/network/api/{ => gankao}/ActiveUserApi.java (82%) create mode 100644 app/src/main/java/com/info/sn/network/api/gankao/CancelUserPowerApi.java rename app/src/main/java/com/info/sn/network/api/{ => gankao}/CreateUserApi.java (92%) create mode 100644 app/src/main/java/com/info/sn/network/api/gankao/QueryPowerUserListApi.java rename app/src/main/java/com/info/sn/network/api/{ => gankao}/QueryProductApi.java (92%) create mode 100644 app/src/main/java/com/info/sn/network/api/gankao/UpgradeUserPowerApi.java create mode 100644 app/src/main/java/com/info/sn/network/api/gankao/UserProductsApi.java create mode 100644 app/src/main/java/com/info/sn/view/FlowRadioGroup.java create mode 100644 app/src/main/res/drawable-hdpi/main_vip.png create mode 100644 app/src/main/res/drawable-hdpi/phone.png create mode 100644 app/src/main/res/drawable/bg_selecte.xml create mode 100644 app/src/main/res/drawable/bt_unactivation.xml create mode 100644 app/src/main/res/drawable/radio.xml create mode 100644 app/src/main/res/drawable/radio_checked.xml create mode 100644 app/src/main/res/drawable/radio_textcolor.xml create mode 100644 app/src/main/res/drawable/radio_unchecked.xml create mode 100644 app/src/main/res/layout/activity_guide.xml create mode 100644 app/src/main/res/layout/activity_selecte_grade.xml create mode 100644 app/src/main/res/layout/activity_sn_uid.xml create mode 100644 app/src/main/res/layout/item_snuid.xml diff --git a/app/build.gradle b/app/build.gradle index 94e6821..532ab14 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { applicationId "com.info.sn" minSdkVersion 24 targetSdkVersion 29 - versionCode 61 - versionName "1.6.1" + versionCode 69 + versionName "1.6.9" multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ndk { @@ -32,7 +32,6 @@ android { JPUSH_APPKEY : "edf9cec22731b8b2fed56ee6", //JPush 上注册的包名对应的 Appkey. JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可. ] - buildConfigField "String", "SCREEN_URL", '"https://homework.uiuios.com:3018/wm/is_online"' javaCompileOptions { annotationProcessorOptions { includeCompileClasspath true @@ -94,6 +93,7 @@ android { manifestPlaceholders = [ AMAP_KEY: "8c4e1d478cb91e6b5713562bc424efba" ] + buildConfigField "String", "SCREEN_URL", '"https://homework.uiuios.com:3018/wm/is_online"' } zhanRuiDebug.initWith(debug) @@ -105,6 +105,7 @@ android { manifestPlaceholders = [ AMAP_KEY: "8c4e1d478cb91e6b5713562bc424efba" ] + buildConfigField "String", "SCREEN_URL", '"https://homework.uiuios.com:3018/wm/is_online"' } debug { @@ -125,6 +126,7 @@ android { manifestPlaceholders = [ AMAP_KEY: "83869aed8624eb00615c2b6d3d15d777" ] + buildConfigField "String", "SCREEN_URL", '"https://homework.uiuios.com:3018/wm/is_online"' } release { @@ -150,6 +152,7 @@ android { manifestPlaceholders = [ AMAP_KEY: "83869aed8624eb00615c2b6d3d15d777" ] + buildConfigField "String", "SCREEN_URL", '"https://homework.uiuios.com:3018/wm/is_online"' } } @@ -169,6 +172,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.3.1' //implementation 'com.android.support:multidex:1.0.3' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'androidx.recyclerview:recyclerview:1.2.1' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' @@ -187,7 +191,7 @@ dependencies { //RxJava implementation 'io.reactivex.rxjava2:rxjava:2.2.8' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' - //声明周期管理 + //生命周期管理 implementation 'com.trello.rxlifecycle2:rxlifecycle:2.2.2' implementation 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.2' implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.2' @@ -212,6 +216,8 @@ dependencies { //implementation 'me.jessyan:autosize:1.2.1' implementation 'com.flyco.tablayout:FlycoTabLayout_Lib:2.1.2@aar' + implementation 'com.github.chrisbanes:PhotoView:2.0.0' + implementation 'com.github.bumptech.glide:glide:4.11.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' @@ -219,6 +225,7 @@ dependencies { // If you are using Kotlin, replace annotationProcessor with kapt. // annotationProcessor rootProject.ext.dependencies["butterknife-compiler"] kapt 'com.jakewharton:butterknife-compiler:10.2.1' + } preBuild { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4b1ad80..0921c98 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,7 +3,6 @@ xmlns:tools="http://schemas.android.com/tools" package="com.info.sn" android:sharedUserId="android.uid.system"> - @@ -60,11 +59,25 @@ android:roundIcon="@mipmap/ic_launcher" android:supportsRtl="true" android:theme="@style/AppTheme"> + + + + + android:process=":remote" /> + 0 && AppInfoList.get(i).getTimes() > 0 // && !AppUtil.isSystemApp(mContext, AppInfoList.get(i).getPackageName()) + && ApkUtils.getIsCanStart(mContext, AppInfoList.get(i).getPackageName()) && !packageList.contains(AppInfoList.get(i).getPackageName()) ) { @@ -170,8 +176,10 @@ public class StatisticsInfo { //再计算一次当前应用的运行时间,因为当前应用,最后得不到MOVE_TO_BACKGROUND 的timeStamp AppInformation information = mapData.get(context.getPackageName()); - information.setTimeStampMoveToBackGround(now); - information.calculateRunningTime(); + if (information!=null){ + information.setTimeStampMoveToBackGround(now); + information.calculateRunningTime(); + } return new ArrayList<>(mapData.values()); } diff --git a/app/src/main/java/com/info/sn/activity/GuideActivity.java b/app/src/main/java/com/info/sn/activity/GuideActivity.java new file mode 100644 index 0000000..e11b0c9 --- /dev/null +++ b/app/src/main/java/com/info/sn/activity/GuideActivity.java @@ -0,0 +1,93 @@ +package com.info.sn.activity; + +import android.text.TextUtils; +import android.util.Log; +import android.view.View; + +import androidx.constraintlayout.widget.ConstraintLayout; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.bumptech.glide.Glide; +import com.github.chrisbanes.photoview.PhotoView; +import com.info.sn.R; +import com.info.sn.base.BaseActivity; +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.manager.NetInterfaceManager; + +import io.reactivex.Observer; +import io.reactivex.disposables.Disposable; + +public class GuideActivity extends BaseActivity { + + private PhotoView mPhotoView; + private ConstraintLayout root; + + @Override + public int getLayoutId() { + return R.layout.activity_guide; + } + + @Override + public void initView() { + mPhotoView = findViewById(R.id.photoView); + root = findViewById(R.id.root); + root.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + mPhotoView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + } + + @Override + public void initData() { + getGuidePic(); + } + + private void getGuidePic() { + NetInterfaceManager.getInstance() + .getGetGuideControl() + .compose(this.bindToLifecycle()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e("getGuidePic", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse baseResponse) { + Log.e("getGuidePic", "onNext: "); + int code = baseResponse.code; + if (code == 200) { + JSONObject jsonObject = JSON.parseObject(JSONObject.toJSONString(baseResponse.data)); + String file = jsonObject.getString("file"); + if (!TextUtils.isEmpty(file)) { + Log.e("getGuidePic", "onNext: " + file); + Glide.with(GuideActivity.this).load(file).into(mPhotoView); + } + } else { + + } + } + + @Override + public void onError(Throwable e) { + Log.e("getGuidePic", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getGuidePic", "onComplete: "); + } + }); + } + + +} diff --git a/app/src/main/java/com/info/sn/activity/SNUidActivity.java b/app/src/main/java/com/info/sn/activity/SNUidActivity.java new file mode 100644 index 0000000..7f08d79 --- /dev/null +++ b/app/src/main/java/com/info/sn/activity/SNUidActivity.java @@ -0,0 +1,71 @@ +package com.info.sn.activity; + +import android.content.Intent; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; + +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.info.sn.R; +import com.info.sn.adapter.SNUidAdapter; +import com.info.sn.base.BaseActivity; +import com.info.sn.bean.zuoye.SNUidBean; +import com.info.sn.utils.ToastUtil; + +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public class SNUidActivity extends BaseActivity { + @BindView(R.id.recyclerView) + RecyclerView mRecyclerView; + @BindView(R.id.root) + ConstraintLayout root; + private SNUidAdapter mAdapter = new SNUidAdapter(); + + @Override + public int getLayoutId() { + return R.layout.activity_sn_uid; + } + + @Override + public void initView() { + ButterKnife.bind(this); + mRecyclerView.setLayoutManager(new LinearLayoutManager(SNUidActivity.this)); + mRecyclerView.setAdapter(mAdapter); + root.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + } + + @Override + public void initData() { + Intent intent = getIntent(); + String jsonString = intent.getStringExtra("json"); + Log.e("TAG", "initData: " + jsonString); + if (TextUtils.isEmpty(jsonString)) { + ToastUtil.show("暂未获取到信息"); + finish(); + return; + } + JSONObject jsonObject = JSON.parseObject(jsonString); + JSONArray jsonArray = jsonObject.getJSONArray("card_info"); + List snUidBeads = JSON.parseArray(jsonArray.toJSONString(), SNUidBean.class); + if (snUidBeads == null) { + + } else { + mAdapter.setSnUidBeans(snUidBeads); + } + } + +} diff --git a/app/src/main/java/com/info/sn/activity/main/MainActivity.java b/app/src/main/java/com/info/sn/activity/main/MainActivity.java index 3375a45..5a017e9 100644 --- a/app/src/main/java/com/info/sn/activity/main/MainActivity.java +++ b/app/src/main/java/com/info/sn/activity/main/MainActivity.java @@ -29,6 +29,9 @@ import com.blankj.utilcode.util.NetworkUtils; import com.flyco.tablayout.SlidingTabLayout; import com.info.sn.BuildConfig; import com.info.sn.R; +import com.info.sn.activity.GuideActivity; +import com.info.sn.activity.SNUidActivity; +import com.info.sn.activity.selectegrade.SelecteGradeActivity; import com.info.sn.base.BaseActivity; import com.info.sn.bean.gankao.AvailableProduct; import com.info.sn.bean.zuoye.BaseResponse; @@ -60,7 +63,9 @@ import com.info.sn.utils.Utils; import org.jetbrains.annotations.NotNull; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.List; @@ -84,6 +89,9 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, @BindView(R.id.cl_update) ConstraintLayout cl_update; + @BindView(R.id.cl_vip) + ConstraintLayout cl_vip; + @BindView(R.id.tv_exit) TextView iv_exit; @@ -111,6 +119,9 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, @BindView(R.id.tv_grade) TextView tv_grade; + @BindView(R.id.tv_vip) + TextView tv_vip; + @BindView(R.id.tv_version) TextView tv_version; @@ -120,6 +131,15 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, @BindView(R.id.bt_activation) TextView bt_activation; + @BindView(R.id.bt_repurchase) + TextView bt_repurchase; + + @BindView(R.id.tv_guide) + TextView tv_guide; + + @BindView(R.id.tv_activate) + TextView tv_activate; + @BindView(R.id.viewPager) ViewPager viewPager; @@ -133,7 +153,7 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, @Override public void onConnected(NetworkUtils.NetworkType networkType) { - mPresenter.getInfo(); + mPresenter.getSnInfo(); } @Override @@ -184,6 +204,7 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, Log.e(TAG, "getWeekDay: " + TimeUtils.inWeekDay(1627702095000L)); Log.e(TAG, "getWeekDayString: " + new TimeUtils().getWeekDayString()); Log.e(TAG, "getWeekDayString: " + new TimeUtils().getWeekDayString(1627702095000L)); +// DeviceManager.doMasterClear(); } JPushInterface.init(this); if (DeviceManager.isDebugMode()) { @@ -200,6 +221,7 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, mPresenter.getQRCode(); // mPresenter.getInfo(); mPresenter.getUserInfo(); + mPresenter.queryPowerUserList(); } @Override @@ -213,7 +235,8 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, protected void onResume() { super.onResume(); setClickable(); - mPresenter.getInfo(); + mPresenter.getUserInfo(); + mPresenter.getSnInfo(); isForeground = true; } @@ -236,7 +259,7 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (REFRESHACTION.equals(intent.getAction())) { - mPresenter.getInfo(); + mPresenter.getSnInfo(); } } @@ -366,10 +389,20 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, continuousClick(COUNTS, DURATION); } }); + cl_vip.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(); + intent.putExtra("json", SnUidJSON); + intent.setClass(MainActivity.this, SNUidActivity.class); + startActivity(intent); + } + }); bt_activation.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - showActivationDialog(); + startActivity(new Intent(MainActivity.this, SelecteGradeActivity.class)); +// showActivationDialog(); } }); iv_exit.setOnClickListener(new View.OnClickListener() { @@ -389,6 +422,12 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, } }); + tv_guide.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + startActivity(new Intent(MainActivity.this, GuideActivity.class)); + } + }); } @@ -401,7 +440,7 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, .setOnClickBottomListener(new ActivationDialog.OnClickBottomListener() { @Override public void onPositiveClick() { - mPresenter.checkSN(); +// mPresenter.checkSN(); dialog.dismiss(); } @@ -426,12 +465,18 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, } } + @Override + public void setPowerUserList(String date) { + + } + @Override public void checkSNFinish(int code) { switch (code) { case 200: case 300: mPresenter.getGankaoUID(); + ToastUtil.show("设备验证成功"); break; case 400: ToastUtil.show("此设备未经授权,禁止激活"); @@ -450,19 +495,19 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, ToastUtil.show("用户注册失败"); } else { ToastUtil.show("用户注册成功"); - mPresenter.queryAvailableProduct(); + mPresenter.queryAvailableProduct(gankaoUID); } } @Override - public void setAvailableProduct(@NotNull List availableProductList) { - setGrade(availableProductList); + public void setAvailableProduct(@NotNull List availableProductList, String gankaoUID) { + setGrade(availableProductList, gankaoUID); } /** * @param list 通过年纪获取对应的产品id */ - private void setGrade(List list) { + private void setGrade(List list, String gankaoUID) { if (list == null || list.size() == 0) { ToastUtil.show("获取激活套餐失败"); } else { @@ -490,7 +535,7 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, } switch (grade) { default: - activeUser(defaultProduct); + activeUser(defaultProduct, gankaoUID); break; // case "一年级": // case "二年级": @@ -514,8 +559,19 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, } } + /** + * @param product 通过产品id激活设备 + */ + private void activeUser(AvailableProduct product, String gankaoUID) { + if (product == null) { + ToastUtil.show("获取激活套餐失败"); + return; + } + mPresenter.activeUser(product, gankaoUID); + } + @Override - public void activeUser(int code) { + public void activeUserFinish(int code) { switch (code) { case 10000: ToastUtil.show("授权成功"); @@ -553,17 +609,6 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, } } - /** - * @param product 通过产品id激活设备 - */ - private void activeUser(AvailableProduct product) { - if (product == null) { - ToastUtil.show("获取激活套餐失败"); - return; - } - mPresenter.activeUser(product); - } - private final int COUNTS = 4; // 点击次数 private final long DURATION = 2 * 1000; // 规定有效时间 private long[] mHits = new long[COUNTS]; @@ -584,13 +629,22 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, private void setClickable() { int isEnabled = Settings.System.getInt(getContentResolver(), activation, 0); if (isEnabled == 0) { + bt_activation.setVisibility(View.VISIBLE); + bt_repurchase.setVisibility(View.GONE); + tv_vip.setVisibility(View.GONE); bt_activation.setEnabled(true); bt_activation.setText("激活学习系统"); } else { + bt_activation.setVisibility(View.GONE); + bt_repurchase.setVisibility(View.VISIBLE); + tv_vip.setVisibility(View.VISIBLE); bt_activation.setEnabled(false); bt_activation.setText("已激活学习系统"); } if (BuildConfig.DEBUG) { + bt_activation.setVisibility(View.VISIBLE); + bt_repurchase.setVisibility(View.GONE); + tv_vip.setVisibility(View.VISIBLE); bt_activation.setEnabled(true); bt_activation.setText("激活学习系统"); } @@ -625,7 +679,7 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, @Override public void onReceive(Context context, Intent intent) { if (REFRESHACTION.equals(intent.getAction())) { - mPresenter.getInfo(); + mPresenter.getSnInfo(); } } } @@ -667,37 +721,77 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, } @Override - public void setInfo(BaseResponse response) { - int code = response.code; - if (code == 200) { - UserInfo userInfo = response.data; - SPUtils.put(this, Configs.isLogined, 1); - SPUtils.put(this, "member_id", userInfo.getMember_id()); - SPUtils.put(this, "sn_id", userInfo.getId()); - if (!TextUtils.isEmpty(userInfo.getSn_name())) { - SPUtils.put(this, "USERINFO_NAME", userInfo.getSn_name()); - tv_username.setText(userInfo.getSn_name()); + public void setSnInfo(BaseResponse response) { + if (response != null) { + int code = response.code; + //设备已经绑定 + if (code == 200) { + UserInfo userInfo = response.data; + boolean username = Settings.System.putString(getContentResolver(), "UserInfo_username", userInfo.getSn_name()); + boolean gread = Settings.System.putString(getContentResolver(), "UserInfo_grade", userInfo.getGrade()); + SPUtils.put(this, Configs.isLogined, 1); + SPUtils.put(this, "member_id", userInfo.getMember_id()); + SPUtils.put(this, "sn_id", userInfo.getId()); + if (!TextUtils.isEmpty(userInfo.getSn_name())) { + SPUtils.put(this, "USERINFO_NAME", userInfo.getSn_name()); + tv_username.setText(userInfo.getSn_name()); + } + if (!TextUtils.isEmpty(userInfo.getSchool())) { + SPUtils.put(this, "USERINFO_SCHOOL", userInfo.getSchool()); + tv_school.setText(userInfo.getSchool()); + } + if (!TextUtils.isEmpty(userInfo.getGrade())) { + SPUtils.put(this, "USERINFO_GRADE", userInfo.getGrade()); + tv_grade.setText(userInfo.getGrade()); + } + mPresenter.getLocked(); } - if (!TextUtils.isEmpty(userInfo.getSchool())) { - SPUtils.put(this, "USERINFO_SCHOOL", userInfo.getSchool()); - tv_school.setText(userInfo.getSchool()); + //设备没有绑定 + else if (code == 300) { + tv_username.setText(defaultText); + tv_school.setText(defaultText); + tv_grade.setText(defaultText); + ControlManager.getInstance().setDisableSetting(); } - if (!TextUtils.isEmpty(userInfo.getGrade())) { - SPUtils.put(this, "USERINFO_GRADE", userInfo.getGrade()); - tv_grade.setText(userInfo.getGrade()); + //没有授权的设备 + else if (code == 400) { + ToastUtil.show("设备未经授权"); + Log.e(TAG, "setInfo: " + "设备未经授权"); + ControlManager.getInstance().setDisableSetting(); } - mPresenter.getLocked(); - } else if (code == 300) { - tv_username.setText(defaultText); - tv_school.setText(defaultText); - tv_grade.setText(defaultText); - ControlManager.getInstance().setDisableSetting(); - } else if (code == 400) { - ToastUtil.show("设备未经授权"); - Log.e(TAG, "setInfo: " + "设备未经授权"); - ControlManager.getInstance().setDisableSetting(); } Log.e(TAG, "setInfo: " + (System.currentTimeMillis() - time0) + "ms"); + mPresenter.getSnUid(); + } + + private String SnUidJSON; + + @Override + public void setSnUid(JSONObject jsonObject) { + if (jsonObject != null) { + this.SnUidJSON = jsonObject.toJSONString(); + String uid = jsonObject.getString("uid"); + if (!TextUtils.isEmpty(uid)) { + Settings.System.putString(getContentResolver(), "gankaoUID", uid); + } +// long activate_time = jsonObject.getLong("activate_time"); +// String card_info = jsonObject.getString("card_info"); +// SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); +// Date d1 = new Date(activate_time * 1000); +// int grade = jsonObject.getIntValue("grade"); +// SPUtils.put(MainActivity.this, "int_grade", grade); +// String t1 = format.format(d1); +// tv_vip.setText(card_info); +// tv_activate.setText(t1 + " 激活"); + } else { + mPresenter.registerGankao(); + } + setClickable(); + } + + @Override + public void setGankao(String gankaoUID) { + } @Override diff --git a/app/src/main/java/com/info/sn/activity/main/MainContact.java b/app/src/main/java/com/info/sn/activity/main/MainContact.java index 15b549d..b9a93e7 100644 --- a/app/src/main/java/com/info/sn/activity/main/MainContact.java +++ b/app/src/main/java/com/info/sn/activity/main/MainContact.java @@ -2,6 +2,7 @@ package com.info.sn.activity.main; import android.graphics.Bitmap; +import com.alibaba.fastjson.JSONObject; import com.info.sn.bean.zuoye.BaseResponse; import com.info.sn.bean.zuoye.UserInfo; import com.info.sn.bean.gankao.AvailableProduct; @@ -12,13 +13,16 @@ import java.util.List; public class MainContact { public interface MainView extends BaseView { + void setPowerUserList(String date); void checkSNFinish(int code); void setGankaoUID(String gankaoUID); - void setAvailableProduct( List availableProductList); - void activeUser( int code); + void setAvailableProduct(List availableProductList, String gankaoUID); + void activeUserFinish(int code); void setQRCode(Bitmap bitmap); - void setInfo(BaseResponse response); + void setSnInfo(BaseResponse response); + void setSnUid(JSONObject jsonObject); + void setGankao(String gankaoUID); void setUserInfo(); void setLocked(int lockedStatus); void onLocationChanged(); @@ -34,15 +38,20 @@ public class MainContact { } interface Presenter extends BasePresenter { + void queryPowerUserList(); void checkSN(); void getGankaoUID(); - void queryAvailableProduct(); - void activeUser(AvailableProduct product); + void queryAvailableProduct(String gankaoUID); + void activeUser(AvailableProduct product, String gankaoUID); //获取二维码 void getQRCode(); //获取设备信息 - void getInfo(); + void getSnInfo(); + //获取激活时间 + void getSnUid(); + //注册赶考账号 + void registerGankao(); //获取头像昵称 void getUserInfo(); //获取锁定状态 diff --git a/app/src/main/java/com/info/sn/activity/main/MainPresenter.java b/app/src/main/java/com/info/sn/activity/main/MainPresenter.java index fa11081..cbbf853 100644 --- a/app/src/main/java/com/info/sn/activity/main/MainPresenter.java +++ b/app/src/main/java/com/info/sn/activity/main/MainPresenter.java @@ -15,11 +15,14 @@ import com.amap.api.location.AMapLocation; import com.amap.api.location.AMapLocationClient; import com.amap.api.location.AMapLocationListener; import com.google.gson.Gson; +import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; import com.info.sn.bean.gankao.AvailableProduct; import com.info.sn.bean.gankao.CreateUserBean; import com.info.sn.bean.gankao.GankaoBaseResponse; +import com.info.sn.bean.gankao.PowerUser; import com.info.sn.bean.zuoye.AppInfo; import com.info.sn.bean.zuoye.AppStart; import com.info.sn.bean.zuoye.BaseResponse; @@ -35,6 +38,7 @@ import com.info.sn.manager.ControlManager; import com.info.sn.manager.NetInterfaceManager; import com.info.sn.network.HTTPInterface; import com.info.sn.service.ManagerService; +import com.info.sn.service.RemoteService; import com.info.sn.utils.ApkUtils; import com.info.sn.utils.CXAESUtil; import com.info.sn.utils.JGYUtils; @@ -95,6 +99,65 @@ public class MainPresenter implements MainContact.Presenter { } + @Override + public void queryPowerUserList() { + String appid = Scheme.partner_id; + String timestamp = String.valueOf(System.currentTimeMillis()); + HashMap params = new HashMap<>(); + params.put("appid", appid); + params.put("timestamp", timestamp); + + NetInterfaceManager.getInstance() + .getQueryPowerUserListControl() + .queryPowerUserList(appid, timestamp, LaunchTools.getToken(params)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e("queryPowerUserList", "onSubscribe: "); + } + + @Override + public void onNext(GankaoBaseResponse gankaoBaseResponse) { + Log.e("queryPowerUserList", "onNext: " + JSONObject.toJSONString(gankaoBaseResponse)); + int code = gankaoBaseResponse.code; + if (code == 10000) { + Gson gson = new Gson(); + Type type = new TypeToken>() { + }.getType(); + JsonObject jsonObject = JsonParser.parseString(gson.toJson(gankaoBaseResponse.data)).getAsJsonObject(); + JsonArray jsonArray = jsonObject.getAsJsonArray("powerlist"); + List powerUserList = gson.fromJson(gson.toJson(jsonArray), type); + HashMap hashMap = new HashMap<>(); + for (PowerUser powerUser : powerUserList) { + hashMap.put(powerUser.getUserID(), powerUser); + } + PowerUser powerUser = hashMap.get(Utils.getSerial()); + if (powerUser != null) { + String date = powerUser.getAuthorizationDate(); + mView.setPowerUserList(date); + } else { + mView.setPowerUserList(""); + } + } + } + + @Override + public void onError(Throwable e) { + Log.e("queryPowerUserList", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("queryPowerUserList", "onComplete: "); + } + }); + + } + @Override public void checkSN() { NetInterfaceManager.getInstance() @@ -136,12 +199,319 @@ public class MainPresenter implements MainContact.Presenter { String appid = Scheme.partner_id; String timestamp = String.valueOf(System.currentTimeMillis()); String uid = Utils.getSerial(); - Log.e(TAG + TAG, "getGankaoUID: uid: $uid"); + Log.e(TAG + TAG, "getGankaoUID: uid: " + uid); if (TextUtils.isEmpty(uid) || "0".equals(uid)) { ToastUtil.show("设备未绑定账号,请绑定后重试"); return; } + HashMap params = new HashMap<>(); + params.put("appid", appid); + params.put("timestamp", timestamp); + params.put("uid", uid); + String token = LaunchTools.getToken(params); + NetInterfaceManager.getInstance() + .getCreateUserControl() + .createUser(appid, timestamp, uid, token) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "getGankaoUID", "onSubscribe: "); + } + + @Override + public void onNext(GankaoBaseResponse gankaoBaseResponse) { + Log.e(TAG + "getGankaoUID", "onNext: " + JSONObject.toJSONString(gankaoBaseResponse)); + if (gankaoBaseResponse.code == 10002) { + Type type = new TypeToken() { + }.getType(); + Gson gson = new Gson(); + CreateUserBean userBean = gson.fromJson(gson.toJson(gankaoBaseResponse.data), type); + String gankaoPartnerUID = userBean.getGankaoPartnerUID(); + int gankaoUIDint = userBean.getGankaoUID(); + String gankaoUID = String.valueOf(gankaoUIDint); + Log.e(TAG + "getGankaoUID", "onNext: gankaoUID: " + gankaoUID); + SPUtils.put(mContext, "gankaoUID", gankaoUID); + Settings.System.putString(mContext.getContentResolver(), "gankaoUID", gankaoUID); + int isNew = userBean.getIsNew(); + mView.setGankaoUID(gankaoUID); + } else { + mView.setGankaoUID(""); + } + } + + @Override + public void onError(Throwable e) { + mView.setGankaoUID(""); + Log.e(TAG + "getGankaoUID", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e(TAG + "getGankaoUID", "onComplete: "); + } + }); + } + + + @Override + public void queryAvailableProduct(String gankaoUID) { + String appid = Scheme.partner_id; + String timestamp = String.valueOf(System.currentTimeMillis()); + HashMap params = new HashMap<>(); + params.put("appid", appid); + params.put("timestamp", timestamp); + NetInterfaceManager.getInstance() + .getQueryProductControl() + .activeUser(appid, timestamp, LaunchTools.getToken(params)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "queryAvailableProduct", "onSubscribe: "); + } + + @Override + public void onNext(GankaoBaseResponse gankaoBaseResponse) { + Log.e(TAG + "queryAvailableProduct", "onNext: " + JSONObject.toJSONString(gankaoBaseResponse)); + if (gankaoBaseResponse.code == 10000) { + Type type = new TypeToken>() { + }.getType(); + Gson gson = new Gson(); + List availableProductList = gson.fromJson(gson.toJson(gankaoBaseResponse.data), type); + mView.setAvailableProduct(availableProductList, gankaoUID); + } else { + ToastUtil.show("获取激活套餐失败"); + mView.setAvailableProduct(new ArrayList(), gankaoUID); + } + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "queryAvailableProduct", "onError: " + e.getMessage()); + mView.setAvailableProduct(new ArrayList(), gankaoUID); + } + + @Override + public void onComplete() { + Log.e(TAG + "queryAvailableProduct", "onComplete: "); + } + }); + } + + @Override + public void activeUser(@NotNull AvailableProduct product, String gankaoUID) { + String specification_id = product.getSpecification_id(); + Log.e(TAG, "activeUser: specification_id: " + specification_id); + String appid = Scheme.partner_id; + String timestamp = String.valueOf(System.currentTimeMillis()); + String uid = Utils.getSerial(); + HashMap params = new HashMap<>(); + params.put("appid", appid); + params.put("timestamp", timestamp); + params.put("uid", uid); + params.put("specification_id", String.valueOf(specification_id)); + + NetInterfaceManager.getInstance() + .getActiveUserControl() + .activeUser(appid, timestamp, LaunchTools.getToken(params), uid, specification_id) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "activeUser", "onSubscribe: "); + } + + @Override + public void onNext(GankaoBaseResponse gankaoBaseResponse) { + Log.e(TAG + "activeUser", "onNext: " + JSONObject.toJSONString(gankaoBaseResponse)); + switch (gankaoBaseResponse.code) { + case 10000: + case 50000: + Settings.System.putInt(mContext.getContentResolver(), MainActivity.activation, 1); +// sendUid(product, gankaoUID); + break; + default: + Settings.System.putInt(mContext.getContentResolver(), MainActivity.activation, 0); + break; + + } + mView.activeUserFinish(gankaoBaseResponse.code); + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "activeUser", "onError: "); + mView.activeUserFinish(0); + } + + @Override + public void onComplete() { + Log.e(TAG + "activeUser", "onComplete: "); + } + }); + } + + /** + * @param gankaoUID 发送赶考uid到后台 + */ +// private void sendUid(AvailableProduct product, String gankaoUID) { +// NetInterfaceManager.getInstance() +// .getSaveSnUidApiControl() +// .saveSnUid(Utils.getSerial(), gankaoUID, System.currentTimeMillis() / 1000, product.getDuration()) +// .subscribeOn(Schedulers.io()) +// .observeOn(AndroidSchedulers.mainThread()) +// .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) +// .subscribe(new Observer() { +// @Override +// public void onSubscribe(Disposable d) { +// Log.e(TAG + "sendUid", "onSubscribe: "); +// } +// +// @Override +// public void onNext(Response response) { +// Log.e(TAG + "sendUid", "onNext: " + JSONObject.toJSONString(response)); +// if (response.code == 200) { +// Log.e(TAG + "sendUid", "onNext: " + response.msg); +// } +// } +// +// @Override +// public void onError(Throwable e) { +// Log.e(TAG + "sendUid", "onError: " + e.getMessage()); +// } +// +// @Override +// public void onComplete() { +// Log.e(TAG + "sendUid", "onComplete: "); +// } +// }); +// } + @Override + public void getQRCode() { + String encryptString = CXAESUtil.encrypt(Configs.AES_KEY, Utils.getSerial()); + Log.e(TAG + TAG, "setImageAndText: " + encryptString); + Bitmap bitmap = Utils.createQRImage(encryptString, 400, 400); + mView.setQRCode(bitmap); + } + + private static final String UPDATE_USER_INFO = "UPDATE_USER_INFO"; + + @Override + public void getSnInfo() { + NetInterfaceManager.getInstance() + .getsnInfoControl() + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "getInfo", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse userInfoBaseResponse) { + Log.e(TAG + "getInfo", "onNext: "); + mView.setSnInfo(userInfoBaseResponse); + int code = userInfoBaseResponse.code; + if (code == 200) { + UserInfo userInfo = userInfoBaseResponse.data; + Settings.System.putString(mContext.getContentResolver(), "UserInfo_username", userInfo.getSn_name()); + Settings.System.putString(mContext.getContentResolver(), "UserInfo_grade", userInfo.getGrade()); + SPUtils.put(mContext, Configs.isLogined, 1); + SPUtils.put(mContext, "member_id", userInfo.getMember_id()); + SPUtils.put(mContext, "sn_id", userInfo.getId()); + if (!TextUtils.isEmpty(userInfo.getSn_name())) { + SPUtils.put(mContext, "USERINFO_NAME", userInfo.getSn_name()); + } + if (!TextUtils.isEmpty(userInfo.getSchool())) { + SPUtils.put(mContext, "USERINFO_SCHOOL", userInfo.getSchool()); + } + if (!TextUtils.isEmpty(userInfo.getGrade())) { + SPUtils.put(mContext, "USERINFO_GRADE", userInfo.getGrade()); + } + String gankaoUID = Settings.System.getString(mContext.getContentResolver(), "gankaoUID"); + String avatar = Settings.System.getString(mContext.getContentResolver(), "UserInfo_avatar"); + int gread = (int) SPUtils.get(mContext,"int_grade",0); + + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("username", userInfo.getSn_name()); + jsonObject.addProperty("avatar", avatar); + jsonObject.addProperty("grade", gread); + jsonObject.addProperty("userid", gankaoUID); + jsonObject.addProperty("sn", Utils.getSerial()); + Log.e(TAG, "getUserInfo:" + jsonObject.toString()); + Intent intent = new Intent(UPDATE_USER_INFO); + intent.putExtra("user_info", jsonObject.toString()); + intent.setPackage("com.jiaoguanyi.os"); + intent.setPackage("com.tt.ttutils"); + mContext.sendBroadcast(intent); + } + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "getInfo", "onError: " + e.getMessage()); + mView.setSnInfo(null); + onComplete(); + } + + @Override + public void onComplete() { + Log.e(TAG + "getInfo", "onComplete: "); + } + }); + } + + @Override + public void getSnUid() { + NetInterfaceManager.getInstance() + .getSnUidApiControl() + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e("getSnUid", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse baseResponse) { + Log.e("getSnUid", "onNext: "+JSONObject.toJSONString(baseResponse)); + int code = baseResponse.code; + if (code == 200) { + Settings.System.putInt(mContext.getContentResolver(), MainActivity.activation, 1); + JSONObject jsonObject = JSON.parseObject(JSONObject.toJSONString(baseResponse.data)); + mView.setSnUid(jsonObject); + } else { + mView.setSnUid(null); + } + } + + @Override + public void onError(Throwable e) { + Log.e("getSnUid", "onError: " + e.getMessage()); + mView.setSnUid(null); + } + + @Override + public void onComplete() { + Log.e("getSnUid", "onComplete: "); + } + }); + } + + @Override + public void registerGankao() { + String appid = Scheme.partner_id; + String timestamp = String.valueOf(System.currentTimeMillis()); + String uid = Utils.getSerial(); + HashMap params = new HashMap<>(); params.put("appid", appid); params.put("timestamp", timestamp); @@ -170,21 +540,19 @@ public class MainPresenter implements MainContact.Presenter { String gankaoPartnerUID = userBean.getGankaoPartnerUID(); int gankaoUIDint = userBean.getGankaoUID(); String gankaoUID = String.valueOf(gankaoUIDint); - sendUid(gankaoUID); - Log.e(TAG + "getGankaoUID", "onNext: gankaoUID: $gankaoUID"); + Log.e(TAG + "getGankaoUID", "onNext: gankaoUID: " + gankaoUID); SPUtils.put(mContext, "gankaoUID", gankaoUID); Settings.System.putString(mContext.getContentResolver(), "gankaoUID", gankaoUID); int isNew = userBean.getIsNew(); - mView.setGankaoUID(gankaoUID); + mView.setGankao(gankaoUID); } else { - mView.setGankaoUID(""); + mView.setGankao(""); } - } @Override public void onError(Throwable e) { - mView.setGankaoUID(""); + mView.setGankao(""); Log.e(TAG + "getGankaoUID", "onError: " + e.getMessage()); } @@ -195,183 +563,6 @@ public class MainPresenter implements MainContact.Presenter { }); } - /** - * @param gankaoUID 发送赶考uid到后台 - */ - private void sendUid(String gankaoUID) { - NetInterfaceManager.getInstance() - .getSaveSnUidApiControl(gankaoUID) - .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) - .subscribe(new Observer() { - @Override - public void onSubscribe(Disposable d) { - Log.e(TAG + "sendUid", "onSubscribe: "); - } - - @Override - public void onNext(Response response) { - Log.e(TAG + "sendUid", "onNext: " + response); - if (response.code == 200) { - Log.e(TAG + "sendUid", "onNext: " + response.msg); - } - } - - @Override - public void onError(Throwable e) { - Log.e(TAG + "sendUid", "onError: " + e.getMessage()); - } - - @Override - public void onComplete() { - Log.e(TAG + "sendUid", "onComplete: "); - } - }); - } - - @Override - public void queryAvailableProduct() { - String appid = Scheme.partner_id; - String timestamp = String.valueOf(System.currentTimeMillis()); - HashMap params = new HashMap<>(); - params.put("appid", appid); - params.put("timestamp", timestamp); - NetInterfaceManager.getInstance() - .getQueryProductControl() - .activeUser(appid, timestamp, LaunchTools.getToken(params)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) - .subscribe(new Observer() { - @Override - public void onSubscribe(Disposable d) { - Log.e(TAG + "queryAvailableProduct", "onSubscribe: "); - } - - @Override - public void onNext(GankaoBaseResponse gankaoBaseResponse) { - Log.e(TAG + "queryAvailableProduct", "onNext: " + JSONObject.toJSONString(gankaoBaseResponse)); - if (gankaoBaseResponse.code == 10000) { - Type type = new TypeToken>() { - }.getType(); - Gson gson = new Gson(); - List availableProductList = gson.fromJson(gson.toJson(gankaoBaseResponse.data), type); - mView.setAvailableProduct(availableProductList); - } else { - ToastUtil.show("获取激活套餐失败"); - mView.setAvailableProduct(new ArrayList()); - } - } - - @Override - public void onError(Throwable e) { - Log.e(TAG + "queryAvailableProduct", "onError: " + e.getMessage()); - mView.setAvailableProduct(new ArrayList()); - } - - @Override - public void onComplete() { - Log.e(TAG + "queryAvailableProduct", "onComplete: "); - } - }); - } - - @Override - public void activeUser(@NotNull AvailableProduct product) { - int specification_id = product.getSpecification_id(); - Log.e(TAG, "activeUser: specification_id: " + specification_id); - String appid = Scheme.partner_id; - String timestamp = String.valueOf(System.currentTimeMillis()); - String uid = Utils.getSerial(); - HashMap params = new HashMap<>(); - params.put("appid", appid); - params.put("timestamp", timestamp); - params.put("uid", uid); - params.put("specification_id", String.valueOf(specification_id)); - - NetInterfaceManager.getInstance() - .getActiveUserControl() - .activeUser(appid, timestamp, LaunchTools.getToken(params), uid, specification_id) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) - .subscribe(new Observer() { - @Override - public void onSubscribe(Disposable d) { - Log.e(TAG + "activeUser", "onSubscribe: "); - } - - @Override - public void onNext(GankaoBaseResponse gankaoBaseResponse) { - Log.e(TAG + "activeUser", "onNext: "); - switch (gankaoBaseResponse.code) { - case 10000: - case 50000: - Settings.System.putInt(mContext.getContentResolver(), MainActivity.activation, 1); - break; - default: - Settings.System.putInt(mContext.getContentResolver(), MainActivity.activation, 0); - break; - - } - mView.activeUser(gankaoBaseResponse.code); - } - - @Override - public void onError(Throwable e) { - Log.e(TAG + "activeUser", "onError: "); - mView.activeUser(0); - } - - @Override - public void onComplete() { - Log.e(TAG + "activeUser", "onComplete: "); - } - }); - } - - @Override - public void getQRCode() { - String encryptString = CXAESUtil.encrypt(Configs.AES_KEY, Utils.getSerial()); - Log.e(TAG + TAG, "setImageAndText: " + encryptString); - Bitmap bitmap = Utils.createQRImage(encryptString, 300, 300); - mView.setQRCode(bitmap); - } - - @Override - public void getInfo() { - NetInterfaceManager.getInstance() - .getsnInfoControl() - .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) - .subscribe(new Observer>() { - @Override - public void onSubscribe(Disposable d) { - Log.e(TAG + "getInfo", "onSubscribe: "); - } - - @Override - public void onNext(BaseResponse userInfoBaseResponse) { - Log.e(TAG + "getInfo", "onNext: "); - if (userInfoBaseResponse.code == 200) { - UserInfo userInfo = userInfoBaseResponse.data; - boolean username = Settings.System.putString(mContext.getContentResolver(), "UserInfo_username", userInfo.getSn_name()); - boolean gread = Settings.System.putString(mContext.getContentResolver(), "UserInfo_grade", userInfo.getGrade()); - mView.setInfo(userInfoBaseResponse); - } - } - - @Override - public void onError(Throwable e) { - Log.e(TAG + "getInfo", "onError: " + e.getMessage()); - onComplete(); - } - - @Override - public void onComplete() { - Log.e(TAG + "getInfo", "onComplete: "); - } - }); - } - @Override public void getUserInfo() { NetInterfaceManager.getInstance() @@ -411,6 +602,7 @@ public class MainPresenter implements MainContact.Presenter { @Override public void onComplete() { Log.e(TAG + "getUserInfo", "onComplete: "); + mView.setUserInfo(); } }); } @@ -578,18 +770,22 @@ public class MainPresenter implements MainContact.Presenter { @Override public void onNext(BaseResponse systemSettingsBaseResponse) { Log.e(TAG + "getSystemSettings", "onNext: "); + SPUtils.put(mContext, "is_first_connection", 0); int code = systemSettingsBaseResponse.code; if (code == 200) { JSONObject jsonObject = (JSONObject) JSON.toJSON(systemSettingsBaseResponse.data); Log.e(TAG + "getSystemSettings", "onNext: settings: " + jsonObject.toString()); ControlManager.getInstance().setSystemSetting(mContext, jsonObject.toJSONString()); } else { - + ControlManager.getInstance().setDisableSetting(); } } @Override public void onError(Throwable e) { + if ((int) SPUtils.get(mContext, "is_first_connection", 1) == 1) { + ControlManager.getInstance().setDisableSetting(); + } Log.e(TAG + "getSystemSettings", "onError: " + e.getMessage()); onComplete(); } diff --git a/app/src/main/java/com/info/sn/activity/selectegrade/SelecteGradeActivity.java b/app/src/main/java/com/info/sn/activity/selectegrade/SelecteGradeActivity.java new file mode 100644 index 0000000..fb23335 --- /dev/null +++ b/app/src/main/java/com/info/sn/activity/selectegrade/SelecteGradeActivity.java @@ -0,0 +1,371 @@ +package com.info.sn.activity.selectegrade; + +import androidx.appcompat.app.AppCompatActivity; + +import android.net.Uri; +import android.os.Bundle; +import android.provider.Settings; +import android.text.TextUtils; +import android.view.View; +import android.widget.Button; +import android.widget.RadioButton; +import android.widget.RadioGroup; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.info.sn.R; +import com.info.sn.activity.main.MainActivity; +import com.info.sn.base.BaseActivity; +import com.info.sn.bean.gankao.AvailableProduct; +import com.info.sn.bean.gankao.PowerUser; +import com.info.sn.config.Scheme; +import com.info.sn.utils.LaunchTools; +import com.info.sn.utils.SPUtils; +import com.info.sn.utils.ToastUtil; +import com.info.sn.utils.Utils; + +import java.util.HashMap; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; + +public class SelecteGradeActivity extends BaseActivity implements SelecteGradeContact.MainView { + @BindView(R.id.radioGroup1) + RadioGroup radioGroup1; + @BindView(R.id.radioGroup2) + RadioGroup radioGroup2; + @BindView(R.id.radioGroup3) + RadioGroup radioGroup3; + @BindView(R.id.radioGroup4) + RadioGroup radioGroup4; + @BindView(R.id.radioButton1) + RadioButton radioButton1; + @BindView(R.id.radioButton2) + RadioButton radioButton2; + @BindView(R.id.radioButton3) + RadioButton radioButton3; + @BindView(R.id.radioButton4) + RadioButton radioButton4; + @BindView(R.id.radioButton5) + RadioButton radioButton5; + @BindView(R.id.radioButton6) + RadioButton radioButton6; + @BindView(R.id.radioButton7) + RadioButton radioButton7; + @BindView(R.id.radioButton8) + RadioButton radioButton8; + @BindView(R.id.radioButton9) + RadioButton radioButton9; + @BindView(R.id.radioButton10) + RadioButton radioButton10; + @BindView(R.id.radioButton11) + RadioButton radioButton11; + @BindView(R.id.radioButton12) + RadioButton radioButton12; + + @BindView(R.id.bt_unactivation) + Button bt_unactivation; + @BindView(R.id.bt_activation) + Button bt_activation; + + + @OnClick({R.id.radioButton1, R.id.radioButton2, R.id.radioButton3, R.id.radioButton4, R.id.radioButton5, R.id.radioButton6, + R.id.radioButton7, R.id.radioButton8, R.id.radioButton9, R.id.radioButton10, R.id.radioButton11, R.id.radioButton12}) + public void onClick(View v) { + switch (v.getId()) { + default: + break; + case R.id.radioButton1: + showGroup1(); + grade = 1; + break; + case R.id.radioButton2: + showGroup1(); + grade = 2; + break; + case R.id.radioButton3: + showGroup1(); + grade = 3; + break; + case R.id.radioButton4: + showGroup2(); + grade = 4; + break; + case R.id.radioButton5: + showGroup2(); + grade = 5; + break; + case R.id.radioButton6: + showGroup2(); + grade = 6; + break; + case R.id.radioButton7: + showGroup3(); + grade = 7; + break; + case R.id.radioButton8: + showGroup3(); + grade = 8; + break; + case R.id.radioButton9: + showGroup3(); + grade = 9; + break; + case R.id.radioButton10: + showGroup4(); + grade = 10; + break; + case R.id.radioButton11: + showGroup4(); + grade = 11; + break; + case R.id.radioButton12: + showGroup4(); + grade = 12; + break; + } + } + + private int grade; + private SelecteGradePresenter mPresenter = new SelecteGradePresenter(this); + + private void showGroup1() { + radioGroup2.clearCheck(); + radioGroup3.clearCheck(); + radioGroup4.clearCheck(); + } + + private void showGroup2() { + radioGroup1.clearCheck(); + radioGroup3.clearCheck(); + radioGroup4.clearCheck(); + } + + private void showGroup3() { + radioGroup1.clearCheck(); + radioGroup2.clearCheck(); + radioGroup4.clearCheck(); + } + + private void showGroup4() { + radioGroup1.clearCheck(); + radioGroup2.clearCheck(); + radioGroup3.clearCheck(); + } + + @Override + public int getLayoutId() { + return R.layout.activity_selecte_grade; + } + + @Override + public void initView() { + ButterKnife.bind(this); + mPresenter.setProvider(this); + mPresenter.attachView(this); + } + + @Override + public void initData() { + setOnclick(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + mPresenter.detachView(); + } + + private void setOnclick() { + bt_unactivation.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + bt_activation.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + checkGrade(); + } + }); + } + + private void checkGrade() { + if (grade == 0) { + ToastUtil.show("请选择激活年级"); + return; + } + + mPresenter.checkSN(); + } + + @Override + public void checkSNResult(int code) { + switch (code) { + case 200: + case 300: + mPresenter.getGankaoUID(); + ToastUtil.show("设备验证成功"); + break; + case 400: + ToastUtil.show("此设备未经授权,禁止激活"); + break; + case 404: + ToastUtil.show("网络连接失败,稍后重试"); + break; + default: + break; + } + } + + @Override + public void setGankaoUID(String gankaoUID) { + if (TextUtils.isEmpty(gankaoUID)) { + ToastUtil.show("用户注册失败"); + } else { + ToastUtil.show("用户注册成功"); + mPresenter.queryAvailableProduct(); + } + } + + private HashMap mAvailableProductHashMap = new HashMap<>(); + + @Override + public void setAvailableProduct(List availableProductList) { + for (AvailableProduct product : availableProductList) { + mAvailableProductHashMap.put(product.getDuration(), product.getSpecification_id()); + } + setGrade(availableProductList); + } + + private void setGrade(List list) { + if (list == null || list.size() == 0) { + ToastUtil.show("获取激活套餐失败"); + } else { + AvailableProduct defaultProduct = null; + AvailableProduct primary = null; + AvailableProduct junior = null; + AvailableProduct high = null; + for (AvailableProduct product : list) { + if (product.getDuration().contains("全学段")) { + defaultProduct = product; + } + if (product.getDuration().contains("小学")) { + primary = product; + } + if (product.getDuration().contains("初中")) { + junior = product; + } + if (product.getDuration().contains("高中")) { + high = product; + } + } + switch (grade) { + default: + break; + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + activeUser(primary, grade); + break; + case 7: + case 8: + case 9: + activeUser(junior, grade); + break; + case 10: + case 11: + case 12: + activeUser(high, grade); + break; + } + SPUtils.put(SelecteGradeActivity.this, "int_grade", grade); + } + } + + /** + * @param product 通过产品id激活设备 + */ + private void activeUser(AvailableProduct product, int grade) { + if (product == null) { + ToastUtil.show("获取激活套餐失败"); + return; + } + mPresenter.activeUser(product, grade); + } + + @Override + public void activeUserFinish(int code, int grade) { + switch (code) { + case 10000: + ToastUtil.show("授权成功"); + break; + case 50000: + ToastUtil.show("已经授权"); + break; + case 0: + default: + ToastUtil.show("授权失败"); + break; + } + mPresenter.queryPowerUserList(grade); + } + + @Override + public void queryPowerUserListFinish(List powerUserList, int grade) { + JSONArray jsonArray = new JSONArray(); + if (powerUserList != null && powerUserList.size() != 0) { + for (PowerUser powerUser : powerUserList) { + if (powerUser.getUserID().equals(Utils.getSerial())) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("card_info", powerUser.getAuthorityName()); + jsonObject.put("grade", powerUser.getGrade()); + jsonObject.put("activate_time", powerUser.getAuthorizationDate()); + jsonObject.put("user_power_id", powerUser.getAuthorizationNumber()); + jsonObject.put("specification_id", mAvailableProductHashMap.get(powerUser.getAuthorityName())); + jsonArray.add(jsonObject); + } + } + } + mPresenter.sendUid(jsonArray.toJSONString(), grade); + } + + @Override + public void sendUidFinish(int code) { + if (code == 200) { + toGankaoApp(); + finish(); + } else { + ToastUtil.show("保存信息失败请重试"); + } + } + + private void toGankaoApp() { + String gankaoUID = (String) SPUtils.get(SelecteGradeActivity.this, "gankaoUID", ""); + if (TextUtils.isEmpty(gankaoUID)) { + ToastUtil.show("获取用户信息失败"); + return; + } + HashMap keys = new HashMap(); + //device_id 传入赶考 UID 可实现账户公用,不会创建新账号 + keys.put("device_id", Uri.encode(gankaoUID)); + keys.put("partner_id", Scheme.partner_id); + keys.put("macaddr", Uri.encode(Utils.getAndroid7MAC())); + try { + String uri = LaunchTools.toUserCenter(SelecteGradeActivity.this, keys, Uri.encode(Scheme.ownCenter)); +// Scheme.openScheme(MainActivity.this, Scheme.getLogin(MainActivity.this)); + Scheme.openScheme(SelecteGradeActivity.this, uri); +// LaunchTools.goGankao(MainActivity.this, "", ""); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/app/src/main/java/com/info/sn/activity/selectegrade/SelecteGradeContact.java b/app/src/main/java/com/info/sn/activity/selectegrade/SelecteGradeContact.java new file mode 100644 index 0000000..994143e --- /dev/null +++ b/app/src/main/java/com/info/sn/activity/selectegrade/SelecteGradeContact.java @@ -0,0 +1,31 @@ +package com.info.sn.activity.selectegrade; + +import com.info.sn.activity.main.MainContact; +import com.info.sn.bean.gankao.AvailableProduct; +import com.info.sn.bean.gankao.PowerUser; +import com.info.sn.mvp.BasePresenter; +import com.info.sn.mvp.BaseView; + +import java.util.List; + +public class SelecteGradeContact { + public interface MainView extends BaseView { + void checkSNResult(int code); + void setGankaoUID(String gankaoUID); + void setAvailableProduct(List availableProductList); + void activeUserFinish(int code,int grade); + void queryPowerUserListFinish(List powerUserList, int grade); + void sendUidFinish(int code); + } + + interface Presenter extends BasePresenter { + void checkSN(); + void getGankaoUID(); + void queryAvailableProduct(); + void activeUser(AvailableProduct product,int grade); + void queryPowerUserList(int grade); + void sendUid(String jsonString,int grade); + } + + +} diff --git a/app/src/main/java/com/info/sn/activity/selectegrade/SelecteGradePresenter.java b/app/src/main/java/com/info/sn/activity/selectegrade/SelecteGradePresenter.java new file mode 100644 index 0000000..2705fa0 --- /dev/null +++ b/app/src/main/java/com/info/sn/activity/selectegrade/SelecteGradePresenter.java @@ -0,0 +1,357 @@ +package com.info.sn.activity.selectegrade; + +import android.content.Context; +import android.provider.Settings; +import android.text.TextUtils; +import android.util.Log; + +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; +import com.info.sn.activity.main.MainActivity; +import com.info.sn.activity.main.MainPresenter; +import com.info.sn.bean.gankao.AvailableProduct; +import com.info.sn.bean.gankao.CreateUserBean; +import com.info.sn.bean.gankao.GankaoBaseResponse; +import com.info.sn.bean.gankao.PowerUser; +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.bean.zuoye.Response; +import com.info.sn.bean.zuoye.UserInfo; +import com.info.sn.config.Scheme; +import com.info.sn.manager.NetInterfaceManager; +import com.info.sn.utils.LaunchTools; +import com.info.sn.utils.SPUtils; +import com.info.sn.utils.ToastUtil; +import com.info.sn.utils.Utils; +import com.trello.rxlifecycle2.LifecycleProvider; +import com.trello.rxlifecycle2.android.ActivityEvent; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import io.reactivex.Observer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; + +public class SelecteGradePresenter implements SelecteGradeContact.Presenter { + private String TAG; + + private SelecteGradeContact.MainView mView; + private Context mContext; + + SelecteGradePresenter(Context context) { + this.mContext = context; + TAG = context.getClass().getSimpleName() + "." + MainPresenter.class.getSimpleName() + ":"; + } + + private LifecycleProvider provider; + + public void setProvider(LifecycleProvider provider) { + this.provider = provider; + } + + public LifecycleProvider getProvider() { + return provider; + } + + @Override + public void attachView(SelecteGradeContact.MainView view) { + this.mView = view; + } + + @Override + public void detachView() { + this.mView = null; + } + + @Override + public void checkSN() { + NetInterfaceManager.getInstance() + .getsnInfoControl() + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "checkSN", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse userInfoBaseResponse) { + Log.e(TAG + "checkSN", "onNext: "); + int code = userInfoBaseResponse.code; + mView.checkSNResult(code); + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "checkSN", "onError: " + e.getMessage()); + mView.checkSNResult(404); + onComplete(); + } + + @Override + public void onComplete() { + Log.e(TAG + TAG + "checkSN", "onComplete: "); + } + }); + } + + @Override + public void getGankaoUID() { + String appid = Scheme.partner_id; + String timestamp = String.valueOf(System.currentTimeMillis()); + String uid = Utils.getSerial(); + Log.e(TAG + TAG, "getGankaoUID: uid: " + uid); + if (TextUtils.isEmpty(uid) || "0".equals(uid)) { + ToastUtil.show("设备未绑定账号,请绑定后重试"); + return; + } + + HashMap params = new HashMap<>(); + params.put("appid", appid); + params.put("timestamp", timestamp); + params.put("uid", uid); + String token = LaunchTools.getToken(params); + NetInterfaceManager.getInstance() + .getCreateUserControl() + .createUser(appid, timestamp, uid, token) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "getGankaoUID", "onSubscribe: "); + } + + @Override + public void onNext(GankaoBaseResponse gankaoBaseResponse) { + Log.e(TAG + "getGankaoUID", "onNext: " + JSONObject.toJSONString(gankaoBaseResponse)); + if (gankaoBaseResponse.code == 10002) { + Type type = new TypeToken() { + }.getType(); + Gson gson = new Gson(); + CreateUserBean userBean = gson.fromJson(gson.toJson(gankaoBaseResponse.data), type); + String gankaoPartnerUID = userBean.getGankaoPartnerUID(); + int gankaoUIDint = userBean.getGankaoUID(); + String gankaoUID = String.valueOf(gankaoUIDint); + Log.e(TAG + "getGankaoUID", "onNext: gankaoUID: " + gankaoUID); + SPUtils.put(mContext, "gankaoUID", gankaoUID); + Settings.System.putString(mContext.getContentResolver(), "gankaoUID", gankaoUID); + int isNew = userBean.getIsNew(); + mView.setGankaoUID(gankaoUID); + } else { + mView.setGankaoUID(""); + } + } + + @Override + public void onError(Throwable e) { + mView.setGankaoUID(""); + Log.e(TAG + "getGankaoUID", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e(TAG + "getGankaoUID", "onComplete: "); + } + }); + } + + @Override + public void queryAvailableProduct() { + String appid = Scheme.partner_id; + String timestamp = String.valueOf(System.currentTimeMillis()); + HashMap params = new HashMap<>(); + params.put("appid", appid); + params.put("timestamp", timestamp); + NetInterfaceManager.getInstance() + .getQueryProductControl() + .activeUser(appid, timestamp, LaunchTools.getToken(params)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "queryAvailableProduct", "onSubscribe: "); + } + + @Override + public void onNext(GankaoBaseResponse gankaoBaseResponse) { + Log.e(TAG + "queryAvailableProduct", "onNext: " + JSONObject.toJSONString(gankaoBaseResponse)); + if (gankaoBaseResponse.code == 10000) { + Type type = new TypeToken>() { + }.getType(); + Gson gson = new Gson(); + List availableProductList = gson.fromJson(gson.toJson(gankaoBaseResponse.data), type); + mView.setAvailableProduct(availableProductList); + } else { + ToastUtil.show("获取激活套餐失败"); + mView.setAvailableProduct(new ArrayList()); + } + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "queryAvailableProduct", "onError: " + e.getMessage()); + mView.setAvailableProduct(new ArrayList()); + } + + @Override + public void onComplete() { + Log.e(TAG + "queryAvailableProduct", "onComplete: "); + } + }); + } + + @Override + public void activeUser(AvailableProduct product,int grade) { + String specification_id = product.getSpecification_id(); + Log.e(TAG, "activeUser: specification_id: " + specification_id); + String appid = Scheme.partner_id; + String timestamp = String.valueOf(System.currentTimeMillis()); + String uid = Utils.getSerial(); + HashMap params = new HashMap<>(); + params.put("appid", appid); + params.put("timestamp", timestamp); + params.put("uid", uid); + params.put("specification_id", String.valueOf(specification_id)); + + NetInterfaceManager.getInstance() + .getActiveUserControl() + .activeUser(appid, timestamp, LaunchTools.getToken(params), uid, specification_id) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "activeUser", "onSubscribe: "); + } + + @Override + public void onNext(GankaoBaseResponse gankaoBaseResponse) { + String jsonString = JSONObject.toJSONString(gankaoBaseResponse); + Log.e(TAG + "activeUser", "onNext: " + jsonString); + switch (gankaoBaseResponse.code) { + //第一次激活 + case 10000: + //已经授权过的 + case 50000: + Settings.System.putInt(mContext.getContentResolver(), MainActivity.activation, 1); + break; + default: + Settings.System.putInt(mContext.getContentResolver(), MainActivity.activation, 0); + break; + } + mView.activeUserFinish(gankaoBaseResponse.code,grade); + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "activeUser", "onError: "); + mView.activeUserFinish(0,grade); + } + + @Override + public void onComplete() { + Log.e(TAG + "activeUser", "onComplete: "); + } + }); + } + + @Override + public void queryPowerUserList(int grade) { + String appid = Scheme.partner_id; + String timestamp = String.valueOf(System.currentTimeMillis()); + HashMap params = new HashMap<>(); + params.put("appid", appid); + params.put("timestamp", timestamp); + + NetInterfaceManager.getInstance() + .getQueryPowerUserListControl() + .queryPowerUserList(appid, timestamp, LaunchTools.getToken(params)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e("queryPowerUserList", "onSubscribe: "); + } + + @Override + public void onNext(GankaoBaseResponse gankaoBaseResponse) { + Log.e("queryPowerUserList", "onNext: "); +// Log.e("queryPowerUserList", "onNext: " + JSONObject.toJSONString(gankaoBaseResponse)); + int code = gankaoBaseResponse.code; + if (code == 10000) { + Gson gson = new Gson(); + Type type = new TypeToken>() { + }.getType(); + JsonObject jsonObject = JsonParser.parseString(gson.toJson(gankaoBaseResponse.data)).getAsJsonObject(); + JsonArray jsonArray = jsonObject.getAsJsonArray("powerlist"); + List powerUserList = gson.fromJson(gson.toJson(jsonArray), type); + mView. queryPowerUserListFinish(powerUserList,grade); + } + } + + @Override + public void onError(Throwable e) { + Log.e("queryPowerUserList", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("queryPowerUserList", "onComplete: "); + } + }); + } + + @Override + public void sendUid(String jsonString, int grade) { + String gankaoUID = Settings.System.getString(mContext.getContentResolver(), "gankaoUID"); + if (TextUtils.isEmpty(gankaoUID)) { + ToastUtil.show("获取设备UID失败,请重新激活"); + } + Log.e(TAG, "sendUid: " + jsonString); + NetInterfaceManager.getInstance() + .getSaveSnUidApiControl() + .saveSnUid(Utils.getSerial(), gankaoUID, grade, jsonString) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "sendUid", "onSubscribe: "); + } + + @Override + public void onNext(Response response) { + Log.e(TAG + "sendUid", "onNext: " + JSONObject.toJSONString(response)); + mView.sendUidFinish(response.code); + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "sendUid", "onError: " + e.getMessage()); + mView.sendUidFinish(404); + onComplete(); + } + + @Override + public void onComplete() { + Log.e(TAG + "sendUid", "onComplete: "); + } + }); + } +} diff --git a/app/src/main/java/com/info/sn/adapter/SNUidAdapter.java b/app/src/main/java/com/info/sn/adapter/SNUidAdapter.java new file mode 100644 index 0000000..0734ec4 --- /dev/null +++ b/app/src/main/java/com/info/sn/adapter/SNUidAdapter.java @@ -0,0 +1,60 @@ +package com.info.sn.adapter; + +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.info.sn.R; +import com.info.sn.bean.zuoye.SNUidBean; + +import java.util.List; + +public class SNUidAdapter extends RecyclerView.Adapter { + + private List snUidBeans; + + public void setSnUidBeans(List uidBeads) { + this.snUidBeans = uidBeads; + notifyDataSetChanged(); + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + View v = View.inflate(parent.getContext(), R.layout.item_snuid, null); + v.setLayoutParams(layoutParams); + return new ViewHolder(v); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + SNUidBean snUidBean = snUidBeans.get(position); + holder.tv_name.setText(snUidBean.getCard_info()); + holder.tv_grade.setText(String.valueOf(snUidBean.getGrade())); + holder.tv_time.setText(snUidBean.getActivate_time()); + } + + @Override + public int getItemCount() { + return snUidBeans == null ? 0 : snUidBeans.size(); + } + + class ViewHolder extends RecyclerView.ViewHolder { + TextView tv_name; + TextView tv_grade; + TextView tv_time; + + ViewHolder(@NonNull View itemView) { + super(itemView); + tv_name = itemView.findViewById(R.id.tv_name); + tv_grade = itemView.findViewById(R.id.tv_grade); + tv_time = itemView.findViewById(R.id.tv_time); + } + } + +} diff --git a/app/src/main/java/com/info/sn/bean/gankao/AvailableProduct.java b/app/src/main/java/com/info/sn/bean/gankao/AvailableProduct.java index b651261..f4cf93f 100644 --- a/app/src/main/java/com/info/sn/bean/gankao/AvailableProduct.java +++ b/app/src/main/java/com/info/sn/bean/gankao/AvailableProduct.java @@ -7,7 +7,7 @@ public class AvailableProduct implements Serializable { String productname; String product_id; - int specification_id; + String specification_id; String duration; String register_autobind; String max_apply_preuser; @@ -30,11 +30,11 @@ public class AvailableProduct implements Serializable { this.product_id = product_id; } - public int getSpecification_id() { + public String getSpecification_id() { return specification_id; } - public void setSpecification_id(int specification_id) { + public void setSpecification_id(String specification_id) { this.specification_id = specification_id; } diff --git a/app/src/main/java/com/info/sn/bean/gankao/GankaoBaseResponse.java b/app/src/main/java/com/info/sn/bean/gankao/GankaoBaseResponse.java index a716fc7..5f3dca6 100644 --- a/app/src/main/java/com/info/sn/bean/gankao/GankaoBaseResponse.java +++ b/app/src/main/java/com/info/sn/bean/gankao/GankaoBaseResponse.java @@ -1,5 +1,11 @@ package com.info.sn.bean.gankao; +import androidx.annotation.NonNull; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + import java.io.Serializable; public class GankaoBaseResponse implements Serializable { @@ -8,8 +14,15 @@ public class GankaoBaseResponse implements Serializable { public int code; public int status; public String msg; - public long serverTime; + public long serverTime; public String tokenOK; public T data; + @NonNull + @Override + public String toString() { + Gson gson = new Gson(); + JsonObject jsonObject = JsonParser.parseString(gson.toJson(this)).getAsJsonObject(); + return jsonObject.toString(); + } } diff --git a/app/src/main/java/com/info/sn/bean/gankao/PowerUser.java b/app/src/main/java/com/info/sn/bean/gankao/PowerUser.java new file mode 100644 index 0000000..153a687 --- /dev/null +++ b/app/src/main/java/com/info/sn/bean/gankao/PowerUser.java @@ -0,0 +1,129 @@ +package com.info.sn.bean.gankao; + +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +public class PowerUser implements Serializable { + private static final long serialVersionUID = -6368881020242541651L; + @SerializedName("合作方用户id") + private String userID; + @SerializedName("赶考内部PUID") + private int pUID; + @SerializedName("赶考UID") + private int gankaoUID; + @SerializedName("姓名") + private String name; + @SerializedName("年级") + private int grade; + @SerializedName("身份") + private String identity; + @SerializedName("授权记录编号") + private int authorizationNumber; + @SerializedName("授权日期") + private String authorizationDate; + @SerializedName("权限规格ID") + private int authorityID; + @SerializedName("权限名称") + private String authorityName; + @SerializedName("回款价") + private float returnPrice; + @SerializedName("有效期") + private String validPeriod; + + public String getUserID() { + return userID; + } + + public void setUserID(String userID) { + this.userID = userID; + } + + public int getpUID() { + return pUID; + } + + public void setpUID(int pUID) { + this.pUID = pUID; + } + + public int getGankaoUID() { + return gankaoUID; + } + + public void setGankaoUID(int gankaoUID) { + this.gankaoUID = gankaoUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getGrade() { + return grade; + } + + public void setGrade(int grade) { + this.grade = grade; + } + + public String getIdentity() { + return identity; + } + + public void setIdentity(String identity) { + this.identity = identity; + } + + public int getAuthorizationNumber() { + return authorizationNumber; + } + + public void setAuthorizationNumber(int authorizationNumber) { + this.authorizationNumber = authorizationNumber; + } + + public String getAuthorizationDate() { + return authorizationDate; + } + + public void setAuthorizationDate(String authorizationDate) { + this.authorizationDate = authorizationDate; + } + + public int getAuthorityID() { + return authorityID; + } + + public void setAuthorityID(int authorityID) { + this.authorityID = authorityID; + } + + public String getAuthorityName() { + return authorityName; + } + + public void setAuthorityName(String authorityName) { + this.authorityName = authorityName; + } + + public float getReturnPrice() { + return returnPrice; + } + + public void setReturnPrice(float returnPrice) { + this.returnPrice = returnPrice; + } + + public String getValidPeriod() { + return validPeriod; + } + + public void setValidPeriod(String validPeriod) { + this.validPeriod = validPeriod; + } +} diff --git a/app/src/main/java/com/info/sn/bean/gankao/UserProduct.java b/app/src/main/java/com/info/sn/bean/gankao/UserProduct.java new file mode 100644 index 0000000..33da823 --- /dev/null +++ b/app/src/main/java/com/info/sn/bean/gankao/UserProduct.java @@ -0,0 +1,130 @@ +package com.info.sn.bean.gankao; + +import androidx.annotation.NonNull; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +import java.io.Serializable; + +public class UserProduct implements Serializable { + private static final long serialVersionUID = 7962643432696702587L; + + String id; + String user_id; + String name; + boolean isgroup; + String product_id; + String user_power_id; + String specification_id; + String register_autobind; + float upgradable; + String upgradablehint; + String expired_time; + String created_at; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUser_id() { + return user_id; + } + + public void setUser_id(String user_id) { + this.user_id = user_id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isIsgroup() { + return isgroup; + } + + public void setIsgroup(boolean isgroup) { + this.isgroup = isgroup; + } + + public String getProduct_id() { + return product_id; + } + + public void setProduct_id(String product_id) { + this.product_id = product_id; + } + + public String getUser_power_id() { + return user_power_id; + } + + public void setUser_power_id(String user_power_id) { + this.user_power_id = user_power_id; + } + + public String getSpecification_id() { + return specification_id; + } + + public void setSpecification_id(String specification_id) { + this.specification_id = specification_id; + } + + public String getRegister_autobind() { + return register_autobind; + } + + public void setRegister_autobind(String register_autobind) { + this.register_autobind = register_autobind; + } + + public float getUpgradable() { + return upgradable; + } + + public void setUpgradable(float upgradable) { + this.upgradable = upgradable; + } + + public String getUpgradablehint() { + return upgradablehint; + } + + public void setUpgradablehint(String upgradablehint) { + this.upgradablehint = upgradablehint; + } + + public String getExpired_time() { + return expired_time; + } + + public void setExpired_time(String expired_time) { + this.expired_time = expired_time; + } + + public String getCreated_at() { + return created_at; + } + + public void setCreated_at(String created_at) { + this.created_at = created_at; + } + + @NonNull + @Override + public String toString() { + Gson gson = new Gson(); + JsonObject jsonObject = JsonParser.parseString(gson.toJson(this)).getAsJsonObject(); + return jsonObject.toString(); + } +} diff --git a/app/src/main/java/com/info/sn/bean/gankao/UserProductCards.java b/app/src/main/java/com/info/sn/bean/gankao/UserProductCards.java new file mode 100644 index 0000000..1ed6265 --- /dev/null +++ b/app/src/main/java/com/info/sn/bean/gankao/UserProductCards.java @@ -0,0 +1,17 @@ +package com.info.sn.bean.gankao; + +import java.io.Serializable; + +public class UserProductCards implements Serializable { + private static final long serialVersionUID = 2956193416718626851L; + + T cards; + + public T getCards() { + return cards; + } + + public void setCards(T cards) { + this.cards = cards; + } +} diff --git a/app/src/main/java/com/info/sn/bean/zuoye/SNUidBean.java b/app/src/main/java/com/info/sn/bean/zuoye/SNUidBean.java new file mode 100644 index 0000000..32c10bb --- /dev/null +++ b/app/src/main/java/com/info/sn/bean/zuoye/SNUidBean.java @@ -0,0 +1,53 @@ +package com.info.sn.bean.zuoye; + +import java.io.Serializable; + +public class SNUidBean implements Serializable { + private static final long serialVersionUID = 8415979808461790756L; + + String specification_id; + String user_power_id; + int grade; + String activate_time; + String card_info; + + public String getSpecification_id() { + return specification_id; + } + + public void setSpecification_id(String specification_id) { + this.specification_id = specification_id; + } + + public String getUser_power_id() { + return user_power_id; + } + + public void setUser_power_id(String user_power_id) { + this.user_power_id = user_power_id; + } + + public int getGrade() { + return grade; + } + + public void setGrade(int grade) { + this.grade = grade; + } + + public String getActivate_time() { + return activate_time; + } + + public void setActivate_time(String activate_time) { + this.activate_time = activate_time; + } + + public String getCard_info() { + return card_info; + } + + public void setCard_info(String card_info) { + this.card_info = card_info; + } +} diff --git a/app/src/main/java/com/info/sn/manager/ControlManager.java b/app/src/main/java/com/info/sn/manager/ControlManager.java index 3dbf77c..b969477 100644 --- a/app/src/main/java/com/info/sn/manager/ControlManager.java +++ b/app/src/main/java/com/info/sn/manager/ControlManager.java @@ -529,7 +529,7 @@ public class ControlManager { private static void setCanReset(Context context, String jsonString) { JSONObject jsonObject = JSON.parseObject(jsonString); - int mode = jsonObject.getInteger("qch_restore"); + int mode = jsonObject.getIntValue("qch_restore"); if (mode == 1) { Settings.System.putInt(context.getContentResolver(), "qch_restore_forbid_on", 0); } else { @@ -555,7 +555,7 @@ public class ControlManager { public void setDeveloperOptions(Context context, String jsonString) { JSONObject jsonObject = JSON.parseObject(jsonString); - int dev_mode = changeNum(jsonObject.getInteger("dev_mode")); + int dev_mode = changeNum(jsonObject.getIntValue("dev_mode")); Log.e(TAG, "getDeveloper: " + dev_mode); if (!DeviceManager.isDebugMode()) { JGYUtils.putInt(context.getContentResolver(), "qch_Developeroptions", dev_mode); diff --git a/app/src/main/java/com/info/sn/manager/NetInterfaceManager.java b/app/src/main/java/com/info/sn/manager/NetInterfaceManager.java index 4306632..e56fa1f 100644 --- a/app/src/main/java/com/info/sn/manager/NetInterfaceManager.java +++ b/app/src/main/java/com/info/sn/manager/NetInterfaceManager.java @@ -7,25 +7,28 @@ import android.os.Environment; import com.info.sn.bean.zuoye.AppInfo; import com.info.sn.bean.zuoye.AppStart; import com.info.sn.bean.zuoye.BaseResponse; -import com.info.sn.bean.zuoye.Response; import com.info.sn.bean.zuoye.SystemSettings; import com.info.sn.bean.zuoye.UserAvatarInfo; import com.info.sn.bean.zuoye.UserInfo; import com.info.sn.network.UrlAddress; import com.info.sn.network.api.APPJump; -import com.info.sn.network.api.ActiveUserApi; +import com.info.sn.network.api.gankao.ActiveUserApi; import com.info.sn.network.api.AddAppInstall; import com.info.sn.network.api.AppUsedApi; import com.info.sn.network.api.BindDevices; import com.info.sn.network.api.Browser; -import com.info.sn.network.api.CreateUserApi; +import com.info.sn.network.api.gankao.CancelUserPowerApi; +import com.info.sn.network.api.gankao.CreateUserApi; import com.info.sn.network.api.ForceInstall; import com.info.sn.network.api.BrowserLabel; +import com.info.sn.network.api.GetGuideApi; +import com.info.sn.network.api.GetSnUidApi; import com.info.sn.network.api.NewestAppUpdate; import com.info.sn.network.api.QRCodeApi; import com.info.sn.network.api.QueryAllApp; import com.info.sn.network.api.QueryAppInside; -import com.info.sn.network.api.QueryProductApi; +import com.info.sn.network.api.gankao.QueryPowerUserListApi; +import com.info.sn.network.api.gankao.QueryProductApi; import com.info.sn.network.api.QuerySnAppStart; import com.info.sn.network.api.RunningApp; import com.info.sn.network.api.SNInfoApi; @@ -38,6 +41,8 @@ import com.info.sn.network.api.TimeControl; import com.info.sn.network.api.UpdateAdminSn; import com.info.sn.network.api.UploadScreenshot; import com.info.sn.network.api.UserInfoControl; +import com.info.sn.network.api.gankao.UpgradeUserPowerApi; +import com.info.sn.network.api.gankao.UserProductsApi; import com.info.sn.utils.Utils; import java.io.File; @@ -218,11 +223,8 @@ public class NetInterfaceManager { .observeOn(AndroidSchedulers.mainThread()); } - public Observable getSaveSnUidApiControl(String uid) { - return mRetrofit.create(SaveSnUidApi.class) - .saveSnUid(Utils.getSerial(), uid) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()); + public SaveSnUidApi getSaveSnUidApiControl() { + return mRetrofit.create(SaveSnUidApi.class); } @@ -251,6 +253,19 @@ public class NetInterfaceManager { .observeOn(AndroidSchedulers.mainThread()); } + public Observable getGetGuideControl() { + return mRetrofit.create(GetGuideApi.class) + .getGuidePic(2) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable getSnUidApiControl() { + return mRetrofit.create(GetSnUidApi.class) + .getSnUid(Utils.getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } //赶考 @@ -266,5 +281,19 @@ public class NetInterfaceManager { return mGankaoRetrofit.create(QueryProductApi.class); } + public QueryPowerUserListApi getQueryPowerUserListControl() { + return mGankaoRetrofit.create(QueryPowerUserListApi.class); + } + public UserProductsApi getUserProductsControl() { + return mGankaoRetrofit.create(UserProductsApi.class); + } + + public CancelUserPowerApi getCancelUserPowerControl() { + return mGankaoRetrofit.create(CancelUserPowerApi.class); + } + + public UpgradeUserPowerApi getUpgradeUserPowerControl() { + return mGankaoRetrofit.create(UpgradeUserPowerApi.class); + } } diff --git a/app/src/main/java/com/info/sn/network/HTTPInterface.java b/app/src/main/java/com/info/sn/network/HTTPInterface.java index 95ae5f9..68b2301 100644 --- a/app/src/main/java/com/info/sn/network/HTTPInterface.java +++ b/app/src/main/java/com/info/sn/network/HTTPInterface.java @@ -58,7 +58,7 @@ public class HTTPInterface { // Log.e("SendAppInstall", installOrRemove + "return: " + packages); // return; // } - + Log.e(TAG, "SendAppInstall: " + jsonString); NetInterfaceManager.getInstance() .getAddAppInstallControl() .installorRemove( diff --git a/app/src/main/java/com/info/sn/network/UrlAddress.java b/app/src/main/java/com/info/sn/network/UrlAddress.java index 7e7c0db..707b997 100644 --- a/app/src/main/java/com/info/sn/network/UrlAddress.java +++ b/app/src/main/java/com/info/sn/network/UrlAddress.java @@ -49,11 +49,14 @@ public class UrlAddress { public static final String GET_USER_AVATAR_INFO = "sn/getUserAvatarInfo"; //上传设备赶考的UID public static final String POST_USER_SAVESNUID = "sn/saveSnUid"; + //获取激活时间和赶考UID + public static final String GET_SN_UID = "sn/getSnUid"; //获取app使用信息 public static final String UPLOAD_APP_USE_INFO = "sn/uploadAppUseInfo"; //获取小程序二维码 public static final String GET_APPLET_QRCODE = "file/getAppletQrCode"; - + //获取操作指南 + public static final String GET_OPERATION_GUIDE = "file/getFiles"; @@ -65,5 +68,12 @@ public class UrlAddress { public static final String ACTIVE_USER = "activeUser"; //获得可用的权限产品规格 public static final String QUERY_AVAILABLE_PRODUCT_SPECIFICATIONS = "queryAvailableProductSpecifications"; - + //获取机构的接口授权记录 + public static final String QUERY_POWER_USER_LIST = "queryPowerUserList"; + //获取用户已获得的产品列表(权限、单体课程、套餐等) + public static final String GET_USER_PRODUCTS = "getUserProducts"; + //升级用户会员权限的学段 + public static final String UPGRADE_USER_POWER = "upgradeUserPower"; + //撤销指定的用户授权记录 + public static final String CANCEL_USER_POWER = "cancelUserPower"; } diff --git a/app/src/main/java/com/info/sn/network/api/GetGuideApi.java b/app/src/main/java/com/info/sn/network/api/GetGuideApi.java new file mode 100644 index 0000000..120027c --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/GetGuideApi.java @@ -0,0 +1,15 @@ +package com.info.sn.network.api; + +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.network.UrlAddress; + +import io.reactivex.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface GetGuideApi { + @GET(UrlAddress.GET_OPERATION_GUIDE) + Observable getGuidePic( + @Query("type") int type + ); +} diff --git a/app/src/main/java/com/info/sn/network/api/GetGuideApiTest.java b/app/src/main/java/com/info/sn/network/api/GetGuideApiTest.java new file mode 100644 index 0000000..2eb2d19 --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/GetGuideApiTest.java @@ -0,0 +1,15 @@ +package com.info.sn.network.api; + +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.network.UrlAddress; + +import io.reactivex.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface GetGuideApiTest { + @GET(UrlAddress.GET_OPERATION_GUIDE) + Observable getGuidePic( + @Query("type") int type + ); +} diff --git a/app/src/main/java/com/info/sn/network/api/GetSnUidApi.java b/app/src/main/java/com/info/sn/network/api/GetSnUidApi.java new file mode 100644 index 0000000..c11c20f --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/GetSnUidApi.java @@ -0,0 +1,15 @@ +package com.info.sn.network.api; + +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.network.UrlAddress; + +import io.reactivex.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface GetSnUidApi { + @GET(UrlAddress.GET_SN_UID) + Observable getSnUid( + @Query("sn") String sn + ); +} diff --git a/app/src/main/java/com/info/sn/network/api/SaveSnUidApi.java b/app/src/main/java/com/info/sn/network/api/SaveSnUidApi.java index c990880..04b4a5e 100644 --- a/app/src/main/java/com/info/sn/network/api/SaveSnUidApi.java +++ b/app/src/main/java/com/info/sn/network/api/SaveSnUidApi.java @@ -13,6 +13,8 @@ public interface SaveSnUidApi { @POST(UrlAddress.POST_USER_SAVESNUID) Observable saveSnUid( @Field("sn") String sn, - @Field("uid") String uid + @Field("uid") String uid, + @Field("grade") int grade, + @Field("card_info") String card_info ); } diff --git a/app/src/main/java/com/info/sn/network/api/ActiveUserApi.java b/app/src/main/java/com/info/sn/network/api/gankao/ActiveUserApi.java similarity index 82% rename from app/src/main/java/com/info/sn/network/api/ActiveUserApi.java rename to app/src/main/java/com/info/sn/network/api/gankao/ActiveUserApi.java index 7f957bc..e7def73 100644 --- a/app/src/main/java/com/info/sn/network/api/ActiveUserApi.java +++ b/app/src/main/java/com/info/sn/network/api/gankao/ActiveUserApi.java @@ -1,4 +1,4 @@ -package com.info.sn.network.api; +package com.info.sn.network.api.gankao; import com.info.sn.bean.gankao.GankaoBaseResponse; import com.info.sn.network.UrlAddress; @@ -15,6 +15,6 @@ public interface ActiveUserApi { @Query("timestamp") String timestamp, @Query("token") String token, @Query("uid") String uid, - @Query("specification_id") int specification_id + @Query("specification_id") String specification_id ); } diff --git a/app/src/main/java/com/info/sn/network/api/gankao/CancelUserPowerApi.java b/app/src/main/java/com/info/sn/network/api/gankao/CancelUserPowerApi.java new file mode 100644 index 0000000..4805faa --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/gankao/CancelUserPowerApi.java @@ -0,0 +1,19 @@ +package com.info.sn.network.api.gankao; + +import com.info.sn.bean.gankao.GankaoBaseResponse; +import com.info.sn.network.UrlAddress; + +import io.reactivex.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface CancelUserPowerApi { + @GET(UrlAddress.CANCEL_USER_POWER) + Observable cancelUserPower( + @Query("app_id") String app_id, + @Query("timestamp") String timestamp, + @Query("token") String token, + @Query("user_power_id") String user_power_id, + @Query("specification_id") String specification_id + ); +} diff --git a/app/src/main/java/com/info/sn/network/api/CreateUserApi.java b/app/src/main/java/com/info/sn/network/api/gankao/CreateUserApi.java similarity index 92% rename from app/src/main/java/com/info/sn/network/api/CreateUserApi.java rename to app/src/main/java/com/info/sn/network/api/gankao/CreateUserApi.java index b2b2613..c03e028 100644 --- a/app/src/main/java/com/info/sn/network/api/CreateUserApi.java +++ b/app/src/main/java/com/info/sn/network/api/gankao/CreateUserApi.java @@ -1,4 +1,4 @@ -package com.info.sn.network.api; +package com.info.sn.network.api.gankao; import com.info.sn.bean.gankao.GankaoBaseResponse; import com.info.sn.network.UrlAddress; diff --git a/app/src/main/java/com/info/sn/network/api/gankao/QueryPowerUserListApi.java b/app/src/main/java/com/info/sn/network/api/gankao/QueryPowerUserListApi.java new file mode 100644 index 0000000..ebb2381 --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/gankao/QueryPowerUserListApi.java @@ -0,0 +1,17 @@ +package com.info.sn.network.api.gankao; + +import com.info.sn.bean.gankao.GankaoBaseResponse; +import com.info.sn.network.UrlAddress; + +import io.reactivex.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface QueryPowerUserListApi { + @GET(UrlAddress.QUERY_POWER_USER_LIST) + Observable queryPowerUserList( + @Query("app_id") String app_id, + @Query("timestamp") String timestamp, + @Query("token") String token + ); +} diff --git a/app/src/main/java/com/info/sn/network/api/QueryProductApi.java b/app/src/main/java/com/info/sn/network/api/gankao/QueryProductApi.java similarity index 92% rename from app/src/main/java/com/info/sn/network/api/QueryProductApi.java rename to app/src/main/java/com/info/sn/network/api/gankao/QueryProductApi.java index 1c7d1ee..5eed154 100644 --- a/app/src/main/java/com/info/sn/network/api/QueryProductApi.java +++ b/app/src/main/java/com/info/sn/network/api/gankao/QueryProductApi.java @@ -1,4 +1,4 @@ -package com.info.sn.network.api; +package com.info.sn.network.api.gankao; import com.info.sn.bean.gankao.GankaoBaseResponse; import com.info.sn.network.UrlAddress; diff --git a/app/src/main/java/com/info/sn/network/api/gankao/UpgradeUserPowerApi.java b/app/src/main/java/com/info/sn/network/api/gankao/UpgradeUserPowerApi.java new file mode 100644 index 0000000..be34fa4 --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/gankao/UpgradeUserPowerApi.java @@ -0,0 +1,19 @@ +package com.info.sn.network.api.gankao; + +import com.info.sn.bean.gankao.GankaoBaseResponse; +import com.info.sn.network.UrlAddress; + +import io.reactivex.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface UpgradeUserPowerApi { + @GET(UrlAddress.UPGRADE_USER_POWER) + Observable upgradeUserPower( + @Query("app_id") String app_id, + @Query("timestamp") String timestamp, + @Query("token") String token, + @Query("uid") String uid, + @Query("user_power_id") int user_power_id + ); +} diff --git a/app/src/main/java/com/info/sn/network/api/gankao/UserProductsApi.java b/app/src/main/java/com/info/sn/network/api/gankao/UserProductsApi.java new file mode 100644 index 0000000..92a9b6b --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/gankao/UserProductsApi.java @@ -0,0 +1,22 @@ +package com.info.sn.network.api.gankao; + +import com.info.sn.bean.gankao.GankaoBaseResponse; +import com.info.sn.bean.gankao.UserProduct; +import com.info.sn.bean.gankao.UserProductCards; +import com.info.sn.network.UrlAddress; + +import java.util.List; + +import io.reactivex.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface UserProductsApi { + @GET(UrlAddress.GET_USER_PRODUCTS) + Observable>>> getUserProducts( + @Query("app_id") String app_id, + @Query("timestamp") String timestamp, + @Query("token") String token, + @Query("uid") String uid + ); +} diff --git a/app/src/main/java/com/info/sn/receiver/InstallResultReceiver.java b/app/src/main/java/com/info/sn/receiver/InstallResultReceiver.java index 95ea862..bba6d80 100644 --- a/app/src/main/java/com/info/sn/receiver/InstallResultReceiver.java +++ b/app/src/main/java/com/info/sn/receiver/InstallResultReceiver.java @@ -53,7 +53,7 @@ public class InstallResultReceiver extends BroadcastReceiver { // Log.e("fht", LEGACY_STATUS); // Log.e("fht", STATUS_MESSAGE); if (STATUS_MESSAGE != null && STATUS_MESSAGE.equals("INSTALL_SUCCEEDED")) { - ToastUtil.show(PACKAGE_NAME + "安装成功"); +// ToastUtil.show(PACKAGE_NAME + "安装成功"); } } } diff --git a/app/src/main/java/com/info/sn/receiver/MyJPushReceiver.java b/app/src/main/java/com/info/sn/receiver/MyJPushReceiver.java index 9d459cb..4c11f50 100644 --- a/app/src/main/java/com/info/sn/receiver/MyJPushReceiver.java +++ b/app/src/main/java/com/info/sn/receiver/MyJPushReceiver.java @@ -11,6 +11,7 @@ import android.os.Bundle; import android.os.CountDownTimer; import android.os.Environment; import android.os.Handler; +import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import android.view.Gravity; @@ -20,7 +21,15 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.arialyy.aria.core.Aria; import com.arialyy.aria.core.download.DownloadEntity; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.info.sn.activity.main.MainActivity; +import com.info.sn.bean.gankao.AvailableProduct; +import com.info.sn.bean.gankao.GankaoBaseResponse; +import com.info.sn.bean.gankao.UserProduct; +import com.info.sn.bean.gankao.UserProductCards; import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.config.Scheme; import com.info.sn.jpush.Logger; import com.info.sn.manager.ControlManager; import com.info.sn.network.HTTPInterface; @@ -33,15 +42,21 @@ import com.info.sn.utils.CacheUtils; import com.info.sn.utils.CmdUtil; import com.info.sn.manager.DeviceManager; import com.info.sn.utils.JGYUtils; +import com.info.sn.utils.LaunchTools; import com.info.sn.utils.SPUtils; import com.info.sn.utils.ServiceAliveUtils; import com.info.sn.utils.ToastUtil; import com.info.sn.utils.Utils; import com.info.sn.dialog.CustomDialog; +import com.trello.rxlifecycle2.android.ActivityEvent; + +import org.jetbrains.annotations.NotNull; import java.io.File; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -139,7 +154,12 @@ public class MyJPushReceiver extends BroadcastReceiver { //搜题开关 private static final String JIGUANG_SEARCH_TOPIC = "39"; //电话白名单推送 - private static final String JIGUANG_PHONE_LIST = "49"; + private static final String JIGUANG_PHONE_LIST = "40"; + //调整套餐 + private static final String JIGUANG_CHANGE_COMBO = "41"; + //取消所有套餐 + private static final String JIGUANG_CANCEL_COMBO = "42"; + @Override public void onReceive(Context context, Intent intent) { @@ -217,7 +237,7 @@ public class MyJPushReceiver extends BroadcastReceiver { case JIGUANG_APP_NETWORKSTATE: ToastUtil.debugShow("收到推送消息: 应用联网管控"); setAppNetworkstate(context, extras); - HTTPInterface.getAppInside(); + Handler.getMain().postDelayed(HTTPInterface::getAppInside, 2000); break; case JIGUANG_APP_LOCKEDSTATE: ToastUtil.debugShow("收到推送消息: 应用锁管控"); @@ -263,12 +283,7 @@ public class MyJPushReceiver extends BroadcastReceiver { break; case JIGUANG_APP_NET_AUTO: ToastUtil.debugShow("收到推送消息: APP联网自启管控"); - Handler.getMain().postDelayed(new Runnable() { - @Override - public void run() { - HTTPInterface.getAllappPackage(context); - } - }, 2000); + Handler.getMain().postDelayed(() -> HTTPInterface.getAllappPackage(context), 2000); break; case JIGUANG_BROWSER_LABEL: try { @@ -290,12 +305,7 @@ public class MyJPushReceiver extends BroadcastReceiver { break; case JIGUANG_APP_SETTING: ToastUtil.debugShow("收到推送消息: 获取app管控设置"); - Handler.getMain().postDelayed(new Runnable() { - @Override - public void run() { - HTTPInterface.getAllappPackage(context); - } - }, 2000); + Handler.getMain().postDelayed(() -> HTTPInterface.getAllappPackage(context), 2000); break; case JIGUANG_FORCE_KILL: ToastUtil.debugShow("收到推送消息: 强制停止应用"); @@ -353,11 +363,18 @@ public class MyJPushReceiver extends BroadcastReceiver { ToastUtil.debugShow("收到推送消息: 电话白名单管控"); setPhone(context, extras); break; + case JIGUANG_CHANGE_COMBO: + changeCombo(context, extras); + break; + case JIGUANG_CANCEL_COMBO: + cancleCombo(context, extras); + break; default: break; } } + private int changeNum(int paramInt) { return paramInt == 1 ? 0 : 1; } @@ -399,7 +416,7 @@ public class MyJPushReceiver extends BroadcastReceiver { synchronized private void setTfcardState(Context context, String jsonString) { if (!TextUtils.isEmpty(jsonString)) { JSONObject extra = JSON.parseObject(jsonString); - int is_tf = extra.getInteger("setting_memory"); + int is_tf = extra.getIntValue("setting_memory"); boolean qch_sdcard_forbid_on = JGYUtils.putInt(context.getContentResolver(), "qch_sdcard_forbid_on", changeNum(is_tf)); if (qch_sdcard_forbid_on) { Log.e("setTfcardState:", JGYUtils.getString(context.getContentResolver(), "qch_sdcard_forbid_on")); @@ -419,7 +436,7 @@ public class MyJPushReceiver extends BroadcastReceiver { mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//获取默认蓝牙适配器 } JSONObject extra = JSON.parseObject(jsonString); - int is_bluetooth = changeNum(extra.getInteger("setting_bluetooth")); + int is_bluetooth = changeNum(extra.getIntValue("setting_bluetooth")); Log.e(TAG, "qch_bht_forbid_on:" + is_bluetooth); try { //写入系统数据库 @@ -474,7 +491,7 @@ public class MyJPushReceiver extends BroadcastReceiver { if (!TextUtils.isEmpty(jsonString)) { JSONObject extra = JSON.parseObject(jsonString); String packageName = extra.getString("package"); - int is_lock = extra.getInteger("is_lock"); + int is_lock = extra.getIntValue("is_lock"); ToastUtil.debugShow("收到应用锁管控消息:包名" + packageName + "is_lock_state:" + is_lock); PackageManager pm = context.getPackageManager(); //后台为0可能传过来null @@ -622,7 +639,7 @@ public class MyJPushReceiver extends BroadcastReceiver { private void setTFmedia(Context context, String jsonString) { JSONObject jsonObject = JSON.parseObject(jsonString); //影音管控开关 - int setting_tfmedia = jsonObject.getInteger("setting_tfmedia"); + int setting_tfmedia = jsonObject.getIntValue("setting_tfmedia"); Log.e("SystemSetting", "qch_tfmedia_forbid---------" + setting_tfmedia); if (setting_tfmedia == 1) { @@ -642,16 +659,16 @@ public class MyJPushReceiver extends BroadcastReceiver { private void setCameta(Context context, String jsonString) { JSONObject jsonObject = JSON.parseObject(jsonString); //摄像头开关 - int setting_camera = changeNum(jsonObject.getInteger("setting_camera")); + int setting_camera = changeNum(jsonObject.getIntValue("setting_camera")); JGYUtils.putInt(context.getContentResolver(), "qch_app_camera", setting_camera); ApkUtils.hideSystemSettingAPP(context, "com.mediatek.camera"); Log.e("SystemSetting", "setting_camera---------" + setting_camera); String cameraStatus = ""; switch (setting_camera) { - case 1: + case 0: cameraStatus = "qch_camera_open"; break; - case 0: + case 1: cameraStatus = "qch_camera_forbid"; break; default: @@ -698,9 +715,9 @@ public class MyJPushReceiver extends BroadcastReceiver { } Intent intent = new Intent(); // intent.putExtra("name", name); - if (type.equals("1")) { + if ("1".equals(type)) { intent.setAction(ManagerService.ACTION_LOCK); - } else if (type.equals("0")) { + } else if ("0".equals(type)) { intent.setAction(ManagerService.ACTION_UNLOCK); } context.sendBroadcast(intent); @@ -841,7 +858,7 @@ public class MyJPushReceiver extends BroadcastReceiver { */ private void setHotspot(Context context, String jsonString) { JSONObject jsonObject = JSON.parseObject(jsonString); - int setting_hotspot = changeNum(jsonObject.getInteger("setting_hotspot"));//热点 + int setting_hotspot = changeNum(jsonObject.getIntValue("setting_hotspot"));//热点 try { if (setting_hotspot == 1) { Intent intent = new Intent(); @@ -859,20 +876,20 @@ public class MyJPushReceiver extends BroadcastReceiver { private void setRestore(Context context, String jsonString) { JSONObject jsonObject = JSON.parseObject(jsonString); - int mode = jsonObject.getInteger("qch_restore"); + int mode = jsonObject.getIntValue("qch_restore"); boolean qch_restore_forbid_on = JGYUtils.putInt(context.getContentResolver(), "qch_restore_forbid_on", changeNum(mode)); Log.e(TAG, "qch_restore_forbid_on:" + qch_restore_forbid_on); } private void setBrowserInput(Context context, String jsonString) { JSONObject jsonObject = JSON.parseObject(jsonString); - int setting_browserInput = changeNum(jsonObject.getInteger("setting_browserInput")); + int setting_browserInput = changeNum(jsonObject.getIntValue("setting_browserInput")); JGYUtils.putInt(context.getContentResolver(), "qch_Browser_input", setting_browserInput); } private void setDeveloper(Context context, String jsonString) { JSONObject jsonObject = JSON.parseObject(jsonString); - int dev_mode = changeNum(jsonObject.getInteger("dev_mode")); + int dev_mode = changeNum(jsonObject.getIntValue("dev_mode")); Log.e(TAG, "getDeveloper: " + dev_mode); if (!DeviceManager.isDebugMode()) { JGYUtils.putInt(context.getContentResolver(), "qch_Developeroptions", dev_mode); @@ -912,9 +929,211 @@ public class MyJPushReceiver extends BroadcastReceiver { private void searchTopic(Context context, String jsonString) { Log.e(TAG, "searchTopic: " + jsonString); JSONObject jsonObject = JSON.parseObject(jsonString); - int search_topic = jsonObject.getInteger("search_topic"); + int search_topic = jsonObject.getIntValue("search_topic"); SPUtils.put(context, "search_topic", search_topic); JGYUtils.updateForbidList(context); } + private void changeCombo(Context context, String jsonString) { + Log.e(TAG, "changeCombo: " + jsonString); + JSONObject jsonObject = JSON.parseObject(jsonString); + String card_info = jsonObject.getString("card_info"); + if (TextUtils.isEmpty(card_info)) { + ToastUtil.show("要修改的套餐名为空"); + } else { + HashSet infoSet = new HashSet<>(Arrays.asList(card_info.split(","))); + for (String cardInfo : infoSet) { + queryAvailableProduct(cardInfo); + } + } + } + + public void queryAvailableProduct(String card_info) { + String appid = Scheme.partner_id; + String timestamp = String.valueOf(System.currentTimeMillis()); + HashMap params = new HashMap<>(); + params.put("appid", appid); + params.put("timestamp", timestamp); + NetInterfaceManager.getInstance() + .getQueryProductControl() + .activeUser(appid, timestamp, LaunchTools.getToken(params)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + ":queryAvailableProduct", "onSubscribe: "); + } + + @Override + public void onNext(GankaoBaseResponse gankaoBaseResponse) { + Log.e(TAG + ":queryAvailableProduct", "onNext: " + JSONObject.toJSONString(gankaoBaseResponse)); + if (gankaoBaseResponse.code == 10000) { + Type type = new TypeToken>() { + }.getType(); + Gson gson = new Gson(); + List availableProductList = gson.fromJson(gson.toJson(gankaoBaseResponse.data), type); + AvailableProduct product = null; + for (AvailableProduct availableProduct : availableProductList) { + if (availableProduct.getDuration().contains(card_info)) { + product = availableProduct; + } + } + activeUser(product); + } else { + ToastUtil.show("获取激活套餐失败"); + } + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + ":queryAvailableProduct", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e(TAG + ":queryAvailableProduct", "onComplete: "); + } + }); + } + + public void activeUser(@NotNull AvailableProduct product) { + if (product == null) { + ToastUtil.show("获取套餐失败"); + return; + } + String specification_id = product.getSpecification_id(); + Log.e(TAG, "activeUser: specification_id: " + specification_id); + String appid = Scheme.partner_id; + String timestamp = String.valueOf(System.currentTimeMillis()); + String uid = Utils.getSerial(); + HashMap params = new HashMap<>(); + params.put("appid", appid); + params.put("timestamp", timestamp); + params.put("uid", uid); + params.put("specification_id", String.valueOf(specification_id)); + + NetInterfaceManager.getInstance() + .getActiveUserControl() + .activeUser(appid, timestamp, LaunchTools.getToken(params), uid, specification_id) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + ":activeUser", "onSubscribe: "); + } + + @Override + public void onNext(GankaoBaseResponse gankaoBaseResponse) { + Log.e(TAG + ":activeUser", "onNext: " + JSONObject.toJSONString(gankaoBaseResponse)); + switch (gankaoBaseResponse.code) { + case 10000: + case 50000: +// sendUid(product, gankaoUID); + ToastUtil.show("激活成功:" + product.getDuration()); + break; + default: + break; + + } + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + ":activeUser", "onError: "); + } + + @Override + public void onComplete() { + Log.e(TAG + ":activeUser", "onComplete: "); + } + }); + } + + + interface GetUserProductsCallback { + void activeUserProduct(UserProduct activeUserProduct); + } + + private void getUserProducts(String card_info, GetUserProductsCallback callback) { + String appid = Scheme.partner_id; + String timestamp = String.valueOf(System.currentTimeMillis()); + String uid = Utils.getSerial(); + HashMap params = new HashMap<>(); + params.put("appid", appid); + params.put("timestamp", timestamp); + params.put("uid", uid); + NetInterfaceManager.getInstance() + .getUserProductsControl() + .getUserProducts(appid, timestamp, LaunchTools.getToken(params), uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer>>>() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(GankaoBaseResponse>> userProductCardsGankaoBaseResponse) { + Log.e("getUserProducts", "onNext: " + userProductCardsGankaoBaseResponse.toString()); + if (userProductCardsGankaoBaseResponse.code == 200) { + UserProduct userProduct = null; + for (UserProduct product : userProductCardsGankaoBaseResponse.data.getCards()) { + if (product.getName().contains("权益套装") && product.getName().contains(card_info)) { + userProduct = product; + } + } + callback.activeUserProduct(userProduct); + } else { + ToastUtil.show("获取用户已激活的套餐失败"); + callback.activeUserProduct(null); + } + } + + @Override + public void onError(Throwable e) { + Log.e("getUserProducts", "onError: " + e.getMessage()); + callback.activeUserProduct(null); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("getUserProducts", "onComplete: "); + } + }); + } + + private void cancleCombo(Context context, String jsonString) { + Log.e(TAG, "cancleCombo: " + jsonString); + JSONObject jsonObject = JSON.parseObject(jsonString); + cancelUserPower(jsonObject); + + } + + private void cancelUserPower(JSONObject jsonObject) { + String appid = Scheme.partner_id; + String timestamp = String.valueOf(System.currentTimeMillis()); + String uid = Utils.getSerial(); + String user_power_id = jsonObject.getString("user_power_id"); + String specification_id = jsonObject.getString("specification_id"); + + HashMap params = new HashMap<>(); + params.put("appid", appid); + params.put("timestamp", timestamp); + params.put("uid", uid); + params.put("user_power_id", user_power_id); + params.put("specification_id", specification_id); + + NetInterfaceManager.getInstance() + .getCancelUserPowerControl() + .cancelUserPower(appid, timestamp, LaunchTools.getToken(params), user_power_id, specification_id) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(); + } + + } diff --git a/app/src/main/java/com/info/sn/service/MainService.java b/app/src/main/java/com/info/sn/service/MainService.java index 1d21520..e342b5c 100644 --- a/app/src/main/java/com/info/sn/service/MainService.java +++ b/app/src/main/java/com/info/sn/service/MainService.java @@ -6,8 +6,11 @@ import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.os.IBinder; import android.os.SystemClock; +import android.provider.Settings; +import android.text.TextUtils; import android.util.Log; +import com.alibaba.fastjson.JSONObject; import com.blankj.utilcode.util.NetworkUtils; import com.info.sn.activity.main.MainActivity; import com.info.sn.activity.main.MainContact; @@ -15,6 +18,7 @@ import com.info.sn.activity.main.MainPresenter; import com.info.sn.bean.zuoye.BaseResponse; import com.info.sn.bean.zuoye.UserInfo; import com.info.sn.bean.gankao.AvailableProduct; +import com.info.sn.config.Configs; import com.info.sn.jpush.TagAliasOperatorHelper; import com.info.sn.manager.ControlManager; import com.info.sn.network.HTTPInterface; @@ -27,6 +31,8 @@ import com.trello.rxlifecycle2.RxLifecycle; import com.trello.rxlifecycle2.android.ActivityEvent; import com.trello.rxlifecycle2.android.RxLifecycleAndroid; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; @@ -197,6 +203,11 @@ public class MainService extends Service implements MainContact.MainView, Networ TagAliasOperatorHelper.getInstance().handleAction(MainService.this, TagAliasOperatorHelper.sequence, tagAliasBean); } + @Override + public void setPowerUserList(String date) { + + } + @Override public void checkSNFinish(int code) { @@ -208,12 +219,12 @@ public class MainService extends Service implements MainContact.MainView, Networ } @Override - public void setAvailableProduct(List availableProductList) { + public void setAvailableProduct(List availableProductList, String gankaoUID) { } @Override - public void activeUser(int code) { + public void activeUserFinish(int code) { } @@ -223,17 +234,69 @@ public class MainService extends Service implements MainContact.MainView, Networ } @Override - public void setInfo(BaseResponse response) { - int code = response.code; - if (code == 200) { - mPresenter.getLocked(); + public void setSnInfo(BaseResponse response) { + if (response != null) { + int code = response.code; + //设备已经绑定 + if (code == 200) { + UserInfo userInfo = response.data; + boolean username = Settings.System.putString(getContentResolver(), "UserInfo_username", userInfo.getSn_name()); + boolean gread = Settings.System.putString(getContentResolver(), "UserInfo_grade", userInfo.getGrade()); + SPUtils.put(this, Configs.isLogined, 1); + SPUtils.put(this, "member_id", userInfo.getMember_id()); + SPUtils.put(this, "sn_id", userInfo.getId()); + if (!TextUtils.isEmpty(userInfo.getSn_name())) { + SPUtils.put(this, "USERINFO_NAME", userInfo.getSn_name()); + } + if (!TextUtils.isEmpty(userInfo.getSchool())) { + SPUtils.put(this, "USERINFO_SCHOOL", userInfo.getSchool()); + } + if (!TextUtils.isEmpty(userInfo.getGrade())) { + SPUtils.put(this, "USERINFO_GRADE", userInfo.getGrade()); + } + + mPresenter.getLocked(); + } + //设备没有绑定 + else if (code == 300) { + ControlManager.getInstance().setDisableSetting(); + } + //没有授权的设备 + else if (code == 400) { + ControlManager.getInstance().setDisableSetting(); + } } + mPresenter.getSnUid(); + } + + @Override + public void setSnUid(JSONObject jsonObject) { + if (jsonObject != null) { + String uid = jsonObject.getString("uid"); + if (!TextUtils.isEmpty(uid)) { + Settings.System.putString(getContentResolver(), "gankaoUID", uid); + } +// String uid = jsonObject.getString("uid"); +// long activate_time = jsonObject.getLong("activate_time"); +// String card_info = jsonObject.getString("card_info"); +// SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); +// Date d1 = new Date(activate_time * 1000); +// int grade = jsonObject.getIntValue("grade"); +// SPUtils.put(MainService.this, "int_grade", grade); +// String t1 = format.format(d1); + } else { + mPresenter.registerGankao(); + } + } + + @Override + public void setGankao(String gankaoUID) { } @Override public void setUserInfo() { - + mPresenter.getSnInfo(); } @Override diff --git a/app/src/main/java/com/info/sn/service/ManagerService.java b/app/src/main/java/com/info/sn/service/ManagerService.java index d08d351..084cc2e 100644 --- a/app/src/main/java/com/info/sn/service/ManagerService.java +++ b/app/src/main/java/com/info/sn/service/ManagerService.java @@ -94,7 +94,7 @@ public class ManagerService extends Service { int code = baseResponse.code; if (code == 200) { JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(baseResponse.data)); - int is_screen_lock = jsonObject.getInteger("is_screen_lock"); + int is_screen_lock = jsonObject.getIntValue("is_screen_lock"); if (is_screen_lock == 1) { if (!timelocked) { showFloatingWindow("屏幕已锁定"); @@ -223,14 +223,14 @@ public class ManagerService extends Service { getScreenLockState(); return; } - if (ACTION_LOCK == action) { + if (ACTION_LOCK.equals(action)) { // String name = intent.getStringExtra("name"); String name = "屏幕已锁定"; if (!timelocked) { showFloatingWindow(name); } screenlocked = true; - } else if (ACTION_UNLOCK == action) { + } else if (ACTION_UNLOCK.equals(action)) { if (!timelocked) { hideFloatingWindow(); } @@ -288,10 +288,10 @@ public class ManagerService extends Service { // if (null != workingContralTime) { if (TimeUtils.inContralTime(workingContralTime, weekContralTime)) { if (!screenlocked) { - showFloatingWindow("管控时间:\n" + TimeUtils.getNowTimeString(ManagerService.this)); + showFloatingWindow("可用时间:\n" + TimeUtils.getNowTimeString(ManagerService.this)); } else { TextView textView = topView.findViewById(R.id.textView); - textView.setText("管控时间:\n" + TimeUtils.getNowTimeString(ManagerService.this)); + textView.setText("可用时间:\n" + TimeUtils.getNowTimeString(ManagerService.this)); } timelocked = true; } else { @@ -317,9 +317,14 @@ public class ManagerService extends Service { screenLockReceiver = new ScreenLockReceiver(); } IntentFilter filter = new IntentFilter(); + filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_ON); + filter.addAction(Intent.ACTION_BOOT_COMPLETED); filter.addAction(Intent.ACTION_USER_PRESENT); + filter.addAction(Intent.ACTION_SHUTDOWN); + filter.addAction(Intent.ACTION_FACTORY_RESET); + filter.addAction(Intent.ACTION_MASTER_CLEAR); registerReceiver(screenLockReceiver, filter); } @@ -334,11 +339,13 @@ public class ManagerService extends Service { } switch (action) { case Intent.ACTION_USER_PRESENT: - break; case Intent.ACTION_SCREEN_ON: sendScreenState(1); break; case Intent.ACTION_SCREEN_OFF: + case Intent.ACTION_SHUTDOWN: + case Intent.ACTION_FACTORY_RESET: + case Intent.ACTION_MASTER_CLEAR: sendScreenState(0); break; default: diff --git a/app/src/main/java/com/info/sn/service/MyDownloadService.java b/app/src/main/java/com/info/sn/service/MyDownloadService.java index ced25e4..c83eb34 100644 --- a/app/src/main/java/com/info/sn/service/MyDownloadService.java +++ b/app/src/main/java/com/info/sn/service/MyDownloadService.java @@ -12,20 +12,25 @@ import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.provider.Settings; +import android.text.TextUtils; import android.util.Log; import android.view.WindowManager; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.arialyy.annotations.Download; import com.arialyy.aria.core.Aria; import com.arialyy.aria.core.task.DownloadTask; +import com.blankj.utilcode.util.ToastUtils; import com.info.sn.KeepAliveConnection; import com.info.sn.R; import com.info.sn.activity.main.MainActivity; import com.info.sn.utils.ApkUtils; import com.info.sn.utils.JGYUtils; +import com.info.sn.utils.ToastUtil; import java.io.File; @@ -181,8 +186,19 @@ public class MyDownloadService extends Service { //在这里处理任务执行中的状态,如进度进度条的刷新 @Download.onTaskRunning - void running(DownloadTask task) { + void running(DownloadTask task) { Log.e("aria running", "正在下载:" + task.getState() + "--" + task.getPercent() + "--" + task.getExtendField()); + String appName = ""; + try { + String jsonString = task.getExtendField(); + JSONObject jsonObject = JSON.parseObject(jsonString); + if (!TextUtils.isEmpty(jsonString) && jsonObject != null) { + appName = jsonObject.getString("app_name"); + } + } catch (Exception e) { + Log.e("running", "running: " + e.getMessage()); + } + ToastUtils.showShort("正在下载:" + appName + "--" + task.getPercent() + "%"); } @Download.onTaskComplete @@ -192,5 +208,4 @@ public class MyDownloadService extends Service { Log.e("taskComplete", task.getExtendField()); Aria.download(this).load(task.getDownloadEntity().getId()).cancel(); } - } diff --git a/app/src/main/java/com/info/sn/service/RemoteService.java b/app/src/main/java/com/info/sn/service/RemoteService.java index 5d48e7b..7c7e597 100644 --- a/app/src/main/java/com/info/sn/service/RemoteService.java +++ b/app/src/main/java/com/info/sn/service/RemoteService.java @@ -54,7 +54,8 @@ public class RemoteService extends Service { public String getUserInfo() throws RemoteException { String username = Settings.System.getString(getContentResolver(), "UserInfo_username"); String avatar = Settings.System.getString(getContentResolver(), "UserInfo_avatar"); - String gread = Settings.System.getString(getContentResolver(), "UserInfo_grade"); +// String gread = Settings.System.getString(getContentResolver(), "UserInfo_grade"); + int gread = (int) SPUtils.get(RemoteService.this,"int_grade",0); String gankaoUID = Settings.System.getString(getContentResolver(), "gankaoUID"); JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("username", username); diff --git a/app/src/main/java/com/info/sn/utils/ApkUtils.java b/app/src/main/java/com/info/sn/utils/ApkUtils.java index fa2b71d..db5d302 100644 --- a/app/src/main/java/com/info/sn/utils/ApkUtils.java +++ b/app/src/main/java/com/info/sn/utils/ApkUtils.java @@ -12,6 +12,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.Binder; import android.os.Build; @@ -40,6 +41,7 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.SortedMap; @@ -790,6 +792,7 @@ public class ApkUtils { } return versionName; } + public static String getTaskPackname(Context context) { String currentApp = "CurrentNULL"; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { @@ -813,4 +816,22 @@ public class ApkUtils { // Log.e("TAG", "Current App in foreground is: " + currentApp); return currentApp; } + + public static boolean getIsCanStart(Context context, String pkg) { + Intent intent = new Intent(Intent.ACTION_MAIN, null); + intent.addCategory(Intent.CATEGORY_LAUNCHER); + // 通过查询,获得所有ResolveInfo对象. + List infos = context.getPackageManager().queryIntentActivities(intent, 0); + HashMap hashMap = new HashMap<>(); + for (ResolveInfo info : infos) { + hashMap.put(info.activityInfo.packageName, info); + } + if (hashMap.get(pkg) == null) { + return false; + } else { + return true; + } + + } + } diff --git a/app/src/main/java/com/info/sn/utils/JGYUtils.java b/app/src/main/java/com/info/sn/utils/JGYUtils.java index 24a0240..880fd2c 100644 --- a/app/src/main/java/com/info/sn/utils/JGYUtils.java +++ b/app/src/main/java/com/info/sn/utils/JGYUtils.java @@ -33,8 +33,11 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; +import java.util.function.Predicate; import static android.app.ActivityManager.RECENT_IGNORE_UNAVAILABLE; @@ -610,4 +613,129 @@ public class JGYUtils { context.sendBroadcast(intent); } + //应用管理-允许联网 + public final static String ACTION_HrReceiver_JGY = "qch_jgy_network_allow"; + //应用管理-禁止联网 + public final static String ACTION_HrReceiver_JGY_DIS = "qch_jgy_network_disallow"; + + @SuppressLint("NewApi") + synchronized public static void setAppNetwork(Context context, HashSet blackList) { + Log.e(TAG, "setAppNetwork: " + "设置应用联网管控" + blackList); + String dis = Settings.System.getString(context.getContentResolver(), ACTION_HrReceiver_JGY_DIS); + String not = Settings.System.getString(context.getContentResolver(), ACTION_HrReceiver_JGY); + //清除旧数据 + if (!TextUtils.isEmpty(dis)) { + Log.e(TAG, "setAppNetwork: dis = " + dis); + Settings.System.putString(context.getContentResolver(), ACTION_HrReceiver_JGY_DIS, "Invalid"); + } + if (!TextUtils.isEmpty(not)) { + Log.e(TAG, "setAppNetwork: not = " + not); + Settings.System.putString(context.getContentResolver(), ACTION_HrReceiver_JGY, "Invalid"); + } + + String oldBlackList = (String) SPUtils.get(context, ACTION_HrReceiver_JGY_DIS, ""); + HashSet oldBlackListSet = new HashSet<>(Arrays.asList(oldBlackList.split(","))); + oldBlackListSet.removeIf(new Predicate() { + @Override + public boolean test(String s) { + //去空 + return TextUtils.isEmpty(s.trim()); + } + }); + //之前禁止上网得列表 + Log.e(TAG, "setAppNetwork: oldBlackListSet: " + oldBlackListSet); + if (oldBlackListSet.size() == 0) { + Log.e(TAG, "setAppNetwork: blackList: " + blackList); + for (String pkg : blackList) { + if (TextUtils.isEmpty(pkg)) continue; + //发送没有安装的 + if (!ApkUtils.isAvailable(context, pkg)) { + Log.e(TAG, "setAppNetwork: skip: " + pkg); + continue; + } else { + Log.e(TAG, "setAppNetwork: " + pkg + " 已安装"); + } + Intent netControlNotIntent = new Intent(ACTION_HrReceiver_JGY_DIS); + netControlNotIntent.putExtra("package_name", pkg); + netControlNotIntent.setPackage("com.android.settings"); + context.sendBroadcast(netControlNotIntent); + } + } else { + //减少的 + Set removedNet = oldBlackListSet; + //增加的 + Set addedNet = new HashSet<>(); + for (String pkg : blackList) { + if (TextUtils.isEmpty(pkg)) continue; + if (removedNet.contains(pkg)) { + removedNet.remove(pkg); + } else { + addedNet.add(pkg); + } + } + + Log.e(TAG, "setAppNetwork: removedNet: " + removedNet); + Log.e(TAG, "setAppNetwork: addedNet: " + addedNet); + for (String pkg : removedNet) { + if (TextUtils.isEmpty(pkg)) continue; + Intent netControlNotIntent = new Intent(ACTION_HrReceiver_JGY); + netControlNotIntent.putExtra("package_name", pkg); + netControlNotIntent.setPackage("com.android.settings"); + context.sendBroadcast(netControlNotIntent); + } + for (String pkg : addedNet) { + if (TextUtils.isEmpty(pkg)) continue; + if (!ApkUtils.isAvailable(context, pkg)) { + Log.e(TAG, "setAppNetwork: skip: " + pkg); + continue; + } else { + Log.e(TAG, "setAppNetwork: " + pkg + " 已安装"); + } + Intent netControlNotIntent = new Intent(ACTION_HrReceiver_JGY_DIS); + netControlNotIntent.putExtra("package_name", pkg); + netControlNotIntent.setPackage("com.android.settings"); + context.sendBroadcast(netControlNotIntent); + } + } + + String net_not = String.join(",", blackList); + SPUtils.put(context, ACTION_HrReceiver_JGY_DIS, net_not); + //Settings.System.putString(mContext.getContentResolver(), JGYActions.ACTION_HrReceiver_JGY_DIS, net_not); + Log.e("fht", "not::" + net_not); + + //Intent netControlIntent = new Intent(CommonDatas.ACTION_HrReceiver_JGY_DIS); + //netControlIntent.putExtra("package_name", net_not); + //sendBroadcast(netControlIntent); + + //Intent netControlNotIntent = new Intent(CommonDatas.ACTION_HrReceiver_JGY); + //netControlNotIntent.putExtra("package_name", net_ok); + //sendBroadcast(netControlNotIntent); + } + + @SuppressLint("NewApi") + synchronized public void onBootSendNetwork() { + String oldBlackListString = (String) SPUtils.get(mContext, ACTION_HrReceiver_JGY_DIS, ""); + HashSet oldBlackListSet = new HashSet<>(Arrays.asList(oldBlackListString.split(","))); + Log.e(TAG, "setAppNetwork: oldBlackListSet: " + oldBlackListSet); + oldBlackListSet.removeIf(new Predicate() { + @Override + public boolean test(String s) { + return TextUtils.isEmpty(s.trim()); + } + }); + for (String pkg : oldBlackListSet) { + if (TextUtils.isEmpty(pkg)) continue; + if (!ApkUtils.isAvailable(mContext, pkg)) { + Log.e(TAG, "setAppNetwork: skip: " + pkg); + continue; + } + Intent netControlNotIntent = new Intent(ACTION_HrReceiver_JGY_DIS); + netControlNotIntent.putExtra("package_name", pkg); + netControlNotIntent.setPackage("com.android.settings"); + mContext.sendBroadcast(netControlNotIntent); + } + } + + + } diff --git a/app/src/main/java/com/info/sn/utils/TimeUtils.java b/app/src/main/java/com/info/sn/utils/TimeUtils.java index a31e82c..6074159 100644 --- a/app/src/main/java/com/info/sn/utils/TimeUtils.java +++ b/app/src/main/java/com/info/sn/utils/TimeUtils.java @@ -29,6 +29,8 @@ public class TimeUtils { public static final String WEEK_START_TIME_KEY = "WEEK_START_TIME"; public static final String WEEK_END_TIME_KEY = "WEEK_END_TIME"; public static long dayTime = 60 * 60 * 24 * 1000; + public static long minuteTime = 60 * 1000; + public static String getNowTime() { long nowTime = System.currentTimeMillis(); @@ -173,7 +175,7 @@ public class TimeUtils { * @return 时间戳格式化文本 */ public static String getDate(long time) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String finaWayDate = sdf.format(time); Log.e(TAG, "getDate: " + finaWayDate); return finaWayDate; @@ -332,7 +334,9 @@ public class TimeUtils { //开始时间大于结束时间 列 16:00-01:00 endDate.setTime(endDate.getTime() + dayTime); } - if (nowDate.getTime() >= startDate.getTime() && nowDate.getTime() <= endDate.getTime()) { + Log.e(TAG, "inControlTime: " + (startDate.getTime() - minuteTime)); + assert nowDate != null; + if (nowDate.getTime() <= startDate.getTime() - minuteTime || nowDate.getTime() >= endDate.getTime()) { return true; } else { return false; diff --git a/app/src/main/java/com/info/sn/utils/Utils.java b/app/src/main/java/com/info/sn/utils/Utils.java index bd5935f..fa43112 100644 --- a/app/src/main/java/com/info/sn/utils/Utils.java +++ b/app/src/main/java/com/info/sn/utils/Utils.java @@ -1169,6 +1169,7 @@ public class Utils { /** * 获取系统配置信息 + * * @param key * @param defaultValue * @return @@ -1216,7 +1217,7 @@ public class Utils { Log.e(TAG, "getHardware: storage = " + storage); double use_space = getUse_space(context); Log.e(TAG, "getHardware: use_space = " + use_space); - long wifi_time = (long) com.info.sn.utils.SPUtils.get(context, "wifi_last_connect_time", 0L)/1000; + long wifi_time = (long) com.info.sn.utils.SPUtils.get(context, "wifi_last_connect_time", 0L) / 1000; Log.e(TAG, "getHardware: wifi_time" + wifi_time); int CPU = getNumCores(); JSONObject jsonObject = new JSONObject(); @@ -1246,7 +1247,7 @@ public class Utils { } public static String getAppUsedStatistics(Context context) { - StatisticsInfo statisticsInfo = new StatisticsInfo(context, 3); + StatisticsInfo statisticsInfo = new StatisticsInfo(context, 0); long totalTime = statisticsInfo.getTotalTime(); int totalTimes = statisticsInfo.getTotalTimes(); List datalist = statisticsInfo.getShowList(); @@ -1265,6 +1266,7 @@ public class Utils { } }); String jsonString = JSON.toJSONString(appUsedList); + Log.e(TAG, "getAppUsedStatistics: " + jsonString); return jsonString; } diff --git a/app/src/main/java/com/info/sn/view/FlowRadioGroup.java b/app/src/main/java/com/info/sn/view/FlowRadioGroup.java new file mode 100644 index 0000000..f42b357 --- /dev/null +++ b/app/src/main/java/com/info/sn/view/FlowRadioGroup.java @@ -0,0 +1,72 @@ +package com.info.sn.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.RadioGroup; + +/** + * 流式布局的RadioGroup + */ +public class FlowRadioGroup extends RadioGroup { + + public FlowRadioGroup(Context context) { + super(context); + } + + public FlowRadioGroup(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int maxWidth = MeasureSpec.getSize(widthMeasureSpec); + int childCount = getChildCount(); + int x = 0; + int y = 0; + int row = 0; + + for (int index = 0; index < childCount; index++) { + final View child = getChildAt(index); + if (child.getVisibility() != View.GONE) { + child.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); + // 此处增加onlayout中的换行判断,用于计算所需的高度 + int width = child.getMeasuredWidth(); + int height = child.getMeasuredHeight(); + x += width; + y = row * height + height; + if (x > maxWidth) { + x = width; + row++; + y = row * height + height; + } + } + } + // 设置容器所需的宽度和高度 + setMeasuredDimension(maxWidth, y); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + final int childCount = getChildCount(); + int maxWidth = r - l; + int x = 0; + int y = 0; + int row = 0; + for (int i = 0; i < childCount; i++) { + final View child = this.getChildAt(i); + if (child.getVisibility() != View.GONE) { + int width = child.getMeasuredWidth(); + int height = child.getMeasuredHeight(); + x += width; + y = row * height + height; + if (x > maxWidth) { + x = width; + row++; + y = row * height + height; + } + child.layout(x - width, y - height, x, y); + } + } + } +} diff --git a/app/src/main/res/drawable-hdpi/applet_qrcode.png b/app/src/main/res/drawable-hdpi/applet_qrcode.png index 5c4fbd0b1890e83b085c2a74be7c913af7611c97..672ffa528441d0db8b7874bf3ed21f7bbfe8e020 100644 GIT binary patch delta 27589 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­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 HMnV4pEYXjc literal 79870 zcmaI7by!qi7dAWt0)upi#Ly`W-Q68ZN)25C64E`Cf^&^;Lwf0ARr*pQUcN; z{T_Z#eD5FM^K!w(%(?bnXP>>-S#jTM#p!CR;60>%2m*od)KnGqK_GDF{T~DqxFW>z z*$enb<*j7w{lwkg+ZXO>2a>aOx3+_-J%>Bk>D$3={a*~(NrFJ=j80FDy^Xar#ckZ5 z^T6-N@c2FV0A_Y7MgOi&SVFhfh#QSeTC+$`9k?=Y;{k!jJg`#f5~$`9+}r{$T{} z=4op$uCJ*4?|T8?q!=B&y*Zzp#*=)FX^wY!hE6eFHbz8;tHO2aBp|d zr|#~q|Jg-dM|W>`FGqI|sKOIrD7%r9o2|RA7so&2wY0?5+`PQuZZ>vmic*Y#1Rf_R zTXBAvD4#sPqB2ZSo{x`DNkL3eKwe3Zj~^zcq#(erAo`!VitaW(&+Xj2|1;P2zjKvf z|8wrWDm?c9?yP9%>GaahR@u}2IrN`L7I*sJYf=24^8P*7_J6KLQR#oqEYKn4C{pNP_uyUCVn(lObbY_3h zm>BcF0tf9M#vhE!bWS7O1-4D1Di<~^wnl8{ZB0iOj5McZ=Ydh5PdWLzXF zbF>&?ZQJytFCSOmUmJdq(w=+S;r0dJ@cz49gqrVIO*k1B@GU#m8axin0X~8n|Cw#b z4Kn?g9CFZye@Vm%`)6L?D-2mK!+v$M8QRnD_jCU5kyBNoZv?ih{@;?)Wu59YtjbKw zYHM{YLN4q~8tfBB@}-`Ua~ne^%e5MCY=HFxciVo#?&Y`FvblEl(>+t>=C{trpbO6* zjwK0e3;Q9>yX{wdAA9g6j2YvB+YOU%fIq#jZP?W}t|a&W(=@X-B7jQM;B9-_+S;nz zF5@)8{KFV3kakKsUxH;|lryr~*n|;=Lo7hGl zOzkMX0tW#c)Kua!SQ!kBI6toqz2V|Fa=cfB`|D{V*#atyM;Xnk3JQJ&(M>Kh+c5S8 z>wokDtuVbciAuoU5p=QvzTt<#3gci^Mzx=C?EiHPDH>*ZG^c)x{E_vflzD65<~ir8 z!KJHBnY+rssPZO|rx8b}aAS2folQkT!og=frkVdw0oeo&(E3 z1KkdUUdPm&9S#$hJrBNIjm8Yfn6J(ozv& z;o*(9?mSof9UVb?UImkPHH|9HH4c+nBI$X)izaUE7aQZB9M|$hlkzWL% z!~H^75@u-%$sU7-NOUCm9@5~kfAe3TbE*Aa68G`J(q~;35_(9aGWfizw%s`n_V0rc zWVpu8wq0oTDM51aW+Ms&io&JyY*%oLOxQq&%p$iRSr-N=9I!S6Ocb%LyB3RZ7R z|K)Hj{!_GHwi_eaIbjNvf|`)T+pDEJy39jW@8UR@`R9GF(znUpqBkzrM-JW+?Ht4lk{b8ZH*KJ^nILXpP9}h-sZ^sjI3Rx_Jv1nkdGfh@qXu;2cbERCb z59lc*^zMJpG;(*dbT>rhkXr;!aubB$PJP*H)p#Rw>-WQ# zmn@`DiU@w|Rv2B|l2I0QTrKSPR}%^K9o!wu+>!hs$4g>1+df5dG6-T7a{ros=1vQi zL0tdpA&{w#lV6l;pT27NXKmC;<>jmwvjfts61#N@rD$wRr^}H9&IGXsmSs_B*NH)E zOh;$U9a4nLgU|Lp|9ZpkzKDEfiL-c^!lEJX6;l0`{_d~J&$#}7jEVDioKkenG~ECY z=ncj(e*tPI;xAx5G#4+Yo44Ws{qc`#vJmJl4Pbp59|gApcK@hv z1N0&O2uJGK;Z<;1%Wn2t%PVg-5h7M9FkxjZHs zobbcnc)^%zDVNIsGOqe%7SO_@t&&7_6&01O{gvPIFMmEi`qbQ})vQ_7*r~q|xZif# zlpKnn5_g&A9<`$7>bi=*k~AIcGG4y~R8xP!TA|QT_~6rEOWQBn{n!&%c8RcyLDk}V zQe|ejc!q1SjO7^DPe1IFAI}_Q9lo**_+6&ARF$Ti(sgemrqLTyl9#`)INkhl51pjb z%3@?=!(>XEpEvdkhZhPMG7Q{Zqwc1bU!Ol>onj7n)?gR>e2pUW@w4)o+b9Z)@ud>; z`vp5(6}_2kZ#d1rw=LNe5UP#*z`bu`&9E*UJi?ICj3NPFgn-qk{3v#?+Zr zZq{_*Z!p@k>W;z@I8FI%DW8vN78!;YrQzt^yzsIr z_FccjQFV*Vt6QhovCr?dgnuv#i-;#9ju^uB%ip@C0EW@h^w~2X&Tu#7g3GCQ-UBR` z1ONCfOr)%My)Gra-RTp`M2f+a=+BkJCWEhe+bfRYAl|6Mu*tWJC#(xp(aHDU%uloI^Z@54Q29>ku?|=_;n1&u=M$E&`Ncg zBjnPkAG#^A#DPWUR~YoShrT9jMNcCl#uso@gMjmTpFl)%%d9vmUG|z-S;5S?>wdp~ zQMU7`)51!AJ&YkA$0mVLC&A8UZ4zGvhWp72=1XtpdNukyf8d^E#w;79KQ_k&mvSW8 zTtN?t~Y8NCDVU;)<;{^&6>u|HR$aotpYktVcwN)e}%h80Wd*CU&lmKd?Osr+FUX`g z7xO7m{qXsfAmaQ{KkMY|Y+LfVnTFK8`+XYc+WNb^RRUM+6MGj9^R>d8ij+l;=_cRZ zB+J{&nU3w2;B@Pygc$2hi&Y3If_X^KJ~)s4k3+t{{nPM{yG=yr5J9wm|0y*GpG!PL znBFJHZ^eTt(4&EqdfL~5;rFo;{}Cj6Xp_ZA(La1Gma`9{^i7sOR-fOy7A{SXNUKNd zQ0EGC_g6CR`Qs`1t%7xNjUSE{6P0!$5#r{VPttcR;L?Ay3bqWnSTDg8!NT5A+$`mI zQf}M_#D(e~APNrIq(qw-t9Y^xD$~v}ARdq54|~~P%tbXdHQDVAB{yR;Hv28T4l-xy z6v5r%{8Nb*L>S-QI?pbs^Iy3x))4l`UM6(L@Oc9 z{cS)cq*gq?lO^H1hnc!_qfXDSY4#$7<5f;b;o4mB+Qnu;A~S9}qu!L**-Xss5tO%7A*5BDCZ(Naw{W&277mVDz(G>Se=oAo=F{0|cg!KOe{o)BXAO?~HxpC$%e<;m>tvgNb12@bzS0u~lLW;Q>2`o+C6nr@hn=%x)|h%8?sEu-tR<_Q2zApu#!4IASJ4WDLF4t~ zOL{WV!@jTOX)F3~6~(L#bJb31QLN_w3|zXh5ZkUO+0E_eBzuI`r2nxKB*iWr@VS&vH%2Unj;!*5YgFG)YN?uz{pcEHQf+v5V2DCwSf{GN>4`Az9}8cO$h z8~+=AL-Gn=&P!uIb`TUkUV&sPqejTx{CYiXBGX-V zYf|ve=r*k7fd>iIbLK33bj5>WhQlPPS|jOd)klz;U3QfSA#&y0D%M^#_nX8b?h zg7%}oRCP>n7A$I7HmLo9EY&*H7YM^snGz-SGdJ&3HJ0!`I^k(nJXPKO=!rtEC=OgU z#b%EcdGki?yJ62-j!Icku|JKIjcCXG>kxXmjla{)?djVAtCB@SscbIpuU|T_>+p8< zUAdD|At>GRt7*Vf_d$?L87@nH;CdSe){27(HY%mPT<`h#fj9@M!glaE_ocsQEumIB z5OQxXzKeG3J)ix#bbHq9Ls49fGu*S6P;ZKmzB`DK=^e9X-q)y?C_=@}k|HzGJ*r&F zxb?7n=B1y}Y8uh%pO3nS2;_uJ?EnrhvMMdE3fVnUE3_4Sd3Ch_gb%X@`J0$C-5TKZ zDpHdTmjfWW>RW)v(4xsqB0nv>e0C0mCGQ8leg$(jVUbpRvAmj_F~jgIIu{0l+Vhi1 zotYiWg!81QY47&veCJ=dNf!_xb?jU}4<}JI?7%zf93pF!z~v!_?)eF5GDcLPhE&rT zjdL_s(JLGs2H8rgoO@CS_z;n9eVn6y#~H<+tWQ!i(#h!U`D|KZ{JH$B{H$M0dz*G0 zGvZQz4~cItTuVc)Sor!7+kAoCZ2O=+eU2C>jO;<5C+RDZcnTKX>yp-QsU*nVk6*nlY9_=O zWj|F_ah=TRxn4_Fp}k;QTU@-^^NksU2+s7I67uk1K>PoMZFuIGP%0g*NJoG^n#pQd z_u92YBa(+MSQaeP`E7sGc#nx~I`;678QY+UE^T+GjY~Cwx4N1m+%Mdrx6972d}#AP z%EH3bC+q0d++RPe7v>xXL1Pm8lF#Lg^amr80!y__#(flU87v(_^2_c6j(VHK1MPyK zqan>Swb>4@hsaIePB4}$jEW_WGID$iP1360w@X+^yk`gR=NtYXuUWcm zxm}G(A%bqohp@)<1TDW;6ChbayZ)7x-75Kx4VQadR z$V(DAz*bSEd_fpzYq*2jS~SIGst>Dtcz)q% zel~~Nl1V%otfH<=RRY$GR7`C$UhaZ16wfMDQa1huY-4qsHG+kdv^}u zoyi@29+xNYWX$;v3`ROoqZINz}P< z1RtHv3C)=O+H0DzsL}6rQ&3P~X5!l|tCsNv;@y|$3%-^&A;Zr!d(qlfq92)IxEAg2 z*j4>$J728PFD0|P=CF|!(8=UBS>;4c2A_OWF}H&}&9(FEBQyGpL(Uy*_6r?fw9{Z1 zxp78`(xf7Pto8vke^}duHz0V*Y z8F+Vd{sqXA-d+Ki*H;5&EhVaX9vSFdN|)OCjK>#&qkRUbhHYh^O@2k<4B;~Cnj1C{xU57#_U;qT7Bt+0|zBh zqRj2*Kp+eH?7Qgy?rK7V*Qst$J?(sx)1Axv&*FLexs#oRJBxA{=}x8OAH~g7Pu%ss zzV_Oqy?LeAKk09sqoqnfw6xJ49`HI*q0$a>BBC-_}l z@8R{>A~VIEqRa>_)kfkS^;m&dg^H8lhkKIG6RB|Y@sx4h+K~T#GNyF z(eyJXnY#^i zVoC_A7TPH+-9xq21jHoeH;N!8LYDhTZ1}w6E;zWbg!ss~0%<9wMJQXz7aUj+eD)1N zvCr&>bO^!J_-;Dfg{F~ZXrTx}9%GsCZgVpfFJsuR1gE3Dbc>p+e?gb=_!+s$@qpM5 z-=*MFu3?R6r2qi&b?Fh>zOnMM*6dtlVeB$NV2t?>bZ$t0BT@7@(Co<>I{tDGD6sy# zS;mqXjK^~Yj}K$Uya|;#8f0pfu_FE3QP;!9NyL0N(_C*Pq!~xF=vruf&qxlCdY4#quMMJ zaF&ark0w(Hw71EKPnqk#+1lAzb}W1sd}`3Dd$EH;_P-lh`qZ|anfk7DM-_4N85h@y zewT|4l3C~5-oa&BzsG;Q(tV#Aq53gLieApE42cuD#siLi5AtgnEm85 zopv6wTR$+rAG{w}gSI_>9s>^E$aZLbDEfz0TQy>+z;l>mfMm6~T(&VO^vhQ9YwzG^ zx}s?E*rz^AfBQum-^u+IsO%fwKfFSy*Du#?9Xv>Aa#$QlvKfRYBM5N%2u-{6SCb{I4I_qfWK5<_m^6c1@9;4fZe27r%hP*>cs(G-@pX`l3$VnV77&? zJYO_3^8lno`IgqFEQT(iqAHBDuJrfKerQJ^5b4{ksy(S4R3u}Rlxq#&n!0yq=8QHh zx5>{yno!qr;I$TL?B8oBxT(fpx8*?Sa?IgB!s|g<0G>{9zb}iXo1MJZc?N_oNX~1q z3lL4~dj+>AY)1ZIp+K489j|l|vd^`ZeStuT*ME8m8D+&|`lwRdy8V6}EkHhFcye@} zz2)|DM*;8XM}xzcOp5>~+k^_KXTlG1R3R#yyy^lnH;+F-_+;^+yVxy^JZsD4R`o>0 zEW6;iNX5@POtPKSENLmFyWxbm@HA6KpU-5hK~oR;qBchqJ6Qn>NkBJT zFsX)xp?5HgVUIx-T9kwt2IaTFwad4gI7W+0fb9W9Nn;lZ!a#CX8f<2KV_V4(qUu^r zP-L6BN*T9vdbWMQZrf6U%^|GF*_MGp%>?_h^@r+dB$iivvGJ=ZuKMhISM$4-Y1Xe! z_6CbUnG-LfMA*M=?R1_mOVuKw7%7DpvY2eNi*adSoeL&!dOAxW!5=^2j;kHeWO!-f z&{VL6QqR^;`Zjc-B!f70((=TE%dpY=A9P{u@N;@r*2IX7b#M$o>Epsl1*Li-mS9Gm zJaUboAmtx_MMTT+CH9eCR!q(!R@~YXTAMdtqHrj-SwBbjuG~<)Er|YkyFWwR8TDbv zm~Py2dMuE@jjALm;`U8!B!>#*DD6PJyFBb^l`fV>TM4z>6$U5yT4exRgHij= z!ej8_F`sx?##y^fCpE49xCgRlT(><7!~!$U5klJ(vbkQ5>~?MWQeOMuzDFVCw5On3 zbJgd~7OoIMM(*$l<}|{ovZxdcdmn$5OvUH?t0%^1 zl20p>lsGz;TNGnqp0~-l=EkI&84_5(rHaW|(=5?&Jd!|0J56E8w>Q9b#GZGr`7LsK}a6|K!pf@+X(vgXsLn#qe` zi_|4IdTEV+sL7LnCWtza9tfB!F%zP()x+_rrX2n8vhUf~4iKg3JA>k6uNHYM2Kx@V z?rut)If@rr*;RV6`LLe^3Na3y4Q%lP*{k^tq{xtbDF=dIlMpAoGurOl;ZiBlHhBgA zx%3MR*g)q)0c~X9gD}>#V1TRLZUTWSzbT2p9`V(Lq>u4?S9Zl7`^JH<5A*>HhkJ-v zg`olbb?8a9T%*jzkd897Zff&NpZ(oYW(SSLx)|>K-=LaW@-`V&$;OvV%uWxW0}5YO zUvYU$@W|GgozY0?f#;yS`81r*|L8&+wT~l=Ijk~#06!b=n`q7K>X1f-dJ91d<~X!< zKF$4B&G5b{YsW<)>t(PB@1^bP4Z2|nLz~=dzUizR!{K9W^or7%S6H~RlM+*k46(6< zi{-vBh81QPD$=gl*H8dcpyV)Kpkch*K>IwKD;F0K8dN|y1fXa?@ydA*mPF<~BJsNr zKFjB5(1L;JXr;|O9)eEmizuPN8pEPmIAI_@xEe;im91)&=ZUD(H_lIMLag9SrVtA3 zxaL2j?k4WQ@q3Fo&l*ogzN*cX))I8}b7>lS1CUkQb$rVzw^R{Nr_D|KB{&I%A98%q zi*Sf~(I@>7P3G8tmp~u83fy9iK8%gdt57v~~>bI`F5V-iI^b z4$D;wflBjIJ3@xI)`YR2=~?SLXU8z`MQP2!P#}WW4$oO>OZ6zP=?Y^$G7iMbuZtz4 zcQ-(54e(X7&l#uG@?(k7Thq!Tt(Iq3}NqJx=RUp5hi^HKP>mr13#Y*;~0YFbMEMqz!8UWtz=(zu^g6P>vX(H);j zqvWyT1xd9o&Dv3G=$J((eP7@+Z6aRn@?bx59>1iL-G<|;kdq05a_5$+tG~UfK0)i0 zb9}VF=q`AL@zJ2N^wAkCnW|&iM`?6Va0dZb+)E{eU}hPCq(m|0_UYH+FoW}{TAu1K zp+1s-;pbD2(V~7TfLPV&rdjjo5!n3jNxOkVVBxAL*GA8 znn=&YFH3^M1Ro=PKRfGcL0LdR?y||gtaD67bIokaviCT4G*c0zqio_2xFlvAIy$Qaburs0?lc0d$Ihvbx+Emlk`zvqSs8Q&iN6vZTy;~lCv6=> z1sk%EGG#D7ZmuiDRv>-_uCOZo({XouS=S%+ELD;uEKWh&;wvck&Z6!WheFX}{nL*C zBQ;Cv#e{%?WsjVls_kkhgp0sBp;>qe5q0d`Pb#**V{)@=pE1$lSXr?$+Hy!LNb*mo z!^~Ss%RjgEhgi2FWH#xTcR4&q%J47nBtpyIY7sLu-sJ5Esi=5xrE;C!_n1F6Y{ZW3dE_+5Ey}GXWx<14c$M{A~Qj`=X1+J7pv(hvctmKE* z+KRXPVL(@x(@0hiYVj87J~Sgq*7Z`%dH}>uL~I2?ax%+SYe#K_PQ}bln?}$gFf4J6 znIQH#47Q@kepklsa8!j$WIyZi6cU&JO43GNTkRYt8auwN!c8*FMVBe+kQ^cbAoqp% zldDb*i7-{lI|bu9vtPtLadk2~W7LPzg#Ix8VrBny7aDGpkIZ_$G-FHQSaj?Xd!KEF zHe=d|rwY+fBrn-INi*-(FFCN_1^OkiDr&uGHq4dbU5j{}zOm{8#s^g|K$_^DPIRBn zeZ@*?2to1I&N86lT(J?g#e#Fr@2|s4!&8oMd_03f#6VkZFY$>UzK*11_LDfFMesSb z>ZExkS$(c=*F>I~R#`y10{;TVJ@1ag!mLc?z=Uq=F5`mFOBDSw*m=@SCjz^-H>65b zNw2k2%wDA2%bpVl-H+q;V`eoW!=hL%{BT5u~w7`Q*X8&i?;7%O$ zwh9N-MQ7*1qb(#G3+dE%(>UWR(+)75AA(^CE>-^VI1s!jk8}y)UBL`tN4L-k$U|RYJ>G#$hjAh`5+SaUWqT<|X|$UbzcyMWn5gMPW}}iYjwFqy-`V5-D@(Fs+f|Y4E$Y z)p_cTgzzHGnEJWaj3bRd>7fW&6yhQ>m9|3n5Jqw22>$|`$GO8gAjK6Zf~|c@08n?<{Lc@`OgSl`6M*ERLh{lzPVK` z>!z|FC)Yf7AVg(^u&4#e;**S0w8=`DH>6=JFNRn$)BbQk5wQ^W{?l8nol+@I7R^W;engn( zp+U)+E#!2O1w8`{l83z{>y4Azle_O5xjC2!dABSGSj4u*JCD#y2c>%3d~-%2pHtp} z%_3`vP?a?H@FYeiFaeY$n|ENP{h%AiC%+_@klY2WN3hzfohS_wv#>-s|K$@LHPM*% z>S3g{ZkoPBrY(WN6IyZ$t{p-{Rd?sfcs|0H?s9?I4Y4Z38473ArY6FUXT++Jku!%Ek3hgfTRLGzeV)974v8nr9JfUW$51P{a-~Z7_#bo485M7!pNnvOpEvX zyzHb=Dhh*{3EHUVAAjDXPRiFiUp6Rm#S)dvNq4{9LA{D5r^-%RtDYPexY(JlJhgP4V%?i~vT zi(0Ea&lOGl_Cl`yPy`GfUm&ZHkn{IdHJ<58S=%8QJm%XLFZ#$X^V2AZ|K7R=bSCdq zG)9;q{pzc#w`PUbJ-A#J4HjRR6vXL892w-#VaCi|p&;OGk_%N!Rlf z4W1Y2Gpn39ZEHIr*M|cO1R)2J$u19M(bB#%?*f$uS4(>znisb%0JpPOtn|7ue0*WS ze4=&H3ng{=qxVmyZ~JlH9sqPa^UX;+wUyyW6!5;YX1-6z_96+Svz+t%_f_cpdv5@? zkId=BW{nFq{^$4a`tb}xkPH6w`j7!{FFD>q`oDqdN)RrEjjMIu z&`PgmxRmlYzPe}du6Irwux|>5LeC(meuhMlmERET1>%7K#|2Q$JLT;$mzLbC?Fs#% z%g+DMvC`||_5s{8Vr^gbsTVu0)}pst_;^>e%8P?9?AM=>*sm^+3+|9(R|y!E5!cu) z&`vzV=ToivJ4$awj#Sv2^$F<2o$zhjRjnw`b%AEeXK`kiRPdwU_5#&a;Ehzbqw;^1k_gW3+t(S?3D#N>7#~9@DvG9QZT(hsA&Ntq95> zzW~4LvIQ^QjO`H`Et|_%nR?n`=@o8cOFt|GUW#C`P@}&jucVx$YJj(ORG*2O@ip+m zwz-+&e9x|PnBZYiYwdj$o`Rp3J*|g3ro~Uq;)0WSY9)oe^MLGCAON(#BHH#c&WqOPI8Ziw=~21Eo;UrFH@3ONzyJY7!E6L{N5p527QnF;yA zdUmU)Ld$Y*&@7fd=NRnZxltnD19jl^NutIeh7}rWF_kFXYpmSQQgFRt7LY+0j7L*p zFb!{TllT(k_v=;Qq^qd>JKgL=$s^Ugt7G3{Dy|hT4hGP*X5w(PvE|Fdo{PCWsUeny6K&%=tE}Vkr8xW&W5u(y$ubA5mM4&7{q~^t`H*&- zB*8yAHGso@y>EvpGJW+xH2*WzHVRhLK{PZw`HL7$5gzb5)iWQz(TI8n&# zvqw?T@!O@T#|smCQKs0V06xmWZXrI_zyM;}o=PDv48Z31gA$_Y3ch&zfB@Sik%rcv zMKZO*^pj|KP(*V~ccJiyDR`aq%qP zQ$!%@zE_)=&~L>MjBw9~`kHWZicW0EsuG%`8d6S}p%Vv(IB~pALk#2^fGn@W8wgB= zY$okCFNL%kQwUSMYRic>$+_whc#ZSB^XaelL%#^|H-29}Wo<5-({r0iqZstb zdZD6Mno;3)3F44ahHvm0M&I?9=%}ZxNP*dq4RuuBAnL1F>%Yto2tkQFvVy7jIH~nB z5px4dRFr<{N&TOV&cslxRZ{&_h06suI^q$vq_zsBa{$#t;zRM?9$rht!jJ0_pH%uB z!dEVavjr(8zix(yS_>kmekok@Rg}6JUUz5zp z;f$mzhPW-&7%p_LNmyi!-&{dRrn8khDH&n*Z5N$&w-vYh=+52;AdfcGC{8~63u<10 z0UozGg)IFmpys1QqGkDqb;ZH;!PFL2_SBVqhmy%u7>7Eq(_aD%jX`c_c}U^t(@5s- zOQQ01iv(~_2vblzzg?pNd9`sd!^kT{UIIldgB}5cjsO^gR^Ex^DqF}ValD^*NJ_sP z6#4cns&3$LV~D`ov0;B!VGA4J_Tqj#p(Lg}UL%`)Q?Y9LgN?FOvCprz8jE-aIpxd{ zL~Teh(#`ZnwA;YYk6A%r>&hE9+)n8*hy$ZMsQoBfP@$@%q{qBHsO9JP@9X%uxLZb~ zUR629W*f(3pzSf%l(3?5T*CAF>V4M*{n=>mt3!d`*C;hAlGchmA#J8>>6!AhVaypV zqcj1Ouy)0 zEF=5~a5>dIesV3W-8Y08gB;~{lhYFE`93l6570$oZ${2%=@G(hfnTP4hODKA+PKE2 zo#^j`j<0`|Al!eb7;dv;WhoA}6~(G@mR!f~ki>{+_I&2yUlXc99;xS1T=$E#7o}c1 zrCd1)`(_MdMCGy+VJc}$6M_)$>H8X$x>5oo@KiIi1gnKe`G-QoVjajDGin@C#5yv) zW$WHr#V7Aj{UBuv+5?`?=Yz3TEt+H){cv)V`ZJ2SE|2@_jA?p*i8J?oJJ~>jvmtQc}#y z0JY+2m!hZ#P*?rN{&8{V>rc#f}M=l3n_HxLG+?L1{L@>qDG zkko@rs3VVX+Hau-r#gf+KY+7WG-B5lY+$N=^;pd}P|kfb3m&=7&BW-W&cn)zS|*bF zsSICbAX3)Q?{E-)Ji_UC$?m&|lVQN2UaDX82=i25rC)LTo=f)S3cnpgfx5UQRXSTJT9nl}05NQujTXBE%eb&TrO>ec#2V2l#mYkbBT8STjLP={? zHui8ugQ)xIc-N0!KT3Az&=$p6`}K2>tfV|B?fi%?`jEH+6-HmAB1u$3lC%j;z3M(5 zwT7`Thp`Ph=+cv|E1|>8D4zOD)(Un;3=E%^c(h#z)ewEhHtj zd57v(d{{A})HR;c+7PcukJQ;q3b&{5vINM52TZheN*4AnG8e z4QfsR*A07fS`=H*WW!6mQ9d6Dfh-CrN4Lxzwp-$|))3hw(|k0_B$9&S$x&BK8AhFA zhLJ>LP^)~285(dERi`6ODs!tIE!4qmoseuz%XT)wju&J=t*uZM!2Oz{)qQEtQKP+lVNen>o2xL#76#Z zl^QDfp|}20Ct{9&$k<(B@9L*^s{2o4vT*`aq|hWj=Q!+jO&QX)x=q~50PRG3Kx<&F z$tY0yeST`v#1A$pe8IpcfSxGkWgLi*)YN##9DybOO(LIg5r1EZj_v`R+Sp|T|Cl1_ zkxo34fV;c821RB^h`FbhQ}>GfG*dxp z8JXo93exG`)~RzQNoCbURSe5X(vF5ti0=p25#n5jQqzgKWrt{!YskNW7~Gc^6Ui~C zo~!p6E#ZpXqP+7=SJRKW*k=?_0lYf>#%NvT-GCF$2SK$!BNT?-EyV_d_91H8$o0 z?!nPR?rvp)7t1}8KVb)t_RS2+(i}3*CKO6QAq{wSR%R@Zvig0mWkXV z1zQUiQFP7mBNg7WKx6 z!iZ<(gHF$*QpGU-2a=`C4VVptAQ~=Oo!1IIO;$HWgJ1MTIn?|U7HnR>cE8^H=CVdO$Upu#;(Q<{+1aX1 zb!K)kf89Tf97MuyF3H*L1HySF^*ckcU|Z9m6n2(O@+a7uL-Jm9!Z0>1Nm4@@R9uEB{)(ZZ`+H%c zaLG4519{F?Aj3;(6B}H)GlAjRYN-{WBaQJLEenwv%G?f?DgSRu6iU&JVghU4YHCxf zIb~$sxoJFy)_IXf3qgseY>e_B-lvN{=yd*Aq2-6QLynQiHdv&kkks|6N1!`J0S?kk zAH1Suc&hYMgcUQ1#D-C92IY`>M5RV1IW1!Wwcy1Pbws$G{)Wu2ga#p&Wtz2Rax%f%J-L->}$(I`a_R6m; z<(k>Wj}#}v{3O4!a6Z@MR{C-p8X9ZuR;GObJhjR5?31hJ>7?=3`%}SMNyZ%!(La<1Bel%p6kn1;{)S?*Pp(AnfaCv)Jzj-mrxc4@G%dQG)X;!IDStb!I_GAT3E|5fv z*uz|aA76_8#HXOE?Kja_!bJgeaz0mNOCTf)BP7RsuN?b8*3tSdo5qM5!=19+FDK~( za*{~YcdbGP=mpdprR=Ach24sIH9pbwD$kNv$Toax|tnfnb${XT4Y5>Sy%Y)e}Hj z%#$ZIVrKN$%UDl3WVoAZga5d+I`J1$v#@hsQdnOk#`s#7eY9Y-!`nsQwk>(k_hv=0 z#H|)z6(mH!Sb8x)+nOz;_v#RhaExq+h~lBJJb^w$4#|DhpbRENB_gTv z)UP8%R8_-hsD`IO|A(ft;A*Su)@Xp@UR;Y4T#FTV*W&KQy%5~pJ-EATakteq-F9kc{MJ+qS z$v4OQ(rTk9B))I}SQWoXD%a7S_$>&M;K(;q=m_mt2S#uf0j<~zzn{GW?^#RX(0#2N%GfuEa18|Ydu;xl~a|AHN7j6`^s?Y%ZxWfmA6rtJmY{9akNxov1;dE@-h$5`AM6$5ZOACl*j>c}VLQqyq(1M$;84qO zd}OTQMzW$jKtSH-U`|0-046C}xSF^tQX;FwhfL=`&?(#rlZwZFbmdYL9e>zm*(+2# zmWeYZ4jLEj4eL!XVw+{cJ=ah)yy*EaHTj_vSU4%hwxf7 z10&7YA3PwC2iw1koq_`MK~89gsEFDmvY6Tn`<+x}OS>Gv*VZEn3baAA-V*`~2icX$zNLxgTd)9GOmp$OW!jc9yzOn~muFzy-T4uMTpxi>y^)r}y zAf#eq&1Tz;nFkeR3+NHaq2nd?pt0XN!7g7A2B!=KJ+*(o+_(vPxlPNt22<}M9HK8y zWp%S|y-$aFcgwvHFKm_K3;HsZqFVo}Hh!z}Uy=0W!;utYw>R}It7V~?MZ6}uzH7%v z`-oNJot+=2t&H+J<48rxfX;6N1=N}8Ajt?K-`?T)#ZG(+!9Qn))E?i& zL|j(RJ4JMiob@p3%|iQ1jNjSDJo7@}>i@3S){>XcdrUw8Lxt!E4a3fFJq zc#TZ4T+Ktp#;>rq6=6d|Kc?`Ev_iOg5*NA75q^v`O1$w8sEan}iLYwe%Ah^dTKY7# z1N#08MuPLxZV*L7(E2zvJ0R!Pa7HkoH$KLChF&eY!@8^9W@$Kf(q0 zD>XKGJXq|*5BKXd%!(Jd9vX?rgJp%~FchMRtsh?5m6N@Lv2=i@4JlQ%!=M*2YYx`m z(?-^+H6p)H{fq->21p)jG_Oe#=A8q{;{+?l!fWH+OIlFd9EH$#9V*gMP2CpuBH|GN zge05XQ-08geBEik3xsU07%RPj(cKJ}(^Ny;hcwVt-(EAMfwd*cJeo&{=LXia)y0Vr z8#f0oT&}wT7`D&if&?e#bZ6GPH?TjUag@{+KM5I5KXr7QB(v?l>c1 z$Is5r-h$4;YFVvDS&X{ZG|7!mY6kvmq0ACbof-W%PO^JsXY1L?llFXLy{y5PWVA}IHXivcx|Wlksg z_4jFc{>o~GM+`3$jy~UNg3x2;B@Ip))0D8Hf>$Ntql?z6VljraOyi0etZtG!;=|hh zvczYF%Iqrhy(KlS)^DE=EVEk*4EOregMPmzT!LJp3DNMdnXsYBu z7{`MR|1aC0K~I-Y6vJmVs1QK~bVJPy;vxjI2{)?gBQ~@#Tuz}qsF(mAs-(n%w=trB z5bfR~W20*Y1uC%#2|$nq0%gK>>ph00>jxGz(}wbnN86{5Jy3kQL!{FIe)=j@zkg#z z0i%HqF!x1|UeSbMKsdD3BD~Z4U!H%)(x;WCf)5lQ8pTquV1P*lTWdDuxn&Xr_Zubu zzEzSP-h9wifIh8I5r?ZIPfUM6;m0-qJS|Rmkzy}~kiA%(=%@Ivd)9>Q+;NW~#(L%i zx1=xm*)4boIX!TFq!tRl;V(fF?7a0g)fA#L+tZ%48d! z*h3X=rq;$9##Nx%rJ*&_GYDO<7nbS-e=RXpTeB!?%ytaoKr( zFR+W{+#_k-`+CS`7eZNe!`C{hkj@OPeB_|a@SxujS(%`13VhRE)6xcC`=@nez3 zdYdr)fwzm_ZTb(vY+G7DqNE}$N`yzMTybm9$-+19TXVOS8#Vhl5NR%b%72_gJuCdT z1|gd7>i&5@A>+#T7-|h#V(K6#L=JTUcZw~Iu_Vbg6k z4mOG}=vC?xE#2a?EFlp3Yd;Bp!v9(?qld()mgVc$lm2<@$_id~%JrTO zwi8m=pt89+PJ09cvFDHJvZKz4fVsCIUy71oZ(A=r%RO10=})IY&Z_6?@Vc5u4bL$ZT!LbSqB!BN;w;o$y2XUeIFjBh0ILta0e>cq z-Kiak$2sSNu}~cb8k#B+VzSMW!os9-@|=OR$iA$K4Gk-5VypdEd&mo?Fhyu4wj=T^ za;nxeNG_`eZgB{G4bXTWI~@*FP!-xl=KFIZBciv=Y<=aYK@f!~D<7&S-A_&pHic^t z_1v&2&oUX&CI*}*!wakoiW*nUA zkfG-c0crprxyFEzY&|);|>ky6`oo9hPBevseU!K@!n5U8p_9Ba z7IADH@VX#q%_Jf2PtL{;nWH}V1D^Gj&fsg9RdC2Yd3ycbT!oG~2Wt`)JzJf64Qqpi zx<4h-z*Bi>9hmsXJXFTCMoc4ohSVK6i5w*cq1==(H+auW{H6+Lg7gIoCRW=P(*v~P z`};~@<#bZL!ZPe_Jk+g^K2mIqsDLIg@5f=N;M?ryI&hDW3_jpo{?9H$l6f&gf-?$8 z$TmS9Oc94D%ORA`6o}+Pi-M#er1(mfLixk-47V{PHDP*q4EI$! zHSb)4FQDCy7k~}-OSuL^2|qXJb>t6?&;XZ7J`N0JlbAL^cOUbZC+!vv{)cKffCG`_ zDD1Twu1bO!vr0d+4Ttv{B|?etZBoKFE#laj8vQiWv_1Gi<*;QGn{e;KM&NRV<(0_% zRkgOuv*xv5J=S&CAJer-^nYJOUY*81|Kt4-_}a!r%Ghco)vYEcM9P4$60K#m^bn`5 z*5zlkTwKQjfQl48VjRxRJHPzrN-CT#v2S6gC>cV9KZD{}*^k=|jw#%St%$5X0B#CG z^vF8@he|dfIQY{uHu+zHOhWM5-gqw$Ktg6T{D?r+H;}|klH8de-7%Ss&D2C{c#fhS zWHL3!dz9bv0{|VRs=P{=m)93P{sCnSJN4OTu$Hbo{zldU>Y(d~rj1%?ny=Ms9M63r2>etYc~xnOfJ-Kf=)n#pO%yPxgsB z#Wk2Z7=@~R-X0a!J#{iYFSt9EPBka)hpjwG+CSZz%nX&ap7<6vvQy%PlP-;95F*5C zO4Z1Q>9nm>7$DM%(M>n8MfSpzX)M-}_5xBc=5ESX+((vr&9DlGWJeuPl##j0hwKry z^fp|z`;TdC$R<$b2f40rqTRPvX(mbU6K{Ad!NXJy3uuQi%LKvp0${S0Vp1gqb|a(t z38qEpN|s&>ECT;9h@Lx7DDt*NhSA2LMpI!{#xPjxkqI(z2$h$qHu;D5r8mIBLq=ff z#Ov3*T9q(;h@#I~wMoxb$2{Job%b$UjYY6PDQ2M13?%3M_+!a2uFv9zyKQ8R2;jp#Yv&1-AHthBacGwKnU7L$W8NaR+7kkD z)F?6cPT)6fT00Ze-7z>M8#d_}&PbL}Ddb#e8e~<$ponrt_fOKN`Mkc*=pEWpKTQOp z`y%()Lw$WgWWVg*0i9)ZjUW4upNv)l0><|z(Z6t^JV)2nkO3iCy<#?3EaO>5+UcHf zfmHP^JdnxS>9b$_Hkyx03AfJ(;betL*EaF&mEOkmB2%$0rNsr?-l~6GMhgGhone7_ zz16c)O{XL1)Z?bid zt|+#qRS)OZ8=|(@AvBmyCPX#4iUBM*&nSgx_|!V6rZZkSS$ZmO{LL!yE07aFASrF% zspzv)4`>(GvGZM3vqNvR%-luZ6gUfc!L$92AKfGl3KzQQX);?c5ag8$`sFUumb1mI zKkb-2ZGCK+0!HVwwoOrlU>>8mofDOQd{I2-W#iQnf3siGEyZ-sx>0ED#V`BC9*BsH z^$y22E>;8o7pp!qnPXJ(Cfb%qxDYTmS#kGHq7Xdj92hhr1zw!^fKOv8h2OGatse%1 zYBJ-;9+i6yv{&0m-NiFAlqRcVH$|col{F&|M$4ny&nyTSgE3VKG~Q5%Jz?oFr8QFi z*B6AK&828?s&P`@plo!-B42%b@5OS3tGkhxp}nDRVe`{Mw{ay&6Y}%?a$iMp%UHQD z!e3_WcSz0;>Q9$mkG_t>)rYe&2=2>IU5K|$wkF93ct3cmYK40i)08?5*1IKoRyvzT zn6-Iwx7qH>_?pyWsNLw3*xXCh3QdYTy7s);J#&J?byNBb`Y_%S4Wxkb9`&r$Y+iD4ktdF5AAb~;n- zanAqQ+MZ3t(T5aa0!K`*NxmX|Fv4BxB~^9&wUHNGqobXw{S)zE`E&P+CHUn^Qz*XX z)J}D04QLoLy`X777kKz1J~OpYzeug|ePa__b*A!Z8k=|;6Vl?_r|5K&0Y3ZebX#CA zKuxa?baFli#WjuO$TdyG(t(QtougfmNpP`vfZdZs+lqDUx0KX@f&);yqvF9mpVQI? ztiiz7hVS+;!?^Ak1kXYDhYXiLJ58AZ_~$=BR&O5XrTPJz;^N|>(;k*$xM|P% zw&#bgziF_kC^{uR!LFK~l+wxdk+WQ9F{KsKhwGRZJf4<^4wSXjvGQIhq_WcVeZC%# zjB0Y3$awiu)~8*zoYVQQsQhg*b;tT1yFI#(J43#B6$_?U7_+7aqBz_Pnl3xw-2m6ieLq^+NdXZ;jQ5KrbIC+*@+=DYYnL zPKFSRk8@&H>^nf`v!m#oAPXHG)+j0y!H!ddXhXM`7|rez462oPEt9M9#mX9R>3`XR^18^3t9<;?d=^1c7Mdhn?oOG za*zU5wyN|%znQ6FO|p1*pi2FsL-OT-G`#QG;SK|a%qJ&H5I#uIp zCLGPkAF7aRXyaOutGcIuG)KktD`70%=lxIq3IYgNfxgmJ;a8@yi(cD5r5mJ@0vrvE8I0HUdcmC7w4!$Jc5lha}^Le>qbM&&`^@3Q3TrHFlz;ukE2?^1*q3Wo&43uD)&5_eIiTeoI@DfD~3VUWDT0U^U=-+ZW5>H`mRF zf1f|>@q0KNFlLvw_Nm?WEFORk2ZR^v1^dZmc(n4)%W7v5wJVHBRPf;wsoa+Bys0Ud zH<4`UxRE*sc!vm^TWL>F^a#8MW`B#^W7;5DnGNzH+4(Ag;YxUn4vBeMsmjopY=|;G z(ZGnjG-Vmp?3+@2^`MHxGGs6nz)x119^C>R=Z>XWrj}wYgw02dK%c!(3&j#SWu7T9 z#jsu3Jde?x*J5Jxb*S04O|eeX1Nli(aH$gX3o8%5n)Ty}KnG=B%!@qGv!D+cGB^Ll$8zL6 zu(chx=_}g$pjYBgkMYp+M_K!MY9{$G1+{sz=FC)0g!!;V!&3?N#SV8zr6P$&5L*T+jB@tZt+ zKQLzaZ*yatLAR)E2b?LApm<>7-cK6XYbn~N>bXx#WGcb?(H&~DmKA)y_g4>9B3Hyy za@n_gS`2Jg9+oY=+e*r8^a^Pa?L`uP0l7@o%d3y9-X8dPncTMZCmc#Zzv#9W6#RTEVP^``HR|z`c=gg zO1%upIsPS>kKn(*twpMJTlN_=(F1i1?iVE*Mc$wHgHktu1SAVG{PMzQ{oVmQMu;R7 z7I2M)-=ZF&b_CrJN{1D|KlbX_IXDu}oJ{RQiNbnH50?)F5vlg`UOs`Du2Bf7bzVNAyYZy%#mN>o7MaPWtC{1SOf-lA@H(D$yBly&4@ z3bjh*W%bFpsFRxa3&O!eE8MNE1oU;l3>k$mZCWWSw}GKLuXPYnPNmTzDR?0@1^=O4 z2{Pz;8;{UC56XFHIPqf@8!LoE|!<(up5P+j_ zFX8v-yQaMh$T9WH4Q2m*0oFez{xfwSYWKaQv4&AB5g>*lIr48)zj01#0M9Y&Z1y!A z1}QDw9H0*F4U@omgmrjtPSF!XHZ<75!BADZ$tp54O^o@+-1+zPIagG>R#%^` z_?pqlVgl=kler_5!^57s_pa8E?mVV*Z-Y~EcMpu|<-F~=C3x$S_}SxXu#lR(zf%c+ zWxa0YO(rQ3e5*3#={xL>0Iz{_re_3%9ObOJa|_{AOKY%mKw5XJe8pT86z&%<*uhGF zr_H3|9Da*(g9JVQbEaibH<$5o>N@y+N9zz5FDbjKxZx-J*Ibz-fQ%-anHMUa!D`rP z#9!6?Ugz1PuzIp0FJadgU)6Gq4!(qDd#n446vtw)MOxV>xNNbAvF=5n#NbH5xK+X` z(OPwMODwsQI`$?V6M?dV9aHPZH5#+GKqTj61EKv`u9hOUc7%v$k>hc zO7PPFRH*dU)l&fAU=xBYp0jbw^})glbm4M8PdJa^ru>`?gEv!HJuL(Pi+hb30a;JZ zLO5=2)RWxq($O>5g2?3+L&Knlt~h{2FU7QSpW+1Oc#T}0y}&Z`lC+O^bQtGGs>{wr z-%NjOk+s3ef)0WY2R-n5WpwPaI!fvOielllZ8WI#f25wKrpN%dh2}WSJVyxMQ?5ft z*VO`s{dWjIC`ShTC|pNdi_5!BH00Pz!l*~CYN%}pyT6DROM~9=eAd9~?3m-X-OdQ^Fgt&Q?ahiigG6aHaPrGiHQBX>yb=gxxAe3EeSNl~4l1a5 zBcx@VaGxX=@Rh+qRJ9bYhBjXW(~S~LEiW-bQq1X~)zT=dD${4LY3M^=BfZXM?$ey@+g30CqC3A@$iCe<_NnU5DlgxX z!s6#CC3w9Kz?H>YX7Rj;iz24Vl_weR=VX5DL_S+|-)$me>CWVrah9X1oW$d!Gs-Uh zUwJ8Np8H;_gDtWobnUn(b#z-8K$Q;dHzQAD|( z`|_7KgGP_QWvW1ON-eVuwH1PGYf``-xJiwn>QHDsutk?@81`?hvjRWnw(+}KF3IKt zLq(wxc-ucCJ|OsqH^TkyZ?*cmpkVbu_$~XFLyWUWQjk%Pk>m6PL^*uwsHA+nCEUtz zr_KRCVL7{dF{(MJ@ndUUIM#l83;vA-@sH!aXreJeS}bRehgK zCOG}Kp<x)b^M$kKlV@klh6CSpf<6}2n-0QTlwwYC_wAa7b%aW7rpdAcLJJYm8JCxj!V|yeT z@|B&$jP~twYJ+wD%nZ%k_}g33!$XGpdP9p!fpezirxkWhLy)fn$}>feYJ0hU$o$L( z5jk46nom9Y04*N{*tay;j|#_Xny7yJfH*gC`MyEzZ56Qq?TrmAgBO|>|3o4H5j7Qx z)ooold;1$5pZBe=N`Z*F+Kn?pKpZ|0)#|_ll}B(WuKdV7VL`5}Y|b>fN3Iy*UVvQX}`6X8rLGI!&mCod&Jafw({Gw(OhTNXHO-A_ThqWCud&<`Yy)8<`Zm?YDnoP#abj- zw%L_;Fwv`?E;awn*BK1q^*|PNzVIz2`ZO`=E3u7dTVXo^+sB8()f%elfEJNK_}DkFTyONK>B`Q*+4+St(E{%8@)Fp5Dn!S`(3gg zYCOr*LlXPX^eXU6=1&-SdMtd96RsrI1K%Bpq_PPGfk*=LjT^S}y!MdaoFMq)*6Po* zgm|4L5oAAF5F1TK`3;0DU}ziZ zW@ixmbc5X4r5@(SyWcNZ_iI9lj+W`82RblIYy=3}qo9!UG$kuk*od5p~8(@ECz zM8o~0Nr&|1^DHreOt&Pxx)jNkrl%8;^w(U@N&e#gvA-SRBQ{nT79eow9)wRJ0}s^< z%7G5?j@%7R9YYOCcF5@bV;x1AdA|(mrc*?UDHWqEijDl^MN2KEOR6`;!P&w54Yh)7 z=tML`%*XW>0m!bapG>>)0Zh!H*e2c!Za6B5ImQc}#K7Gw{Jhb#C(`);R#`kvDWC+} zh_(d>6{)>vOq`l#U;x9`uQ)Xak~GQSLABFqhqZOg4ou@sk7ByZa# zy^O*(>$gr?14pkxztRyRuup|s285dV#AZ-x%f(8n?-r{Iak-fl(mZK!0kdFZb*CHG zWD@`4bV%vQy{u+L>988UR!mK9D%U-CgPLE)Z*G-Wx!QI2k44&xG*i9$xe;1({STOs z^9d}a?a={DZIZ-7p5T#FR&VgZ8Jf|mn+d$Kq#`J?{M-%WiZVWWU&7FLrvzaxKfo27 zPDgS6)~=YV66{%q-a9qexAWOsMTR>X->i&t`ZwaS;S(oRYXnqw@ zxA8;5(r?n26CR8e|H7kBNDp@zBBYL#T`l$Q3i4X&SoKyO_!pENsNQ%U{Enpso9W=q zQtlum>REoa=4x4Kh}nymGtQ=cotHtq-7WaU?x)fUA>LP`Vh_Ah=s7K{=Y-=7Lj^#? z&SG7oKDG$Y=$Eb2X{kdoyyaH*Q}Gh*p4D@d4?Zsudfl2+OD^4jAKOFAp73`XBnW5T zC~-}l`ftkZOmUFO{FRx+?IQb*^o(0HYy4F0wfdNghR8`{04QI@P9A%pPQuJ~JGY2C?}Mk8 z@rwui(pJ=drt!(@zlY0OqnI7u#1cMii$u3gZGCc`NN)IK7f)y)@Az_22d}jn9HS!k z79)vVSp!}Pp>N$Re&`Z;$_nO2ZCQs9d^ciC$U!&SJ;pebodH>=;WE>Lalv*&#T$S0 zxHUJv#bs*Y#BaB$mF4VkcNCb3{@t;?>ecS|c@D-mtb<&q^c zR@wy~_Z1Cx6xFjz;vl&sE>iTnwAt`#DJzJ1$L;k%X)B%fk6eS+a}#0wp}K@k_^-@> z_&?#hLc&lS!jAYBDzv4>6ub_!3V3{aqJQzpni#xBQ83d${4jYBm2Qxv*_Aw}tumD7 zP(kex+B}97RO+_H81XKi(kW?mqinniL!Q8ubI11B z#_tFF@gIt@R};Q_Ld|Xw*Qk-*d$sQ$64i{XT!75{N+5lwY+;J4oU8Fz@btp!GJOI= z>Go<$iU%A>x7?rY7~dlO_OUHiMu-+l$u}11?P~sC6dm0sHh6|1+(%Zq zu1(zzsxN6A?7A@L7B@0J1+a8froMDV#vpjRwF**=O8?xU=IgY~vHz$H3I7 z)^UYuQcz15uv*}*X;j0Gf91^SZM_hln0p6j;j*N{-$WKhNqt8|sprTO*OKeO zdq}{jr)e2YhDY6wC*U?wn~#Wk?jdwd1|pghy+uL(3mRpW&(?cxz%)yPD?$I+Cb;yf z<{F{;{rClDXF$4^eJHn$P9L;n5`S=AgJ=!Ya3m-j>h%iEO{xFui_%Rmd~J~6jy+#o>a(u! zuv5R{unZf&n?xu{bhFsFmup%NmJ`?L%X=+&wX0>C>@qw(A^R#aJIM^6tUoh3k=~O4<#A>O{qA402F%lZH*MOQnnOdy(I7*b)W;zpji?ST{9Y0OG`m(y&PjrR(Q>u0u zsc(Ipgz%?W?w28e`5l_P z*<{)*ax|Rs`B?ZtA-5R3*~Y0ybV(TSA19Zt*o<>CR%V1xFCx&hG9EspojJenUCYRP zL|MYaFZECbMF_zy{M@F$sFoDqol!8ovznN7S}8mT_qD7i01TVNWr;utDP~M+r%+qW zV4OF_i=@HcLD@i$OsGtf9CA9rSzXm2eR+htoySC7|J)=lN7rd%8ySxggKUU&Cu5ijL|{&rh| z?rQvPAWADAa>lf{C;FCG(?XOM_Om(%es`PC7F6v1BY)haB{=;PCL%MYeb69Gw0X=U zTMyg6Viv;eRz5yy8>h_}W14&W`jSlwihzBSW0A}0K&Q8+!P7}=_`xC1@iin?H*>pf zQT`%2SD$lq+eCHsy#zq~A#e$ZKqlIc`Ca$WItZPE&Bq6^)Iq7drS%brX(@^j6IR%! zi@Y-Ow~EYMTDm=e=+br})6HVkA_*QP=V&I6itom51M%RLK=1I=Y}@2reO=0<$D2SZ z4qcAjafx65 zGoP|{UG@4zq0JRM&ddOLP5dTusnH=MRP8{44aNxY zQL}V*D(@6d3oWYRa{|S_K&K#;He2v>yg*a2 zh4+Q@jLSHpwJR<=l7rJ$4NIGVklVa&x6e(@F1hG}KMats8uI453f0>E z^G|~_cP(wSm;`$Yfo^4JC&7QfEb(+Ww8ib-kB-PBaGa2NnNPKL4<;_z0{u_j$3nNK zDgk;vk!edfHtwO&%}<{X(XCuWk#fmF2T7e)kvy`#3D^p;-){A4(@NAdmV`P=)p&A$ zQRqMZxHTx3jes4Q*)HsGh3Bt1n#*`6v>-P5TkHpN_|kd-0^%jLtwQwYsTphQi}cmF z4J?M5sSahIZR=gPYyQn{gGDF4YkCCa``Dd;ytbVD*+7)YSXdTVVL)I?bTAi(Nh%OH z6ATyf%;J2iu4WJjEI^8+NWuOfg@tFCOliwbfrVt@CAYo#)@eMe=`q_LaJ;SI*Y&cp zWGJ*c(|NkOwXEsMXARv7m*B_hNEjyVeS4q8GI4rG3thdo_A7XbQPfu<~pcfY}GhD(l*d4YS2uP;_GZTRs8UDt=5~-Q^UY~RezDF04UNM~hl12%n zeM(n&VSO@So(%hfaQNyj$7sp)#Eg4zgen~#{@@o;!&G`QIkx`EO@XSNq3d;OU9^`^ zE>>~fcu*C_!dze`Vs)xp2}jyVJrA%kf_|KSU~*MNO2Rz(_87GpAfj7PNJ?^*BJoyu zf2b&(u^!iYX|jxF(TtXtt0(e9_jn5*kc=&LCX|9wp}k8p;a@}ot2nHp zTt0#cpI7@h@cRIL{W8Wx8?U9Tjyk{CN6zRnV^)rPj%l~S=v;1j#QOd-*J$bSB5++R z-MXfI@J2^td%P+8HD^N%kUcDJlV(-4=1Gw7icG`l5@M(QQvNFe4fkLzNVV<+lLqZu z^D1>=Q^!X`D`kD69?|gPB&jn-g4j(DE9J{e9I!fq4$)WY;2G){{ul`BtPya6>}h(k zGAfw)YxD&3@P&E7y1*R@Nf3jf>u5Nt>&Sbz;B{h}9mX)g3%niT5C2bCVCX~F*omVi zJ-5%a)_I!pS=+;s=66zn+}+z!xiBphc}?+sY|i&^1mxqvukAVx2~hcgaS&dSFu2B| zLEaAnU{45HLwe?hvS)xJq=Sd^Zn~*@fvzkMalt}$W5Y!X42|C*KLIBN1!C(LG9&OaWWaX#w8^|XsUKuT<@_eWC8FE!9ll4i4Ady} zwd|C+WIeQOG*f@@7=VnmoPnj8*8J&LqH0Yqx4kMSdo?h}c(E`QrADJ&&=1X7*~Z_- zz?`4PdxN^OIh|O%?*BTac)f8vv0wok5lj$uHncg5K9kH zgNPQ#gllTbjPd;6Ym%H7#)o|=?&Ll3)6mly#jJkJ%J%r@Tj_Q<@~qzMoSS`x42!1_ zi&Ru~kjlxe9u9s4$AF%)j7FNoEWIV({1(1w&)u<3fZY^s|DecmD!78Kf@6(K`*~Va zZbwwb_0_>3qvln;y`xbA)A-u>(o!Zmnx<04k?jeaXTB5t zMyS7FhWq^Y-Yle~Ju_u8jZ)-Ul0q9zhX`Yz0b7jNN&`pidx%V_5qL>?&gNuqqY}T? zfK4Lc*InMzkG8laaU2cWj!0xaZkQ`s)UgLxisFgO{|>?{cZu6QWB@LmkQY1U|Im$6GanHh#-Q@DG1%RfMQ?t=fuwS_6$LMc4Ul)7smif7-yl(}I{(b|rb&7yPuA74 zMl6$ z{cW0g8mh?|>rgobx92$`>kxf{lLG7xCNBn2!zsdjVjjN<(ZcxD;HtX5GtQrshbn!U`>}(aV4M~{A(`=M z1kYu#)6-F-E-Xs8MaY~=Ol3emf!H}L@TFH(+MVI)ahUZ-X%i=V*~+XQxQm;9?GfvXc|J~VB?wEWwT`WIjz3p z*6jgLi;=OkHrGmX&Yx^ZfUDCMq3`NcBm^?yrpi~jX}$}S-g(DU2MMx!{-sPG1@<}Q zU#Ti^aTTc%Q>_xdGS^FeYDvLO!QY@Q%0G1vA-^}z$a*8|lPT|eY_0b&2Fpqe`O8b^ zy&lka9c^>(e7h&V*YSgv-}u=i z0QTB{hMu?Y%Xm8)X^eh=0Nn5U(D`wpmp(Ut`+nl zLr(s&4@}`=e5UB;Hat{NVo#rICIGZn=W$3@3}VVaPd$M6C6SWV$maV8n9Pl9n!{_J zfq2iar_Abo9k$0O!lIjci`Ky1uUD0-7!0CD8dyY^s0U&)-X(pi>2?SZ*V(VSarK~# zvjFEG+I57QWjQqU%wcbJ^R1wOvSS5i8TE1CD7-gIT<>)IbeX00*T?{m z=tpnmp}e40wF&VE=Tn|2LN_nQo5Ac~O_jdu_SkQKp{wsG+BaQed_*EY(1eBX8BoJq zXU5+^Q3gAyY`%N;QmRzbw_%mnP->uV@HUj#&_93F$<4}2&UWfuR~lM7!FN-F!4jB+ zpMQ+Nanc6RIDWgB{-*tBaqSOR{vXAotBL^gRHP8|!o3I4*s{fXuMs9vfNM&RiHixc z5Oj}_@y!znjB1x>&BPfqxGIE0E|uYoql|)&drIW&OppBq~jr&4A~dh8L=)6 zBJ|%YsTS{d1dWq4H26Cjh6zhVZ<~XBAM%n(x$Zct0NY%3v5j-oaQo5&+^HH6FY9CP zO@_yZ%0t1-lpIbf_l-^8^`I&zLNeO8p*QC4{!vYgl>|SOJzuPII_6eQVwe5S& z!X*yi1Kp7a?SA5a8&%5f7Ip785hIbjQLianK2Vy5%5f!l4O5dMS1bqU!al#fU;XPv zbpYkgSSRg^F=IIC^p!REVH6aEmp>RCZcudWMLPRE4 zZ+RHYCMr)xrfwf9SNkY|&Oa4E+P$E*f|@zZDRfS}+p0B9=@rvju|03!GM*B|G|>Qp zqB$8U>G%W7AH4oCF`ZBJY{VTGu}QOeU!}Roe(2=h;(-m&4kror0*qr_UE^T44^jO0 zQA)!63eV3t)mfj*IExPE)1uh#X9z4M29>p@nbXcps~rjIT!+Iqx3VaZM{(^D9ha2fnD-Gg-}rclAyJL0b%Ya> z&$7z$FTeY+jt<(~kPApY<+o0TxM?IzWgXV&SH{07x88 zYlH_*;1^de_YrplzH{dGJ?mM|a@Jg{!lK1uwk_w3@Gi8~cT$J+z3QPrDb1*+E_vty_dP?LA=P2(eIv~<3a+#Y;3kpo%M$GuU~tlVpk3UrlIzEebLF&Wm&8! z`z$TVy?TG9X8WWZt*w+HZLG!rwka2IdjBORjg4y^qohWKpXb9slnl#Y(JC`$Jd}do zJ|kD{3*?G1N7igK9W3t9@*+xEK|qVYE8War>z&jgT04N@<|`92*5?= z<9pxxUY9&VXeUdjwIhUqI54OIjbHuMU#$xsFvtJ?@Bdx_eraJ=DQ?k5AWB(Vx>O}d^+t&tI`7@@e)p>1qk|a;ye+aoJm;G$ycghr#gyfyZN@Uwu7-NQ$2wXs*fk3}!$NVxa?iZrekHL7w*A5vzOZTC zBp?o$dd@^LLReuTo`7)T zK;#DL-ZyFG&hsTXsjTpx$yqr+XJxv=Wb{y3p)x`@r`=Si6GSP^SslS+8b7bqX*b3J z%fwn}cdMeOa*;lu$`UUq7~VD^ zGNATZkFrT(ektiIQhzIaJNb3xy8LfPNxg?MVZNrGZjzD+1i{BK<{_f7@6AC>V{ zLb<3QeD9o*nI&;07wb1*YJfBeH#!#PGH)v`M>l6HQZOay3nLlpwQ_hkCr8Kh7zyS0 zXkNb$WxUVGKGl)K1><_66327BJspdeY9f#CEVt_UB(YALu-fIBAwk=Gu9M6UFBJI$ zWTKPXK>Q7bjsC&lZ&b>_&nYQ;)vI3R_HU;Jy}+dUXFTH>j$t*@bItT%BmD*uBD3H3 z9^P5vU2dS)7B%F5VV(@$Io#? za)I?2*;+t`IOI?MXnI!&&xKMGtUufb8x!L*Er8@|0L;3d zCZmdv#h44Mi?bapSh;K{l4*U+=SQvFF|3Cg+FzeAa`I9j_s%FN&4n_ljBs`-l*Mu~ zp2ss8iQSqmyWXrNj$|AQn^sUG!}H`~L4vc1MwU21$2kCP?2ffA9c7udp|oeDC^O}} zoSISAJL_Y3F;u&kMoAHUm9@qJy-HjRP)!Qqv!>N{`-)!c?bE&zKkr^2MM-J+db0;J z{yuJKV-h!{aW3m#MY0h!P)3Rs*{??aWrLAiuFvJfm>Mkml*#M&!wS$n0a?Jtv3(Ds zlt-APrCl7_i&sH5SznGTuKe}ZrGsL?(hP+3eMo>$M8R!{(th6ap4U)u^Lk=u)W0=) zChLjWVoc-Bs&^h_djiyiv+y9*3S8!*r?^F$w6K71CjjEOFY0CPuKjw< zI)C5%!MiV1(7XL~aQ4lUezX?`eluc&w*%*}LzpKR4 zF@hxFCQ4B(58Ha-aaLutLfKna{$Q)^20_o5wT5kj-%2H0J1=j!Lr$oSFRyHmA-}yr zMTUE<92zomY&0jA?JLOT9q*9OeeQEBeoj3cKgaMyf!8J=`R_5_)4vX>FY<-a8oMR>``jL2Ty84qTjA7d${% zCvm}c0;MFlkm(74_=QN44&aB|ptcO6)2>h!PVHQ=X1}j}AN=?AEJ!lCa1j$E@8q?# zrff_HKET^s{coVXgq zp1mMQ;LZbFrOr9{{yH%Pxblb^7zpY?ddqF%B8iJBLT4<**Q?)!H1@VKTHuJ}KyO8k zDic33EONz&$o=#!ehtY|$&l227~dqe)P`=--EC@h*>=f<&#iY+Z05!I8|wRywkrVUGoSfP2ZUI0 zSY(%9ez~*UvS@dwuM5BUH-GatJ6C6xU_oI$HTqoApuNi>OUNqCnqIweF3`@Y9OIc# zHEy@8-s9w!&?&-!zMLG*>sQ@x#}A1-XwE7tRCYXBj^l(E7UZr33DbNO9h$Tu+|jT1cWfY#VDk$p-qhVxbi3*w5~1Mk9hK$@NqpSrS! z%fxuRtb6yYG_U^LXd(WW&c3V_vd}R?(*T&>%K!v`fdO7GqkTQh5AgfZAN|pW-Z*q9 zu1ZQBU~A|>T)Qw=^iMkpJ2L@`^9S z_m&~Pa9C(FV5h?Z8!Ri1h#Wn7w5fKqJk#r>4)HZt~RiTP=f}9l#6&cMd z(<@fwU{6^N4p!vIh>^>O17&vYA8EeRg zHtjOwHOY0_Wax0%!kso7sCy_D2V6+l$kHpM{ik~#XE8u>6^PXnih(t@E4VP(|A9-! ziX8Bv69}7p=XZXmn_%B43C`Ss|8_6 zA%!mDLS6=RB_HX{OTQYwM~{h|S3~{uRODiXcbu!p$qN;^Z>r=nCuzVP=QGCb#VXcR zJ#ovPLl1aynqutAS%D#IV9TrTS&{_XW{lD__$-^@0$qORcyb3W+_Dsc$hnyZT-L4L zzhNVnjTYsKv3_NIM)nT|vad&E1h%dBwX;;#v1pRgiWSJz45I3@WouTuLfzLO)!r=CzHHTVv!>>D*(8P+ zRNIkNfzFp?B$ecG*@1}**NwP@mIHck4)&Gg$Y5EH4M%c(n65Vk{aTbmL!k^R;^lL( z+j)6lty#g1*S*htXCIqRo7pNH$@o$>801{Uod`N)m0t$bnwY#3d#@ zWOEjc93C-pVl0p=_S2;%kYl4p#`Wh+Ul>%z*B?lA1d&P3)vf}(m9r98f4}nNX@B8asxh5wk1|#X!6Iph&Zae@s8mjHP zxR8uSLJWp0IR${)W^^v;N=Icf*S!Zj(;~teD4u4Oxj(V{;VwW8#MX8$yzr_a8H)|ow>N5iy>BIO~ZOkeFJ1Y z`!HSLj+>H$}12eBwYa9=?^g1eS}RtY-Blxc{iMPpR${tp`z@M`sIY8 z+}T+xCnw|MZe@gbPcnG6A~TD|G04Tpx~?u1r@Iooz$bBRzA`eY(t;WdnH1JX5*n_R z8a`!CAx#C0?C%fdGRO9cu07eY5q@T5UqKn4VojeOg&@JxRjD}f_$4EfIpDT^wr;me zH?wsEW21)Ao%Hy0fv*dIUFk{-Qe%nRDDmCJ+P$Fv9t|Ts62-0nFk7g|g?w2i`YUo~ zxFq+DEh#Isa(Xr=r!M8>%&am)<`pi4GG{~QUUf0UczkVK3+R(SR%FT4XMRl;qse9f z>4sn)PF!}Zjq4F9|HpMXTCB(cWqHR2mgM+wMVVeChn4LeAIi(&fxHa&=cS;Cmk)>u zCYhB@#GDVw-1eZNUl z9hVpPAMGuMGOm_9HHBlUzmF_gIWbSqO)Ga@5V`w;vZx7>bNc7WK@WY+pqtI8 zz!z8vZ0$W#&c^#LVxlrJCA9WkGe5?)-k$Yz7 z?HM>`II)mZFk}o;pg<8fujVtCdyl4DicZP{)AV!VZ zepkBE1;D-SQrWBG?`Pa6(6<_=|hGy^!$ zAIRnV3UbA`m8%uO?>8n2d`5;8*@yIXy$q-gOjf1fDuxros+F>`y`@q`78WXUele7L zrk7-4W>)qO^++xpkRErBO#9_E)e(-SI<&s}^MtMYa!-ei!7?-44*RCNce?=C1*skC zQrXR$H+I!25Ge~QM>d%%VXDl}59AGeX}z_HVvR&HY3Wysej_V zlUQGJ50-n1#$d!fV$R~F3bPmWx-N!t*JL1fOc=TEVviJ~P`>53g6cjaW4;-|s*;0R zmS*A!7sA~v#BcD)fts|<+^$l6@b zdv<}l3xHb&QX92!>%DKizuDazAkNgBU0_Dv65qMGefeAqzHehT#=diK%Y-V7MEb_;d1tBa#nsuU`4H&1wEJ9g-}ZRxjngDTW z{R6NgkwXJU6}ZS?A&_24M)epU8%)L)iJy%YCbI;igsm+rauQDZ^!L50yGNA`?k`w5 z)KihG6qKgMN-{BBb{VA97Sf#i-b+T#C_9``Msc6 zcXJU76&cs}KRjsU*icR`8=+Mh8J&4KFqoGyMZBS6&Vjs7Ofe~!uSvBgGb#SZmC`7H z_}=s)r68f)ITgs)FXZH|36cBAg1w{wulI3!CX!kDrxqz%uQ+fGefzUj&n2i**K|H8 z^UhB$1aiw6Be$F@$bIv%VGxP0HH@mfl>0qh4&>I!P{z*aJy$k+^`HWLlEoA>fj=W# zS)$VZ>pD>ev6ZdFx&YX9iFVzUTWw?jUkVyivlY4P?4tbNsgg`BMsh@fV{$x@i=%-Y zQ;^y}5Xz9!xL!rFLOxVx7`k|xS)OIoRFPDt{+W0{Y(bgjV7~&&zEBpHA~~^;utEir zeaZ?)reYWAg&8ArutJwnDQ=K0^8j74PCWZI&gcx{;`JW-bM{$x-X}&yuH0vo@d1QZ zh6=`ALr=1SgM_J8sbf;7xFUw=N+m-5{IV=6Go3A!WOB~Rndy?;HCd6{l)ZlWyq@=k zNEu&FW^CT|OvQy+(QAyDWS=WJ*J@yz&xZ7TjYbVK3l+KNOe9~vQ$OoeAk*``QjSb& zJXJE2!U1+9^Lmr+I#ZI{@=J0|uk~QiBgJ0hYF>BKzUc1rE&z5HXcMcA(MEoNCS4~O zs!Ic1KTd@iiS!So8E>;j+B*{25{|cmVPv}6j2nVGTdv4`3wc-Aeupx`&nvSTQsp`B z*q|~f*YDCea6CY=NKup(hK`9Om3=Pu7AEm1Q~hka3@9efr{r{ClYNN-?^kNb7@_^j z-0t63k%{q&E1j577IjvE=E7_w7nk&z>M_4yq+Ce=P}wH2u091d8dDGTiL$$#o?jpb z6#t?AlmGONsA?Ve9|cQ6QB5m z8*uB}oiRd%KA?V-5*v(`Xpem4BjssNdz$MBx?7s%w&xm(3)F0omjxTj)KXcNW=mpb zNN9fWMM$DC=gCA6kGxkGZQf)A`=@Me#W2w&eXc6O*Uxo%TifCbD=DEpRLFj?yAV=?=|u@ z1w!saB?_dD57mLL{;5na(w(OwgTbN$~t~83ek_~=Pl^DEJPJ4 zm!lX6T$U;|Z^pSmi$R=h)0YpVSO2DHR(7>qcEkqDY_Iw?aMw+J9Wl^Z{m1D!Bllbk zzC)Vr|!RvYx$bB+2s0{s2yAkrb6Jg9hk)a zTn!I1Of!LKU0Jb5xIRH0e7%(ml7FiI)v5JL-1via>h3_-JI3_12 z9U$SNWZ`4|ebYC6lYIAgf47_C)vSLYAohkgyul63ZASpkfBUz8bMwlW7no*&JAWfI z$&wQv_F8V-961+Y=-ic2l8IPW%{*NyOE5zbxs`rpg=2jcIW{PAT!HWM(MT>IsmPH5 z#s%eMn7*Nfy!001xM49Kq_+YTTr0F{9^*>!FqPBSkf;(RK2|plmjsw9TT6KxJlOi* zRzJ?Hz8|S(+%A=*VwLTcU3_mw+1L45k=rj;9QeTczCM+gd#6IVxTMUKR@qS)e~Qmt zX)#OH+Q#uxW-Lz3F3FefE6eBZQMP$5kh61YfZ#ATwOle8%xmomDC5~J=sltc-%Lbm z5R_$5pTV(SCer5>05{M5>Ay0+^B?}vfcBA(e8gFYFM837+yZU%*)Ta4 zb~DS=W(-S%Dc*9+EpCId;PuVBiMC9vlw!2;`8m#4$CliwUUZB_1s6TB@a0`Ks~?U*G0y+JYpqw#?m@ zEAvd^#Pof@f@&+bbaNQrX@;6Od;>)1U|o!Tx^E^YcM{t>AH*4*7h}dZv1sLz0^i(X z%+PF-eOZ4$*lb^?Y1W?1x&)uu`9(Q%_L7`Emy@}LUIp7i(#<9AXIc%Xnw5z<%OD)Z zB7g>+&}lh&@}xW1|HSei z_`nA?JSWcKEpK^?15QRWp@%%E0d@dg768Hy(P13?4EHQ7lmk!I=;-LS(9>N2+#I&%3wa{zV_s) zF^oH-ELYy8oO}seTH!VHF4M&2XI5}Ve*xazYBB&w+}~Epk<64LnVK)j_iGaj%u1!wG52bE#vt;a z|M{OTuIK?U3qa5f=#p2z`qiuS6CSHO?zm&s=MhT52u};S0}S2;EMbh_@-5#YPkriB zoq>5dhp=EJq&-g3NWxS=Ww$o#i5cS zcdva((68Q~$0A!UX`IoUsCWTZEa z)iG&3FL6?g>n2krA$HkKE1m^Pis3~yYt*bN_^u?ca-gl(Lv7x~oRNE{jNEUoOX zJrT3L3ko)qj`3M#xyqqbF~u#$R5VjSblaVgOzd7Wxl$; z>*PMclGt14&Yf$?Bhv~qO8*_MQUDBHQ7@4V-Si*-@gM6p&b_hi1$O)KkAGaA|NQ66 zGoJB`mfWL&G2n{F43{qFO+p^ou*5mNA zx~{i16AhC!V3I7)c9eEI4+9Qx2&3RY+_0P4!BCm<(%GErDic+VRL26^q<5?FS(3`A z^#uFW=s2eL`oV`I`Q~FHk2z-Ls`1Dr6oqx>F)puh(`bdPS@7Omd+oJOXZd~H?mhH- zG3)OzfMI5hvd_^^?YLoA_mr(q00`5(``zz$*VrtCf)0P@JKyO@1OMi{ATq=uj~zSa z+^y((J{zDT>BncodeVcQdeDO&BnJ*0aMun<^7p$E0CCNED$W7maG>akqhWER-3wSG zPlT2(XTtu`^r|*I$3V%K|0#*i2YxEI8aI zKkx%T;DYFTIs41k@n!G%)Ihowjj)&9mvOFR{06SJ&JDzkq@+rFs$^wxsiKxTh1ymI z@>Yh6)^%h#I3jXHkAuTT4v)lHr7**S394D7CdpJycus0E!g4Z9l=S{|{W7DZhEI>F z#Zb;niQIc3l9Ln0F+PgcDXo}RUCg;rKUa>&!!H;2N421^Ih|5WE|C79AXgqNNT^`e z+q0y~W?sH@M&$HDUKy;yWE8AO{&C}-Oj$LP&vG}w8jxH1R7T$Un7y_ex{No?* z0?v(u(urUE#b0#Sip!K(q`zMn30P8CO5Uho@jT=q4{_Eh7FMmxc&lm|w*>sGq!>;z zTW3WoWjgqjPIFIvS8ek}l8J{cwUBL`XmZK*v9#6BEjfM3Ku;tGrXo2!QISJKB^Nh5 zK5XR>1?@_K`YCBp>Ry;H$2EMH^tf26$k{n+ z_Cj}@)Z^Z%f}EZX6-Z)dY2*@AgB8PTt0NXX%vTj%`kt)8z>xZ>B|bqE@Ww5Cv=GV2 zJ}bS1Ih4f~^*(&|oRNi@K%zzCuG^*LC>Z9IDh?~q-ET+i^T>T>|{(ZE!5z!xIg^i53hR>r3Ke5md%g+$d9;M zpH}Jt0k|Lk@gJ8T`k^0k3k27&FN9|U5WM#11#oxMnKRtmtvO6vdB+uhY3=glJh!PU z%DmJ1bu6&UikRD*=k#0{y-0G@6Q zY8B^}^t~3WYwdP{E;2JEIj3JI<^snAr%M1|PRfL<@38uVFSaZazd_m+(F{BJ$-|ZTJ?e@fm^uhQ1uC}ZS?+r0CLLcAp z9pBM3)PsRc!wbqEAQgbfdX4k+-{X#~m!sfciwhQD?*!|ueH|gNH^2GKj_^Pjb_D>E zs!N7bEz4{5#$c5I0_oRxdShd4Jmo1*kxzc|ldcBOcUoyAxI*w*!yME8ZrC1x%J;Z6 zr~!nfHLC&4dVgvNyV4%J_pU`}VEGa7YXHBrf#z|=DRmQ8TZ~y(v@NorFF0S)*Dt^d zBk7&7GO7mhr~=nukCnj!-DqfVT~Zc=tFPpkpqrKe2rBR`DHza(3?Q6Y3gqH^UM6Ql zxv(g1?jYVa#yv$zQ)|~6IvML^Tq`si$NV-J;_4@GMk}U3_(YVvK9ECsBO^n49}esF zFD**14dv67P!?xn7xBIUD-Rqi%VUp}9s9dxzsTW!z_a3}R*1{qUCv(Jc&^u6yx|Eb zab(GL*Iid-KIjH?AOOO_ztIyIwduHhGa*LzyTALpE?b?BG%!!z3mw^vl{FI14-x>; zXtpo1JWaLwe67GtJdx{q^rIi`l4*840Fu;#m9!pk0#r7d={({QkC2zW>}B%L|NPI+ z!Xjpgj~^hy?ZMad!{wZCRr2#R00Mg6io#zHOIwSj*_G|VCR==Q63Mf!+jY5AmT6^m z3-ghj3nD3+ND8XV^ZGTU^9xfIs-POz&QZKi5jm6COE!?jC@+i3@)mH9I=^B(sUk47 zB^NOe*sWems|Elsmwlu!LA3fG=Jpzz_E$EU?kNA>ROfNL#p0c*$x(lyfE17UsMw0FawYP&3{A zpdEod(cxsH1+aSD;~wWM4<0V*y|@?vU=~|#{4OgXy%8I2Gu=D84ZxgHlCHI0paSY|I6GiHD_AXg6AT0AxY!)NU$`HsD@joW>;mE$!B* zP0!N;t*qSnOMff%4E?ue1S6C^&&;0>cEG0l)2*=&_xd zRM)MVi6b50HqAKV$_!JJqC#=0Ma?)T)7mFQ36Pu2v#O(n?fMw+df2h4d-LK}XGOi1 z14{9RbxU7ftVpF?R#0S=ROnp9zEEUs&tdDB-%b+rZYvC{o}R;_2Qi`SiV_EOI^>4L z9GZRjzwr%D(EWgUuikUp>(9d^Q{Qn9|~nxFg^D_ar%zGB;eZjFTe#gvXDPuFY_N zZYltB(fE#Gf@E8Is*Ia6om{fh7RXKl-o2J|Q!R?`;3d~%RyNK2RxrHfL>12f%^I$w z?PuL&m~f}>b1M`v9(iPa6C71O)-}jBO&e_QoV~Z1du+X*)#>x({j#!QX&^v+vG$x{ zgfK@xA_^>Mb!^;@1HiNZc-s~9cAKlC_Imab2paK8BUYqKn77p$^xooDfNv+Q+0EQz z&Ek@q-3GCh&q@D&JK#Wf8pJMeW8gx-myS;z*8wrtdNI?z!~iWdWEhl@S!QlNQ_(al zn9n3J^#{Q==AmsexoG9zdOBxpeX3{bxmdSBcBrXkg6T%pCi6an+|}xfq`u0HCWd*r0iVCxDUSkt@zU^vfayFVya~jUHZ2xp5<2UIXYR9=}7(pY5%zDzWv+3-DN7)D}di>7P?vQ z(aGns70)-f6CciQSYYi6?2ceEr6kn#0D81ZqhORy5P%{vRf_K4{`R-KHbO6W!3$h* z>uxhZTHyeWTbNv&cW72~4AUl)+T1%%OA-;39sJ$u$| zIBITaCO}#-fS6TpgF6%^NV8h9Y3Wpx&ZycGO|ivKJWt#}-3-jGtWhvD84*N}N-r3j zbXQ?w3k^D`iR*-pNdIj&%exDJyPEm6nqE!%@T*?+DhGa9V@4WTu9Ta=8XGmY-S$*& zv*?%E>mb>jIklcm8|;cZLSZ*)`Y^vN@oD_u`@P>=?FiLKM_{nBFJX~1y{-*UY=zsg z3xHkO5(b#H@N3_nI!S=7gNW3%b%|krX#&C?r2w4%m&^m?XTCgO zE!mh|=>p)E3vmKA4Gm+-)TAprfJO!xoer@4X#LX&T(K@;aP`EQb&ZVgw6=x`JLY>Kl3v` z<66JflSXsK8j0_?LyMwzXAo|4Dp;3d7%+YRQd|3kcJ@>iKb?(VqZn?$H+XL`mYB%0^qXVgW0>Cj}Gz&ayg>VH2gJ$Wc zN!bPZ;Rk>42Qw$5cfqdk&k@D4WOi8J@etH)d`TX>HhH_|IvMxcYUxiahI?`7{JSbO#sse z*Ef2QZ5KQcs(jeyKa1t58M+ z;Boj)FtrIQS&WRotLMSVnxJ0$GXNJhh!MP(8(MS$P_~cHJAEExfiXS))vtcF1F3oo zy&iJ|&=?(34*(H>?S(IVp^N8H5&?T8=#Crp>Z`AI8J={1;rqSJVyyM5*(7ed)}F!M zl~!6?1+Jdb&+KI=?_RGKX{UE39vM0^z3+YRtB(C?M+lh^J|PJX*4apKw~}Sb>&Y{~ zbxSf$J97-X0N9nb#Irab$gT%|jV#M%8;bV;J>OZ32F#`k$XI z*WK{VZHeqysK0aE$+CV^F`jdqOhaT>P`(ZcS)@;T(v#eLyAOQe11>aD3r4lZby`S( zAu*=WNH|}shzE*zBS~}o4O8B~@B6;bxo;cwE#2#&xMKityF8%ud63yjM~G(3BJ20O z4{gfYnL58yrf6&li_u$Lu81s^BmJ6`MkJ8fWqxa0=kBgWmR{mgRz+LVpHw^=22vjY zyHefv?C;%r0esTj?6bGHYa=)l+mCZCST+JW%tWuId?{AQ_3tc(7wyRX@2`ml}B%|}ukAAcR zrmueWs}2Y$ipPis#AX*>p4sbw*mZ%f zLs+CNuK)Ot|8RAG&BPbJVv*5EmwLeM4DdTirQ^Y);-jZ0CxtNQppQ8a*3SfVYFZV! zt+=1lC_8Qwx;M)oR)LmT*$msU=O|7t3PK}cJ}0>_lAOykid~?~YtuC2=X;h#dm&33 zj}HgBg4jRaBft=*1{e}jA-q8n8|4)=v~SdCoA=@GXm?oe_kbYf73iKudW5WX&V?`w z+2bVGZPrxwE&z6Dk!`k+4Thf`s}4(x5{I-9xF$h`1x=!Ne{-gRbbp>YPkUrF8_|Q%A6@nPf(H3-bk(* zEX%>ZKzeifyTGh&2h)|-m2NKQ0EXkSkA18wqaq=WL>52?-9V?9R*YlbtI-s7vc((y z-j`gw_r33RlV$)w^c9(>=r)q@x&XKX#J3p2U*2j@y-op_oi+?@>m5Q19tCjF;rm$IJ4719=(BTbCWW z_l&I$F5jAc?Ms?C+7bQ^V;bE;k$$bfIx)CuiC9ngyWji0-*a`$UeIG7{pd#>D8KZj zFLk=C3xL~9NDT&T$iSoo!FOB1dZK8Rg|Sh6Fw+Z|7$EKn0MNHPBSVu#0}!sKerLUt zoYUgF(Ck)~&TSs-FUV#3buKJOMHO`=SCPVf3oE~sHKSg>+%z{*tz0(sPlK6%vT%34N@^cHr%YZF$~j5%!=uNCdsuDk9!*KG#3 zsuvg}p_V5+;R$tHwGlTYe8be3TEUye@4o;0zuz_1=mKB|EuQrN9uFD7!?(@Ba9E}^ z!vJ}pJZy@?pZe6N%Fq4W&$Vq;t#ttdbhr*UwiFDKbK_nRTqn-Jfi;IamJNe}u#?Lu zRu@>uuFW1jjuox+jh1BCRAf9X$>lv|`TW^XZlCUz3k!KESBwPKESGtk6{ND01hoS| zVVl02sVO>deczcXi?+$=A0|&?)Q>4h(8)>Kd`AtrTj4$tU3aU~%Y2e)h13J!wLiRct{k0voLvB1Zrt7goT33vsMWF5|aZYNjUkbpZcjy zb%}1Z@xb+Sf2aw!BdgkIZ=`Gvm*0Lfs}2K0*&3dxog+W>YA^Z5(moqLOpsytKb*NiG6{5!_hu@ zr?_0)Sn#=BiYwmkt5?3IT0?%1Ntj+>zP3Q_jDj%oh-^lWrL-v zN;k{Oy~?cC-Xz;}^h!-b4p__le7Q{4b+~73muna-MI!pzJTA|CB*zC!^5F5ZeB%)# z-*7OLtM}*SP;XIsgXA1iYh^bv0`|$9-~48I>s#Ntsy+_`9E19UAN-)(FHd>OQ?@M- z0($K*RYF9Bitw62IBEs<%eAJ#Z!KV!emzVZ;3agl9R>hz834jaH~>4k7Z7+Q9T=9! zS7>>fny*EO53;y-G5|JHI9wmVM>mLn_=kUR0N8ADJZ=&?*f8pajl9#7ZL*4dVS

VVGz(7tObTB6mzbudkA5<2o`hBd&NMX4ca94sK_X~Z4v783KbYD)4OZxnx zo9M|45aM1W?!VJY1=4#RV8gx1wR5CBYQzwU{V|#;{dbKZwWV?zmtpK>W+tE_%gpe|g z(ZIxbz>IpJRtM)|fpO1y5AM%SRcO`^YOUjz!?o9IBI(H)8R|1Keqd29D=f-`1|#{( zSu0;rJK>J$P|nR3WWJP>61^`C?;55+qqbv5u<6&CHK`~o=Et>1{yrqZ9Mrb!RiDm<`fUrbA{NWF~@k<2kvtpsmg!|G;7n+^4v1`|ot#$_uq^R0_d{j5p zP>=MES{WQy_H#-kf7(h>b>HNSkxR-37nKTDlo3{-5J2(rvoeF3zZe;0_n|% z%KAb%J|yzMLq@*gsK_f&81F!#KDJ8{K^as|5?@yT0qY zc7>A1Vxr80EHC1FY(5qb_j|4P2jhTju^mG7R#KrFc2jRd8b83t#R#qR>pu&Dku)kg>tM^uqeY)DA+b##nc@ zAy8jvG!GMEkF_J@DG+v`UDkNe5F)h9oWo)Zp>8`jCN={i&|DctjF)ITK z27_w+_nsE%o3L{4w2|pKk(rWlF~X9I6GqiE8S7_GY&)f&fEJmZus8+#qFyKE3j_I_ z98z2GiUU@zIcS{A^U4vC{XIqoR14%1cc)2}9me-EXnLJHogtz#=*#QFG3^KjK3e7m_=Fu zJMIzb(zG~gG=p&aOVHAW_C@dMw12n}AeeJ?gGPE407geEa%Hh3-!x+7)Kp3CxfsdG zDI<4HR^;xBBKOW3nbFsmDtW0;KB26zY;x|a&FTqO(_N^8I&{qsowt&GoW;lZ2?4}>yY45cRs zTwKt&IS+b5#ydaFuC4jY>cqmHptS1G{_M}(UTZb1fPsn*+%C*`BR_8~?+vr`!@1Wo zmy_qf0gxg9B6vf|2c=w0*;tSJdEEd=_R#PA&hNM+jP)>+W;Z7dcocGT0C;@GI`DNb z+l|$vlQSA^h^(K(s^9(YcRMSy(Y;y~`$~N#3lOmT?(hC?dD_#S=G+{6p~-Ed4Qmo~ zWZM*V^W=I$8R!XQY*ggHcu@|{SlK@%GNO8I@PbJHv>JK~BD3?#2$w__l^M?IQL2cG z7m`70%rY!lUteD{l-I8NdJ=+HEnL_C^dfShksjS2#at+bLQdIUQLo3!pmR zVJsNk4DJTNI^hZQ(`O0+cqsDi?8d9jOl)UE_(7K#7OmW?TH*fSDj;2(_y+v~cWg#%yLzN<;aqxh zK@1~s9NdLD{dv)_<|5gr^zgEt9G!z(q;DIBC)Z|dw%csZreC&gyEc2WYqPc4w!OK{ zw%ulbv)_L($1(5B^FG&o-RBu8;Ice6xRa2Tjn2!h7yk;LHTp_v?KURQffpIXD6mc$ zQk24lm5ozXn35C2qh&GYxZyOa5v;bm;}VpkXcy8lo6uL&FvPo6r_ll!_(O3zXei8L zzK&pxI!>lbz645!BEEFKLh-T)@rsg4ghKLiV6^(j-5;1Xa{mnY4vY+_I6*AWcKJ2$ zi(p!ViYlHvll4M|>KVSq4IqOPO3QiJeI#iQ1OEU`*nd)qX5w3j;I``iG0KiKv9l01 zaAs}`%l_xs#P1{S=gkB&#m8YOtIcT6&;h72(W3~PKYEKI*pA4Rw)x8{#=XoRmF^V! z_`q9Eg0fxQ&=EI@a|3ac(XQ1wVh@{Hx;0c{^~l1-$>i@3HyV{n&;} zal^Q!7YdAY>dA!39t4tSCYnQWtPI<&N3h_Hrfj2*#@Y~J<>+yVVN zsH<=HtinYp2Si8z)?o!NV3Jd1n8U56}I49Z&9 zO9sc8cHB}K&^;NvyyZ2Ze>VG5Qy7H(eyi;?F8mAuWFY;RV#kVP(ULp?o!CPFd+6SV zg?66v>?nlxIYD>`Kux|F5Gpr79qn_IwFr6bv5b+XhQ(nLms`3lPl)5#O(t(beudZ` zccURyTD=(SiTbEYmYE7r+RM{mYNl?$fwM#2#8x9nkvWfC1qYx={O`urwNgbMqGDU1 zXxPl`;rNJdiWlvC3Akx6QzJ$(03?3}bd!hu79!jH?Z;z>=B-aP(Fkatt^VozTmQdK zdJa3?MJPc)tk=fB$$P~eg^<^r9CzEI_4!)Ywv%w`4n`4S>>wGRG8kePRqzA!eLC1j z^20`q6uy(h6znxXTcT9Wx%099s88ZSf_*G%Nvnl?JEuSX^pf{0XIKw`HfAM7|as~PlM9m{bZmA$SQQD(6>h;Au$alPQsPUS;VV11jM-W&6t#yLvY(``P zRH`rD5R;O|7>I!5NA7{{FEXJrP-X5J3NYR$+v`0!C<*`1F4L{eNYT=7`V{ORl(=j< zafEr8iXR@m4`2{r}5f{!-G7(FY{1K&C@|=Sn3Hp|z?h34Ge|pI|^7=>% z3ys=#_kVQPyCEl)WTjw0#i9O^1qBE`iSIknIXnN_mqGSZo*TM-8(?hO&=0zaQK`|K zh6k;FZliwWLGgc)cEZ`l9!}fd?yh#PRN~fQB*2sVCQPN*wSDv(O23q$H%v2&g#EW5 zxmGNF@l)Y{WxGG%TsX~8x-XW;(B+z6^e?kz31yO2As*#o0*Ap7VvN#5)x6^6{reFF zdNwTh6zPkz4y2p=g)B6P30wAyC1;;vefBISAAiFUtFF?U358}1o*Wfai}mfYu1u(7OF5$TM7j4V9?r62@i^@?5=M`JbbG?@vtAU9~f3pH!eGyRN_gx@7}8rU|b zl0l|`buV|XxjYYio?`762bnD1$!B{`Px+l*-u2dg{{Bu04*Mx~Vv(FR2gQ*l9s=D% zf&cBe*@eR=2+d}=LvdkZI7+@-I4s&=brE#&;=Uf|#mtI&bI8?lURSuPHPS=(-Q3clV_+oNFG0h_xnTbM%gmoDs?lDL8S)0Li3^)ET?{M4 zvIvm}e#Td-<(u&+bjLrAfL5n(Iz9I~Oh_W|(0W2By?Z2|9!q|V^pr`kY}AK-Q zLW}KORl5WK(#-Z+t`azYYw&Sku&;OJmHM`^^{zL77f6f7R!`foe9?Yp+Nc?cU?5~4|s{I`rMm}qw_WayWS zWcAvlZ0(%poYHBXj=j&KYb|^P)zhwAZ_K%@xrWi71?POUZF4>tt-QBv93ga^-{!Er zZLqpIH9iOQM70YlNGC($i{D^6^#JE%@|e0gCmHo#2k-#WIdwn^*#9{-birl)p$pVg zSzFI3L=~zAQNz43maT$vaI%uQAjyfXrR6Y?eWr`=7hPc+r`HC>v0av#I% z7UQm7+)Wm`UB)>06d-n?k(^TxbEI6GfloffdmD#G^}+r^S1u%ozf0W@O-uy!`t)q5 z!2ptgV;6Dtlxx0aRWH#ZZs`&ndVpN$5xxG+mnGhfM{?VP2E*z*I?9ihbk?zI7qc#; zz8bqNngnc}q{l`R4rL5zc;zvn4XqA}L2awxtz%c*Y!)E^UX2pJh&r!6b+3PeZX3TU zb~}LfW*>$N0m2Lrl%GcYqID2U6;8HIyDR~T65k6jU6Mh@TOOm#2OW*byGT^b%A!-u9GgA~|tY+-{G&^^ha7Vi4g^1QXAN_6z9?c$_ z?!e|tdGa$URGJxQwA$p}71Eduf2?L(ZzWgTQm)xh0|1Hev;=vTM;8wM9nMaR-aV@j zi-YqYcM6~Lcu9iyDuM^ra6p3f<0h12jByIAK3Xzs2-dMo&ZyyVDz`0|p2KekhyrcU6d=T`mb^OY#(<&E;N~EvbXVfjx-fN!JmAeL71Uj+|^Ml#Yo$+iUm0+ zMvT9q3d=a2^1SnDh}kWsLFen~|IwO!XDO7~7l3{6!Zr;!oHd*7E`g&NwL5{l75Cmi ztopr76Abrz|ADkYYZEnEx0fJp;a@+GJBbj-u1xg@F=1~U>}$_o`kr0g(wIA#_MhT_ zPPiLo!F-FBrbb)RL~z6P3_+~U!D}v)@JwcDzlpvT%;kkZuI#%2;G0&lB?ld@Y7y|* zn9S)UQQ~kRR@P)*tR#1lH$s>aZ&et)TjRi5S&-7dLW_sC1k3)ZO6x=Lrm73WrNTSa zMeP-Pppj^B4wOnbme_<63SUbaCY;BBypF~rhpx{YSpXNG3*WYjn0?E}&j+=wlMfak zVX06DA-exf(2(obnY7eFuQea1HRkf!zcB*$=Mj|(r_JpTznr#ncho218qwRNFvxUL z55kt+O#Yzbnng^~nwbbxw>S=r$vM%uYM-%S8St9>W3xhM`1}i}OY-BT=F>|p0%ob# zbw`9M>dq<7J4+^Vttfpv(R+A*gi#Wxi~UrDqfxa@5O(vY1GO3Y8UlCC?guclO=+hR zhYS8vTbi&|KXVe(w(!5&45|8^9AhUpJW~xW#O?6$c%=T#N=7Bi1G z`Y8mwyN=dS&L7RE_Bx+cEnCV^Lxi2P5>o8#wea}=vTLDFSWqh{6!jGVc7V53zmwFg zOw+0;yrF@^Pw@FbqERyVIEYRML$+4^#~j=*Sfm*2I1U&U#tkaO*8Bqdjj7X33)dUI zW~%1%rKTe#G)X94C{$@ldIdsA)B9nSEU`_Os{v+SUTJMZ*!)S4Sj8H&cwMbOYPyP`!k>9g{(rTvHDSir6Ctg zTD<_<=PgkQd1ex-B}rZ%E*iMk9l^IY2|?=x+V$qgn@I=12DPBJi!%Z|ygF&YKTZ8ahyBKGtz{KRZlQ`i)Pw$%30SKK45#& z?V`%{0T-JE>1zvR5i!em1`{=uDKXKwfqSHsVBtB1q(KN>N*@#^%u2Dqzl9ObHQ_`q zHb2{Etqw(eUgN;S&yCdr_0-(H`O=N9i{>?5Wq7SRjMeAD|q6sorL!pN=qg| zeytp@f&aB#pz&8Mw5_wV8I69}O1$CHeWdK;SyOl#;5#_9{8X$+Z9Dcj+ zVsXhbUIQ)0=uWE-i0b7nEKbph-;lo|2C|{Gf%-;yBT7 zNb4fgEhz0FFZ0oU_oDpP9F^cj!B+<%Y?H&UFuQ2;H{ z9zwE;!`~?M((v(&y(pUj7%qZjn=N{vII+;HY^mA#H^BPfqGo3dE}avwI<6HqbNP`~ zcbXHz14Kf^nxQqQ**Pdv)BSR4e`u+}M@?&;A%Nyyjgxss317c-o%0h~q#g<88WR(f z@e_E%zPop>^FVSlbb&!|BoMyPAkkI>@Zm>pnKPUQ1|al*f#?^Hb|f%QVz!k+a-@gJ zy$?aesbrG%e!Xbn7j$dW-AwW@s}Ok;N>Ax}ShcBQqUL8|+3x$L5fiPCD-aU`r53F&X(NPuBnNEFo!b~8@ z3g0Q`9Fwi5VQy`+a3=120w`ORHwFevE^OH94)My8>{jxc0lol;{^BQhpj)F_7h~NI zS0%nj$j3krVuMk(pqO|ksijbL{L^X)NAK>B`x z=^RTab%K7&LFgOM&+eWa$1nQG%cKVwov_36l_VBba4>qJmS+5B3cnt&v4P;?tfP~H z%NN_PS999B1uP=1DZ<^dlfVQ3k`TlR3%tIci!^@?fzLYcqZyUz5gQ9`axTzdP- zMk&T)YSBq+!4Itul*aVd`^J`8EVFUI&Z=obr-35Dj`p@z=cQ|na}3n%w#F;o$(7aS zKkM|GU9ny3a!36@pF8#U2W%mrD8w%u;aSKgbq#1_J4Ft4M2P=L|KJ3RB4v~6ur)=^(W zDNK*J2;j}a@6cku{j7Q|VNp?U<-Ol)~r=#c9Ub{6*xpXLcQ+V$euaD; z#b<8T3$eLXq5A$js=)Uyqf9(lNc32PBb4-*hlNZ5XqJN9ZSh@e;ho;pj=8@dD`pe& z4`7h?x>8aYUgxt%s_rt6!Yh|w3cFzQcAyv>;agePO3WKw@1K-RDd{Q6hP-NAn+r0a z7v+Z#JWMI-_+4^D3r4AAb12_HLI_;22a}o%VaFjbvR|tPhA&k^>gs|I$A2CTNN1%L1UT=9b5kPH|`mIkvpS#Q-{cQqk?>d!n z*(^2Hc=Q$To{YG4@P02P{;OL09Mx0=Dcf~dGdU=Q+}<_ngBIRi*D{~JK=mo!+A^EI zn$7+iAPp9d9{aL@roZL^e`Rb8=y z(5;pxX`UwYLmM`?xG+{`w1E{Aii=jqhTDdFg#nb&?P@!kLAt~U1+`l6BmM$61pwrGSW%r{qbAt} zbFXKop0B%IQcH&8qgj{@KK`a|faKT3nSFK;xz~_qljX1k@R|Le$MybZ;*8-x<(Nhp zyfzs)hZ+?8$kY~wcwH*Q)W@fDO5)6o!q|e3o7Nu<78gV(*ar-H#5Pt848S4UOT7IT zqlXBBPuHzl49J6bVw@?tO`rBT{PK9@7RQM0;PG#UdF3&}pB1QpIJVVb2=eVp@&`T! zrv0Ae-dg8qh?2{hdYJej#?6nquGcEV5@;RLP8ONvxtOg8&J_G0Df)3I@K-{}LT3k; zhlFgGFahu{_ahb@HWx$fBgcVGZbzDK;!9{cX2Z0bgh+ZIG$Cks9Xv*uwiVmJhBAds z9Yhv5uY(0lV+a6A6n^nwkNemgohJBvdV0Uu`mob$mO+Xp_Ybu!PW0khYZ`Yht-2Y_ zKo2z@llCY(A|J&tj=4juOa;Qqn5%2y0NhJ{-u2#&T%0UvRT&Qg$ATYlI=5l$ydiyL zXW0A1NyA$L7;G?jn`Z$VF@a9!0cZuVU@BzLpFfgUm>TQne4}#QzO}8my#GyCu)-~IJl(CmPXB( zB+E!-A*l?snk04;+Ki+Y&b!#F(lVHi6f(#fV(Lm~RbdqKJNrExPn0WffhxsDjn?t1dxR&sJu)X1if@*Q3mv z(14g~I?FJcT0A}G<0%#WOLGeUS@R(3hlY##mjs-5^?oY)rG2K<3a?lh%W>ry8N3U; zlme(%Q=x^&_)RjpMqlJF16;ECJ(ozoIpL zT1|~=h&v&~Pk%THW0su%_l%Hk(n-Q(jNvdVHozj|C-GK7&##iP;QtbDIv8nbr>Vg5 zWfXq!;^SXKmvQO6Sa7aG)TyMOXSoEo9CvLH$D#9P*qXl~<|i!#DkwOzw}FjrE~NoE!;$o8zkH>v+4R?yMUl2))DUAzoB{iDueLW$b^ubLCo}fQCQQXET z|HuV;cFWr4C;7S&yzv(iuQ8k`6~WJS-8NediIriG?cQ$E^30Q?snR9;LASZ_I>lEB zH3~Tx1X>8ESUYfB-=S=558D{G_9XqWPdK$tMh_0g-cv`L-ZjSeynCc#u|xMgj5Ou% zTEYJGCZKwY&ZW=S-gV z!1e%Vv#JHJG<94#8)%`;fm83=FH%>$25qzkxja<4Z>NlZhY;OIQ_U5|oqYostG?cows!>;RMcb^Q5|Ft04<{e&LFXM;<5+Gl#G>&(l9{xyybCdS5}9jp*fk z3Ob*;C99>{a>`uFRd3q|(Knk|*Y<&860ZxOkg{GO) zwC)Ak1$)PLm~mFf&|g$HZ+agI=C--JSy)&cK6HrP{=n8+-S9q=fBwF8`8pS*w5qSmdQf1;~eNLx{8nJ~Lh*)2@yoU?Uz2R>n1wBl=SS{P_Z* z>9F<}Y8_{fY9&v{{t))RY{{_DUHZ;O-r4q*8(tRK8+yd#zMosX?BeuTF1_|c_KF}u zVKQ(7^>2##00;ws1nG|#s4g$ZC$)Ex*`m1ePJzj@?8y!blcG;YTJLXYD1gx2Tc&rqt zfo1|%2cQ<-zq_F^GQ64b8O^Qc7Yz!QN8PC|CuB5dK#AN6G4{iRW}=5%GrPg| z+_c}QI;Su>NLEUNWR2W!m+n3ED=-_pZf?J6>1x^z@jD(g9KOJ|l9RpUOHXD*L@ySyy@vhK)gfmZa3$`0R^c*{0a3SCwDfH)Xo{>b zS!XwWsD6&od1S{Q#uTCWglJ+ncqv~FTu0mU(EOGXCoxnseh}Te@|ZVjF=DKqTc7 z)C>mh8?Ic(9LB`BLcX_?+;O-%9cv7wZ8u`=V^&Ln*6d?|hT%!~0H;F-4I=l$~|8r(q&Hzemci;&{X%0C5(V zK)jWL)&9ENH65ZhDmt!tu98kRyfH(zQx;LWoq5EKqlg6NK$NI2CzHxc5||HoM;;Ah z`=R%O3hO5Ck6!N!5gMn#V)P75X+K#Ss(P8v(;x(>?MU$*shPb4vI0^VjFXX?vXJO_ti^qr^FT1|zH&02%lOZR zOE2#DW=ulg5?)%iqNQnSTPgIkVwadP@v6bez^~18-PeCQ^?zox?Ae;D{-kk#&$xi5 zUcOZS-}ZBG2JZpY-g|KE6?Q=n#bM{&K*WzE1+Tx+=7>EzTjlbT)3j&x*X6apmD#9x zd7Jn;j5hhqGfxV4S2yQN3^=;-#tk~8ayLF?fZ1zBeNuPP9qCt%aJ^+1Q?=vD8H+}~ z(Fkof!vyzj)4tV*`a#0n@K)1c2}1|h)6JF9$z@J!b%HDBh^<<9D-;G52Hce$McF z+h%szs_L-&PhKXx9+A(9?XvBUCZ;ozKVT{4xa5GD_o#SbJb{Yp+3sb!UY2#rfGJKosA6YPWozR%JDZc-|eBWFgGpv$}h$ zN&U5g*Gz?j+LZjw6lNfAJO2n#DT1VTX0!L#1TBsLJ2+Ho%NUT=LM!b_nvGT{kHAKP zb(atMqr3^C>gBk`c44lk6;@jMRj=3O)pVt3&|@>fThKi2BT}sNb9axhPO20~ltI0P zZb*T%(tiIDh>PjwTSyB*JDU!lFFBd&MdH})3EM9XQTXkd_vO)2hK|$G+ek$`o0Vbm zRF|ELUcg!NUhQKhwVfEZ{cI)desbwkg4ujimD(&oO5pHQSv=M^jHL_?2mJBu4h$(|bK%U&j4^P-bka`_*>|+;H?9lbI zdflYL)X@A}W%cb=T+DN{+rn)4$)s#*&a`dH%IdGLax(K+Gn70V02cgUHP~B2YBEmX z%M6+}PZXtLe{Kv)=bd5+Y=lUsD*zCrJ+6AYcK7`nx7?&0G0IHX9HQ_&KZ}^vYxqFcIhrL#u|!K2*(@#t&ih~cFCbvm!RE%tH#AaP}q9O+(% z;m`T_jmMPN9th?sMgkGlnIe51eUc%L5wQZFwB3xeFg%#U(>wpgfwpkfognPn*XPZS z`$)HMD}>VuR@W|!`+`AAH=O1Byex>HS6QyJWxU*y=_u2Pfi+6u6Vyn^+6D^e{-P%( z_Dg>Uv|akhM&zcmO1L}RS%UBpiBOfxqG(7ZnTZVMl_D<$&KOU`@Gte}12?xI1YfG{ zTX#a~IIH-OcmQS6nVVXsM#6p6 zhg8ZYXTkV4Zwx~S!(}+bjD<25d)9~Jvb0v(wX%%$GvutMhHWVeh71LMXJPE(i{zD| z8^4UU96}z6pXXk(IcA6zPQmHYOOL~5x!q(?yDeD#jcqj7RPm4pC1el4rc>6hrNOT_ ziQ?ajX1BekuB=WHYfWmD=~4^jpbl$-ZtaV^BQ2Yjh9*ypcwhKddN9k4i#4Cl)57pn zLIOrGhhvc%g*9COgRVJ<3W?e|EdAKXz2YgqPFBVg}yH@#XHPX*PzMqD9M7N*^ zTzSj7-W*l=xJ!S%Y-YjI0To17=@AUMBc5ZxPrW@boJwuO>#T}m$c z11*W3$5OQytS8cdds`o{MQuio+u|%#Cs@pk_?vo_>g8KjLiXRUvNhyiD7b9CAZ;DG z0P^J5_*KeGLT;N7PbdF=*shT)cfnt}ZqdW5 z;d_V^NgNiM<4}O9=@~*)OZ79D@r}QrI=QX&zx;NWoB5`EUDWlmPJKo;*6nt-2 z!r!REKIh_DJW=+rIc@yhA_{XNFyAoMdNkTIV`IG?`hJq{I%7b|&7sOK}6radT>4KPCYwA)pJ%8~Tu5IX}v=Hrfz%lY$IcdLk1 z#!%ecl(PZhCD?#4GJe;V*=Pcg3l1bi4TYGdcHO4j%TQogPKK#s?R9=+R^>L1s;KpU zq=kKTl#&n#1CXZDa=r<2q^IwHf0i;KrIH;JNnaXTy8$L51b0nfp{fzo zi5f0|-weAURo`n=AAV(2g#yCGN-``4`l5G0KX)jGh`A<=reJOa_F8GqXn)pJ!8_#) zQD^k*wTtP9;9+7HLB$y<{ka89zFaZ~i&dq0sgamX7c6 z6U^K90!4k}mz=jsgn!{(!ktER64QxY>cj@M46`58N00v~Vpe^*)_?VAm|ve~R>mPE5`5{wb^@b&m8i3C>S zs>HR~-v>Not4`Dzt#c~|%o%4R3-4dC^QX?QH2mEZ2b@y3zmOsKTK*c7qn%r;se*g3 zJbd%y`_?pbTV}%xbn4&TRt^BuBt?0izaxqj0kxr<2&^eU#L9Lb&{@j}x0?)&DBCxH z>)Hh6{*DA{`_*rqe_vVhh8`1CaRX5-1Tdoj0QfZSa=aemZHX_)SIU4;4&1rH=W;bn z!QF^|!DurP&i0UZueD)lqk58c`vj*2JLXf8)>3v1+6kXvD*n~|LHCV~jgzwD{B4$c zmNFz6sutihehN1F6*+`Dr}m)KVk47T_0OA>1KClW31lOWe`!p`hR2O3gas@oc$vch z_3MTs)A2ztuktYMq?hA4dAE^Ai{D+p-s+!u8g@MQw)}KXm>zV%UAMAPut3Zsf{iav zy>ohX`m?&;_gCo2sOi5~cDPF_tl!bsZ2hS?r(d>iu+f-w*ubUs~%Y(-*f2l?Eq#D{O3 zc6<7bngA)C_#E(Vd;En;x0AlLjt^vIK6E&;TqwEpk;YSg#WR;wOuO#RgSJM`*%Wk#T z!%BzRkC~x&1C#E@3;9IYHsoKAH$h$v-#M4xc+(-L!DPKO0}1MUc8jWJ%`INOiVNCF z)l9*MWQb;pt4ubRyR5I$6SDN(yw&{N-^(TkygAdj?0TmiUjF`2M(Q$2Pt#w&3GL49 z)X*StlG6Wr%HBl|*-M8efF@9Rez~INg+m1=Ii^);7(GucSw*gUU9lDnQR_w8gNI8Ahigw}!pRW*KNEw^0 zzNM%+_K-|u8;$C#I6S_O6$6AdZ~?Fp#_RXJ+VE|P28+@GCpe}Y|3+D>q&k%;(#;@? zcsbS;f~{<;Bn8lp`dAVl_rUEL{1Uxb^e-P`lS3t@dx8 zzhsc~kO-t2mui{8PJI4*ZB3 z?s&52Iz6;m1ZhzCXmH)0&i$lh$n*ia%S~*R*kADgn$~)e*&L{A8r^@tcHFcibeH6T zry?VP)4OAVn$2rNSO^YXNJZrAIG+awA4Bf!!WkIF;@Q;+clKpn=?5Ul!)aZA>s9{kdF2@5L~ag0>07%E$my)Eb3UL{u?Mc=?Xm>zn5o?3Lrwyt#PjwP;oGD{Kbc9 z=lLm*x_!-my-j@f`KUeN+5+1&e!L`KprAMW^ChXFJMro<3a41b!#_7JUb=;LBWpJH z!*_MDWoZ>|U-kI0cEc#EMGm(xs9~|k?7n$w&(54j?gbL{I}I)|{0JguUBF!J#K7*+ zAx5L9IHR<5=*hCteXcZ=qxeafW59PtXhx&*juQ+Yb!%xOpjY7l&(XY$4TRr9E$K2X zrvbO7H}ay<;k^66%lZ1%^se5yhooA_0;mT`jg4nM%myLNLfyxN zv>vvlAa||Q*-O>EQLBvaA*devnl;5rzjNT>UZC4EB8A&kyC#!RbU9iC-#IpZK4esF zb+JvR=HY7QrTYRV$X+?GuD|2R^80+|@b``8BRb#uSB$FjG(2yW)1J-o! znE~0c+i`=B`peGSsb9|bns-?oUu8kr{CSAIbp>L7j%d+>l=);+LCA0awow_iaw~l! z76Q=?14UA?9P7>!9L^c9Zc}!1wJvRb5Gj$ipLO{KDURbssFk-C>DH-p<~p-M|H9X% zSjJMeK}9@`*G)C<3g@2yf20ElWU9Y{7Eiq@zS8=Kzt14qZ=&ptQRyHigG^m-%pcYT?R(4 z>bE_;8pZ$9&ohHX-Qw=PL0-$Js3cX;{;GsXr?y-K6?1#43MPgYe*>N$**Ikl zV_~s6PTX1efjMDK+@bSAL4h$;TM`WW7Vj3KI$R|dkGAtwuer)8H{#;t{`x;)ww-Oq zP6yw`nF5BIwd)bOicFH_6&RP0*g5^QgTKPDL3wTWj=$_&!rdQF;WUmI2izQ{88e#1 zIVQH>x!A|~^<1e{MRt`|uv;8&u*=UGoviGo=Y5qRxOEYJaqLR+678t(dN4G|eEzDq zyxEKAbTLUZGu^&;TG&13>NlQ0M~;jSVHm;x!yeM@`JdGos04(6E0y`<5sl8m_+_~= zfW0Ir>vRG`p&yk*5*>WIi(`u3>QHXu2^z~>n>cgpmgFsPh_G46x-{o+BJ921)auuJ; zBBU!v%ku{o!juK7?F`Ww@uKqvvo#B6sVaH=r=7Ea<}hP#q!!@wu(_(;{fy#NH+iB7FM)wulYupKSa8-#yM!BM$WF|}^~<)nU5ZWr{SB18_4vWOgH$3I zayo!H518^+LM<3p8+E#U&4PQ8Fxt%0_>Z$OowU6i`wcBU-?BJnNXh=!#6Gb1P$a3+aIyIeTWI~RGAP`iCPW@$0H#y6Ol@$??{2&S* z23{^IcrBiCw;e4ktk$IQZU%bmj?MR%YOfs%6J%*#4q}L#>#?|-!ae`(HudWo- z(4J}i#;V{STeYM}oyiQ*9=FIx$7|EIlJGq*3|2pv>vH*D%EOSxGu@!*9Yn+*1;_M& z3!}kTnAk|?40EDp>Vq7`S=rx}H%l4wNVb_EZ|%wlt!~WHn>QJT87^fAIC!XaB1T_Y z_t=Yh=oAdoGCK8{20kt$-_UZ>Yd!H&&!>SRNgSQCBg;6u^1i^=g~LIRjwn2khLeTD zoCtIMux(t2${7_RZ3b5#UP=;tWrEnKP1(A^n24371*734V`~;;d9!V;9{fYnKfe40*N>yVmY! z5AX4D@sr|_rhi7itBI~;mFeku-$icDl+mYJsjIBDx;XMJ6sFs;Ctb=|Ikrx7-;9TP zTY5-lwm2+2h(1~=&DrXh@g?u&-9lDT5)SB5hrTlM)WTyU18U0=7RJWAJc+RPNkKt) z+ZNigAa=DtI6Siwk_I=y{qTsicX3f4s_2n)!|m=+hN`)suGVKyBvj6S=E8 z!xs4hmI_dDC?`eTj%-!y~tRT+Oi z&(a8e^E*|^t>3UfYwFt{?I*=WB#3XET(8M}d{@e}K#KM-Tx}e=)4_1YC*sx#J5O*$ zuo%u{L|H5h&P5t|>CtHLz6)$q2^y|-t$ZFuxfBz?uIdzZNe758n;~D6kjhAA)dZe4VO+}*2sLfBIHKzCxbSfde4NAv6wu{(tP~t(G$gmE zn#!eZ`${2p!vkkA%~%XC@A93Hr}?isXJBfT4I9;>%=B#l5!3h_;!)0^?a0@*`FI(> znm%u6tyHJjQnSR9(&ChH&k@={Rhp|&3v%Gt8Ft0l1InGvd+g-c(8Mft+mh2QTrXAC zYe>zFKIgo313oSx807gq8elOy^E&Pomo)?#R&~buH@fX_vH6bvZq9*%MSqt;3rP)k z65isO4!8C7&*=LoE4hPkKyC04-r>=ctrv+9G@T}=8b#qX;(rK8HAQV1?Rhvpbvgxp zqQIdG5w@=jzAP)on<=$|!D90=^a#+hMiQ@BcDdZD%joxn{;osn9Lae z=j$+g0OY%*HIFs&ED*Im%cU(C#=iZUyAQXHvbyEMuBuYNzHP!(9GTw)-na6pLIX8j z_N5~n!Vdd5`|~C$%QVxD7WwfcjUT7yAbU|P6;NfY8h6sdXj1}6m3jRxF$-HXlY+!2 zlj_4mU~0w#rMspH2vJcei;xDh&v!f;L+c=vb&~4^AuFm`j4-z7)mpKJC7%cxPFb9( zg_2f3k2YFsOFODI16RezIE{qxq>x!EL*Qt>T2D?*CwZe5P`j1{z2`thQv&+LOKvVQ zmL1hIA8l2{3#1dodnBM-0+seQMS;lGpV8)gB%k5jAB@(b6to2yLprXI z^cB0%LrTz#9sANdnFEjE&x&qxrW)W)QiktTwP#DBH|Us-mQindIpt!Z;XM`WGtxJl`B!Sw&xG2fXSmqCzKRp+R$;%g8&uyGJ+h{3d-&5>s;R zkwgxPRpZm5=<34X#vB@v7@^MRZO{oZN3iF))oO@p8)^rN|DiF@m_K%z&zm8JSAMD& zc1LEQ^@;M@f7=wxz77A2)&~uew#Mi~=PU#_kJz~qYg{~RF0=y9r?0wNItj|9mGiPh zS6w@6F3hZKtG_ipnI!fd&PYkY*3oYkECWux27kgJz9VBf&L`@<*kurz!^z1G?`8u~jHRd1khzsSn+!Bg&yV$a+kUfwZdaaJZt~#GaiNP!9|4LB~5enU*3e6&K z_nQ$ooPeaR^sQAmU+{BqrpN&$cDSD;LO)>F6oe^8K2NZU& z4`GVpNn?n#+b{r&6pqJf%1YHD-yHp5+PW{|47T6}Tq3nWwGP?2b|_3WN?EuoTCgT_ zh9dNDe|<&DE!!`&eSfowf_Ws$7oBI)SLnmnCizkhG1h^2i#{- zlcBcgEOp8GuU}Uhvwty(i`Kpg^g;e}r>VI#E@eJ1XWkf!H!w8(B5k&JN@zWcFe&3= zwpPYhViI#Wye9EIJO9s3;F_zD|Cs&a%MNfXgQK%!GaryPg;ysScMs+L!}nz)(|^|D zs9Ucp=Q+!h9fE{D6CO~a?nnk9Y>|4Q?_-Es#FP=Pc6~c|gkeUANbpTTo5qlI2!B`MlE%$e5GUZMjam0}+8o!3F`yze2G=VFQ*s|cqc=AO5D-?-%QP6Xx3^)=jK zxEOd7liv-(q8}39|Hg-ApKVU$O?q&M{!mD-QisvrHZZ}b77r-+kTk^J1fnZg?wmhs zvwIg!P-2awLT|`Z<^VqBIdml^F`tqty z$VlQn1F?#}=xTOa@(ha&OZg^P?_YrsD+`x3Nv^!xjz*H%cu8r|{s8aryMilBLSwiYk7?2t^< zZlEdy(?Q9ie1o`hjeog@Xhq-7?owqK+iCF&o_HJ8$N+88!%ksr`1D*Gd)z#Nvxdz= zmS`g_r_O~Z!MT%Vdeetf*o(_!FTI!JHRnacN9M_OX!_^*&iR7kYA+`Tj*kcUzw9Cp zB8Q`(#XM{ddQqdOHNH07Q0u@K85{Q_`w9n2C=H!cXg2uL1p|=^7+8oHb#eTT%@Ydw z+T@Nl|DE@{*YY3AZI)+ z*bKArMB`0tK#kiyy9e1WCd9X#tCe4`9r`num(}fe_!(}iY}GK%M`wXW4hvu9M$T&Y z1)7F2^J&OU%o~l4%z@3W*Rb?Md}>|0Be)IIMM_H+WRSfGy1mOGuSNa_BuJ*txV7b__wFKDibq7{4qEsiLc!(u29`g$OTRgeRgtFt*V0wTHTix2 z(Om+Q?vw^;DQRg?7)bX*@e1H4%+3P+#_uO;O z?mh8-v(sWP+5P5ZAdpR6xJDL+qKx2jMhfs|@P7fcVJ)g!yjg zg7=&LO|V(763cM?%;LtIWczBirkyrqPmk2G(|G)6ZW*sf&4iJ%eXAgqLi*0Jr5OIv zCa1B{9VwTSUnaBu73rg<1;#2>$ztDWXquQjHHKV$GSpXF5qK_9$Me56i?Vn@(Qnn> zXJEB4B3>Bnjma7lxTxy&`;{bjUQ_NaNyt^?`D2tBo;7uMn~* zaNw0cIW?ej;8*aI>fT93WQSIh~T8P^H}ZwU-%{3|t@Te%$T|1c3>hT2xj< zxIR=CPxt9-N!TyHuQTTMnR(5tyP%H~zJn9>x<&jRKD2|GSM-lRK6n3=*5bQJgq3_F zFtk)9L9!sOUs^PA6x?v}DgP!Qr?mEMyuoAb!gb}_CQS87MR zloPL0n($#LbMXB#KiBJ;EjouzI*QIzUhUvNd#8wO@*e_M+Ec7&fV%6w*7;YP4~6cn zF6)tm8QTcyI zkHW?Fp||fEn9e5#MFdXV-|HI?1L($DKx%D@BL4po!>d{f+7#T$2!II6Ag$ zjeAv}a;Lf2SoKnPhQp?nY+~$=v2}_;rWKPH%P6fi5L^wmDD&f$GIQX6p%N2o3^DSg zNPU5jbY_m3%1O*@qMDj?46KF%MltqBZL18&O}=DmxpW~AceHVg?Yt+KO0JzJi}x)j zt2Yh4b{9P9k!hvI9x5sx#4~jz-673`i3jQ$XsiIKImV-TpeAjLon@WmKUGgBL4_m_VZPMQ{?mi#=N|3XB) z{z&61V}o%%{pTv(ieuyU!P?K@qj4U}Ka3yqVurlG_fbMG`@Fmtzif$?3tH&J2bF0Q zh(R%S;mfntd3mlo2ZH9ZX>s5|-Iw%>Eq5yC)Zrvuk3BG%j$7r`rLzo%rN?C7XJ2m` z_L#FuQNfbWD`dkh6Fb9~Ws?!&=shgbuJWNcRH{^dlhUf|IRU~UURwcfn7+M7W&7RM zIHNUfIc@Z=)UbV4{nvuAuS)M~0SnwnHhrrKB&bBf5LjB!@LKYVD+?pG7}vRYpZnUo zEuvefClP4DN$89?{bLVn1vNdAgSFaHVkh1W@?9l9sF?FfPZ*x3oR?b>sa;saWR;<2 zp0^yrYbVWUX)in=p@HAmBQCbZr!wnS&xMAD*D`5eT|NGp;*hLS{Y{D#WRUr$XS&|! z;b;r42avyBRBaP&^`ygb#Lz6ocsKT!?0rRc#L6^97pV6>Wa8}&bpKU z(KB3*F?Z`W<=VM+Tb8%LCpoI+*?xg%m0kAj7q3i$R)Hefo=VzU z<^w+%VAwiDn52NKQ5zfM4>|t_K7Qg6_wV?w!FC}p-Sx)$KJY&xZu5)+cQ4M?-fP+Z=n<+ggwyKHd!Z zZ05ZXJYt>W0IkPWB&W;@@*DICszHxt{c`RQxs83keKPN(al)KCQen458ue}v?9UZ`-I{Cf`IAQ{;kRjF(>ut~^=FKcIDmU7 z5D!G!2`y<|A;Ep74tJ?oQQL`Kq)v1Hqk)A6bSu-l%EYcO=2uoSc((9KKOyHCH*v-~ z3G6h?W0Q6JVzk)Crr)Q!jI1lwd@@SVxWyt!L4)>KraeKC`#&27? z>>uOaSG#F8X9x90Gqj79dXL`~d-oP?iHgkb62R{0C8x}h`#xUnc`Ik18CJh(Pn;|l zJZuLO!F*?w=*Ro>Fm8P=9~z;O_gPZeQb&iaK^3afw-<{we5-Xd3d5Srd9(u}IUO;ot+;Re>|H7bS9~9-lOQ4#UxW2c zc%TD8+B2%$WYA{*Dvu`T(mTucll5-xOXSy?r4ynhp%#l)4ysR* z;~}Mn3NC-;g^P{!ZP@6$>+q^542qoZP} zyMqOhncb6lK^Yy9RGC&!{Xyz@dL)JR+e82|G`uHQ1;6ss_^~ULgZ`%EFE|gl=}Usy zl%Ayw{B#n=I>vR@?o&Cobk{xR;?|E);KRi1RIZs;&$^bnL17}>w-j> zTbqvWE-RG#w+(GXTXkxKLS^sapEj5%#{%P4!0)YRqLfDU4%N|@g+Rj-mBNL(D|(WB z2&7>ko}I8GI$T6qcKFwaV6*84b3_(|Vh3#_$GaWqH-2_sv(Fz%nT4^J=_1A6sjor! z$V(C!GI7~ah;Z$CyS{&2%;36Iqve8epkaRuQ<%XLldQiuBVWlTB0wB*U$(YLj*mDK zUQw3`+=`6WEl8NmhusdSeq(Cfl?h<1X3=c`x{ODNrWdJS!Ekm-> zQknbc2O0IczeM!j1iDgW3d)b$fS6Q1mtE5UJ}5-gX%6{13tMFCBXS`JhAEX#Q+@ng zZ#C&Vy&D-8>#8SH95CryHdRc$zT~R{`il@o8%tTs<#Nseh7&bG>Y3+>Pdsiu#)VSZ zo(H-N>NPI<`fOON>11~yv;)+ZYiCRk zt{ABDXpJP;V?|+~8rT4vMAsWTM?1l(sha1Qpoc#co$qbOG?f9XGuoAwz^furASR|v zEXkk%jhN)9R29K7(F4~7YsKZuqq&-z)i=&u_+EI52*gSxhDME`GK@tG*x|tM@R>aY z{&T$a)nJ*}2PFVVrPh5jF|-}0?`d~ZC_k}sG0ypPY)tlrFaZY znT2R(txo(TPY!5W<}89$Kr;YlodHuZ;Y7W&92-?-OM81@xuFlF80YNtQ;_TTK<`Lv zl9$LQKkb(fb|U*OCRA5rYi>b-i~~9?N|*U3P5&toZt28C?hgDF?J+c_r5>^#I4h<; zge~M9&WaTqMNz@BZ0ga8YvSUGqOVsBers+;<77ndT$!neQ}0GTsR#1@bUR9sd`9k5 zu;|5GhNLDpk$P^Rni*3qBH8Fdj5>#jsJXyU)it%0<|HppL5~6L9K(H4 z&k~o&RhHC{XbNoC3O;P83Pvschy`^~h^KEOAt{GSOk{po9J!z2B;-ilqml+7FvsFm*OgIGqsgY1v} z@aMQ6-DTsV`#Pe3FWCIJDbD~e+}=gAF{b)R>tC+e@|{ZkHv~6 z^wflvoDSx#6hMW;eu|&Wo@8E*v_Xvvr3sX6$6~YMILsztCF$SG9!fG$bHP-Ao|5V( zYTJC4B5>owA{pN>fWX!o95P(8Qq04_+Hj_~Ao{r9R$^8cEYID{wPsr1o0}&rnd`QP z8$9w*X7q_s3qtib;ewep+W6Ve#T(bV??$?L7mr><4-SngWou{pb-?}{gaKCwOpw;vw3*uEtT+`g&6V4oKvQZl=;Z)NvJ&QW6uG6`$-_1&o}JN0HmXD zif3KNNOb<0Mps)p0;}W=VqwM9Z1sJSwyUv}iG%k&w$9|usClPsgN9<=sG4HHDnOuu zl`Uc6Kyb!H#3mE?JzJDMB1ahjva7uvQp*ZYOPzNMx_ujPLA~WyL4wVVIrJhnoVmOK zC(%$*;Xo5zfIUOx>K~GYZ+=mVt8$6r=L@g=+niPLg^B`(3ltJ^S;Yu`k9mTmdr1`9 z8z{*=73Y0UBc^;P4PU{K5yh+su_oby($sjL3N{&aHoF*YV~54k%$St(Fa3e0&I}{N zo7(%F%$bJ=b5xmN*~tY4B*8DX`#~ioUiw@ucX6$hFB`j|-XTB2vma~zDM{EfE?KJp zFJ4Qzz%@K6tB0urwHuzo+q9`U4C%)5n=D6{{eLlpDl{gi%RWR3~WPfan>94{p`XL$*1&@a1BX7)Vb z{w4iT;LiRFxSufA#MnQq3E^b%n7V(8a`2S$ckGg#gr)m*`~iD(qYR@T&_G&!IuJ=M9~qt@cg?U# zn8B=xNxF?4p};b{!7Sis#R1x0>;i&JV1z_Iz%Q z@WA9f_VPIp;yhS;IuBv`l=e&g?Q$pVC**!y9BE=5rfu>Kgvx8neq|ri@%=rjs68Ev zMbId5_Bn5**?bv#2`SK((@fd{=T+NCr|-v>%}UAEDG`v5p-tLyefn{b=5mPqc|k-Y zOi-MPpO8{t=k(h4i%sU@bXjwalzMKInAWFq4)h)=EWprHWQPzp<>6qpol9gCb}&TO zaze!dkWYZuh`E+cooKx`x+C-7qNVo#L1^+N|X4P<)b>$0MfDl{gXh5Qju&{%qiB_lp!o%2U8$YGDW zRLk1IwfiC9F@ILdEuCMTzDg28Q%%!$@y_dsmXt`HsZ)b)V0F3ihWMA>U(7LRyQ$i2 zv({+l2D~npK#oAm@BU*lG}DS00*BoJd6N;N42M*nHiXqqUOLb?sa2Nj1zgq!PIbcF zhBmu+SCDU)y(TNce#NWx-{j^tR+#P9U7_er`*}xZBkpn^j@I`5*>-4wn%U)f25wfw zL)d3FrWAWa1h8ESzqp&IuuJb60vYI`WP&U_Aj4e^jAEQ@w~d>uQ* z?YFiGXm&h~aA>q!7t3tT5g=gE%KQeiD$8o*5;Ne@_wunlw5DJ6j3n0Jt9@{Zuz$Oe znf|N&N-DSw6?$TT9^-Y^-V-66Kyg*~adHW%B2r6BK7Xf%szm0bcCy!50XZrPuOj`! zVZnX;)P?GmGH$b&dHInReNYCgpidUCR+-o)*95mH0;}%_92V|D6izXPUD__$V1_g^ zo#NV~IQ~Ea-nk1Sp0%0*9FtTUL9_KS%C5il=NB{>Z7z=@H?T{^w)K^YPM`))>>RCu zO3E)1P8-DN)ckmmfSg_D2y{#}P8?aihJ&oa(1CnftZE^ve^c7pHv#upmiT#xubLLO zm-?G=4(k?p_&5r?J!fT`vJr0#quFd(Wdi}6$mon+6gJ*`I||~LY+?jj$58HT z5PM(PRRT29xiE6F zoxRO{%>Nbp^v@fv=GLl+&FS<}S((}g@apAX6PIsPR<05TsU&H_@w_ED*`gI07O#>R z_aFD<9{tTc1}K|IIJgNQ&JC|yX7Z8HcXSs|#Viuwh}SumjP_E&A(Fd0k%^8S<@e}= zV@9GWyCie+l_N3))n1EMfuRgI#7z+_{tsx(?g207{f_HGW7iwLu`@1>XxO_C$Jz)MZqhrZLK4d({*{TX!q73A zp6WRXamak++K-@h%@E|wtE7n!dN%kZ;}s^>Gn*S1J@OgZ*ZfRZGDdgDYGYH4Lmi6U z0rz(F!$>X$Cu)~yKiD{Q?k3w4x@zrUwwynkcM`a?TxYQ7O;z$Iza} z%;R%;3E2wCMLAdY)m7vdhW#K#v%vx^Sl!)`yjQBq?$8ra$ex4CU*UU`$qrM588itC z@gsV^92Y>6%yntcb#a!qVmcdpRmtWkBHwgU{o@^4)`Qv&z47(|C4lTDzI;=jyhd)y zgyzyGiVAW;H!6u35#B^^b5=34IM9bHXMlA6Q$4*-Q&+Xslpj|!`48LD%HOX?onJ8c zZ4$K8LY}9JNAWeb7kY5Ti zjeA5c$BWf+7hPXi_xR_3)qjG(Jk$9?_iMW*p}==JV;k7dzc3JeetW-^zF1|{-u!!q zp7#9j1K*NtgAT@@SRz=B!V$x+1hAnWWXfJ9bP;Tc+E`u8^ltp{$L1r?Trn^3*c@v1 z#TkYnTLfqKeduRkn#oQ+=0^M%svi9wP=-qOU;R-_4avRV2hf`W5S^FtXmWm*@mkOZ zR5%u#V9VE&6gMU^@xn&r?a{^6s6;*B6z*LItFlXMEwD%#d$PCCz9F?2dP@wjef6rE za5lvIDEF)J`>v*wwbHm-#@SjhT5=Lq%AMCZcyP(dw=|+ry7{fZ#mUrCh?Yr{PYtl# z-Vv-(?vl7lR(#BCR}RWNsFj;9ug-LJp;@Yq!)R{=w`jCSw23+r^32iItFlnew8B}* z_TO`q$q3#TwTe~~koZ?Uc>a1@PJb8!5RA@J;z+5>b*%X4|CH-84C}V|!6*Ueqii?o zWVd{?uM-4mpOir8xDXc~{JV<3ncwOlk=ey?trGP!5JSVoNM5KBEm|$k>&j78IZk$0%|kQIV04y(PkD2%{muJFbz1V5QzqZUXwTvh%c!!V(;@B+qrY*Y z_i#bTO7hf1za1(w1+N-)F1&7y5g6yO;^qR1=$jy=%w{A8)ujAl2)F{}6b33g(j!@xenm>csTRua=p4#occoVGXxml^p&Uq>Jm zF?M$<&*I9J-qaNf>ZSD_jWbl@Ga*j>gdchxcUU{1>-8sA+xUI*gYPeC?+?2=II%GR z_s`hUuD-n})|*EsM32>5uAPkMIsq8koQ>KFY2@%TwU31oc7=cW2}|l_PeVu+7|M~B z&r0?LwTNjx6R>V~B-LP4RO#(WbrZBqMG~D6nq<)96hx8s!iAN?+ddJgEbNA5aTcYS z;B362$v&jD<*{1#`wP9BcDA94y)GAYf)8Gch>83#P+)nW`^qR7wCu{Ay}ED{BD<;MI3laa@^d zilE`DdtqZiOhHV$_@&=^^e3?St`V7aD*L5nT{-t@bM|~3juaUM`#NRL!I9L3??)sf zJbP`OA@yP#4(%(T(TP|GpTQ1t@2%uZupMM-m^MrJ9#IMo4MAmtrwc0YKFZw{jsZHw znMjBmGe0uI7S;lFwpS#9^fZ60Uf{9=?57(v3jhEoNyLO(k}W3L&<31&HAEc%Fl%+& zzFPma5BU?4mqKuo^myVb@!8&496V?g6dE-O<}BS*zRIKvFImGIAE z?bsGW+x2d?qVdLY^SbM!>G7axoEBeR-Mcv1H54cnLG$6h46QRqh8DHW66*?+9fds} zcF5O#f+2gNgti8FMH0eivZJeI?c4UdRrgWphEa4mR9$PlcbhbaGC%?^Y-!{lJ@~>t zV>iW9w6hS8Kjqn0T1wIA94J6#ATy`dNcSvlhB4bdmd#}X%OouTqq5F~QMK-D#F}1= zuw~kkrLP-hrpx(hG_3gqHfWfvg!W}?2Y%hJp>hD&!qJo`VA%^pCL902+e)@!78_!I z!b8On%t%r3+A6g6MBjuZy1#!R|98W~UC*e&^C0zjnPhyrex! zZ=)UUPTwT&_8R8E=Agn3HuVBMlPTDVst!%}di3)BTR3!3tYISR)vvjF`7^(fb(yE0 zFAb*^fbFoWvRDuRjmC&Bo=DIWC3qf9_c$z*(@150SsVXqV&+;kx8{;hLiHmg9uN24}`X5ShR^oR?a`Olq`|GM^_+5ZpH|7wd|^FISY23h6^lk>^cjo^(U`I7`HEz z9HjYgJg6uQWK-&Mc2>RD&?&alx9+T4cvU4rx5IO=;3tVdm5%feJ?NzP_FX%&z zmME8>4QBsh1K40=V)8wS+MLZac7Aw-7xckdN0S7jW-st#Jy`^{pg-r>@w^-Ut<8q_ zy+Sd~?WY$YOvCU(sEMxje#t8}rQFKfrezhtR9SO4rK9SP0ug$o>+ zraxH62!!6Hd-njgjqf^>3mI|h_xB48N8XS|sE3P#7a;3$8GWG ztu|-q%ZHH1qlPOuWgR7SXmbZzANUn^c65K^a%lr)ovWr-=_a=2v(KxI3HG;f{;22F zaW#YXN|o>6k~hl+oGmlJKr)e&sq9niD^fj>Nld@EUa9dEwM`lPo0bf;wt^=TekD8> z%v2!+(0kOsNkFM7k@S8LmssyMfGc1OmCewmy}NT=f}X4ZI{zW3Hoc@I-F~O0^=t6) z;j+7%+1dM>V2^%{TeY$vJmAlBEI^o;YVb>$C4s(^Rh3ShprPx?Tf%u}ND*%D@38Me z_QIo?Y}G9V#Rdr2VVX(0aj|s3!ee?^yL?koB1Zeu7c&hkVg~ee+gxolI66(J@CWy| z$iIHR#|p`wduRm{#I@jtzvMfNF4QRKjTx#!G;ZM+Q zq4uf<@$Vq>w^a_lU+1fC#j1ED3s4pIGW%98A~&gpneHW%R6LOmD|~;$i72hpa|+`% zU%5c^odzdIdsBBa>7{&kg>#>~rHz|6s_?;?;#z!oJ<=Q)M1IO?QO{&vp?v2e`Ww!_ zp7{4L0=j1sH%kYFe|doCmU{W;28*aGz`Kw3&MRsh5Rs`!w*E#hVl_I@I={p@IA9wpsZoLvbYK#JRLqgV#}Yg-+$c z94wapR4{Oryw~z>WZk+CS;lY#Tzd0^Y^lx_*XeSYlHxm zz&#xNSf$TH+sGe4E@CUmk}#{#F6n!AjRWfsW7uH4Yg{038vaN)XlJQ|Mlcpm-W%s;v<_W-C~-wI==@z2bHuS7 zMfU?f>^}HnDt<$ZFBngRJ_MolooOYB-i7`v#=cI5c_JsLf(xmRp)huwED7EGjEm7KUJEFfv4%4+9=D-k$U{a>xy5~;-`^Djb z(>02GsYEoF9DsNC$oa!Q0)d>=?1tpL$FRvlcJ!XGSUat>0vwMbPF+oJ!R<>{#_LF; zccVMSz8WSCdBq_BS$GfJM$h~PjhqipkZI}70b1}vo!(Z7*jRx7dOqNtAfZDFoXd&= z;lG#bw}er$sx8^FS*xHxPjH16YVh}3oMq0aIab{ppJU!tFuKyi41gw|z`YIXnX9tWUPfjSQ?f^mmPUt{>7`*7VC#^D3o7gd zsY89|q!OU<#A`-AVgL*TfK@2dvMZr2tc*?s#9v8YfMcn%8#atAp~^vAeZ!~-MC7Jr ztp19nTG||h=7WVUh8>)If3koGeSc~%Kgc{VFpx-6prWk*<~5#vAt6!T5wBqMzfmmF z0FHwp)W3$3RHE+(C|0HUl2so7CxpUB{-8Jx_dEZ2drbPb4468+${-HxOR5wTWK;#ynZob@iGv(>RpN%C^708*A$qHP zsM~Z=q;)ia>G-KR@VEK*fPjD);x{#7f{yMw9hccu6DwURvuI>&g~J2kg9(((2H z*ZqtSx^>`p6sThcnKA`AsRH+;5J>~_9-2^EM1;+(3Cd>-3_iy|ACAL4x^nd5O2-dp z#t7C96n>JY44_h`(9;YF-tV>M$m*Q5!QGIs+!EBiWU^FYw~7LaNqwHCbkiO?^cXQ5X5F}5!QK};VCPv$D*bHXU; zYm}|fZj04n`pyuFwMENk2Qbw7MROI^D#V8j!`9M?XRJJe?*0s6l)r&L%Xo*j@d2x= z@G4YTu69mSA`;7b{-b2bWk;()F4xQJXqNvLq{zJeR*H*|tY9)`&pvRC=^li5j-q;f zG@t_O_Ne6h?`CGjc=jFmme_x7*^Ex|+BU_xY}|0jXcFcY6U9e3N0uol{Wo!n(DPze z**_Q{B|*YB_6!y>VNy&68!^{?u8ZGFt?q+~3Em?D)~iqq&%LrFCmS6?ZYjN;C(k|M z_#UKkI#b*z(~vqoIV=z?p$w&teeQEx_u>P$Lw=xdg@a>t=w$(;;Fob#9hTiyIm(}ZQmH4u4_YXWp!w=WEBb>+nbFnH~#GCXqLTDav}; zk@^LCN_q;Kwo6A1Guktv^QJZ;bo%}PRDNcVz4P%N(VVHx8v2~enaBA&ne}I7xy)PL zTD$^7^{^L&&k65F9e2&Y|7ZFeOgm~aF{v~&IBICqq{KV~5Z$jh#Tgb?;C`A~^ z-25)S2qi`#&i=~;=6a1w+HkPJ1FTBt{MP*U7Mawt(TYB)lu@l(5(2()#d4}#;eh*7)hKjGtw%F9)q=4*(~8@F!-nIL93ZztdS9aNUbAGV%-(;e69 zTm={XZ*Nq12->FO?OCOppSSs=omx89Mp$iX8+>7AC>&SfQuzNJRKcR=1w5-SnIIw% z#ltVt?TFrG1H4I0i8?vB8pRZJ7V9xsdEWmo{$GbC^Y@u#L!q=Z2a(&X% z`Q8FoHT5(Fw%s!bIIouTMY9ITM7U3W)gIl|P(? zzN9#88WHGz(O||J&Gny?Q^yTH2SjjFsc$tlHEFA{-q_;PtfBx;oJQ2fuvXE52+Q*Q7qh&hB}Z6wC#**}?D$5<0zXes=sqHKF02KP*)0sZHb^3;F=cTmEwdUVY#^1$RC^7D$a(!up5rCcAGh<0eAJMln@Gq%`(Y#X6g1A+-~E>X6?0v2 zEEhxTB;aq6H!|~iV>!n2Dnx~BV4JA_xfUJFLAjg-B|&j_w}n90Rnc7aTZhXQp`_dg zxw1M{lzkZRxBaIO)Y~@;FncPnQGS*A7iFDNQ98;|%95d>%DBtn_ z(xV>yzdBJ5SfaVngOk7(C~cu$i}SW&61RKyCW|^Z=D#nwh>I339|;5j#088pU&ZjP Q0jQ6gT-v6+=+WVX4ELKKGC#)e(m<`OAluB~&Tg)SIBze-2_ zay{ypkXubnLL8#Yk#a3UMBh2z)A|1X`1SidKA+F~@_0U};LI4_RGp~^W@SYcG4D}xk4^`??2Cr@-y z?d0SXL3H0^yki6p6q&_mXot{h-Z_?QB)oA}nFHwzeA@a5zMUfN)PTd8Bv< zlMDW?fTeQD96FmvXEA{rili`B3=a*GW%}Lt!(j+@u^Ii+c`2@pQN1y z%E@h6cf~sT#t%&qqdas6^-s$yO)5D)u)xu>9w8rwV*Sf>Z;cV74BsS_RW^_8Ag{JQ zY*~ye8(Fs!3Sf^au(^vF?Fn%gj`q7ZM!y+CD2rlqK34f+**cm!?^h*p_6O%jnye$l zs-t#Y+Sf?pLT-`me9_YH?{t^OniaEw3lZy?g-<2qaO)0u@20#0r-BiQXZYs%!sTzo zaO>)nFJ9x2@ky7iV?hOc&rna&lL%dyYT>94Zx%Z4FG(2JACC$5+P7tA$JMr=wy(C< zXzbG@iJj!D>b!e6D?|syZ%Fx~IiEpV&z-eevRVSn_nM>`HGhRvd%PHMQJ6~9nb!_? zuK}P7zQE@9OH#HE#y1aleMQeV=xocZ?^Mo*Un$Tz0)%HFF6AKdv+b}oQg(-ZgrBwZ zkprg)3WgaYc*ScIihaF0`0H%EUSF z3mq3;X(cGkvm`g4FTsw!jltaDLp4~o8DX1kK~I%LS_bmPmIbY5i^+Dy+6KqW7nTaI z7u?)_-$m1aa(oXjJ^o4|1?+RGPrriiNiiai4;eH$-Ine?QZ79cDrQAZD$_n?nTyW2 zoqzC)`qSlFY3D^LZFUx{dUjuu$_Y$a^l{M}?7Vef|1-;y9-|PYXZcbUy(hIcYCBZ0 zYb{YXKWi;JA1d#OUbRJqKy&FqCTa$mZgv^nRu!x{Bj#PFP7H%Zy4`+Mb$=fHtr>hj@P|4IHj zY|s%b?9{n@Z_8RrrGRs4EI@y+O2k2Qu20hHB4enIVOU#V?-Lnm&KMP6!wWvypL*La zFs$Le^K|oA*x5BTJzai!ZRLoY8$h6Moeoe{rGN0#aqkc!I6a*4zv;BJ^wcMK0yrLreys?Al(#%LN zT(IfU*q@K{eS?E#Rx6mxU)iTAzN*OP9%6K8aNo*fMd5Xpk~p5J*8aT%NS60g@a zENW;NWUJk!vS)^E6XwSSt(V%`=;cE`t`FZ;W;o=Hb$e_|U0F#OYD}!x7u5nZ&731u zsWVp8N87uZDDBZ_&oBak0CD>3a>)$$^}{W#uqjGxY@PS&%&C-HewC#)HHd`O#p!QJ z!^`p0w=ibn(`%?09&bmmj zdt#ke*p{Pbc>c(}r^OD&Qr5?;;QO)NY-azj#}Vw37#O6nYmP54-0$t3dm{Qx-z|Tt z@hu_Er}f^aPoHQD6FuqN>t4lMC+Z`fTs?8Hp3FwnerGNeCK6HGC_qAbeurG)mB;+VoPBJo;B6lqclc%EOCo2#`4daXj) zJtn61%FRPbyR&wyR8nR_PM;S4VYuXH1`2=mH1X~u9&pE>+gwI3fSuLerK{;<@=Uxg zEvCI{XeyQ4{NYRMStZpPVBX6mY%10mhyel!Of&!hFa?9byD=f+Q-xJkRl@=4F8+am zhQ#04jyd(4Ue72gst5+l=;m-_+)PlaRPOSf1ko;dX{4XuS#h$8$U`;0{hWTd(W+gr zO68`mt}X;)2vH2d`JPQUSXfj9HFWyLyr)?KGD^6DENmpydyB4}0H8I5+{*ypc;k0jnD}TGe0RHXdfHeZ|#adaW`h(f#{An z-*|H8vf+m;QfoS0XcW|a0W4JSkK{|^jz(x8r)AEXJ+E0Wj{jKNT&@`Ye8{0o)6oo<|Q#kgl+#RCRSBot}{Jis^UsOQG4)y=( z`R1MEzg(fxIg#?<-g-6eronz@kPBbA2%U&09nww{Guo~t;a&lgquk-%jazZFG^t8; z%uTViIqo-RkyYpex$4HpJ!#O0Ed1j+3yY#;w;pX^l}AV9#Y;5W>Z3u`U{;&seG``@cs2+mf+HQnG zc6N5nU4vWxcaYk>eL)y(zXsK*UJn#`<5;6S8k8v!1*(@Pe);rgKmaDwfa5_%o?CVX zJjqiRE@%1l#_N?Ob@b!)XC|(xHA=0F6Qh$Zk}Ti%JJgz}9#?G2 z|BMi6+xIke6-Alm=(VI;?=zpIV@#mS&->jCigPoBiPNr2kty`9%r#}Z_eOetFYYM` zI9{MtErSOY)iHIk@@1Yhd^14Zn61dC(HBjf?@KHE@wAe{FBX80?TSZ~Y1P3rTop#~ z4ApNaAput|?KDv!zA+xzmC1h*HL9O72mkN-#!qpi5>>U=cz2vrd%EH`&C9<7-o6g) z-^-vvHNUl^N}5YUYgA%uiE4Fbd)rz&OV#FD+)O)DoZ*wsxEzHGtsHdaD1>clk@q=>YFTjvwRN;>6wAg`c-6K^FldT{ys{pzv zl@NTVT0iCfbStM4Y$-1^ZHohWQ9(a%XNs;J8d$+{_H`LeFJs=8pKB i#s18f$!lj6)a1(RjQt*O`3Bp#9l7E>v9~dyXa5DCgA8i` literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/phone.png b/app/src/main/res/drawable-hdpi/phone.png new file mode 100644 index 0000000000000000000000000000000000000000..3c2b0246696835043043638967d23b2aaa635e47 GIT binary patch literal 15787 zcmaKTb9|)Dwr-M%jfrjBwrx%9iIa|PTN9^a+nm_8lSwAVWMbd`_Bs2U`^Vk4f8DRT zYL(Vowbrwqic(RMMuNwK2Ll5`l9iEA1D)?czrV21prg0@$pPqu3y{RAfrtTzqWYB>(*(1C{1tZpo)6A@$#7f$jv! ztN{QgK4xYQ4-X~}b|yy`D`r++UfzFXu(2_MQZTxDIRH#N868~7|1Ckn!qv>h#tC5K z=s@z1L=#g-H-I1+sHXqb1be6d5$oXk-`xc2FlJ8^CuUYAmVcV`?}Unq|No@+_WzUG z6`*GEzxDlp3U<}-aJ+1Qx#@k(*9^NO>Hu}F!6 zdR?SIGx|_Uw!tS0#E}D5%*SK_y9L$b+cp z{SUfdxp~ib8dpO)S(Bs7*Rgz&*QW1^5)kXUOL>lW)Qi=QvwkM39Q?igaO z5ZUiu-_kbk0OeP;b%y2Ib-w8qNeFD3xM)m+8aDVl)Tpq?h;ka^+7=CTj+JcUY4FFQ zLfB&YH4`C~fD8{BR0_tG^1sxYJ1ibAahDvLM6kpp=2)=F_k3QA5YdfRd;Ff;8UDM=wp}$*QE*IbY;{XZs*%y6Ij~$f?DIV(VB8R7o zWs9%ZeahKf_J!5e42tG`yLI^A+}+(}E^l7VxW0Egy5`^RQjO;x^Ygm9P}yv?KRrxQF2zvd5yj9i zU{y<76|v^&TB%$x+==3^tgJklWbP}D!k}LG`+Jg>nmS@(VS$F6JmhS(u8xuocDvq0 zJX=JGO#&6_H6UDLGeaU;QY2;0fueHS&9=yyr*8BZ=tO90Fj|AmgGB+IDS9aA^KjBf zQ&Lj0)aGb}$8L#uf4wXG3s*2&u@V3UWY)k}4{f~?3GqHH$*^81mhD6nCF8c96T!d< zh3;sfXb4WtOOMyWA!Riv!N==hmar%G-;GG!#0GzO+{)inU0R}TN9WseK7D!i0}8&9 zG+TV)4=dwVHVyeen>=1^SB-but}@vl8RO@koXi*59F8TmjvttOi{)k!v&PS!niYH` z5PZF8;_?Doinl;Fkai#-AXGHU$)Zw9R!@NGey9`y$b*tMziM>7i@Jq=-xG4^N7nCb z4P7_#S*GZ%U|QAs)m5?jn!43H=c)&8fugP=T!%^J1CX}*C~eh%$xO;rTGw6I=ri;y zK?<9~>!qf6xZ3VIttiV|*gY$ZVfxEgA-#7R0qa%--gOyGl1{s%F?wNsjBR1OE^?M}u|f}KkUv=NuZ|`bkD{d9!eM1R#Ofzy@iFCJZ4v&PK`(J+3^$bo$Wdmw}MRG zbv-h1@$XCJNnAc6=G|S#`2mI=ouFfH#`1N)O2=bm90SmaLg@WYz4PPc+$|)`JX~UB zNGp!!u)IQztULNmF8Gc>AkrK0LfSyT8JM2g0hGF`Ds`2qItrkty^Lt0F0Z?}=Z>*? zxLB_Yp+Vr3h)EvtnUn~pg1D%=yA2~2Qt#>8HFSn^yIiBSQ(yJX+a>OFw2`HK|Brm!d3G z;S*54cJka3Ds}*kmgaq_U3mCspL!9u>?6zj_`Z+|2~V~3yYZ|12yifb;cv;L^?GAT zYA(hZVshLZ!_CEGJ#lPn>cfKVACbt0LGDc(g63xOxQG@(@N>JufJ>Sh-`PUKe z*DGOFj+t`reKvOE;YY2kELF?gFWq>(|DbVr9i87j6lYX)H>b*_@?n(2t4L``wEQ@kz_J>mZlOa+!tD8!w6&sfbNvP%1~sirCFJcel;x(U4>B4r6RXUDQS^5>ctbW;p5a zHF>5qH2(fNk;8I5HoW9PQ)7O9P`M0z+k4q7mznq0?#y|JWZPy>*q0uahrfCwf*{T( zY|c=-O}j?V!be$kA&pL#@@9PmU+_mq1Q_Ht>7N`4@A*nDcBa9vTHt!7A4YzQul-&f)qZviJS8Z<~Ma2-7x- zEmbOPpK}>^@GUA&@_kc+JHk=5XRq^{#b%(U)u3kf6zE_gI z(|hW-Mthgedgw5pb;$-*9O6j1tlq~Ka!o00v!7I5!$d}=Xk0euvK|bDg}{8HzuDQw zBkD#oAdZZ~CZe!JCeAUU(PS{(hyaT|RLO)y1e`cu_7b7009Ma#9%yeW6nVy>$6-?$ zQ(##TV!v65^t|BPc`)2|K!O9tx~mnfl)_s$SyX4R!lzD$-_=#JdF^ z94a?}P8Bv~3o2iDC)PR%13EpQO^tQsOe+p;$#D3C_aaLvBfOf-v3t^-VM|HaTs-ui zf@&3cLg?-|Bam?9Zg#SsEL5nRvPFa>RLL2ARHGwocf7_0!A{0FN_^XWQk+te3QEB` z20gh}mI4qBb{cUsn}6*P09T~0wE35=B5cltq-%I0jsB9-M&h>;Vb~^hz6|VTXoqo^ z$c1$S5QWTbda9^IUIkBqjl7()*_WIYfY?P(XHjFwriQ2R7v4H%0Kp+r%3C zG+BQ;-H|+W$7mrM3>6lr4kJTjRT_vy30rL#G=H3-oz{GmeAgysO})|PsO;tC#Z}>V zlw4alUsAn78TvrO2RIQKC2&=^z(fdJlC>4}$^0pHf&-S+0AQ$tv*$w2E#jx?piI%+ zM&`qwxn*gvSerQ6zC3&x5jwq3dG897n;V;CMAuU>o2_M+movO7{&Zh>h6mb8UL|5{ z!sa&fwK4V5r0J`ndi8ju0BM6zU-rOO*j5gvlWQm}kZk00%*3pvEG$Y4{W)lME|w^o zvnwd*+B{foR~TO2ZfC1j!?9#@v#44|`?3-B!&uEm5b0=WoLb}mIHh~4q-gWNjJp5^ zlJC_;?$4HEDkgLV)@WtKq+D0fM+w|zMGx(N5IH1`(3V=NThDZ6L{x>&sSd1F>LS9b zO<0cj7pMN+P$@?3gbt1=Rx&W=vr|<~BI-aDLx7}3B=XK-w~BXnhX+btVihlO$HWr` zRvLW!rm*XK8;7cQ!7BQ_A&YE_z;a;p;=&H3T~2cxP6@oj6!pbiXKje$)X#13eiXW! zaufgs^rn}Z6r!;zSzS*?E+g2>1+W}Jfp*3tw`f~kF>4#d?xE`RmE;DBC}Au~g?zww z&_fi6Q=e(*J&cAN^h7&0v6CN_ttm_XqyRZstG|*=Y&3LjflR$mre_N!@?r?-e>R;{UU$#o=?0I6#Wtcv3U+ z9F%p#kv7B4yx@v{%hQh0=uM~CQaH%fOQwsFt9tCX;DCcXhl%3ljg1S-i;U(<28!~qm#W|VpML`e z;HcN)eoiq`b>ydD*Amu8ETV!^TQ8Qz5gj?XmWI;g5+Ioe;8l8_^}yV?M1Z^Dt4b1> znDY(2oqc}rIGepbTsC{&n7-z5LbY+&ttEyd;ufk?+HW+=Ufb^W3WD@sK3`i!r2v~} zlxsy&=S~n4PP&2J-updGbQ!cA_(DCIr9~>*&c8 z)6ZZigyv5ZBR3di!8?`j8_g9QT%>p4>Hb=8E4UwjCz(%U*=Nd^8+2gzB8dG9e6D*k z484A1_FQ}Py%Gw3zTJBJTyC@gCTPn}E^~4SHkzywcBB|yK<2vK`^$aNb?+5QVaE)9fJD!6CphJ`SI9Sehy({ zV{>;iO1y||z~uvvf44>&QFx8G|RC0ca5SgJ@#AA2J7TEOFWP`E!|T~$>V{&*^)!d|il zAlHE!G9=h)zgar_ycdGf{DRD3vk)53^9z>my8HG7R(TC|!^Og<#VLT}{crXdeFr%pV{gj;A(!7{f&aR@C}F?bR%P3<=U%HP zj_)RxYH3+F;CB7j!}LH?%@k!|kDOi7oaMDvNG`$k2wK&k(-MC1$o4cc>)P}aVe73Vwn1_3caI$}Y9s=l#2LZIZ|{y6l9G~lp!wq5zxyWQz* zZrcbgkiSo^Vd>c{`m_O%a&W6TU56wCqC^_x!om%TE9jJMKz1)E{bCVi@kcZza$hsK zyXv}LXxsI#dNlin5A{RPr}YCt6Hm?ObfM&KHsFK(`!C^0r0MUYJaPn}8IZ~)aRORbzopgz&DUK8+kK-^-6cps9Hm8)Lg zAgU6pU9_jGRr^gAr22qux7GFI!7np3jEu_xCPwW0CdzesEpkSa&BvndTeWuS^Ky`{^RjEZQav9a{CtSP7{y8v zR*?Mm=G*h0(f20FKNin_#bb{VV!oC@!@dT3Fa6tluctEEPm`pHfSV3oiutqRCM4|L zoAph^-Y2ArFBr-KNww|2;5!eKSJ#3AIRGw`-we; zwy;Ny1#m+{7?CQFMcnfF+$x32l=FqW7vQfvKAw+lF~BzMMhBC^?VEashle}=^v$E~ z=jafoi%6fW!dYIGJ(Mf7F8JC zP*)a|Oc4I?42{?T1ovNEt<>mC5PIReWpdc4vH7+~0(uP%pA29Po(na zvK_pf*R670^?klyN16qEzV4pOqTnc7rak1i&HzP2pigC36mougsq`Puf5pN~Dl3VVFac+vc?V3ujv$O&{4A8CJCS%W8-9LN6yp?K^$N#Y1Y9Ejzt;3-b5L zigJ8s?}2JHjJK||F1lf1VGn%?0)J)XD;7KV+H-Pp%6(|Ebw5iroaEPgy?q8k;nKq zLVgS-&N`K5jouFz6@B_3K&htdx_478H>GT&VQsFZx#|E(hC?fY6ql5d)Qfd%2$`~s zH}GKn%jaX?r@`h14G%O1YkmF~Nz?yzUuY<@$hi9zgwDmQxK2(?064NRaNw(4AqUS|W3m|O+DP^TS8>gHe%zbKvlj(w zsAL9#76w(6&sbb`sRZ7^_^?%6I+l1zcuIxxKz0NoSIUYzM8=tc;HQ7a`#fG;mf3Im z=3w;vJUF$T34@4>Z^`@(`5r&i3LjsICpKVEDIx{AsaixM5r5Ql3QwJH-iBtpM(_$2 zkO=||Bx0i`ay`?!{9Yg6G&?Xe?bDj26Nu3IOm;yF2NAFnVwA|I`uD>rm2zJ7qwwRF zE7~j2-L#L)b%{4RRdscs57UJF0SY20a@Pb4Ol3FsjLT_RQ+s{$`T5!VH3UVd+$YUv z#8&IG*RKZrjK4xju}@s9Bh7%Bt}UZK??R%M-L4XdGb{OX1cABR_}XkdvQvak9Np{! z7adK63jIPHD`mb&+Lku{&Ds;|8v^=TEW;O)mZWJ&&x1Jbi$F{T=b@GzpKC$T^j>!- zR4ot$q_>8cpjr;1O*~;iP@yh=a%u&aX%4hC`2@j7HZZ9_ZkrD%(q&e-(9-xzGdAsM z=t+si(NID~QQ?$zzxDa|?1U4>IGYmDOVz_X4D!eM3CMmqvo|pT##fDSNUu%6e!kt; z1=MKT+l2%Y%)n_96c4FjhW~V`F?v7Ke$bHp0kMTvU>M0Y$hrS6)lL)qjmHcwAEl0W zDIhdyU^DN>eThUaw%B#ZTvY2b$u{cJ&Cf3=)({XlLci=WC@Cq?UX$!0haiH$AS;bc zp~71dA7Ex7Dq?6@3tW$tUYIW|0T55QvJUaGgZ@V{AoKv7Hj+TR@ry)}i7CtuVS?9z zp3}lUZ$07XZ)=J9uVU1h*o5k&%KVocJ<|uRW8C4v4W_Zg z(&f}L@S4xb@=OINLY^7%!XGqe^G(=2pC5KLLXKPQy0X7aIKD4++>Mc=oShr^-KV_} zQRg@nQeD13?qZ8NO!aAT^-%Hhub?u)ixn~bFpc6XVDiLTf+B>Dh#H}Um_?7%hc!T; z&9y#7oaMOCTbuubC0-)=71yT&ZDxF78B*h0`CMWz?9C9bG?7=TR#Ae`5p3s0^kju( z(@Ha7oQ;weX5M*}*eYLNr9N!LkTo5T+eYbknuT1LLmBLvl22U*lR=@~&E%Z|Z8yde zg4@6!>_B5oYe-99E(pB>hmbp*2{D7cOX&RrDeE9qKHPp}3K^l;{Q)iu2$4b}wbMiy55m0wS~3UTTYic)Ui7O zQ|ubSN`sZf0|xx3nNc2dM$}v4Z95NE{Bnq^5=QIpe~3M2`xjE@`%?YtR2YN9pgQ3*{RNZbye8$xQWO(Jn+1CFmlyf>?MK(R zHXq&OEhlH_kJ1s8U>VQc#ezoSgJl?~xC|pIgg;@@YJf@HJ93*xh~-~7KY8@spxei2bIT*3J12M_cWJEY?V8&nVBoiTxm`m z6)b${FjZZ@lGZJUhPwxvq7O}39Ien65=FX*_w!4>arqn{tl`V=MYqFjQ#Nn@y1x0& z@FPCbgfv!=JQ>0BPe05(Dwd^6KNgg6msl=m(5;AzP(si6v|eZ_trji1crfO5bzzWr zr}}Dbjm^>t`Dr-5^ulF8Z=yrbJK07;Q^p|YbZh@JUSjANrE)<3bL$L+B(K!!%MH%*rQ;p77Kb6MRN(8S_OTkFJ*s3qO{oJ;Od=KqAGa`o zzr^KSYn`B#>G~aW0CSKJ{j%XoKU0s~O1^iwjTO2ekjdoIjKY&OuzU-nc#NzbP@v-Q zg(e#Yld+*<&QVJYC3)41y$bk<7}*0gaukd??OBghO9A14F;I0 zVv(cA*ZVeWJL2n|+C6FPsHx*l||f?4S;gk(9|Iq?>dP8eX(D8^PrB zI65_>pX#n0Ruu+5pJ}iZ86J#Jt0E`XpazX)S+ML^P^^zk*suuxU|t7#g; z%TljB7ZR^8O^xn52FS!lxT`99RV|Xbw^=}N)hJ^PmCD(U?9FKlg>_BvC*Z3 z$*~{~pNnSm+0+0dx*j6LBbpdex+AR1P*IDX43lbGprNI}-($e@M?nfGCBG z2(+}z<%XsLxY{ggJq>jgDdq)3X{IAn0o3g(y^DVH-sF9=@xC10w!B93r1WHlebHMS zf4O0gT}f?3sY&l=zka9TpGvb24uvmE5y$*RPJXH?MqjI^zy)rGFj`yL{ayfmi~_bf zLIfSU63M|bsQX_R7xda26%5_^$j+~MbgVSD)|2d z$cBatY{q(%C0DzhCo1}EUbfAX_MiZLJ_J&t;bW}dJ6-e|>{8T#Z7NNrim3)Y8FX|F z0`^#!OvrIwRu;=ezmi?(7-<()*VH?ucd?1SdoE6=@iwF)5Ad!>u$vzn&ka3Fk}wEvyp={6Omb14CvD;8SIHSN1G{xwp4(-@unDHt4GWEdLg6^re> zji|8G4l?oWtkT%EAJ-ayz-rYZkMi@`qIkkiT21~CcmxkM{|_k({n$YwW)y)!ah{q9{mviQ5Q?{1;1{i*`M1*BX%-lIe`r-2JbkAJi3AN@H&T`j<#N(kWqxY z`?Wu!+xdz(^#wi6S}Em+rCXmtS4@SrA<^ZIro^Y`FQ!f-n=eID1_cO5oMu?qfx6%7 zqrhW%Lr#nW-djEp{*s_0+R9{041}T+$tQRm)1!)wYP8wkEBf@l>qQUC3qlr%xuU`> zSx*Uv=f;|l$k?n^kwBlp1oyXwolRp(czFp{#5K+z`@hk0+Ha`1;a#TneB>F1V?9bzLqrf>g?zJ2 z^o>*zw@d?}WlFYiGDeUvxJSn9>mBL}W8PZnU7eS*jq<&-s1uWuH6V9H9~81})*x@y zYjdbcX?;B3T*U*d0atRAh2tjuc%R?(9eXqnoIyBjtJr(Y>`bk$mKIi0RFgrMyLT4| z)^Z=2#&^KE&Pq#}^*Y}6xVQv4^*p}}Y4UylM)|#sC6Qm=rj4MwZTqEx03H@5UE$Zm z->28b9LTv1nr`u0AcK(Nyo{t354*0HD4y~VY0&cyI45vb+R5HFzN3iJyW zQw$(dxgvAsSg5QzBNvYHDBS%69rcrf1q<)^zuFVNhrx2ltS>4FPWM6+IO2$z$s#xr zv3|oIROTVh^EiBjHVk-o6V!kv$;YXUGV=@qqo5q>zV!6Uz2pHO)cD&NiY3Nx6lp@g zX_mz~gz&jA68U6VzM@g0Py9XHJJyvY zA5UV)|KdRBd-?qdOF`#g46-t3dVyp+O>5E>ta+#+;wEE6V9@v*e+OLPl`}A6Az~qqfA2X3A zRA5~RCIy4MIayuWT`W1uun%!-mfP5W{)_q{dt zOb_ZM9?l`FI0=xAIrV0uKZ!hxN&J2wnJNf9yE%E>ej%-aMZx@; zt({?hkIlLeSp;oDVh^sAji8B*PPhSG=MOF-IO?_+Djo>$VLXRk@aw?v;x1S&!OU40 z6$67&$D5y$EE&6isebo4>xp{-XWut8aYUBKC;cZG@KIci8p274)E$3@I^Ed%t(uNp z=L;9ThCV9X<_`w&Z0ux0WJb@Qz$>v9Nn;qT(9lO;5P<9s7Ks1c(E1ZjUIeea zQ?8!ygCPWC-U(`ihhwBbHI-t49{1sLaTJfox`1;OCqZ!Trzd>?U&-H%O&zejZzI{Z zUyi*t+Z(mJ6maR?_*hMcBFkS*8S;O%@4X^8Dm8%^9Sgf~RZ6CBnK5kA z49lz&Jk6_=?8Pw^y}HhLtq^EfL zxeLvmnq2yM1Eq-rh5i+t07PPPU^iq%7yp*n{1m6@4d&GjZq6#Yt-#Dvb=JOHsabX5 z7Zv*(D@`BOBqB2u8JZCu`WO3K5DDtx{saiIJ}Y-!iw!bijK%$eqbvn(yjW;VORzSf zk`Ht+vz~BIEk}+{AqOL28<0>;;43x!+s^OLt$n$-%ld(&Pw*g=<8)znKvNuTJNw=Uao3 z9_gf(xdBcf8#(lAnN@)V0x=nV)OEoR(!+S)9TA%}4t1ne^~V$#l_A(z{6G*XEJY9= z(r9L5!leug&saSKbZtKz!v4=ebU|!GPhk3%Kv_1ne}p%RIv6rvPC|n_Llilx7%?hO zhJU}WwNcJ0y#*-Dl1hvAik6QgmR&r`f*xLMET8?I12!HRe9-Vm4HP=r5q_o^36NBC zza;z&nVHXYP`AUHdsOc9T>{iA=6J}JxS-#D$ILf;Gyx6;C~Jd4c&MeZyDg;=oA z;ouQ6ggJz>sP&K=dH2`xXT<`uz|@hJq%{y)Jk|4 zdwA+PGsHzC#kyoBmHG|j zjr6c6IDwG@=b()v2G_%Ve%eF;Ir2I*S9cNbAH!BR9=<30`I81aog5=^ZxyJc zwAgQIMFhBC?`)qfmL)7ZiUgbw^1A+VF)Ai1)GPfX>P;9<=DBnoE%9(Iqbw2cG}GaF ze0I59rM)>y=>N3uouB;iAS4Ovqc3|Gy>3Befy( z%eP=M*%`8oZyJh#(Jntn{QY<&Ma-XKp**W|SHr$vY{5k6D(*$Hrd+6$ZU3BM$581z zc$ucFl92)q(_*E}85+8gVyap|iSb5?UCEO+bHE)~ghoW>gr@IL7jva@B>4?kkpdWK z343Cr+3Si)Y$yOMB3dj2s1$l>YjX~v?n*PLOw`Qv=b4ybiU|0nm;5yd_1IKDjI5q*p<{7L#T#t;bcI7#>ZYPvRMr~Z8QF$)vQZapj;N-Tp4KGY=%hK zi2F{3zA=cNHExe#V5o>5LqUA=lJZgSJHRbr`IW*nv85(-Ni_fTV)vw@@b*N0Y?Ai6IhUAa*wS0vGNZX8yY z$_f_vI2eva(G;1kO+x3vxa<(}o9#djG~?pH63U@RPT^?&HBCkZZycCtrGzi*4$4|~ zc-=M4ret(!av2+&r9;=t8WI`<6{=QbsMR_ZivdTdzic^fCuhC=jUm%7t$HI>1eUPL zS;jH{J06G|1pDr~GP> zu#7x3CsPz$%XZ9_TWp(^t#Y|f`pGFXI3caUhw7D_3utK>8Rx!Eh6ecx6af2YhJ!g- z24GF($I2vzUFcjxR@79t+^HjVDArQ>$~bB|s=nPxhzMUq;ZQJ}IQe>uLlCOBQE{tl zjO?M+#LY(4_qOsaWC@w0v!2FeDK!jUwv5h<+sc?w_oOKWLw-aJfvpM?=4`LM*f%FK zpdb@a)S77Wt`j~3eRm3{d4T)CNtrobEiyEIc{BSHS??<%B)ZEryc@`HL+$CxvNj-{ zk8fP^a-4RF?BpQjtAUv>@0HMngDpaaN?*F-hX)GESw3fKhgc8RF8O+# z1Y$W*WwoZB0*!~Q)RLTms&hAiD^ z9PH>AKCap&i!aqN&a-YuroT&Y)DzCvvK3a~lgSEqqs*5U&hmTw+s zJE;-$X(AFw%2prg9SHt!+urzOXAfRNOa{ef1OLaNd0DD|s;gtTVAbNxb7$u;Qpt5Jm~sfxpFvCX1a zGy_g*|5;r<(bP2ZOL+=_3(cN$mkWkuD|DutkK)=u%qoT-1{J-=*|g;HCl@%GBNLLn zxOb5VW}W=rbJo$&^`y*Hg3O5?=>T$!Sy8{v`n-uyB?Ou4|*of2nTxZ`=)ouhVJU(tEC;!L_{=>`fFOeUA znC6>|!Zcjd=Sp*Pt7ng&jLmU-QK(u&{o%hw#hN5}a>W<%qZ#n(pxK&i8@M`%7BBTY z$DEjX5>vcv@vP5!G6@)M9X2JTpblrzQlsk?H<{t(5go_6I)1L%MEkxY*Lp-9_qz^n z_Uzwwpcu%Wl>O9NM&HI^Ta2X27r)z}DFj|NTscQ`(HNC~cp?iZTV`?hg4P6C18`pYy-&n>h?tTnc21Q)m&)c3ZUtthO@>u@nk4teyrRsB}xl1@| zr=_RY6S*7CrIL$tG#n)DjIF+&k7uYDETK4?G}L2^83V7qWgqj`p<|NzArNqkagNVk z+r1@{+Pcy335x|KJ6i`m z*l{~-=~QiA{9Y04`Hl@v2^IZ#m6VYhx<*(|VuYEKA+#AaezO&a$N6`Q?WdS^k+vf! z;_m>v)n%)nC01b?p!XcoU2Lx2RzqUHYajtB_DW;=VoriuU^$)TrKE-cM1tGybhF(? zZ8w3ui%yY~tLi)d%dMgrtX1%J37KEcV=-ECmkxitEY~zgoe&h0js_7LNkC+-(5v+( z>K40oHibh};J)LH)sxM~*6c}yefDojN;IrmLnUGVw%|7q*R8{-eBR#pYAyzrD+xukIcz41+`QUiT`sk#$z zDh6U<-Q<qhjUtYImOSr1mOa&rX5Nn zsZJ^<5byDQ`p>%(@9(egf?;z+Qk`nsO2Y2|d-b0sIm2@Fw&Ab*`yIW;0LCrrOktg zPj?=7WWMQBzY+$LDdnxFey}z>A4qLa7WIqh9UmU5@Z~W5PFpH4z~?)DO9JeSB`p;x z!jvS*Q|NYsG1}amVRGEJte*5#)T!$_vp#Da>*-<^^vKB_Y~Ol(U#%tVdHXxLR3wc; z+Dro3om`<_w$Sc;0H~XF$Cb&=O_Myu%{=>2koRr3+7F-a<>|osPd#v{!@y_a-U_wk z+3lijm~|gWx%`xt?Ezo&B(kq?vo9XpFEU1i2qXCv`}yp<-!jc=cqQX*ISkA5SR}NM zQDf|B0{F(yam>=3kYUkc`YnO{cns%yx$7Nmv{0#gLFRsG_CR+zobeqL@mZ8v9{1){Q-CG>0@|np zST*pNPo-6FKASFvW@BfkRj)db(}VeH^F>s#cj`jnZ%N5Hbhs3}=`WA%c6&bQ#u0dR zuul}1!K3^|F}OcGOqu-H9G;8L*w2!e2->gE8U|k6-TfEDb7;;lz57-q(gHqD-kn00 zLz;8ZXVy!LTEh86=eOta!TH-(M)Otxb5gxqi@BSEkhwm+O2gkQZgh8UZ>KgdIU+2F zU}iP4eYS4GZ?B*rG!Vqa$aZn<$^OI%Wzq_uR9S}teE{b*Z401(Y)4^S=OFMfmIS^A z=#ZHui?As05F>ELMC~)Nw##mEv<;}Kr~KF^(E4gcZkkbZcHeeE@grTFc<+RpeK@(H zUoRN5*^W!!#O9=_&M2L3&aqb+z@O|TkMX*d1@T;Zvosn1$Zu|bNQPP&Ad)GeUPlqEI@gLN>=JFPA$Z7bSXQ>3~hONFp zR{b4m@yuBhQZ~rwS$J~*>(=fH;iwDweCvf}ggZ9&biPS&F8HY^02UK|h7*K)9jN zOtm=*w$B+^d=avxehU0+kG#qI6?e}kg5LP`C|-W5tBV}V=%$Z11z*P6FWKyt#{<_0 zYP|gX*)syS3ij+MxNH)5mYht`K=$PkJ8RXcy14yj*A!TO*WJ1jIDyB zO6+asZb~kElupfjcr_Dz2_9Xow>wnpnKV@GMb0ZxZJB^0M2@B=muw%qylaY*Or(+L zi#LK&_n;S-vV}@bdORUto?Pb<+|-N=Y0y@sRA}8e(B8M(FrzaW&C&_}3PIGLDmpqc zAl4cX3IS^l1XCA`BTMTsEK$A6Dn69UqEqvFss*Qr_!42PPLH@vODfIlvMZ|bKeFCD zd#KB0uO1wjy5SuOiW-MHx}UGag(DMIhDfql5#E3W)8v#*aOB@W5NrIV@?w5XAmn$S zd$`=ZSHW)8E#xWDuwVE!M3#g+~SAv&=qt2xr|y^xh`qg3HS7$&e| zdngD8DI3RWqW-K$)ub+#J%&i^+e#Nvv7nTO=oJCc5B_E3eeX%Hcp|$#L$kt(=Um(>0 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/bg_selecte.xml b/app/src/main/res/drawable/bg_selecte.xml new file mode 100644 index 0000000..7261685 --- /dev/null +++ b/app/src/main/res/drawable/bg_selecte.xml @@ -0,0 +1,17 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bt_disable.xml b/app/src/main/res/drawable/bt_disable.xml index 5d03ac7..f1ed4ec 100644 --- a/app/src/main/res/drawable/bt_disable.xml +++ b/app/src/main/res/drawable/bt_disable.xml @@ -3,11 +3,16 @@ xmlns:android="http://schemas.android.com/apk/res/android"> + android:color="@color/check_activation_color" /> + \ No newline at end of file diff --git a/app/src/main/res/drawable/bt_normnl.xml b/app/src/main/res/drawable/bt_normnl.xml index 4806f8c..5d03ac7 100644 --- a/app/src/main/res/drawable/bt_normnl.xml +++ b/app/src/main/res/drawable/bt_normnl.xml @@ -3,7 +3,7 @@ xmlns:android="http://schemas.android.com/apk/res/android"> + android:color="@color/activation_color" /> + android:color="@color/activation_color" /> + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/edit_background.xml b/app/src/main/res/drawable/edit_background.xml index cff10de..ac96c99 100644 --- a/app/src/main/res/drawable/edit_background.xml +++ b/app/src/main/res/drawable/edit_background.xml @@ -1,14 +1,13 @@ - + - - - + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radio_checked.xml b/app/src/main/res/drawable/radio_checked.xml new file mode 100644 index 0000000..341dbca --- /dev/null +++ b/app/src/main/res/drawable/radio_checked.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radio_textcolor.xml b/app/src/main/res/drawable/radio_textcolor.xml new file mode 100644 index 0000000..0562a7a --- /dev/null +++ b/app/src/main/res/drawable/radio_textcolor.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radio_unchecked.xml b/app/src/main/res/drawable/radio_unchecked.xml new file mode 100644 index 0000000..d1bc6b9 --- /dev/null +++ b/app/src/main/res/drawable/radio_unchecked.xml @@ -0,0 +1,20 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml index ce276d1..22ecff9 100644 --- a/app/src/main/res/layout-land/activity_main.xml +++ b/app/src/main/res/layout-land/activity_main.xml @@ -11,7 +11,7 @@ @@ -33,7 +33,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" - android:text="设备信息" + android:text="教管壹 云管控·AI学习机" android:textColor="#4b4b4b" android:textSize="24sp" android:textStyle="bold" @@ -43,6 +43,28 @@ app:layout_constraintTop_toTopOf="parent" /> + + + + + app:layout_constraintTop_toBottomOf="@+id/tv_guide"> + android:layout_weight="2"> + + + + + + + + + + + + + + + + + + + + + + + - - + app:layout_constraintStart_toStartOf="parent"> + + + android:layout_weight="2"> + android:layout_height="40dp"> @@ -192,7 +301,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="right" - android:textSize="18sp" + android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -200,8 +309,8 @@ + android:layout_height="40dp" + android:layout_marginTop="4dp"> @@ -231,7 +340,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="right" - android:textSize="18sp" + android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -240,8 +349,8 @@ + android:layout_height="40dp" + android:layout_marginTop="4dp"> @@ -271,7 +380,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="right" - android:textSize="18sp" + android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -280,8 +389,8 @@ + android:layout_height="40dp" + android:layout_marginTop="4dp"> @@ -311,7 +420,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="right" - android:textSize="18sp" + android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -320,8 +429,8 @@ + android:layout_height="40dp" + android:layout_marginTop="4dp"> @@ -351,25 +460,93 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="right" - android:textSize="18sp" + android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> - -