From a2b94a97ad37257a031f2f20b7dea738a9425249 Mon Sep 17 00:00:00 2001 From: zhangyuanzhen Date: Fri, 14 Feb 2020 14:33:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DUI=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mogo/module/map/VoiceConstants.java | 2 +- .../navi/cp/AddressContentProvider.java | 10 +- .../mogo/module/navi/dialog/NoticeDialog.java | 91 ++++++++++ .../mogo/module/navi/manager/NaviManager.kt | 16 ++ .../navi/ui/search/SearchPresenter.java | 167 ++++++++++-------- .../navi/ui/setting/SettingAddressFragment.kt | 4 +- .../res/drawable/shape_react_blue_grident.xml | 9 + .../res/drawable/shape_react_gray_grident.xml | 9 + .../main/res/layout/dialog_common_notice.xml | 58 ++++++ .../res/layout/fragment_setting_address.xml | 41 ++++- .../main/res/layout/include_search_bar.xml | 3 +- .../main/res/mipmap-ldpi/icon_navi_home.png | Bin 478 -> 377 bytes .../main/res/mipmap-xhdpi/icon_navi_home.png | Bin 712 -> 531 bytes 13 files changed, 322 insertions(+), 88 deletions(-) create mode 100644 modules/mogo-module-search/src/main/java/com/mogo/module/navi/dialog/NoticeDialog.java create mode 100644 modules/mogo-module-search/src/main/res/drawable/shape_react_blue_grident.xml create mode 100644 modules/mogo-module-search/src/main/res/drawable/shape_react_gray_grident.xml create mode 100644 modules/mogo-module-search/src/main/res/layout/dialog_common_notice.xml diff --git a/modules/mogo-module-map/src/main/java/com/mogo/module/map/VoiceConstants.java b/modules/mogo-module-map/src/main/java/com/mogo/module/map/VoiceConstants.java index eb2a1bc06c..d68f8b471a 100644 --- a/modules/mogo-module-map/src/main/java/com/mogo/module/map/VoiceConstants.java +++ b/modules/mogo-module-map/src/main/java/com/mogo/module/map/VoiceConstants.java @@ -40,7 +40,7 @@ public class VoiceConstants { */ public static final String CMD_MAP_HISTORY = "com.ileja.navi.map.history"; public static final String CMD_MAP_HISTORY_UN_WAKEUP = "CMD_MAP_HISTORY_UN_WAKEUP"; - public static final String[] CMD_MAP_HISTORY_TRIGGER_WORDS = {"导航历史"}; + public static final String[] CMD_MAP_HISTORY_TRIGGER_WORDS = {"查询导航历史记录"}; /** diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/cp/AddressContentProvider.java b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/cp/AddressContentProvider.java index 46b73b54de..4f49273f2c 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/cp/AddressContentProvider.java +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/cp/AddressContentProvider.java @@ -46,17 +46,17 @@ public class AddressContentProvider extends ContentProvider { Log.d( TAG, "query code: " + code ); final SearchPoi poi = getPoi( code ); MatrixCursor - cursor = new MatrixCursor( new String[]{DataConstants.HOME_ADDRESS_NAME, DataConstants.HOME_ADDRESS_LATITUDE, DataConstants.HOME_ADDRESS_LONGITUDE} ); + cursor = new MatrixCursor( new String[]{DataConstants.HOME_ADDRESS_NAME,DataConstants.HOME_ADDRESS, DataConstants.HOME_ADDRESS_LATITUDE, DataConstants.HOME_ADDRESS_LONGITUDE} ); if ( code == DataConstants.HOME_ADDRESS_CODE ) { - cursor = new MatrixCursor( new String[]{DataConstants.HOME_ADDRESS_NAME, DataConstants.HOME_ADDRESS_LATITUDE, DataConstants.HOME_ADDRESS_LONGITUDE} ); + cursor = new MatrixCursor( new String[]{DataConstants.HOME_ADDRESS_NAME,DataConstants.HOME_ADDRESS, DataConstants.HOME_ADDRESS_LATITUDE, DataConstants.HOME_ADDRESS_LONGITUDE} ); } else if ( code == DataConstants.COMPANY_ADDRESS_CODE ) { - cursor = new MatrixCursor( new String[]{DataConstants.COMPANY_ADDRESS_NAME, DataConstants.COMPANY_ADDRESS_LATITUDE, DataConstants.COMPANY_ADDRESS_LONGITUDE} ); + cursor = new MatrixCursor( new String[]{DataConstants.COMPANY_ADDRESS_NAME,DataConstants.COMPANY_ADDRESS, DataConstants.COMPANY_ADDRESS_LATITUDE, DataConstants.COMPANY_ADDRESS_LONGITUDE} ); } if ( cursor != null ) { if ( poi == null ) { - cursor.addRow( new Object[]{"", 0, 0} ); + cursor.addRow( new Object[]{"","", 0, 0} ); } else { - cursor.addRow( new Object[]{poi.getName(), poi.getLat(), poi.getLng()} ); + cursor.addRow( new Object[]{poi.getName(),poi.getAddress(), poi.getLat(), poi.getLng()} ); } } return cursor; diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/dialog/NoticeDialog.java b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/dialog/NoticeDialog.java new file mode 100644 index 0000000000..d1379e06c0 --- /dev/null +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/dialog/NoticeDialog.java @@ -0,0 +1,91 @@ +package com.mogo.module.navi.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.view.View; +import android.widget.TextView; +import androidx.annotation.NonNull; +import com.alibaba.android.arouter.launcher.ARouter; +import com.mogo.module.navi.R; +import com.mogo.service.MogoServicePaths; +import com.mogo.service.map.IMogoMapService; + +/** + * @author lixiaopeng + * @description 通用分享dialog + * @since 2020-01-10 + */ +public class NoticeDialog extends Dialog implements View.OnClickListener { + private final String content; + private final String positive; + private TextView txtOk; + private Context mContext; + private View tvCancel; + private View.OnClickListener onClickListener; + private TextView tvContent; + + public NoticeDialog(@NonNull Context context,String content,String positive) { + super(context, R.style.Theme_AppCompat_Dialog); + this.mContext = context; + + this.content=content; + this.positive=positive; + + getWindow().setBackgroundDrawableResource(android.R.color.transparent); + } + + //public NoticeDialog(@NonNull Context context, int themeResId) { + // super(context, R.style.Theme_AppCompat_Dialog); + //} + + public void setOnClickListener(View.OnClickListener onClickListener) { + this.onClickListener = onClickListener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + initView(); + setContent(content); + setPositiveButton(positive); + initListener(); + } + + private void initView() { + setContentView(R.layout.dialog_common_notice); + txtOk = findViewById(R.id.tv_dialog_ok); + tvCancel = findViewById(R.id.tv_dialog_cancel); + tvContent = findViewById(R.id.tv_dialog_content); + + } + + + private void initListener() { + txtOk.setOnClickListener(this); + tvCancel.setOnClickListener(this); + } + + + @Override + public void onClick(View view) { + int id = view.getId(); + + if (onClickListener != null) { + onClickListener.onClick(view); + } + dismiss(); + } + + public void setContent(String s) { + if (tvContent != null) { + tvContent.setText(s); + } + } + + public void setPositiveButton(String str) { + if (txtOk != null) { + txtOk.setText(str); + } + } +} diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/NaviManager.kt b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/NaviManager.kt index 7f694ebeab..fc28306340 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/NaviManager.kt +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/NaviManager.kt @@ -10,6 +10,9 @@ import com.mogo.module.common.MogoModulePaths import com.mogo.module.navi.constants.SearchServiceHolder import com.mogo.module.navi.ui.search.ChoosePathFragment import com.mogo.utils.logger.Logger +import androidx.core.content.ContextCompat.startActivity + + /** *@author zyz @@ -33,6 +36,8 @@ object NaviManager { val lat = intent.getDoubleExtra("LAT", 0.0) val lon = intent.getDoubleExtra("LON", 0.0) + showHome() + var newInstance = ChoosePathFragment.newInstance( MogoLatLng(lat,lon) @@ -42,9 +47,20 @@ object NaviManager { ) }else if (key_type == 10021) { SearchServiceHolder.getNavi().stopNavi() + }else if (key_type == 20009) { + showHome() + SearchServiceHolder.fragmentManager + .clearAll() } } } + + private fun showHome() { + val intent = Intent(Intent.ACTION_MAIN) + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + intent.addCategory(Intent.CATEGORY_HOME) + context.startActivity(intent) + } } val inputFilter = IntentFilter() inputFilter.addAction(AUTONAVI_STANDARD_BROADCAST_RECV) diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/SearchPresenter.java b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/SearchPresenter.java index bf0a049789..c58e8b30c9 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/SearchPresenter.java +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/search/SearchPresenter.java @@ -3,6 +3,7 @@ package com.mogo.module.navi.ui.search; import android.app.AlertDialog; import android.text.Editable; import android.text.TextUtils; +import android.view.View; import android.widget.EditText; import androidx.annotation.NonNull; import androidx.lifecycle.LifecycleOwner; @@ -19,11 +20,13 @@ import com.mogo.map.search.poisearch.IMogoPoiSearchListener; import com.mogo.map.search.poisearch.MogoPoiResult; import com.mogo.map.search.poisearch.query.MogoPoiSearchQuery; import com.mogo.module.common.TextWatcherAdapter; +import com.mogo.module.navi.R; import com.mogo.module.navi.bean.EntityConvertUtils; import com.mogo.module.navi.bean.SearchPoi; import com.mogo.module.navi.constants.DataConstants; import com.mogo.module.navi.constants.SearchServiceHolder; import com.mogo.module.navi.database.AppDataBase; +import com.mogo.module.navi.dialog.NoticeDialog; import com.mogo.service.MogoServicePaths; import com.mogo.service.map.IMogoMapService; import io.reactivex.Observable; @@ -46,25 +49,25 @@ import java.util.List; *

* 搜搜页逻辑处理 */ -public class SearchPresenter extends Presenter< SearchView > - { - +public class SearchPresenter extends Presenter { private CompositeDisposable mCompositeDisposable; - private IMogoMapService mMapService; + private IMogoMapService mMapService; - public SearchPresenter( SearchView view ) { - super( view ); + public SearchPresenter(SearchView view) { + super(view); mCompositeDisposable = new CompositeDisposable(); } @Override - public void onCreate( @NonNull LifecycleOwner owner ) { - super.onCreate( owner ); - attachSearchBoxTextWatcher( mView.getSearchBox() ); - mMapService = (IMogoMapService) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICES_MAP ).navigation( getContext() ); + public void onCreate(@NonNull LifecycleOwner owner) { + super.onCreate(owner); + attachSearchBoxTextWatcher(mView.getSearchBox()); + mMapService = (IMogoMapService) ARouter.getInstance() + .build(MogoServicePaths.PATH_SERVICES_MAP) + .navigation(getContext()); loadHistories(); - } + } private void loadHistories() { Disposable subscribe = @@ -82,8 +85,8 @@ public class SearchPresenter extends Presenter< SearchView > addDisposable(subscribe); } - private void attachSearchBoxTextWatcher( EditText editText ) { - if ( editText == null ) { + private void attachSearchBoxTextWatcher(EditText editText) { + if (editText == null) { return; } editText.addTextChangedListener(watcherAdapter); @@ -91,14 +94,14 @@ public class SearchPresenter extends Presenter< SearchView > private final TextWatcherAdapter watcherAdapter = new TextWatcherAdapter() { @Override - public void afterTextChanged( Editable s ) { + public void afterTextChanged(Editable s) { // 避免 disable 设置内容时触发 final String input = s.toString(); - startSearchPoiByInput( input ); + startSearchPoiByInput(input); } }; - public void startSearchPoiByInput( String keyword ) { + public void startSearchPoiByInput(String keyword) { MogoInputtipsQuery mogoInputtipsQuery = new MogoInputtipsQuery(); mogoInputtipsQuery.setKeyword(keyword); @@ -111,59 +114,70 @@ public class SearchPresenter extends Presenter< SearchView > inputtipsSearch.setInputtipsListener(new IMogoInputtipsListener() { @Override public void onGetInputtips(List result) { - mView.renderSearchPoiResult(result,false); + mView.renderSearchPoiResult(result, false); } }); inputtipsSearch.requestInputtipsAsyn(); - } + /** * 缓存搜索到的导航地址 - * - * @param tip - * @return */ - public Single cacheSelectPoiItem( MogoTip tip ) { - return Single.create( emitter -> { - SearchPoi poi = EntityConvertUtils.tipToPoi( tip ); + public Single cacheSelectPoiItem(MogoTip tip) { + return Single.create(emitter -> { + SearchPoi poi = EntityConvertUtils.tipToPoi(tip); //ignore insert result - final List output = AppDataBase.getDatabase( getContext() ).poiDao().insert( poi ); - emitter.onSuccess( output ); - } ).subscribeOn( Schedulers.io() ).observeOn( AndroidSchedulers.mainThread() ); + final List output = AppDataBase.getDatabase(getContext()).poiDao().insert(poi); + emitter.onSuccess(output); + }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()); } - public void addDisposable( Disposable disposable ) { - mCompositeDisposable.add( disposable ); + public void addDisposable(Disposable disposable) { + mCompositeDisposable.add(disposable); } public void deleteAllCachedPoi() { - new AlertDialog.Builder( getContext() ) - .setMessage( "清空历史记录?" ) - .setPositiveButton( "立即清空", ( dlg, which ) -> { - dlg.dismiss(); + //new AlertDialog.Builder( getContext() ) + // .setMessage( "清空历史记录?" ) + // .setPositiveButton( "立即清空", ( dlg, which ) -> { + // dlg.dismiss(); + // deleteAllCachedPoiImpl(); + // } ) + // .setNegativeButton( "取消", ( dlg, which ) -> { + // dlg.dismiss(); + // } ) + // .create() + // .show(); + + NoticeDialog noticeDialog = new NoticeDialog(getContext(),"清空历史记录?","立即清空"); + + //noticeDialog.setContent("清空历史记录?"); + //noticeDialog.setPositiveButton("立即清空"); + + noticeDialog.setOnClickListener(new View.OnClickListener() { + @Override public void onClick(View v) { + if (v.getId() == R.id.tv_dialog_ok) { deleteAllCachedPoiImpl(); - } ) - .setNegativeButton( "取消", ( dlg, which ) -> { - dlg.dismiss(); - } ) - .create() - .show(); + } + } + }); + noticeDialog.show(); } private void deleteAllCachedPoiImpl() { - final Disposable disposable = AppDataBase.getDatabase( getContext() ) - .poiDao() - .getAll() - .map( input -> { - return AppDataBase.getDatabase( getContext() ).poiDao().deleteAll( input ); - } ) - .subscribeOn( Schedulers.io() ) - .observeOn( AndroidSchedulers.mainThread() ) - .subscribe( count -> { - mView.showHistory( null ); - } ); - mCompositeDisposable.add( disposable ); + final Disposable disposable = AppDataBase.getDatabase(getContext()) + .poiDao() + .getAll() + .map(input -> { + return AppDataBase.getDatabase(getContext()).poiDao().deleteAll(input); + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(count -> { + mView.showHistory(null); + }); + mCompositeDisposable.add(disposable); } // ///** @@ -197,9 +211,9 @@ public class SearchPresenter extends Presenter< SearchView > // // - private void emitterCommonAddress( SingleEmitter> emitter, SearchPoi poi ) { + private void emitterCommonAddress(SingleEmitter> emitter, SearchPoi poi) { String poiId = null; - switch ( mView.getSearchType() ) { + switch (mView.getSearchType()) { case SearchConstants.SEARCH_TYPE_MULTI_HOME: poiId = DataConstants.POI_ID_HOME; break; @@ -207,20 +221,20 @@ public class SearchPresenter extends Presenter< SearchView > poiId = DataConstants.POI_ID_COMPANY; break; } - if ( TextUtils.isEmpty( poiId ) ) { - emitter.onError( new IllegalArgumentException( "设置类型错误,请重试" ) ); + if (TextUtils.isEmpty(poiId)) { + emitter.onError(new IllegalArgumentException("设置类型错误,请重试")); return; } - if ( poi == null ) { - emitter.onError( new IllegalArgumentException( "位置类型转换错误,请重试" ) ); + if (poi == null) { + emitter.onError(new IllegalArgumentException("位置类型转换错误,请重试")); return; } - poi.setpId( poiId ); - poi.setType( mView.getSearchType() ); + poi.setpId(poiId); + poi.setType(mView.getSearchType()); //ignore insert result - final List output = AppDataBase.getDatabase( getContext() ).poiDao().insert( poi ); + final List output = AppDataBase.getDatabase(getContext()).poiDao().insert(poi); notifyAIAssistCommonAddressChanged(); - emitter.onSuccess( output ); + emitter.onSuccess(output); } private void notifyAIAssistCommonAddressChanged() { @@ -232,12 +246,11 @@ public class SearchPresenter extends Presenter< SearchView > //} } - - public void navi2Positon(){ + public void navi2Positon() { //mMapService.getNavi(getContext()).naviTo(); } - public void insert(SearchPoi searchPoi){ + public void insert(SearchPoi searchPoi) { Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter emitter) throws Exception { AppDataBase.getDatabase(getContext()).poiDao().insert(searchPoi); @@ -245,23 +258,21 @@ public class SearchPresenter extends Presenter< SearchView > }).subscribeOn(Schedulers.io()).subscribe(); } - public void clearHistory(List list){ - Observable.create(new ObservableOnSubscribe() { - @Override public void subscribe(ObservableEmitter emitter) throws Exception { - AppDataBase.getDatabase(getContext()).poiDao().deleteAll(list); - } - }).subscribeOn(Schedulers.io()).subscribe(); - } - - + public void clearHistory(List list) { + Observable.create(new ObservableOnSubscribe() { + @Override public void subscribe(ObservableEmitter emitter) throws Exception { + AppDataBase.getDatabase(getContext()).poiDao().deleteAll(list); + } + }).subscribeOn(Schedulers.io()).subscribe(); + } @Override - public void onDestroy( @NonNull LifecycleOwner owner ) { - super.onDestroy( owner ); - if ( mView.getSearchBox() != null ) { - mView.getSearchBox().removeTextChangedListener( watcherAdapter ); + public void onDestroy(@NonNull LifecycleOwner owner) { + super.onDestroy(owner); + if (mView.getSearchBox() != null) { + mView.getSearchBox().removeTextChangedListener(watcherAdapter); } - if ( mCompositeDisposable != null && !mCompositeDisposable.isDisposed() ) { + if (mCompositeDisposable != null && !mCompositeDisposable.isDisposed()) { mCompositeDisposable.dispose(); mCompositeDisposable = null; } diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/SettingAddressFragment.kt b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/SettingAddressFragment.kt index f37fe4f6e1..cbffb47abd 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/SettingAddressFragment.kt +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/SettingAddressFragment.kt @@ -31,9 +31,9 @@ import com.mogo.utils.UiThreadHandler import io.reactivex.Observable import io.reactivex.ObservableOnSubscribe import io.reactivex.schedulers.Schedulers +import kotlinx.android.synthetic.main.fragment_setting_address.et_navi_search +import kotlinx.android.synthetic.main.fragment_setting_address.iv_navi_back import kotlinx.android.synthetic.main.fragment_setting_address.tv_set_as_home -import kotlinx.android.synthetic.main.include_search_bar.et_navi_search -import kotlinx.android.synthetic.main.include_search_bar.iv_navi_back /** * @author zyz diff --git a/modules/mogo-module-search/src/main/res/drawable/shape_react_blue_grident.xml b/modules/mogo-module-search/src/main/res/drawable/shape_react_blue_grident.xml new file mode 100644 index 0000000000..804e5a8de3 --- /dev/null +++ b/modules/mogo-module-search/src/main/res/drawable/shape_react_blue_grident.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/modules/mogo-module-search/src/main/res/drawable/shape_react_gray_grident.xml b/modules/mogo-module-search/src/main/res/drawable/shape_react_gray_grident.xml new file mode 100644 index 0000000000..377483211d --- /dev/null +++ b/modules/mogo-module-search/src/main/res/drawable/shape_react_gray_grident.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/modules/mogo-module-search/src/main/res/layout/dialog_common_notice.xml b/modules/mogo-module-search/src/main/res/layout/dialog_common_notice.xml new file mode 100644 index 0000000000..ff78f98f77 --- /dev/null +++ b/modules/mogo-module-search/src/main/res/layout/dialog_common_notice.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-search/src/main/res/layout/fragment_setting_address.xml b/modules/mogo-module-search/src/main/res/layout/fragment_setting_address.xml index 6decbd8fe6..2f0419dd2b 100644 --- a/modules/mogo-module-search/src/main/res/layout/fragment_setting_address.xml +++ b/modules/mogo-module-search/src/main/res/layout/fragment_setting_address.xml @@ -9,7 +9,46 @@ android:paddingTop="@dimen/dp_40" > - + + + + + + + Px$Gf6~2R9Fe^RXYm8KoCttf{m33)>dA{!qyX5dLmC@lR`nT^Z<4qKosnRpoQz( zI14ht{RXQUcr3d!@6F_8VY5s^91sV@0dXMQ0j1OsSOF*C1%yO};sdY*^6>7A0g*9q z1=@%;lMmlwiakxT!8!qgz7q94U^9YQd)6kExg4sXeoyMqBp;hc zfhTkslN|EZa5)q>dV0AG579+>fudbT$5!_j;FfBQ204xRA;5b6#ue_&Mh# zJ7ffPBOPWRyS6q^>;Rl6193^jyNC=)DFA> X?My1zrkCrk00000NkvXXu0mjfiYA^2 literal 478 zcmV<40U`d0P)Px$m`OxIR7ef&mA@|pQ4q&>j|c?`A`%p$BK`omL{1b6t>}q_zrkN{6^%+QQ7Ckx zR{0U7D21BjPNBII)@PW#Ja2FJ_N{Xw*_V88=FNP+Gy7&=_B=0N`2_L_=mdfw7z7g? z9S99e;0e^hMn{@UBW;LjtTLYeD-S^70@!J^3W8nyE%2(bBW!P5n^UkKoM?k@<0ZBP zo;7!l9cfE*3Qd9=EiCV~WEUnj3m%knhn==LPJ0T>gGViRi=B!qKyDOVDYt@MjN>N8 z5zc^`7COZaBnn8v=>x~Akyo*sB$8iizE=g=-R#8RRDh-ELgfV_7_$xaqE0ys)d>| zzCc#$%lAe1yeuaUwfCWu#fDFxMf)SopEXW1>TPcArg6M+_4kd~3YXP)Px$%}GQ-RA>e5SV2z1Fc54J*Iu~s0Nz2=UzC1^zJojOC@&~?E=W9~_l6lMuB@oG z9DD5qG%Kx~xa%G7?0VB=wUUSdF(3xSfEW-1Vn7Ut0Wly3nlsS%{RVn~o}g!_rO+S! z(*I_T;I;t%hPDvmY?}p1FzBU4WF7|b>IVrBmZhJ$AKdStkCqJ6-{6=2oe;NfxdMP^ z!U@42ECU<+qJO9#zpbN57 zzd)Y?_FtHPM<>4ii4WMdoo4%X5<`Z~-q}UQeaMHuCS((vZ*c}gne+FRV&mHae;npIjL*Y$wV`!@N1U}+MuXDhSUtcNCCYea69qUM^+v$|K7*~BOgA(a=BG1C zQq+yf`(PBo@W-6@&XN*s{Z^laR}vsU9b|!KBz5wqiVO@b5d&gC42S_SAO`*#1HTGL VS=U_b9%KLj002ovPDHLkV1n*A>v;eG literal 712 zcmV;(0yq7MP)L000001b5ch_0Itp) z=>Px%f=NU{RA>e5m(NR7Q545V4LA9-b*PB_3n?fze?zsf+ywm#;!YGn2npN?~JvYnJHij zm;$DNDPRhi0;Yf|5LSU!t91u#fU&Sl6;)@j0k8v{9pg+@)J_;$1{wjc+=OcVjz1fQ zHF8x3nFb%#aN=I5_y_*o$ZeHN#{i4qObsROCYT4O5+o*rua?UmsTz$x1n0>hvit-~ zjvilj`V-K$OK`>IboEN3{ot|g9{(%2nQokCBA3;Da3f>azwrEkJMHp<%gBrWSZ+XP?byj%cDesq+x}$K@3!Oo*XJ>gZq`of zemcp~`MLezM>o|`lem#QtFzup{NPLMK^y!nZpc&|MOmW_8sq57T$P&*TKN`~+<@(9 z$%0m1u4i^M_SZ{2`C5@3uE*SFuYa25=UB`p(_B9P?E4<%qdK7g0000