From a7fd1b1c1455da12fcfcc7c648fec90341e64de8 Mon Sep 17 00:00:00 2001 From: HYL123698745 <1252347619@qq.com> Date: Sat, 15 May 2021 15:29:26 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=E3=80=90=E4=BF=AE=E6=94=B9=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E3=80=91=EF=BC=9A=E5=88=9D=E6=AC=A1=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 15 + CHANGE_LOG.md | 5 + PROPERTY.md | 138 +- README.md | 158 +- Screenshots/S70413-224859.jpg | Bin 26300 -> 0 bytes Screenshots/S70413-224945.jpg | Bin 40170 -> 0 bytes Screenshots/S70413-225013.jpg | Bin 35703 -> 0 bytes Screenshots/S70413-225055.jpg | Bin 37234 -> 0 bytes Screenshots/S70413-225125.jpg | Bin 33224 -> 0 bytes Screenshots/S70413-225235.jpg | Bin 41942 -> 0 bytes Screenshots/S70417-010650.jpg | Bin 17501 -> 0 bytes Screenshots/S70628-230542.jpg | Bin 48919 -> 0 bytes app/build.gradle | 83 - app/libs/gson-2.2.1.jar | Bin 189617 -> 0 bytes app/libs/picasso-release-2.5.2.4b.aar | Bin 115506 -> 0 bytes app/proguard-rules.pro | 25 - app/src/main/AndroidManifest.xml | 72 - .../quickstart/activity/BaseActivity.java | 79 - ...sable_Left_And_Right_Refresh_Activity.java | 28 - .../quickstart/activity/MainActivity.java | 79 - ...Dynamic_Change_Configuration_Activity.java | 27 - ...d_TabLayout_Switcher_Example_Activity.java | 146 -- ...With_Pull_To_Refresh_Example_Activity.java | 54 - .../With_RecyclerView_Example_Activity.java | 29 - .../quickstart/adapter/BaseViewHolder.java | 24 - .../quickstart/adapter/TextAdapter.java | 110 -- .../quickstart/adapter/TextViewHolder.java | 21 - .../java/com/wordplat/quickstart/app/App.java | 44 - .../wordplat/quickstart/app/AppRuntime.java | 21 - .../quickstart/app/AppRuntimeInitializer.java | 143 -- .../bean/request/ServerRequestParams.java | 107 -- .../bean/response/ServerResponse.java | 24 - .../bean/response/ServerResponseParser.java | 36 - .../quickstart/fragment/BaseFragment.java | 26 - .../quickstart/mvp/BtcChinaApiRequest.java | 46 - .../quickstart/mvp/BtcChinaPresenter.java | 53 - .../quickstart/mvp/StockApiRequest.java | 49 - .../wordplat/quickstart/utils/AppUtils.java | 62 - .../wordplat/quickstart/widget/TabButton.java | 77 - .../widget/pulllistview/ListRefreshView.java | 226 --- .../pulllistview/LoadMoreViewFooter.java | 80 - .../widget/pulllistview/PullListLayout.java | 88 -- app/src/main/res/anim/dialog_enter.xml | 9 - app/src/main/res/anim/dialog_exit.xml | 8 - .../main/res/animator/loading_rotation.xml | 9 - app/src/main/res/drawable-v21/btn_tab.xml | 4 - .../main/res/drawable/bg_ad_image_mark.xml | 16 - app/src/main/res/drawable/bg_tab.xml | 5 - app/src/main/res/drawable/btn_tab.xml | 5 - app/src/main/res/drawable/ic_default.xml | 19 - app/src/main/res/drawable/text_tab.xml | 5 - .../res/drawable/vector_drawable_loading.xml | 17 - .../res/drawable/vector_drawable_loading2.xml | 47 - .../vector_drawable_loading2_anim.xml | 8 - .../drawable/vector_drawable_loading_anim.xml | 8 - .../activity_left_and_right_refresh.xml | 113 -- app/src/main/res/layout/activity_main.xml | 23 - .../res/layout/activity_simple_timeline.xml | 14 - ...y_with_fragment_and_tablayout_switcher.xml | 46 - .../layout/activity_with_pull_to_refresh.xml | 115 -- app/src/main/res/layout/fragment_kline.xml | 112 -- app/src/main/res/layout/item_text.xml | 18 - app/src/main/res/layout/view_list_refresh.xml | 44 - app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3418 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 4208 -> 0 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2206 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 2555 -> 0 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4842 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 6114 -> 0 bytes app/src/main/res/mipmap-xhdpi/image.png | Bin 893590 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7718 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 10056 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 10486 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 14696 -> 0 bytes app/src/main/res/values-v19/styles.xml | 11 - app/src/main/res/values-v21/styles.xml | 10 - app/src/main/res/values/attri.xml | 12 - app/src/main/res/values/colors.xml | 13 - app/src/main/res/values/dimens.xml | 15 - app/src/main/res/values/strings.xml | 3 - app/src/main/res/values/styles.xml | 33 - app/src/main/res/values/warning.xml | 5 - .../wordplat/quickstart/ExampleUnitTest.java | 17 - build.gradle | 39 +- {app => entry}/.gitignore | 0 entry/build.gradle | 30 + entry/proguard-rules.pro | 1 + entry/src/main/config.json | 164 ++ ...isable_Left_And_Right_Refresh_Ability.java | 33 + ...Enable_Left_And_Right_Refresh_Ability.java | 34 + .../MACD_RSI_KDJ_Show_Together_Ability.java | 34 + .../quickstart/ability/MainAbility.java | 34 + .../Simple_TimeLine_Example_Ability.java | 33 + ...nd_TabLayout_Switcher_Example_Ability.java | 34 + .../With_Pull_To_Refresh_Example_Ability.java | 33 + .../With_RecyclerView_Example_Ability.java | 34 + .../quickstart/adapter/TextAdapter.java | 158 ++ .../wordplat/quickstart/app/AppRuntime.java | 49 + .../quickstart/app/DeviceRuntime.java | 18 +- .../wordplat/quickstart/base/BaseAbility.java | 40 + .../quickstart/base/BaseAbilitySlice.java | 49 + .../quickstart/base/MyApplication.java | 33 + .../com/wordplat/quickstart/bean/BtcBean.java | 3 +- .../wordplat/quickstart/bean/KLineBean.java | 3 +- .../wordplat/quickstart/bean/ResultBean.java | 3 +- .../bean/response/IResultResponse.java | 7 +- .../com/wordplat/quickstart/json/JSON.java | 121 ++ .../wordplat/quickstart/json/JSONArray.java | 647 ++++++++ .../quickstart/json/JSONException.java | 53 + .../wordplat/quickstart/json/JSONObject.java | 824 ++++++++++ .../quickstart/json/JSONStringer.java | 419 ++++++ .../wordplat/quickstart/json/JSONTokener.java | 560 +++++++ .../quickstart/mvp/BasePresenter.java | 76 +- .../wordplat/quickstart/mvp/BaseRequest.java | 72 +- .../com/wordplat/quickstart/mvp/BaseView.java | 14 +- .../quickstart/mvp/BaseViewListener.java | 25 +- .../quickstart/mvp/BtcChinaPresenter.java | 31 + .../wordplat/quickstart/mvp/LoadingView.java | 18 +- .../quickstart/mvp/LoadingViewListener.java | 2 +- .../quickstart/mvp/StockPresenter.java | 136 +- .../exception/NetworkTimeOutException.java | 2 +- .../mvp/exception/NoNetworkException.java | 2 +- .../mvp/exception/ResultEmptyException.java | 2 +- .../mvp/exception/ResultFailedException.java | 8 +- .../mvp/exception/ResultParseException.java | 2 +- .../Disable_Left_And_Right_Refresh_Slice.java | 34 + .../Enable_Left_And_Right_Refresh_Slice.java | 339 ++--- .../MACD_RSI_KDJ_Show_Together_Slice.java | 140 +- .../wordplat/quickstart/slice/MainSlice.java | 103 ++ .../slice/Simple_TimeLine_Example_Slice.java | 114 +- ..._And_TabLayout_Switcher_Example_Slice.java | 135 ++ .../With_Pull_To_Refresh_Example_Slice.java | 352 +++++ .../With_RecyclerView_Example_Slice.java | 38 + .../quickstart/slider/PagerProvider.java | 554 ++++--- .../wordplat/quickstart/utils/SSLHelper.java | 37 +- .../wordplat/quickstart/utils/ToastUtil.java | 155 ++ .../quickstart/utils/ToastViewDialog.java | 67 + .../pulllistview/HeadBaseComponent.java | 146 ++ .../pulllistview/HeadDefaultComponent.java | 93 ++ .../PullLayout/pulllistview/IRefresh.java | 61 + .../pulllistview/OnRefreshComponent.java | 6 + .../pulllistview/RefreshComponent.java | 312 ++++ .../wight/navigation/AttrUtils.java | 189 +++ .../wight/navigation/BottomNavigation.java | 1339 +++++++++++++++++ .../navigation/BottomNavigationItem.java | 200 +++ .../wight/navigation/Notification.java | 124 ++ .../quickstart/wight/navigation/ResUtil.java | 591 ++++++++ .../wordplat/quickstart/xutils/DbManager.java | 481 ++++++ .../quickstart/xutils/HttpManager.java | 90 ++ .../quickstart/xutils/ImageManager.java | 82 + .../quickstart/xutils/ViewInjector.java | 32 + .../xutils/cache/DiskCacheEntity.java | 143 ++ .../xutils/cache/DiskCacheFile.java | 66 + .../quickstart/xutils/cache/LruCache.java | 357 +++++ .../quickstart/xutils/cache/LruDiskCache.java | 428 ++++++ .../quickstart/xutils/common/Callback.java | 173 +++ .../xutils/common/TaskController.java | 76 + .../xutils/common/task/AbsTask.java | 252 ++++ .../xutils/common/task/Priority.java | 14 + .../xutils/common/task/PriorityExecutor.java | 116 ++ .../xutils/common/task/PriorityRunnable.java | 29 + .../common/task/TaskControllerImpl.java | 255 ++++ .../xutils/common/task/TaskProxy.java | 304 ++++ .../xutils/common/util/DensityUtil.java | 47 + .../xutils/common/util/DoubleKeyValueMap.java | 210 +++ .../xutils/common/util/FileUtil.java | 171 +++ .../quickstart/xutils/common/util/IOUtil.java | 202 +++ .../xutils/common/util/KeyValue.java | 75 + .../xutils/common/util/LogUtil.java | 244 +++ .../quickstart/xutils/common/util/MD5.java | 92 ++ .../common/util/ParameterizedTypeUtil.java | 102 ++ .../xutils/common/util/ProcessLock.java | 257 ++++ .../xutils/common/util/TextUtils.java | 97 ++ .../xutils/common/util/URLUtil.java | 318 ++++ .../quickstart/xutils/config/DbConfigs.java | 66 + .../quickstart/xutils/db/CursorUtils.java | 67 + .../quickstart/xutils/db/DbManagerImpl.java | 674 +++++++++ .../quickstart/xutils/db/DbModelSelector.java | 340 +++++ .../quickstart/xutils/db/Selector.java | 355 +++++ .../xutils/db/annotation/Column.java | 58 + .../xutils/db/annotation/Table.java | 44 + .../db/converter/BooleanColumnConverter.java | 32 + .../converter/ByteArrayColumnConverter.java | 29 + .../db/converter/ByteColumnConverter.java | 28 + .../db/converter/CharColumnConverter.java | 32 + .../xutils/db/converter/ColumnConverter.java | 38 + .../db/converter/ColumnConverterFactory.java | 128 ++ .../db/converter/DateColumnConverter.java | 34 + .../db/converter/DoubleColumnConverter.java | 29 + .../db/converter/FloatColumnConverter.java | 29 + .../db/converter/IntegerColumnConverter.java | 29 + .../db/converter/LongColumnConverter.java | 29 + .../db/converter/ShortColumnConverter.java | 29 + .../db/converter/SqlDateColumnConverter.java | 32 + .../db/converter/StringColumnConverter.java | 29 + .../xutils/db/sqlite/ColumnDbType.java | 24 + .../quickstart/xutils/db/sqlite/SqlInfo.java | 159 ++ .../xutils/db/sqlite/SqlInfoBuilder.java | 345 +++++ .../xutils/db/sqlite/WhereBuilder.java | 271 ++++ .../xutils/db/table/ColumnEntity.java | 192 +++ .../xutils/db/table/ColumnUtils.java | 220 +++ .../quickstart/xutils/db/table/DbBase.java | 113 ++ .../quickstart/xutils/db/table/DbModel.java | 184 +++ .../xutils/db/table/TableEntity.java | 193 +++ .../xutils/db/table/TableUtils.java | 70 + .../quickstart/xutils/ex/BaseException.java | 66 + .../quickstart/xutils/ex/DbException.java | 59 + .../xutils/ex/FileLockedException.java | 19 + .../quickstart/xutils/ex/HttpException.java | 83 + .../xutils/ex/HttpRedirectException.java | 37 + .../quickstart/xutils/http/BaseParams.java | 606 ++++++++ .../xutils/http/HttpManagerImpl.java | 114 ++ .../quickstart/xutils/http/HttpMethod.java | 70 + .../quickstart/xutils/http/HttpTask.java | 642 ++++++++ .../xutils/http/ProgressHandler.java | 21 + .../quickstart/xutils/http/RequestParams.java | 380 +++++ .../xutils/http/RequestParamsHelper.java | 113 ++ .../xutils/http/RequestTrackerWrapper.java | 90 ++ .../xutils/http/annotation/HttpRequest.java | 68 + .../xutils/http/annotation/HttpResponse.java | 39 + .../xutils/http/app/DefaultParamsBuilder.java | 109 ++ .../http/app/DefaultRedirectHandler.java | 52 + .../xutils/http/app/HttpRetryHandler.java | 80 + .../xutils/http/app/ParamsBuilder.java | 58 + .../xutils/http/app/RedirectHandler.java | 21 + .../http/app/RequestInterceptListener.java | 31 + .../xutils/http/app/RequestTracker.java | 78 + .../xutils/http/app/ResponseParser.java | 22 + .../quickstart/xutils/http/body/FileBody.java | 79 + .../xutils/http/body/InputStreamBody.java | 110 ++ .../xutils/http/body/MultipartBody.java | 274 ++++ .../xutils/http/body/ProgressBody.java | 17 + .../xutils/http/body/RequestBody.java | 40 + .../xutils/http/body/StringBody.java | 54 + .../xutils/http/body/UrlEncodedBody.java | 74 + .../xutils/http/cookie/CookieEntity.java | 128 ++ .../xutils/http/cookie/DbCookieStore.java | 304 ++++ .../xutils/http/loader/BooleanLoader.java | 32 + .../xutils/http/loader/ByteArrayLoader.java | 43 + .../xutils/http/loader/FileLoader.java | 345 +++++ .../xutils/http/loader/InputStreamLoader.java | 36 + .../xutils/http/loader/IntegerLoader.java | 32 + .../xutils/http/loader/JSONArrayLoader.java | 58 + .../xutils/http/loader/JSONObjectLoader.java | 58 + .../quickstart/xutils/http/loader/Loader.java | 98 ++ .../xutils/http/loader/LoaderFactory.java | 67 + .../xutils/http/loader/ObjectLoader.java | 111 ++ .../xutils/http/loader/StringLoader.java | 54 + .../xutils/http/request/AssetsRequest.java | 42 + .../xutils/http/request/HttpRequest.java | 446 ++++++ .../xutils/http/request/LocalFileRequest.java | 141 ++ .../xutils/http/request/ResRequest.java | 184 +++ .../xutils/http/request/UriRequest.java | 228 +++ .../http/request/UriRequestFactory.java | 104 ++ .../xutils/image/ImageAnimationHelper.java | 52 + .../quickstart/xutils/image/ImageDecoder.java | 231 +++ .../quickstart/xutils/image/ImageLoader.java | 580 +++++++ .../xutils/image/ImageManagerImpl.java | 98 ++ .../quickstart/xutils/image/ImageOptions.java | 541 +++++++ .../quickstart/xutils/image/MemCacheKey.java | 49 + .../xutils/image/ReusableBitmapDrawable.java | 21 + .../xutils/image/ReusableDrawable.java | 11 + .../xutils/view/EventListenerManager.java | 162 ++ .../quickstart/xutils/view/ViewFinder.java | 53 + .../quickstart/xutils/view/ViewInfo.java | 37 + .../xutils/view/ViewInjectorImpl.java | 175 +++ .../xutils/view/annotation/ContentView.java | 37 + .../xutils/view/annotation/Event.java | 57 + .../xutils/view/annotation/ViewInject.java | 44 + .../com/wordplat/quickstart/xutils/x.java | 160 ++ .../base/animation/loading_rotation.xml | 8 + .../main/resources/base/element/color.json | 201 +++ .../main/resources/base/element/string.json | 28 + .../base/graphic/background_ability_main.xml | 6 + .../base/graphic/background_change.xml | 6 + .../base/graphic/background_shape.xml | 8 + .../base/graphic/toast_background_shape.xml | 8 + .../base/graphic/vector_drawable_loading2.xml | 47 + .../graphic/vector_drawable_loading2_anim.xml | 8 + .../graphic/vector_drawable_loading_anim.xml | 8 + .../src/main/resources/base/layout/Header.xml | 24 + .../base/layout/head_default_layout.xml | 54 + .../main/resources/base/layout/item_text.xml | 30 + .../layout/slice_left_and_right_refresh.xml | 136 ++ .../slice_macd_rsi_kdj_show_together.xml | 20 +- .../main/resources/base/layout/slice_main.xml | 25 + .../base/layout/slice_simple_timeline.xml | 14 + ...e_with_fragment_and_tablayout_switcher.xml | 42 + .../layout/slice_with_pull_to_refresh.xml | 143 ++ .../resources/base/layout/slider_kline.xml | 137 ++ .../base/layout/toast_dialog_layout.xml | 22 + entry/src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../src/main/resources/base/media/rotate.png | Bin 0 -> 7916 bytes .../main/resources/base/profile}/client.p12 | Bin .../resources/base/profile}/mytruststore.bks | Bin .../src/main/resources/rawfile}/kline1.txt | 0 entry/src/ohosTest/config.json | 41 + .../wordplat/quickstart/ExampleOhosTest.java | 14 + .../com/wordplat/quickstart/ExampleTest.java | 9 + gradle.properties | 15 +- gradle/wrapper/gradle-wrapper.jar | Bin 53636 -> 58694 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- ikvStockChart/build.gradle | 26 +- ikvStockChart/proguard-rules.pro | 26 +- ikvStockChart/src/main/AndroidManifest.xml | 4 - ikvStockChart/src/main/config.json | 27 + .../ikvstockchart/InteractiveKLineLayout.java | 215 +-- .../ikvstockchart/InteractiveKLineView.java | 732 ++++++--- .../wordplat/ikvstockchart/KLineHandler.java | 40 +- .../ikvstockchart/SimpleKLineHandler.java | 30 +- .../ikvstockchart/align/XMarkerAlign.java | 12 +- .../ikvstockchart/align/YLabelAlign.java | 10 +- .../ikvstockchart/align/YMarkerAlign.java | 12 +- .../compat/GestureMoveActionCompat.java | 45 +- .../compat/PerformenceAnalyser.java | 26 +- .../ikvstockchart/compat/ViewUtils.java | 427 +++--- .../detector/GestureDetector.java | 675 +++++++++ .../detector/ScaleGestureDetector.java | 538 +++++++ .../detector/VelocityTracker.java | 215 +++ .../detector/ViewConfiguration.java | 64 + .../ikvstockchart/drawing/BOLLDrawing.java | 53 +- .../ikvstockchart/drawing/CandleDrawing.java | 149 +- .../drawing/EmptyDataDrawing.java | 53 +- .../drawing/HighlightDrawing.java | 51 +- .../ikvstockchart/drawing/IDrawing.java | 8 +- .../ikvstockchart/drawing/KDJDrawing.java | 56 +- .../drawing/KLineGridAxisDrawing.java | 127 +- .../drawing/KLineVolumeDrawing.java | 104 +- .../drawing/KLineVolumeHighlightDrawing.java | 9 +- .../ikvstockchart/drawing/MACDDrawing.java | 51 +- .../ikvstockchart/drawing/MADrawing.java | 52 +- .../ikvstockchart/drawing/RSIDrawing.java | 53 +- .../drawing/StockIndexYLabelDrawing.java | 61 +- .../drawing/TimeLineDrawing.java | 42 +- .../drawing/TimeLineGridAxisDrawing.java | 150 +- .../wordplat/ikvstockchart/entry/Entry.java | 93 +- .../ikvstockchart/entry/EntryAdapter.java | 273 ---- .../ikvstockchart/entry/EntrySet.java | 26 +- .../ikvstockchart/entry/SizeColor.java | 377 +++-- .../ikvstockchart/entry/StockBOLLIndex.java | 10 +- .../ikvstockchart/entry/StockDataTest.java | 24 +- .../ikvstockchart/entry/StockIndex.java | 77 +- .../ikvstockchart/entry/StockKDJIndex.java | 11 +- .../entry/StockKLineVolumeIndex.java | 10 +- .../ikvstockchart/entry/StockMACDIndex.java | 11 +- .../ikvstockchart/entry/StockRSIIndex.java | 11 +- .../ikvstockchart/marker/IMarkerView.java | 13 +- .../marker/XAxisTextMarkerView.java | 63 +- .../marker/YAxisTextMarkerView.java | 59 +- .../ikvstockchart/render/AbstractRender.java | 255 ++-- .../ikvstockchart/render/KLineRender.java | 136 +- .../ikvstockchart/render/TimeLineRender.java | 45 +- .../ikvstockchart/utils/ScreenUtils.java | 145 ++ .../ikvstockchart/utils/StringUtils.java | 36 + .../ikvstockchart/utils/TypedAttrUtils.java | 184 +++ .../src/main/res/drawable/text_tab.xml | 5 - .../src/main/res/layout/tab_stockindex.xml | 33 - ikvStockChart/src/main/res/values/attrs.xml | 157 -- ikvStockChart/src/main/res/values/dimens.xml | 12 - ikvStockChart/src/main/res/values/strings.xml | 20 - ikvStockChart/src/main/res/values/styles.xml | 15 - .../main/resources/base/element/color.json | 190 +++ .../main/resources/base/element/string.json | 48 + .../resources/base/graphic/but_background.xml | 5 + .../resources/base/layout/tab_stockindex.xml | 58 + .../wordplat/ikvstockchart/ExampleTest.java | 9 + .../ikvstockchart/ExampleUnitTest.java | 17 - settings.gradle | 2 +- 368 files changed, 31029 insertions(+), 5489 deletions(-) create mode 100644 .gitignore delete mode 100644 Screenshots/S70413-224859.jpg delete mode 100644 Screenshots/S70413-224945.jpg delete mode 100644 Screenshots/S70413-225013.jpg delete mode 100644 Screenshots/S70413-225055.jpg delete mode 100644 Screenshots/S70413-225125.jpg delete mode 100644 Screenshots/S70413-225235.jpg delete mode 100644 Screenshots/S70417-010650.jpg delete mode 100644 Screenshots/S70628-230542.jpg delete mode 100644 app/build.gradle delete mode 100644 app/libs/gson-2.2.1.jar delete mode 100644 app/libs/picasso-release-2.5.2.4b.aar delete mode 100644 app/proguard-rules.pro delete mode 100644 app/src/main/AndroidManifest.xml delete mode 100644 app/src/main/java/com/wordplat/quickstart/activity/BaseActivity.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/activity/Disable_Left_And_Right_Refresh_Activity.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/activity/MainActivity.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/activity/Multi_Color_Dynamic_Change_Configuration_Activity.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/activity/With_Fragment_And_TabLayout_Switcher_Example_Activity.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/activity/With_Pull_To_Refresh_Example_Activity.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/activity/With_RecyclerView_Example_Activity.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/adapter/BaseViewHolder.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/adapter/TextAdapter.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/adapter/TextViewHolder.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/app/App.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/app/AppRuntime.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/app/AppRuntimeInitializer.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/bean/request/ServerRequestParams.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/bean/response/ServerResponse.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/bean/response/ServerResponseParser.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/fragment/BaseFragment.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/mvp/BtcChinaApiRequest.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/mvp/BtcChinaPresenter.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/mvp/StockApiRequest.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/utils/AppUtils.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/widget/TabButton.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/widget/pulllistview/ListRefreshView.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/widget/pulllistview/LoadMoreViewFooter.java delete mode 100644 app/src/main/java/com/wordplat/quickstart/widget/pulllistview/PullListLayout.java delete mode 100644 app/src/main/res/anim/dialog_enter.xml delete mode 100644 app/src/main/res/anim/dialog_exit.xml delete mode 100644 app/src/main/res/animator/loading_rotation.xml delete mode 100644 app/src/main/res/drawable-v21/btn_tab.xml delete mode 100644 app/src/main/res/drawable/bg_ad_image_mark.xml delete mode 100644 app/src/main/res/drawable/bg_tab.xml delete mode 100644 app/src/main/res/drawable/btn_tab.xml delete mode 100644 app/src/main/res/drawable/ic_default.xml delete mode 100644 app/src/main/res/drawable/text_tab.xml delete mode 100644 app/src/main/res/drawable/vector_drawable_loading.xml delete mode 100644 app/src/main/res/drawable/vector_drawable_loading2.xml delete mode 100644 app/src/main/res/drawable/vector_drawable_loading2_anim.xml delete mode 100644 app/src/main/res/drawable/vector_drawable_loading_anim.xml delete mode 100644 app/src/main/res/layout/activity_left_and_right_refresh.xml delete mode 100644 app/src/main/res/layout/activity_main.xml delete mode 100644 app/src/main/res/layout/activity_simple_timeline.xml delete mode 100644 app/src/main/res/layout/activity_with_fragment_and_tablayout_switcher.xml delete mode 100644 app/src/main/res/layout/activity_with_pull_to_refresh.xml delete mode 100644 app/src/main/res/layout/fragment_kline.xml delete mode 100644 app/src/main/res/layout/item_text.xml delete mode 100644 app/src/main/res/layout/view_list_refresh.xml delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xhdpi/image.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/values-v19/styles.xml delete mode 100644 app/src/main/res/values-v21/styles.xml delete mode 100644 app/src/main/res/values/attri.xml delete mode 100644 app/src/main/res/values/colors.xml delete mode 100644 app/src/main/res/values/dimens.xml delete mode 100644 app/src/main/res/values/strings.xml delete mode 100644 app/src/main/res/values/styles.xml delete mode 100644 app/src/main/res/values/warning.xml delete mode 100644 app/src/test/java/com/wordplat/quickstart/ExampleUnitTest.java rename {app => entry}/.gitignore (100%) create mode 100644 entry/build.gradle create mode 100644 entry/proguard-rules.pro create mode 100644 entry/src/main/config.json create mode 100644 entry/src/main/java/com/wordplat/quickstart/ability/Disable_Left_And_Right_Refresh_Ability.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/ability/Enable_Left_And_Right_Refresh_Ability.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/ability/MACD_RSI_KDJ_Show_Together_Ability.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/ability/MainAbility.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/ability/Simple_TimeLine_Example_Ability.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/ability/With_Fragment_And_TabLayout_Switcher_Example_Ability.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/ability/With_Pull_To_Refresh_Example_Ability.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/ability/With_RecyclerView_Example_Ability.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/adapter/TextAdapter.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/app/AppRuntime.java rename {app => entry}/src/main/java/com/wordplat/quickstart/app/DeviceRuntime.java (45%) create mode 100644 entry/src/main/java/com/wordplat/quickstart/base/BaseAbility.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/base/BaseAbilitySlice.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/base/MyApplication.java rename {app => entry}/src/main/java/com/wordplat/quickstart/bean/BtcBean.java (97%) rename {app => entry}/src/main/java/com/wordplat/quickstart/bean/KLineBean.java (98%) rename {app => entry}/src/main/java/com/wordplat/quickstart/bean/ResultBean.java (96%) rename {app => entry}/src/main/java/com/wordplat/quickstart/bean/response/IResultResponse.java (79%) create mode 100644 entry/src/main/java/com/wordplat/quickstart/json/JSON.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/json/JSONArray.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/json/JSONException.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/json/JSONObject.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/json/JSONStringer.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/json/JSONTokener.java rename {app => entry}/src/main/java/com/wordplat/quickstart/mvp/BasePresenter.java (61%) rename {app => entry}/src/main/java/com/wordplat/quickstart/mvp/BaseRequest.java (85%) rename {app => entry}/src/main/java/com/wordplat/quickstart/mvp/BaseView.java (73%) rename {app => entry}/src/main/java/com/wordplat/quickstart/mvp/BaseViewListener.java (53%) create mode 100644 entry/src/main/java/com/wordplat/quickstart/mvp/BtcChinaPresenter.java rename {app => entry}/src/main/java/com/wordplat/quickstart/mvp/LoadingView.java (54%) rename {app => entry}/src/main/java/com/wordplat/quickstart/mvp/LoadingViewListener.java (94%) rename {app => entry}/src/main/java/com/wordplat/quickstart/mvp/StockPresenter.java (44%) rename {app => entry}/src/main/java/com/wordplat/quickstart/mvp/exception/NetworkTimeOutException.java (90%) rename {app => entry}/src/main/java/com/wordplat/quickstart/mvp/exception/NoNetworkException.java (89%) rename {app => entry}/src/main/java/com/wordplat/quickstart/mvp/exception/ResultEmptyException.java (90%) rename {app => entry}/src/main/java/com/wordplat/quickstart/mvp/exception/ResultFailedException.java (81%) rename {app => entry}/src/main/java/com/wordplat/quickstart/mvp/exception/ResultParseException.java (90%) create mode 100644 entry/src/main/java/com/wordplat/quickstart/slice/Disable_Left_And_Right_Refresh_Slice.java rename app/src/main/java/com/wordplat/quickstart/activity/Enable_Left_And_Right_Refresh_Activity.java => entry/src/main/java/com/wordplat/quickstart/slice/Enable_Left_And_Right_Refresh_Slice.java (40%) rename app/src/main/java/com/wordplat/quickstart/activity/MACD_RSI_KDJ_Show_Together_Activity.java => entry/src/main/java/com/wordplat/quickstart/slice/MACD_RSI_KDJ_Show_Together_Slice.java (49%) create mode 100644 entry/src/main/java/com/wordplat/quickstart/slice/MainSlice.java rename app/src/main/java/com/wordplat/quickstart/activity/Simple_TimeLine_Example_Activity.java => entry/src/main/java/com/wordplat/quickstart/slice/Simple_TimeLine_Example_Slice.java (56%) create mode 100644 entry/src/main/java/com/wordplat/quickstart/slice/With_Fragment_And_TabLayout_Switcher_Example_Slice.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/slice/With_Pull_To_Refresh_Example_Slice.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/slice/With_RecyclerView_Example_Slice.java rename app/src/main/java/com/wordplat/quickstart/fragment/KLineFragment.java => entry/src/main/java/com/wordplat/quickstart/slider/PagerProvider.java (38%) rename {app => entry}/src/main/java/com/wordplat/quickstart/utils/SSLHelper.java (66%) create mode 100644 entry/src/main/java/com/wordplat/quickstart/utils/ToastUtil.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/utils/ToastViewDialog.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/HeadBaseComponent.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/HeadDefaultComponent.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/IRefresh.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/OnRefreshComponent.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/RefreshComponent.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/wight/navigation/AttrUtils.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/wight/navigation/BottomNavigation.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/wight/navigation/BottomNavigationItem.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/wight/navigation/Notification.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/wight/navigation/ResUtil.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/DbManager.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/HttpManager.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/ImageManager.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/ViewInjector.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/cache/DiskCacheEntity.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/cache/DiskCacheFile.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/cache/LruCache.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/cache/LruDiskCache.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/common/Callback.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/common/TaskController.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/common/task/AbsTask.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/common/task/Priority.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/common/task/PriorityExecutor.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/common/task/PriorityRunnable.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/common/task/TaskControllerImpl.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/common/task/TaskProxy.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/common/util/DensityUtil.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/common/util/DoubleKeyValueMap.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/common/util/FileUtil.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/common/util/IOUtil.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/common/util/KeyValue.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/common/util/LogUtil.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/common/util/MD5.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/common/util/ParameterizedTypeUtil.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/common/util/ProcessLock.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/common/util/TextUtils.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/common/util/URLUtil.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/config/DbConfigs.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/CursorUtils.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/DbManagerImpl.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/DbModelSelector.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/Selector.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/annotation/Column.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/annotation/Table.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/BooleanColumnConverter.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ByteArrayColumnConverter.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ByteColumnConverter.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/CharColumnConverter.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ColumnConverter.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ColumnConverterFactory.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/DateColumnConverter.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/DoubleColumnConverter.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/FloatColumnConverter.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/IntegerColumnConverter.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/LongColumnConverter.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ShortColumnConverter.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/SqlDateColumnConverter.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/StringColumnConverter.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/sqlite/ColumnDbType.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/sqlite/SqlInfo.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/sqlite/SqlInfoBuilder.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/sqlite/WhereBuilder.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/table/ColumnEntity.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/table/ColumnUtils.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/table/DbBase.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/table/DbModel.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/table/TableEntity.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/db/table/TableUtils.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/ex/BaseException.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/ex/DbException.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/ex/FileLockedException.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/ex/HttpException.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/ex/HttpRedirectException.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/BaseParams.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/HttpManagerImpl.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/HttpMethod.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/HttpTask.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/ProgressHandler.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/RequestParams.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/RequestParamsHelper.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/RequestTrackerWrapper.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/annotation/HttpRequest.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/annotation/HttpResponse.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/app/DefaultParamsBuilder.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/app/DefaultRedirectHandler.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/app/HttpRetryHandler.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/app/ParamsBuilder.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/app/RedirectHandler.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/app/RequestInterceptListener.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/app/RequestTracker.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/app/ResponseParser.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/body/FileBody.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/body/InputStreamBody.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/body/MultipartBody.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/body/ProgressBody.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/body/RequestBody.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/body/StringBody.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/body/UrlEncodedBody.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/cookie/CookieEntity.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/cookie/DbCookieStore.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/BooleanLoader.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/ByteArrayLoader.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/FileLoader.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/InputStreamLoader.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/IntegerLoader.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/JSONArrayLoader.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/JSONObjectLoader.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/Loader.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/LoaderFactory.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/ObjectLoader.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/StringLoader.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/request/AssetsRequest.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/request/HttpRequest.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/request/LocalFileRequest.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/request/ResRequest.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/request/UriRequest.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/http/request/UriRequestFactory.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageAnimationHelper.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageDecoder.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageLoader.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageManagerImpl.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageOptions.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/image/MemCacheKey.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/image/ReusableBitmapDrawable.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/image/ReusableDrawable.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/view/EventListenerManager.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/view/ViewFinder.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/view/ViewInfo.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/view/ViewInjectorImpl.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/view/annotation/ContentView.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/view/annotation/Event.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/view/annotation/ViewInject.java create mode 100644 entry/src/main/java/com/wordplat/quickstart/xutils/x.java create mode 100644 entry/src/main/resources/base/animation/loading_rotation.xml create mode 100644 entry/src/main/resources/base/element/color.json create mode 100644 entry/src/main/resources/base/element/string.json create mode 100644 entry/src/main/resources/base/graphic/background_ability_main.xml create mode 100644 entry/src/main/resources/base/graphic/background_change.xml create mode 100644 entry/src/main/resources/base/graphic/background_shape.xml create mode 100644 entry/src/main/resources/base/graphic/toast_background_shape.xml create mode 100644 entry/src/main/resources/base/graphic/vector_drawable_loading2.xml create mode 100644 entry/src/main/resources/base/graphic/vector_drawable_loading2_anim.xml create mode 100644 entry/src/main/resources/base/graphic/vector_drawable_loading_anim.xml create mode 100644 entry/src/main/resources/base/layout/Header.xml create mode 100644 entry/src/main/resources/base/layout/head_default_layout.xml create mode 100644 entry/src/main/resources/base/layout/item_text.xml create mode 100644 entry/src/main/resources/base/layout/slice_left_and_right_refresh.xml rename app/src/main/res/layout/activity_macd_rsi_kdj_show_together.xml => entry/src/main/resources/base/layout/slice_macd_rsi_kdj_show_together.xml (37%) create mode 100644 entry/src/main/resources/base/layout/slice_main.xml create mode 100644 entry/src/main/resources/base/layout/slice_simple_timeline.xml create mode 100644 entry/src/main/resources/base/layout/slice_with_fragment_and_tablayout_switcher.xml create mode 100644 entry/src/main/resources/base/layout/slice_with_pull_to_refresh.xml create mode 100644 entry/src/main/resources/base/layout/slider_kline.xml create mode 100644 entry/src/main/resources/base/layout/toast_dialog_layout.xml create mode 100644 entry/src/main/resources/base/media/icon.png create mode 100644 entry/src/main/resources/base/media/rotate.png rename {app/src/main/res/raw => entry/src/main/resources/base/profile}/client.p12 (100%) rename {app/src/main/res/raw => entry/src/main/resources/base/profile}/mytruststore.bks (100%) rename {app/src/main/assets => entry/src/main/resources/rawfile}/kline1.txt (100%) create mode 100644 entry/src/ohosTest/config.json create mode 100644 entry/src/ohosTest/java/com/wordplat/quickstart/ExampleOhosTest.java create mode 100644 entry/src/test/java/com/wordplat/quickstart/ExampleTest.java delete mode 100644 ikvStockChart/src/main/AndroidManifest.xml create mode 100644 ikvStockChart/src/main/config.json create mode 100644 ikvStockChart/src/main/java/com/wordplat/ikvstockchart/detector/GestureDetector.java create mode 100644 ikvStockChart/src/main/java/com/wordplat/ikvstockchart/detector/ScaleGestureDetector.java create mode 100644 ikvStockChart/src/main/java/com/wordplat/ikvstockchart/detector/VelocityTracker.java create mode 100644 ikvStockChart/src/main/java/com/wordplat/ikvstockchart/detector/ViewConfiguration.java delete mode 100644 ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/EntryAdapter.java create mode 100644 ikvStockChart/src/main/java/com/wordplat/ikvstockchart/utils/ScreenUtils.java create mode 100644 ikvStockChart/src/main/java/com/wordplat/ikvstockchart/utils/StringUtils.java create mode 100644 ikvStockChart/src/main/java/com/wordplat/ikvstockchart/utils/TypedAttrUtils.java delete mode 100644 ikvStockChart/src/main/res/drawable/text_tab.xml delete mode 100644 ikvStockChart/src/main/res/layout/tab_stockindex.xml delete mode 100644 ikvStockChart/src/main/res/values/attrs.xml delete mode 100644 ikvStockChart/src/main/res/values/dimens.xml delete mode 100644 ikvStockChart/src/main/res/values/strings.xml delete mode 100644 ikvStockChart/src/main/res/values/styles.xml create mode 100644 ikvStockChart/src/main/resources/base/element/color.json create mode 100644 ikvStockChart/src/main/resources/base/element/string.json create mode 100644 ikvStockChart/src/main/resources/base/graphic/but_background.xml create mode 100644 ikvStockChart/src/main/resources/base/layout/tab_stockindex.xml create mode 100644 ikvStockChart/src/test/java/com/wordplat/ikvstockchart/ExampleTest.java delete mode 100644 ikvStockChart/src/test/java/com/wordplat/ikvstockchart/ExampleUnitTest.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..37a4eb8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +/entry/.preview +.cxx diff --git a/CHANGE_LOG.md b/CHANGE_LOG.md index 95087f0..363a168 100644 --- a/CHANGE_LOG.md +++ b/CHANGE_LOG.md @@ -1,3 +1,8 @@ +## 0.0.1-SNAPSHOT +> 2021/5/12 + +* refactor: For module library Android-to-OpenHarmony + ### 0.1.5 > 2017.06.28 diff --git a/PROPERTY.md b/PROPERTY.md index 534b959..a2d0249 100644 --- a/PROPERTY.md +++ b/PROPERTY.md @@ -2,16 +2,16 @@ | XML | Java Code | Comment | Since | | -------------------- | ------------------- | --------------------------- | ----- | -| app:xLabelSize | setXLabelSize | X 轴标签字符大小 | 0.1.0 | -| app:xLabelColor | setXLabelColor | X 轴标签字符颜色 | 0.1.0 | -| app:xLabelViewHeight | setXLabelViewHeight | X 轴 Label 区域的高度 | 0.1.0 | -| app:yLabelSize | setYLabelSize | Y 轴标签字符大小 | 0.1.0 | -| app:yLabelColor | setYLabelColor | Y 轴标签字符颜色 | 0.1.0 | -| app:yLabelAlign | setYLabelAlign | Y 轴标签对齐方向 1: left, 2: right | 0.1.2 | -| app:axisSize | setAxisSize | 轴线条大小 | 0.1.0 | -| app:axisColor | setAxisColor | 轴线条颜色 | 0.1.0 | -| app:gridSize | setGridSize | 网格线大小 | 0.1.0 | -| app:gridColor | setGridColor | 网格线颜色 | 0.1.0 | +| ohos:xLabelSize | setXLabelSize | X 轴标签字符大小 | 0.1.0 | +| ohos:xLabelColor | setXLabelColor | X 轴标签字符颜色 | 0.1.0 | +| ohos:xLabelViewHeight | setXLabelViewHeight | X 轴 Label 区域的高度 | 0.1.0 | +| ohos:yLabelSize | setYLabelSize | Y 轴标签字符大小 | 0.1.0 | +| ohos:yLabelColor | setYLabelColor | Y 轴标签字符颜色 | 0.1.0 | +| ohos:yLabelAlign | setYLabelAlign | Y 轴标签对齐方向 1: left, 2: right | 0.1.2 | +| ohos:axisSize | setAxisSize | 轴线条大小 | 0.1.0 | +| ohos:axisColor | setAxisColor | 轴线条颜色 | 0.1.0 | +| ohos:gridSize | setGridSize | 网格线大小 | 0.1.0 | +| ohos:gridColor | setGridColor | 网格线颜色 | 0.1.0 | @@ -19,14 +19,14 @@ | XML | Java Code | Comment | Since | | --------------------- | -------------------- | ------------------- | ----- | -| app:highlightSize | setHighlightSize | 高亮线条大小 | 0.1.0 | -| app:highlightColor | setHighlightColor | 高亮线条颜色 | 0.1.0 | -| app:markerBorderSize | setMarkerBorderSize | MarkerView 边框大小 | 0.1.0 | -| app:markerBorderColor | setMarkerBorderColor | MarkerView 边框颜色 | 0.1.0 | -| app:markerTextSize | setMarkerTextSize | MarkerView 字符大小 | 0.1.0 | -| app:markerTextColor | setMarkerTextColor | MarkerView 字符颜色 | 0.1.0 | -| app:xMarkerAlign | setXMarkerAlign | X 轴 MarkerView 对齐方向 | 0.1.3 | -| app:yMarkerAlign | setYMarkerAlign | Y 轴 MarkerView 对齐方向 | 0.1.3 | +| ohos:highlightSize | setHighlightSize | 高亮线条大小 | 0.1.0 | +| ohos:highlightColor | setHighlightColor | 高亮线条颜色 | 0.1.0 | +| ohos:markerBorderSize | setMarkerBorderSize | MarkerView 边框大小 | 0.1.0 | +| ohos:markerBorderColor | setMarkerBorderColor | MarkerView 边框颜色 | 0.1.0 | +| ohos:markerTextSize | setMarkerTextSize | MarkerView 字符大小 | 0.1.0 | +| ohos:markerTextColor | setMarkerTextColor | MarkerView 字符颜色 | 0.1.0 | +| ohos:xMarkerAlign | setXMarkerAlign | X 轴 MarkerView 对齐方向 | 0.1.3 | +| ohos:yMarkerAlign | setYMarkerAlign | Y 轴 MarkerView 对齐方向 | 0.1.3 | @@ -34,9 +34,9 @@ | XML | Java Code | Comment | Since | | -------------------- | ------------------- | ---------------------------------------- | ----- | -| app:timeLineSize | setTimeLineSize | 分时线大小 | 0.1.0 | -| app:timeLineColor | setTimeLineColor | 分时线颜色 | 0.1.0 | -| app:timeLineMaxCount | setTimeLineMaxCount | 分时图 entry 最多个数。注:此值与 entrySet 里的 entries.size() 意义不同,这里指 X 轴上最多能容纳多少个 entry | 0.1.4 | +| ohos:timeLineSize | setTimeLineSize | 分时线大小 | 0.1.0 | +| ohos:timeLineColor | setTimeLineColor | 分时线颜色 | 0.1.0 | +| ohos:timeLineMaxCount | setTimeLineMaxCount | 分时图 entry 最多个数。注:此值与 entrySet 里的 entries.size() 意义不同,这里指 X 轴上最多能容纳多少个 entry | 0.1.4 | @@ -44,18 +44,18 @@ | XML | Java Code | Comment | Since | | ------------------------------- | ------------------------------ | -------------- | ----- | -| app:candleBorderSize | setCandleBorderSize | 蜡烛图矩形边框大小 | 0.1.0 | -| app:candleExtremumLabelSize | setCandleExtremumLabelSize | 蜡烛图极值字符大小 | 0.1.0 | -| app:candleExtremumLableColor | setCandleExtremumLableColor | 蜡烛图极值字符颜色 | 0.1.0 | -| app:shadowSize | setShadowSize | 影线大小 | 0.1.0 | -| app:increasingColor | setIncreasingColor | 上涨颜色 | 0.1.0 | -| app:decreasingColor | setDecreasingColor | 下跌颜色 | 0.1.0 | -| app:neutralColor | setNeutralColor | 不涨不跌颜色 | 0.1.0 | -| app:portraitDefaultVisibleCount | setPortraitDefaultVisibleCount | 竖屏默认显示多少个蜡烛图 | 0.1.0 | -| app:zoomInTimes | setZoomInTimes | 最多放大次数 | 0.1.0 | -| app:zoomOutTimes | setZoomOutTimes | 最多缩小次数 | 0.1.0 | -| app:increasingStyle | setIncreasingStyle | 上涨蜡烛图填充样式。默认实心 | 0.1.4 | -| app:decreasingStyle | setDecreasingStyle | 下跌蜡烛图填充样式,默认实心 | 0.1.4 | +| ohos:candleBorderSize | setCandleBorderSize | 蜡烛图矩形边框大小 | 0.1.0 | +| ohos:candleExtremumLabelSize | setCandleExtremumLabelSize | 蜡烛图极值字符大小 | 0.1.0 | +| ohos:candleExtremumLableColor | setCandleExtremumLableColor | 蜡烛图极值字符颜色 | 0.1.0 | +| ohos:shadowSize | setShadowSize | 影线大小 | 0.1.0 | +| ohos:increasingColor | setIncreasingColor | 上涨颜色 | 0.1.0 | +| ohos:decreasingColor | setDecreasingColor | 下跌颜色 | 0.1.0 | +| ohos:neutralColor | setNeutralColor | 不涨不跌颜色 | 0.1.0 | +| ohos:portraitDefaultVisibleCount | setPortraitDefaultVisibleCount | 竖屏默认显示多少个蜡烛图 | 0.1.0 | +| ohos:zoomInTimes | setZoomInTimes | 最多放大次数 | 0.1.0 | +| ohos:zoomOutTimes | setZoomOutTimes | 最多缩小次数 | 0.1.0 | +| ohos:increasingStyle | setIncreasingStyle | 上涨蜡烛图填充样式。默认实心 | 0.1.4 | +| ohos:decreasingStyle | setDecreasingStyle | 下跌蜡烛图填充样式,默认实心 | 0.1.4 | @@ -63,36 +63,36 @@ | XML | Java Code | Comment | Since | | -------------------------- | ------------------------- | --------------- | ----- | -| app:maLineSize | setMaLineSize | MA 平均线大小 | 0.1.0 | -| app:ma5Color | setMa5Color | MA5 平均线颜色 | 0.1.0 | -| app:ma10Color | setMa10Color | MA10 平均线颜色 | 0.1.0 | -| app:ma20Color | setMa20Color | MA20 平均线颜色 | 0.1.0 | -| app:bollLineSize | setBollLineSize | BOLL 线条大小 | 0.1.0 | -| app:bollMidLineColor | setBollMidLineColor | BOLL MID 线条颜色 | 0.1.0 | -| app:bollUpperLineColor | setBollUpperLineColor | BOLL UPPER 线条颜色 | 0.1.0 | -| app:bollLowerLineColor | setBollLowerLineColor | BOLL LOWER 线条颜色 | 0.1.0 | -| app:kdjLineSize | setKdjLineSize | KDJ 线条大小 | 0.1.0 | -| app:kdjKLineColor | setKdjKLineColor | KDJ K 线条颜色 | 0.1.0 | -| app:kdjDLineColor | setKdjDLineColor | KDJ D 线条颜色 | 0.1.0 | -| app:kdjJLineColor | setKdjJLineColor | KDJ J 线条颜色 | 0.1.0 | -| app:macdLineSize | setMacdLineSize | MACD 两条线大小 | 0.1.0 | -| app:macdHighlightTextColor | setMacdHighlightTextColor | 高亮的 MACD 字符颜色 | 0.1.0 | -| app:deaLineColor | setDeaLineColor | DEA 线条颜色 | 0.1.0 | -| app:diffLineColor | setDiffLineColor | DIFF 线条颜色 | 0.1.0 | -| app:rsiLineSize | setRsiLineSize | RSI 线条大小 | 0.1.0 | -| app:rsi1LineColor | setRsi1LineColor | RSI 第一条线颜色 | 0.1.0 | -| app:rsi2LineColor | setRsi2LineColor | RSI 第二条线颜色 | 0.1.0 | -| app:rsi3LineColor | setRsi3LineColor | RSI 第三条线颜色 | 0.1.0 | -| app:maTextSize | setMaTextSize | MA 字符大小 | 0.1.0 | -| app:maTextColor | setMaTextColor | MA 字符颜色 | 0.1.0 | -| app:bollTextSize | setBollTextSize | BOLL 字符大小 | 0.1.0 | -| app:bollTextColor | setBollTextColor | BOLL 字符颜色 | 0.1.0 | -| app:kdjTextSize | setKdjTextSize | KDJ 字符大小 | 0.1.0 | -| app:kdjTextColor | setKdjTextColor | KDJ 字符颜色 | 0.1.0 | -| app:macdTextSize | setMacdTextSize | MACD 字符大小 | 0.1.0 | -| app:macdTextColor | setMacdTextColor | MACD 字符颜色 | 0.1.0 | -| app:rsiTextSize | setRsiTextSize | RSI 字符大小 | 0.1.0 | -| app:rsiTextColor | setRsiTextColor | RSI 字符颜色 | 0.1.0 | +| ohos:maLineSize | setMaLineSize | MA 平均线大小 | 0.1.0 | +| ohos:ma5Color | setMa5Color | MA5 平均线颜色 | 0.1.0 | +| ohos:ma10Color | setMa10Color | MA10 平均线颜色 | 0.1.0 | +| ohos:ma20Color | setMa20Color | MA20 平均线颜色 | 0.1.0 | +| ohos:bollLineSize | setBollLineSize | BOLL 线条大小 | 0.1.0 | +| ohos:bollMidLineColor | setBollMidLineColor | BOLL MID 线条颜色 | 0.1.0 | +| ohos:bollUpperLineColor | setBollUpperLineColor | BOLL UPPER 线条颜色 | 0.1.0 | +| ohos:bollLowerLineColor | setBollLowerLineColor | BOLL LOWER 线条颜色 | 0.1.0 | +| ohos:kdjLineSize | setKdjLineSize | KDJ 线条大小 | 0.1.0 | +| ohos:kdjKLineColor | setKdjKLineColor | KDJ K 线条颜色 | 0.1.0 | +| ohos:kdjDLineColor | setKdjDLineColor | KDJ D 线条颜色 | 0.1.0 | +| ohos:kdjJLineColor | setKdjJLineColor | KDJ J 线条颜色 | 0.1.0 | +| ohos:macdLineSize | setMacdLineSize | MACD 两条线大小 | 0.1.0 | +| ohos:macdHighlightTextColor | setMacdHighlightTextColor | 高亮的 MACD 字符颜色 | 0.1.0 | +| ohos:deaLineColor | setDeaLineColor | DEA 线条颜色 | 0.1.0 | +| ohos:diffLineColor | setDiffLineColor | DIFF 线条颜色 | 0.1.0 | +| ohos:rsiLineSize | setRsiLineSize | RSI 线条大小 | 0.1.0 | +| ohos:rsi1LineColor | setRsi1LineColor | RSI 第一条线颜色 | 0.1.0 | +| ohos:rsi2LineColor | setRsi2LineColor | RSI 第二条线颜色 | 0.1.0 | +| ohos:rsi3LineColor | setRsi3LineColor | RSI 第三条线颜色 | 0.1.0 | +| ohos:maTextSize | setMaTextSize | MA 字符大小 | 0.1.0 | +| ohos:maTextColor | setMaTextColor | MA 字符颜色 | 0.1.0 | +| ohos:bollTextSize | setBollTextSize | BOLL 字符大小 | 0.1.0 | +| ohos:bollTextColor | setBollTextColor | BOLL 字符颜色 | 0.1.0 | +| ohos:kdjTextSize | setKdjTextSize | KDJ 字符大小 | 0.1.0 | +| ohos:kdjTextColor | setKdjTextColor | KDJ 字符颜色 | 0.1.0 | +| ohos:macdTextSize | setMacdTextSize | MACD 字符大小 | 0.1.0 | +| ohos:macdTextColor | setMacdTextColor | MACD 字符颜色 | 0.1.0 | +| ohos:rsiTextSize | setRsiTextSize | RSI 字符大小 | 0.1.0 | +| ohos:rsiTextColor | setRsiTextColor | RSI 字符颜色 | 0.1.0 | @@ -100,9 +100,9 @@ | XML | Java Code | Comment | Since | | -------------------- | ------------------- | ------------ | ----- | -| app:loadingTextSize | setLoadingTextSize | loading 字符大小 | 0.1.0 | -| app:loadingTextColor | setLoadingTextColor | loading 字符颜色 | 0.1.0 | -| app:loadingText | setLoadingText | loading 字符 | 0.1.0 | -| app:errorTextSize | setErrorTextSize | error 字符大小 | 0.1.0 | -| app:errorTextColor | setErrorTextColor | error 字符颜色 | 0.1.0 | -| app:errorText | setErrorText | error 字符 | 0.1.0 | \ No newline at end of file +| ohos:loadingTextSize | setLoadingTextSize | loading 字符大小 | 0.1.0 | +| ohos:loadingTextColor | setLoadingTextColor | loading 字符颜色 | 0.1.0 | +| ohos:loadingText | setLoadingText | loading 字符 | 0.1.0 | +| ohos:errorTextSize | setErrorTextSize | error 字符大小 | 0.1.0 | +| ohos:errorTextColor | setErrorTextColor | error 字符颜色 | 0.1.0 | +| ohos:errorText | setErrorText | error 字符 | 0.1.0 | \ No newline at end of file diff --git a/README.md b/README.md index f8dfa98..a728de0 100644 --- a/README.md +++ b/README.md @@ -1,52 +1,82 @@ -## Features - -当前最新版本:0.1.5 - -支持在 XML 布局文件和代码中设置各个线条颜色、大小配置 - -支持左滑、右滑加载 - -支持长按高亮、短按点击、双指缩放事件 - -支持 fling 滑动 - -支持 MACD、RSI、KDJ、BOLL 四个指标 +# ikvStockChart + +**本项目基于开源项目ikvStockChart 进行openharmony的移植和开发,可以通过项目标签以及github地址( https://github.com/wordplat/ikvStockChart )追踪到原项目版本** + +#### 项目介绍 +- 项目名称:ikvStockChart +- 所属系列:openharmony的第三方组件适配移植 +- 功能:ikvStockChart一个简单的openharmony图表库,支持时间线,k线,macd,kdj,rsi,boll索引和交互式手势操作,包括左右滑动刷新,缩放,突出显示。 +- 项目移植状态:主功能完成 +- 调用差异:无 +- 开发版本:sdk5,DevEco Studio2.1 beta4 +- 项目作者和维护人:蒋军 +- 联系方式:jiangjun073@chinasoftinc.com +- 原项目Doc地址:https://github.com/wordplat/ikvStockChart +- 基线版本:ikvStockChart组件Release版本号 0.1.3.1 + +#### 支持的功能 +- 支持在 XML 布局文件和代码中设置各个线条颜色、大小配置 +- 支持左滑、右滑加载 +- 支持长按高亮、短按点击、双指缩放事件 +- 支持 fling 滑动 +- 支持 MACD、RSI、KDJ、BOLL 四个指标 +- 支持自定义的指标显示方式 +- 附带的程序示例有:默认左滑右滑加载、禁用左滑右滑加载、多个指标共同联动显示、在 Fragment 中使用、带有下拉刷新的需求中使用、横竖屏切换(自动旋转)、简单分时图 + +#### 效果演示 + + +#### 安装教程 + +1.在项目根目录下的build.gradle文件中, + + ```gradle +allprojects { + repositories { + maven { + url 'https://s01.oss.sonatype.org/content/repositories/snapshots/' + } + } +} + ``` -支持自定义的指标显示方式 +2.在entry模块的build.gradle文件中, -> 附带的程序示例有:默认左滑右滑加载、禁用左滑右滑加载、多个指标共同联动显示、在 Fragment 中使用、带有下拉刷新的需求中使用、横竖屏切换(自动旋转)、简单分时图 + ```gradle + dependencies { + implementation('com.gitee.chinasoft_ohos:timetable-view:0.0.1-SNAPSHOT') + ...... + } + ``` -## Change log +在sdk5,DevEco Studio2.1 beta4下项目可直接运行 -> 2017.06.28 +如无法运行,删除项目.gradle,.idea,build,gradle,build.gradle文件, -增加 K线图成交量柱状图 +并依据自己的版本创建新项目,将新项目的对应文件复制到根目录下 -![S70413-225235](Screenshots/S70628-230542.jpg) +#### 使用说明 -查看全部日志:[https://github.com/wordplat/ikvStockChart/blob/master/CHANGE_LOG.md](https://github.com/wordplat/ikvStockChart/blob/master/CHANGE_LOG.md) +##### 添加控件 +该控件包含的基础组件有日期栏、侧边栏、课表视图,在布局文件中加入如下代码后会包含这三个基础组件,注意要添加背景色,没有背景图片可以添加白色背景。 -## Usage +XML中添加控件: -```groovy -repositories { - jcenter() -} +```xml -dependencies { - compile 'com.wordplat:ikvStockChart:0.1.5' -} + ``` -```xml - -``` +##### 代码使用 + ```java - final EntrySet entrySet = new EntrySet(); + + final EntrySet entrySet = new EntrySet(); entrySet.addEntry(new Entry(...)); kLineLayout.getKLineView().setEntrySet(entrySet); @@ -86,43 +116,45 @@ dependencies { ikvStockChart 支持 66 个属性配置,设置各个线条颜色大小参考 [https://github.com/wordplat/ikvStockChart/blob/master/PROPERTY.md](https://github.com/wordplat/ikvStockChart/blob/master/PROPERTY.md) + ```java - SizeColor sizeColor = kLineLayout.getKLineView().getRender().getSizeColor(); - sizeColor.setXXX(); + + SizeColor sizeColor = kLineLayout.getKLineView().getRender().getSizeColor(); + sizeColor.setXXX(); + ``` +#### 测试信息 -## Screenshot +CodeCheck代码测试无异常 -![S70413-224859](Screenshots/S70413-224859.jpg) ![S70413-224945](Screenshots/S70413-224945.jpg) ![S70413-225013](Screenshots/S70413-225013.jpg) +CloudTest代码测试无异常 -![S70413-225055](Screenshots/S70413-225055.jpg) ![S70413-225125](Screenshots/S70413-225125.jpg) ![S70413-225235](Screenshots/S70413-225235.jpg) +火绒安全病毒安全检测通过 -![S70417-010650](Screenshots/S70417-010650.jpg) +当前版本demo功能与原组件基本无差异 -## Dependency +测试员:陈翔,朱品,邓世雄 -none +#### 版本迭代 -## License +- 0.0.1-SNAPSHOT -```java -/* - * Copyright (C) 2017 WordPlat Open Source Project - * - * https://wordplat.com/InteractiveKLineView/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -``` \ No newline at end of file +#### 版权和许可信息 + + Copyright (C) 2017 WordPlat Open Source Project + + https://wordplat.com/InteractiveKLineView/ + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Screenshots/S70413-224859.jpg b/Screenshots/S70413-224859.jpg deleted file mode 100644 index 137fe86d83d2de6fdbb06fe1de5e63e6ae06084f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26300 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 UlBha|^-VwfTKq~I=&!MV19V6x@Bjb+ diff --git a/Screenshots/S70413-224945.jpg b/Screenshots/S70413-224945.jpg deleted file mode 100644 index 9d7b6f846c0ec30a78c9101a19e8023715748cca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40170 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 diff --git a/Screenshots/S70413-225013.jpg b/Screenshots/S70413-225013.jpg deleted file mode 100644 index 3db2eef7415cd15fd4c090223880f765a7ac3429..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35703 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 diff --git a/Screenshots/S70413-225055.jpg b/Screenshots/S70413-225055.jpg deleted file mode 100644 index f2e4dd81cfcf3b06f30cd6aaf36edd37405dd1ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37234 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 diff --git a/Screenshots/S70413-225125.jpg b/Screenshots/S70413-225125.jpg deleted file mode 100644 index ff53f4afe44970f84f3ca4bbb808762dbfedf199..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33224 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

a-$nE(+m;f?`|mAni@m?%^+N_FJm$Hl2xe}Wl^ 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 N^Zh^kjQ(rpe*m2W-bVlc diff --git a/Screenshots/S70413-225235.jpg b/Screenshots/S70413-225235.jpg deleted file mode 100644 index 9fb10c3295847785c962d63d7d17e3956e442d7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41942 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 diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index 597a326..0000000 --- a/app/build.gradle +++ /dev/null @@ -1,83 +0,0 @@ -apply plugin: 'com.android.application' - -android { - compileSdkVersion 25 - buildToolsVersion "25.0.2" - defaultConfig { - applicationId "com.wordplat.InteractiveKLineView.example" - minSdkVersion 16 - targetSdkVersion 25 - versionCode APP_VERSION_CODE as int // 这里的值去 gradle.properties 文件中修改,免去每次更新版本都 sync 一遍 - versionName APP_VERSION_NAME as String - vectorDrawables.useSupportLibrary = true - - multiDexEnabled true - - ndk { - abiFilters 'armeabi', 'armeabi-v7a', 'x86' - } - - manifestPlaceholders = [ - SERVER_HTTP_URL_VERSION: SERVER_HTTP_URL_VERSION as String, - ] - } - applicationVariants.all { variant -> - if (variant.buildType.name.contains('release')) { - variant.outputs.each { output -> - def outputFile = output.outputFile - if (outputFile != null && outputFile.name.endsWith('.apk')) { - def fileName = "ikvStockChart-" + defaultConfig.versionName + "-release.apk" - output.outputFile = new File(outputFile.parent, fileName) - } - } - } - } - aaptOptions { - additionalParameters "--no-version-vectors" - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - dexOptions { - javaMaxHeapSize "4g" - } - lintOptions { - abortOnError false - } -} - -repositories { - flatDir { - dirs 'libs' - } -} - -dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') - testCompile 'junit:junit:4.12' - compile 'com.android.support:support-v4:25.1.0' - compile 'com.android.support:appcompat-v7:25.1.0' - compile 'com.android.support:design:25.1.0' - compile 'com.android.support:recyclerview-v7:25.1.0' - - compile 'org.xutils:xutils:3.3.36' - // 设置状态栏颜色 - compile 'com.readystatesoftware.systembartint:systembartint:1.0.3' - // multidex - compile 'com.android.support:multidex:1.0.1' - // 下拉刷新, 支持ScrollView、RecyclerView - compile 'com.chanven.lib:cptr:1.1.0' - - compile project(':ikvStockChart') - - compile 'com.wordplat:RecyclerViewEasyDivider:1.0.4' - - compile 'io.reactivex:rxjava:1.1.9' - compile 'io.reactivex:rxandroid:1.2.1' - compile 'com.tbruyelle.rxpermissions:rxpermissions:0.9.3@aar' - - compile 'com.alibaba:fastjson:1.1.46.android' -} \ No newline at end of file diff --git a/app/libs/gson-2.2.1.jar b/app/libs/gson-2.2.1.jar deleted file mode 100644 index 93ac6d70b3ee93be63f2f51b34c8c8bac0777292..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189617 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�=__Dc#<0$o3+3&@4s(e~-SaPwHxmI4 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

8__

Nu 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 diff --git a/app/libs/picasso-release-2.5.2.4b.aar b/app/libs/picasso-release-2.5.2.4b.aar deleted file mode 100644 index 29a752b7e13aa5f713ecc60b5a058891d292c058..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115506 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 z 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 diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro deleted file mode 100644 index 0b96725..0000000 --- a/app/proguard-rules.pro +++ /dev/null @@ -1,25 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /Users/afon/Share/android-sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml deleted file mode 100644 index 10bae4e..0000000 --- a/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/com/wordplat/quickstart/activity/BaseActivity.java b/app/src/main/java/com/wordplat/quickstart/activity/BaseActivity.java deleted file mode 100644 index 553ec05..0000000 --- a/app/src/main/java/com/wordplat/quickstart/activity/BaseActivity.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.wordplat.quickstart.activity; - -import android.app.Activity; -import android.graphics.Color; -import android.os.Build; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v7.app.AppCompatActivity; -import android.view.View; -import android.view.Window; -import android.view.WindowManager; - -import com.readystatesoftware.systembartint.SystemBarTintManager; -import com.wordplat.quickstart.R; -import com.wordplat.quickstart.app.AppRuntimeInitializer; - -import org.xutils.x; - -public class BaseActivity extends AppCompatActivity { - protected Activity mActivity; // 给子类用的,避免使用 XXXActivity.this 这种写法 - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - init(); - } - - private void init() { - x.view().inject(this); - - mActivity = this; - setStatusBarColor(R.color.colorPrimaryDark); - } - - protected void setStatusBarColor(int colorResId) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && - Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - SystemBarTintManager tintManager = new SystemBarTintManager(this); - tintManager.setStatusBarTintEnabled(true); - tintManager.setNavigationBarTintEnabled(true); - tintManager.setStatusBarTintResource(colorResId); - } else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - getWindow().setStatusBarColor(getResources().getColor(colorResId)); - } - } - - protected void setTranslucentStatus(boolean on) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { // 我不知道为什么要加这个 - getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); - } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // 5.0 全透明实现 - - Window window = getWindow(); - window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); - window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); - window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); - window.setStatusBarColor(Color.TRANSPARENT); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { // 4.4 全透明状态栏 - - Window window = getWindow(); - WindowManager.LayoutParams winParams = window.getAttributes(); - final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; - if (on) { - winParams.flags |= bits; - } else { - winParams.flags &= ~bits; - } - window.setAttributes(winParams); - } - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - - AppRuntimeInitializer.INSTANCE.dealOnRequestPermissionsResult(this, requestCode, permissions, grantResults); - } -} diff --git a/app/src/main/java/com/wordplat/quickstart/activity/Disable_Left_And_Right_Refresh_Activity.java b/app/src/main/java/com/wordplat/quickstart/activity/Disable_Left_And_Right_Refresh_Activity.java deleted file mode 100644 index c3e226d..0000000 --- a/app/src/main/java/com/wordplat/quickstart/activity/Disable_Left_And_Right_Refresh_Activity.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.wordplat.quickstart.activity; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; - -/** - *

Disable_Left_And_Right_Refresh_Activity

- *

Date: 2017/3/31

- * - * @author afon - */ - -public class Disable_Left_And_Right_Refresh_Activity extends Enable_Left_And_Right_Refresh_Activity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - kLineLayout.getKLineView().setEnableLeftRefresh(false); - kLineLayout.getKLineView().setEnableRightRefresh(false); - } - - public static Intent createIntent(Context context) { - Intent intent = new Intent(context, Disable_Left_And_Right_Refresh_Activity.class); - return intent; - } -} diff --git a/app/src/main/java/com/wordplat/quickstart/activity/MainActivity.java b/app/src/main/java/com/wordplat/quickstart/activity/MainActivity.java deleted file mode 100644 index 426a777..0000000 --- a/app/src/main/java/com/wordplat/quickstart/activity/MainActivity.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.wordplat.quickstart.activity; - -import android.os.Bundle; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.util.Log; -import android.view.KeyEvent; -import android.widget.Toast; - -import com.wordplat.easydivider.RecyclerViewCornerRadius; -import com.wordplat.easydivider.RecyclerViewLinearDivider; -import com.wordplat.quickstart.R; -import com.wordplat.quickstart.adapter.TextAdapter; -import com.wordplat.quickstart.utils.AppUtils; - -import org.xutils.view.annotation.ContentView; -import org.xutils.view.annotation.ViewInject; - -@ContentView(R.layout.activity_main) -public class MainActivity extends BaseActivity { - private static final String TAG = "MainActivity"; - - @ViewInject(R.id.textList) private RecyclerView textList = null; - - private TextAdapter textAdapter; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - textAdapter = new TextAdapter(mActivity); - textList.setLayoutManager(new LinearLayoutManager(mActivity)); - textList.setAdapter(textAdapter); - - RecyclerViewCornerRadius cornerRadius = new RecyclerViewCornerRadius(textList); - cornerRadius.setCornerRadius(AppUtils.dpTopx(mActivity, 10)); - - RecyclerViewLinearDivider linearDivider = new RecyclerViewLinearDivider(mActivity, LinearLayoutManager.VERTICAL); - linearDivider.setDividerSize(1); - linearDivider.setDividerColor(0xff888888); - linearDivider.setDividerMargin(AppUtils.dpTopx(mActivity, 10), AppUtils.dpTopx(mActivity, 10)); - linearDivider.setDividerBackgroundColor(0xffffffff); - linearDivider.setShowHeaderDivider(false); - linearDivider.setShowFooterDivider(false); - - // 圆角背景必须第一个添加 - textList.addItemDecoration(cornerRadius); - textList.addItemDecoration(linearDivider); - - for (int i = 0 ; i < 16 ; i++) { - String result = Integer.toHexString(255 - i * 12); - Log.i(TAG, "##d onCreate: " + result); - } - } - - /** - * 点击两次退出 - */ - private long exitTime = 0; - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK) { - exit(); - return false; - } - return super.onKeyDown(keyCode, event); - } - - private void exit() { - if ((System.currentTimeMillis() - exitTime) > 2000) { - Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show(); - exitTime = System.currentTimeMillis(); - } else { - finish(); - System.exit(0); - } - } -} diff --git a/app/src/main/java/com/wordplat/quickstart/activity/Multi_Color_Dynamic_Change_Configuration_Activity.java b/app/src/main/java/com/wordplat/quickstart/activity/Multi_Color_Dynamic_Change_Configuration_Activity.java deleted file mode 100644 index cc53b1a..0000000 --- a/app/src/main/java/com/wordplat/quickstart/activity/Multi_Color_Dynamic_Change_Configuration_Activity.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.wordplat.quickstart.activity; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; - -/** - *

Multi_Color_Dynamic_Change_Configuration_Activity

- *

Date: 2017/3/31

- * - * @author afon - */ - -public class Multi_Color_Dynamic_Change_Configuration_Activity extends BaseActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - // TODO: 2017/4/11 - } - - public static Intent createIntent(Context context) { - Intent intent = new Intent(context, Multi_Color_Dynamic_Change_Configuration_Activity.class); - return intent; - } -} diff --git a/app/src/main/java/com/wordplat/quickstart/activity/With_Fragment_And_TabLayout_Switcher_Example_Activity.java b/app/src/main/java/com/wordplat/quickstart/activity/With_Fragment_And_TabLayout_Switcher_Example_Activity.java deleted file mode 100644 index 46b6f8b..0000000 --- a/app/src/main/java/com/wordplat/quickstart/activity/With_Fragment_And_TabLayout_Switcher_Example_Activity.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.wordplat.quickstart.activity; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.support.design.widget.TabLayout; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentTransaction; - -import com.chanven.lib.cptr.PtrDefaultHandler; -import com.chanven.lib.cptr.PtrFrameLayout; -import com.wordplat.quickstart.R; -import com.wordplat.quickstart.fragment.KLineFragment; -import com.wordplat.quickstart.mvp.StockPresenter; -import com.wordplat.quickstart.widget.pulllistview.PullListLayout; - -import org.xutils.view.annotation.ContentView; -import org.xutils.view.annotation.ViewInject; - -/** - *

With_Fragment_And_TabLayout_Switcher_Example_Activity

- *

Date: 2017/3/31

- * - * @author afon - */ - -@ContentView(R.layout.activity_with_fragment_and_tablayout_switcher) -public class With_Fragment_And_TabLayout_Switcher_Example_Activity extends BaseActivity { - - @ViewInject(R.id.tabLayout) private TabLayout tabLayout = null; - @ViewInject(R.id.pullListLayout) private PullListLayout pullListLayout = null; - - private KLineFragment dayKLineFragment; - private KLineFragment weekKLineFragment; - private KLineFragment monthKLineFragment; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - initUI(); - } - - private void initUI() { - pullListLayout.setPtrHandler(ptrHandler); - - dayKLineFragment = KLineFragment.newInstance(StockPresenter.KLineType.DAY); - weekKLineFragment = KLineFragment.newInstance(StockPresenter.KLineType.WEEK); - monthKLineFragment = KLineFragment.newInstance(StockPresenter.KLineType.MONTH); - - final String[] tabStrings = new String[]{"日K", "周K", "月K"}; - - tabLayout.removeAllTabs(); - for (int i = 0; i < tabStrings.length; i++) { - TabLayout.Tab tab = tabLayout.newTab(); - tab.setText(tabStrings[i]); - tabLayout.addTab(tab); - } - tabLayout.addOnTabSelectedListener(onTabSelectedListener); - - addFragment(dayKLineFragment); - } - - /////////////////////////////////////////////////////////////////////////// - // fragment 显示隐藏 - /////////////////////////////////////////////////////////////////////////// - - private void hideAllFragment() { - FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); - if (!dayKLineFragment.isHidden()) { - ft.hide(dayKLineFragment); - } - if (!weekKLineFragment.isHidden()) { - ft.hide(weekKLineFragment); - } - if (!monthKLineFragment.isHidden()) { - ft.hide(monthKLineFragment); - } - ft.commit(); - } - - private void showFragment(Fragment fragment) { - FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); - ft.show(fragment); - ft.commit(); - } - - private void addFragment(Fragment fragment) { - if (!fragment.isAdded()) { - FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); - ft.add(R.id.kLineContent, fragment); - ft.commit(); - } - } - - private void switchChart(int position) { - switch (position) { - case 0: - showFragment(dayKLineFragment); - break; - - case 1: - addFragment(weekKLineFragment); - showFragment(weekKLineFragment); - break; - - case 2: - addFragment(monthKLineFragment); - showFragment(monthKLineFragment); - break; - } - } - - private TabLayout.OnTabSelectedListener onTabSelectedListener = new TabLayout.OnTabSelectedListener() { - @Override - public void onTabSelected(TabLayout.Tab tab) { - hideAllFragment(); - switchChart(tab.getPosition()); - } - @Override - public void onTabUnselected(TabLayout.Tab tab) {} - @Override - public void onTabReselected(TabLayout.Tab tab) {} - }; - - /////////////////////////////////////////////////////////////////////////// - // 结束:fragment 显示隐藏 - /////////////////////////////////////////////////////////////////////////// - - private PtrDefaultHandler ptrHandler = new PtrDefaultHandler() { - @Override - public void onRefreshBegin(PtrFrameLayout frame) { - pullListLayout.postDelayed(new Runnable() { - @Override - public void run() { - pullListLayout.refreshComplete(); - } - }, 2000); - } - }; - - public static Intent createIntent(Context context) { - Intent intent = new Intent(context, With_Fragment_And_TabLayout_Switcher_Example_Activity.class); - return intent; - } -} diff --git a/app/src/main/java/com/wordplat/quickstart/activity/With_Pull_To_Refresh_Example_Activity.java b/app/src/main/java/com/wordplat/quickstart/activity/With_Pull_To_Refresh_Example_Activity.java deleted file mode 100644 index 4ada84c..0000000 --- a/app/src/main/java/com/wordplat/quickstart/activity/With_Pull_To_Refresh_Example_Activity.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.wordplat.quickstart.activity; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; - -import com.chanven.lib.cptr.PtrDefaultHandler; -import com.chanven.lib.cptr.PtrFrameLayout; -import com.wordplat.quickstart.R; -import com.wordplat.quickstart.widget.pulllistview.PullListLayout; - -import org.xutils.view.annotation.ContentView; -import org.xutils.view.annotation.ViewInject; - -/** - *

With_Pull_To_Refresh_Example_Activity

- *

Date: 2017/3/31

- * - * @author afon - */ - -@ContentView(R.layout.activity_with_pull_to_refresh) -public class With_Pull_To_Refresh_Example_Activity extends Enable_Left_And_Right_Refresh_Activity { - - @ViewInject(R.id.pullListLayout) private PullListLayout pullListLayout = null; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - initUI(); - } - - private void initUI() { - pullListLayout.setPtrHandler(ptrHandler); - } - - private PtrDefaultHandler ptrHandler = new PtrDefaultHandler() { - @Override - public void onRefreshBegin(PtrFrameLayout frame) { - pullListLayout.postDelayed(new Runnable() { - @Override - public void run() { - pullListLayout.refreshComplete(); - } - }, 2000); - } - }; - - public static Intent createIntent(Context context) { - Intent intent = new Intent(context, With_Pull_To_Refresh_Example_Activity.class); - return intent; - } -} diff --git a/app/src/main/java/com/wordplat/quickstart/activity/With_RecyclerView_Example_Activity.java b/app/src/main/java/com/wordplat/quickstart/activity/With_RecyclerView_Example_Activity.java deleted file mode 100644 index 4b73bd7..0000000 --- a/app/src/main/java/com/wordplat/quickstart/activity/With_RecyclerView_Example_Activity.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.wordplat.quickstart.activity; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; - -/** - *

With_RecyclerView_Example_Activity

- *

Date: 2017/3/31

- * - * @author afon - */ - -public class With_RecyclerView_Example_Activity extends BaseActivity { - - private static final String TAG = "Activity"; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - // TODO: 2017/4/11 - } - - public static Intent createIntent(Context context) { - Intent intent = new Intent(context, With_RecyclerView_Example_Activity.class); - return intent; - } -} diff --git a/app/src/main/java/com/wordplat/quickstart/adapter/BaseViewHolder.java b/app/src/main/java/com/wordplat/quickstart/adapter/BaseViewHolder.java deleted file mode 100644 index 0f69751..0000000 --- a/app/src/main/java/com/wordplat/quickstart/adapter/BaseViewHolder.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.wordplat.quickstart.adapter; - -import android.content.Context; -import android.support.v7.widget.RecyclerView; -import android.view.View; - -import org.xutils.x; - -/** - * Created by afon on 2017/2/5. - */ - -public abstract class BaseViewHolder extends RecyclerView.ViewHolder { - - protected Context mContext; - - public BaseViewHolder(View itemView) { - super(itemView); - - mContext = itemView.getContext(); - - x.view().inject(this, itemView); - } -} diff --git a/app/src/main/java/com/wordplat/quickstart/adapter/TextAdapter.java b/app/src/main/java/com/wordplat/quickstart/adapter/TextAdapter.java deleted file mode 100644 index 23c0c1c..0000000 --- a/app/src/main/java/com/wordplat/quickstart/adapter/TextAdapter.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.wordplat.quickstart.adapter; - -import android.app.Activity; -import android.content.Intent; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.wordplat.quickstart.R; -import com.wordplat.quickstart.activity.Disable_Left_And_Right_Refresh_Activity; -import com.wordplat.quickstart.activity.Enable_Left_And_Right_Refresh_Activity; -import com.wordplat.quickstart.activity.MACD_RSI_KDJ_Show_Together_Activity; -import com.wordplat.quickstart.activity.Multi_Color_Dynamic_Change_Configuration_Activity; -import com.wordplat.quickstart.activity.Simple_TimeLine_Example_Activity; -import com.wordplat.quickstart.activity.With_Fragment_And_TabLayout_Switcher_Example_Activity; -import com.wordplat.quickstart.activity.With_Pull_To_Refresh_Example_Activity; -import com.wordplat.quickstart.activity.With_RecyclerView_Example_Activity; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by afon on 2017/2/10. - */ - -public class TextAdapter extends RecyclerView.Adapter { - - private static List textList = new ArrayList<>(); - - static { - textList.add("左滑右滑加载(Enable left and right refresh)"); - textList.add("禁用左滑右滑加载"); - textList.add("多个指标共同显示、联动(MACD, RSI, KDJ)"); - textList.add("在Fragment中使用"); - textList.add("带有下拉刷新的需求中使用"); -// textList.add("动态改变颜色、尺寸配置"); // 还没有准备好 -// textList.add("在 RecyclerView 列表中使用"); // 还没有准备好 - textList.add("简单分时图"); - } - - private Activity mActivity; - - public TextAdapter(Activity activity) { - mActivity = activity; - } - - @Override - public TextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View itemView = LayoutInflater.from(mActivity).inflate(R.layout.item_text, parent, false); - - return new TextViewHolder(itemView); - } - - @Override - public void onBindViewHolder(TextViewHolder holder, final int position) { - holder.text.setText(textList.get(position)); - holder.text.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Intent intent = null; - switch (position) { - case 0: - intent = Enable_Left_And_Right_Refresh_Activity.createIntent(mActivity); - break; - - case 1: - intent = Disable_Left_And_Right_Refresh_Activity.createIntent(mActivity); - break; - - case 2: - intent = MACD_RSI_KDJ_Show_Together_Activity.createIntent(mActivity); - break; - - case 3: - intent = With_Fragment_And_TabLayout_Switcher_Example_Activity.createIntent(mActivity); - break; - - case 4: - intent = With_Pull_To_Refresh_Example_Activity.createIntent(mActivity); - break; - -// case 5: -// intent = Multi_Color_Dynamic_Change_Configuration_Activity.createIntent(mActivity); -// break; - -// case 6: -// intent = With_RecyclerView_Example_Activity.createIntent(mActivity); -// break; - - case 5: - intent = Simple_TimeLine_Example_Activity.createIntent(mActivity); - break; - - default: - break; - } - - if (intent != null) { - mActivity.startActivity(intent); - } - } - }); - } - - @Override - public int getItemCount() { - return textList.size(); - } -} diff --git a/app/src/main/java/com/wordplat/quickstart/adapter/TextViewHolder.java b/app/src/main/java/com/wordplat/quickstart/adapter/TextViewHolder.java deleted file mode 100644 index 7b060a3..0000000 --- a/app/src/main/java/com/wordplat/quickstart/adapter/TextViewHolder.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.wordplat.quickstart.adapter; - -import android.view.View; -import android.widget.TextView; - -import com.wordplat.quickstart.R; - -import org.xutils.view.annotation.ViewInject; - -/** - * Created by afon on 2017/2/10. - */ - -public class TextViewHolder extends BaseViewHolder { - - @ViewInject(R.id.text) TextView text; - - public TextViewHolder(View itemView) { - super(itemView); - } -} diff --git a/app/src/main/java/com/wordplat/quickstart/app/App.java b/app/src/main/java/com/wordplat/quickstart/app/App.java deleted file mode 100644 index 05b85ec..0000000 --- a/app/src/main/java/com/wordplat/quickstart/app/App.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.wordplat.quickstart.app; - -import android.app.ActivityManager; -import android.app.Application; -import android.content.Context; -import android.support.multidex.MultiDex; -import com.wordplat.quickstart.BuildConfig; - -import org.xutils.x; - -/** - * Created by afon on 2017/1/24. - */ - -public class App extends Application { - - @Override - protected void attachBaseContext(Context base) { - super.attachBaseContext(base); - MultiDex.install(this); - } - - @Override - public void onCreate() { - super.onCreate(); - - if (BuildConfig.APPLICATION_ID.equals(getCurProcessName(this))) { - AppRuntimeInitializer.INSTANCE.initRuntime(this); - } - - x.Ext.init(this); - } - - private String getCurProcessName(Context context) { - int pid = android.os.Process.myPid(); - ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); - for (ActivityManager.RunningAppProcessInfo appProcess : activityManager.getRunningAppProcesses()) { - if (appProcess.pid == pid) { - return appProcess.processName; - } - } - return ""; - } -} diff --git a/app/src/main/java/com/wordplat/quickstart/app/AppRuntime.java b/app/src/main/java/com/wordplat/quickstart/app/AppRuntime.java deleted file mode 100644 index 6718868..0000000 --- a/app/src/main/java/com/wordplat/quickstart/app/AppRuntime.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.wordplat.quickstart.app; - -import android.app.Activity; -import android.content.Context; - -import java.lang.ref.WeakReference; -import java.util.LinkedList; - -/** - * Created by afon on 2017/1/24. - */ - -public class AppRuntime { - - public static Context sContext; // 静态类型的 Context,你懂的 - public static LinkedList sActivities = new LinkedList<>(); // 查找当前的 Activity 栈用的 - public static WeakReference sActivityStops = new WeakReference<>(null); // 快速查找位于栈顶的 Activity 用的 - - public static String serverVersion = "1.0"; // 与服务器通信接口版本号。本值会自动读取到 gradle.properties 文件中定义的,不需要手动修改 * - public static String appVersion = "1.0.0"; // 本APP的版本号。本值会自动读取到 AndroidManifest.xml 文件中定义的,不需要手动修改 * -} diff --git a/app/src/main/java/com/wordplat/quickstart/app/AppRuntimeInitializer.java b/app/src/main/java/com/wordplat/quickstart/app/AppRuntimeInitializer.java deleted file mode 100644 index d268691..0000000 --- a/app/src/main/java/com/wordplat/quickstart/app/AppRuntimeInitializer.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.wordplat.quickstart.app; - -import android.app.Activity; -import android.app.Application; -import android.content.Context; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; -import android.os.Build; -import android.os.Bundle; -import android.provider.Settings; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; -import android.telephony.TelephonyManager; -import android.text.TextUtils; -import android.util.Log; - -import com.wordplat.quickstart.activity.MainActivity; -import com.wordplat.quickstart.utils.AppUtils; - -import java.lang.ref.WeakReference; - -/** - * APP 初始化程序 - * - * 用于 APP 运行时环境配置 - * - * Created by afon on 2016/12/20. - */ - -public enum AppRuntimeInitializer { - - INSTANCE; - - private AppRuntimeInitializer() { - - } - - public void initRuntime(Application application) { - final String TAG = "AppRuntime"; - - AppRuntime.sContext = application.getApplicationContext(); - - application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() { - - @Override - public void onActivityCreated(Activity activity, Bundle savedInstanceState) { - AppRuntime.sActivities.add(activity); - - if (activity instanceof MainActivity) { - requestIMEIforMIfNeeded(activity); - } - } - - @Override - public void onActivityStarted(Activity activity) { - - } - - @Override - public void onActivityResumed(Activity activity) { - AppRuntime.sActivityStops = new WeakReference<>(activity); - } - - @Override - public void onActivityPaused(Activity activity) { - } - - @Override - public void onActivityStopped(Activity activity) { - AppRuntime.sActivityStops = new WeakReference<>(null); - } - - @Override - public void onActivitySaveInstanceState(Activity activity, Bundle outState) { - - } - - @Override - public void onActivityDestroyed(Activity activity) { - AppRuntime.sActivities.remove(activity); - } - }); - - initVersion(application); - initIMEI(); - } - - private void initVersion(Application application) { - final String TAG = "AppRuntime"; - - try { - ApplicationInfo appInfo = application.getPackageManager().getApplicationInfo(application.getPackageName(), PackageManager.GET_META_DATA); - AppRuntime.serverVersion = appInfo.metaData.getString("server_http_url_version"); - if(AppRuntime.serverVersion.startsWith("ver")) { - AppRuntime.serverVersion = AppRuntime.serverVersion.substring(3); - } - AppRuntime.appVersion = AppUtils.getAppVersionName(application); - } catch (Exception e) { - e.printStackTrace(); - } - - Log.e(TAG, "### initVersion: serverVersion = " + AppRuntime.serverVersion + ", appVersion = " + AppRuntime.appVersion); - } - - private void initIMEI() { - final String TAG = "AppRuntime"; - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M || ContextCompat.checkSelfPermission(AppRuntime.sContext, - android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) { - TelephonyManager tm = (TelephonyManager) AppRuntime.sContext.getSystemService(Context.TELEPHONY_SERVICE); - DeviceRuntime.IMEI = tm.getDeviceId(); - DeviceRuntime.DEVICE_ID = Settings.Secure.getString(AppRuntime.sContext.getContentResolver(), Settings.Secure.ANDROID_ID); - } - - Log.e(TAG, "### initIMEI: IMEI = " + DeviceRuntime.IMEI + ", DEVICE_ID = " + DeviceRuntime.DEVICE_ID); - } - - private static final int REQUEST_IMEI_PERMISSION = 1346; - - /** Android 6.0 以上系统请求 IMEI 和设备 ID */ - private void requestIMEIforMIfNeeded(Activity activity) { - if (ContextCompat.checkSelfPermission(AppRuntime.sContext, - android.Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(activity, new String[]{android.Manifest.permission.READ_PHONE_STATE}, REQUEST_IMEI_PERMISSION); - } - } - - /** 处理权限请求成功之后回调 */ - public void dealOnRequestPermissionsResult(Context context, int requestCode, String[] permissions, int[] grantResults) { - switch (requestCode) { - case REQUEST_IMEI_PERMISSION: - if (grantResults.length == 1) { - if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { - initIMEI(); - } - } - break; - - default: - break; - } - } -} diff --git a/app/src/main/java/com/wordplat/quickstart/bean/request/ServerRequestParams.java b/app/src/main/java/com/wordplat/quickstart/bean/request/ServerRequestParams.java deleted file mode 100644 index 94a65f4..0000000 --- a/app/src/main/java/com/wordplat/quickstart/bean/request/ServerRequestParams.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.wordplat.quickstart.bean.request; - -import android.text.TextUtils; -import android.util.Log; - -import com.alibaba.fastjson.JSONObject; -import com.wordplat.quickstart.BuildConfig; -import com.wordplat.quickstart.app.AppRuntime; -import com.wordplat.quickstart.utils.SSLHelper; - -import org.xutils.http.RequestParams; - -import java.io.File; - -import javax.net.ssl.SSLSocketFactory; - -/** - *

ServerRequestParams

- *

Date: 2017/4/5

- * - * @author afon - */ - -public class ServerRequestParams extends RequestParams { - private static final String TAG = "ServerRequestParams"; - - private JSONObject params = null; - - private JSONObject requestJson= null; - - private String uploadKey = null; - private Object uploadValue = null; - - public ServerRequestParams(String URL) { - super(URL); - params = new JSONObject(); - - requestJson = new JSONObject(); - - setMaxRetryCount(2); - setConnectTimeout(20000); - - SSLSocketFactory sslSocketFactory = SSLHelper.getSSLSocketFactory(AppRuntime.sContext); - if (sslSocketFactory != null) { - setSslSocketFactory(sslSocketFactory); - } - } - - public void addRequestParams(String key, Object value) { - if (TextUtils.isEmpty(key) || value == null) { - return; - } - - requestJson.put(key, value); - } - - public void addCustomParams(String key, JSONObject jsonObject) { - if (TextUtils.isEmpty(key) || jsonObject == null) { - return; - } - - params.put(key, jsonObject); - } - - /** - * 上传文件 - * - * @param value 可以是File, InputStream 或 byte[] - */ - public void upload(Object value) { - uploadKey = "uploadFile"; - uploadValue = value; - } - - /** - * 添加完参数或设置参数后调用此方法 - */ - public void commit() { - params.put("RequestParams", requestJson); - - if (BuildConfig.DEBUG) { - Log.i(TAG, "##d 请求数据: " + requestJson.toJSONString()); - } - - addBodyParameter("", requestJson.toJSONString()); - - if (!TextUtils.isEmpty(uploadKey) && uploadValue != null) { - if (uploadValue instanceof org.json.JSONArray) { - addParameter(uploadKey, uploadValue); - - } else if(uploadValue instanceof String) { - addBodyParameter(uploadKey, new File((String) uploadValue)); - - } else if(uploadValue instanceof File) { - addBodyParameter(uploadKey, (File)uploadValue); - - } else { - addBodyParameter(uploadKey, uploadValue, "image/jpeg", System.currentTimeMillis()+".jpg"); - } - } - } - - @Override - public String toString() { - return params.toJSONString(); - } -} diff --git a/app/src/main/java/com/wordplat/quickstart/bean/response/ServerResponse.java b/app/src/main/java/com/wordplat/quickstart/bean/response/ServerResponse.java deleted file mode 100644 index f65190e..0000000 --- a/app/src/main/java/com/wordplat/quickstart/bean/response/ServerResponse.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.wordplat.quickstart.bean.response; - -import org.xutils.http.annotation.HttpResponse; - -/** - *

ServerResponse

- *

Date: 2017/4/11

- * - * @author afon - */ - -@HttpResponse(parser = ServerResponseParser.class) -public class ServerResponse implements IResultResponse { - - @Override - public int getResultCode() { - return 0; - } - - @Override - public String getResultDescr() { - return null; - } -} diff --git a/app/src/main/java/com/wordplat/quickstart/bean/response/ServerResponseParser.java b/app/src/main/java/com/wordplat/quickstart/bean/response/ServerResponseParser.java deleted file mode 100644 index a14dba4..0000000 --- a/app/src/main/java/com/wordplat/quickstart/bean/response/ServerResponseParser.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.wordplat.quickstart.bean.response; - -import android.util.Log; - -import com.alibaba.fastjson.JSON; -import com.wordplat.quickstart.BuildConfig; - -import org.xutils.http.app.ResponseParser; -import org.xutils.http.request.UriRequest; - -import java.lang.reflect.Type; - -/** - *

ServerResponseParser

- *

Date: 2017/4/11

- * - * @author afon - */ - -public class ServerResponseParser implements ResponseParser { - private static final String TAG = "ServerResponseParser"; - - @Override - public void checkResponse(UriRequest request) throws Throwable { - - } - - @Override - public Object parse(Type resultType, Class resultClass, String result) throws Throwable { - if (BuildConfig.DEBUG) { - Log.i(TAG, "##d 服务器返回数据:" + result); - } - - return JSON.parseObject(result, resultClass); - } -} diff --git a/app/src/main/java/com/wordplat/quickstart/fragment/BaseFragment.java b/app/src/main/java/com/wordplat/quickstart/fragment/BaseFragment.java deleted file mode 100644 index 2548d93..0000000 --- a/app/src/main/java/com/wordplat/quickstart/fragment/BaseFragment.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.wordplat.quickstart.fragment; - -import android.app.Activity; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import org.xutils.x; - -public class BaseFragment extends Fragment { - protected Activity mActivity; // 给子类用的 - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - mActivity = getActivity(); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - return x.view().inject(this, inflater, container); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/wordplat/quickstart/mvp/BtcChinaApiRequest.java b/app/src/main/java/com/wordplat/quickstart/mvp/BtcChinaApiRequest.java deleted file mode 100644 index b2802ac..0000000 --- a/app/src/main/java/com/wordplat/quickstart/mvp/BtcChinaApiRequest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.wordplat.quickstart.mvp; - -import android.util.Log; - -import com.wordplat.quickstart.BuildConfig; -import com.wordplat.quickstart.bean.BtcBean; - -import org.xutils.http.RequestParams; - -import java.util.List; -import java.util.Locale; - -import rx.Observable; -import rx.Subscriber; -import rx.schedulers.Schedulers; - -/** - *

BtcChinaApiRequest

- *

Date: 2017/4/16

- * - * @author afon - */ - -public class BtcChinaApiRequest extends BaseRequest { - private static final String TAG = "BtcChinaApiRequest"; - - private static final String URL = "https://data.btcchina.com/data/historydata?since=%d&limit=%d"; - - public static Observable> getHistoryData(final int id, final int limit) { - return Observable.create(new Observable.OnSubscribe>() { - @Override - public void call(Subscriber> subscriber) { - String url = String.format(Locale.ENGLISH, - URL, - id, - limit); - - if (BuildConfig.DEBUG) { - Log.d(TAG, "##d 请求参数: " + url); - } - - requestArray(subscriber, new RequestParams(url), BtcBean.class); - } - }).subscribeOn(Schedulers.io()); - } -} diff --git a/app/src/main/java/com/wordplat/quickstart/mvp/BtcChinaPresenter.java b/app/src/main/java/com/wordplat/quickstart/mvp/BtcChinaPresenter.java deleted file mode 100644 index 6030107..0000000 --- a/app/src/main/java/com/wordplat/quickstart/mvp/BtcChinaPresenter.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.wordplat.quickstart.mvp; - -import com.wordplat.quickstart.bean.BtcBean; - -import java.util.List; - -import rx.Subscription; -import rx.android.schedulers.AndroidSchedulers; -import rx.functions.Action1; - -/** - *

BtcChinaPresenter

- *

Date: 2017/4/16

- * - * @author afon - */ - -public class BtcChinaPresenter extends BasePresenter { - - private List btcList; - - public void getSimple(final int requestCode) { - baseView.onStartRequest(requestCode); - - Subscription subscription = BtcChinaApiRequest.getHistoryData(5000, 600) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Action1>() { - @Override - public void call(List response) { - baseView.onFinishRequest(requestCode); - if (response != null && response.size() > 0) { - btcList = response; - - baseView.onSuccess(requestCode); - } else { - baseView.onResultEmpty(requestCode); - } - } - }, new Action1() { - @Override - public void call(Throwable throwable) { - baseView.onFinishRequest(requestCode); - handleError(requestCode, throwable); - } - }); - - addSubscription(subscription); - } - - public List getBtcList() { - return btcList; - } -} diff --git a/app/src/main/java/com/wordplat/quickstart/mvp/StockApiRequest.java b/app/src/main/java/com/wordplat/quickstart/mvp/StockApiRequest.java deleted file mode 100644 index 4dae54e..0000000 --- a/app/src/main/java/com/wordplat/quickstart/mvp/StockApiRequest.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.wordplat.quickstart.mvp; - -import com.wordplat.quickstart.bean.KLineBean; -import com.wordplat.quickstart.bean.request.ServerRequestParams; - -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; -import java.util.Locale; - -import rx.Observable; -import rx.Subscriber; -import rx.schedulers.Schedulers; - -/** - *

自己搭建的股票 API 服务器接口

- *

Date: 2017/4/11

- * - * @author afon - */ - -public class StockApiRequest extends BaseRequest { - private static final String TAG = "StockApiRequest"; - - private static final String URL = "https://api.wordplat.com/ts/v1/get_k_data/%s"; - - private static final SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd"); - - - public static Observable> getKLine(final String stockCode, - final Date startDate, - final Date endData, - final String type) { - return Observable.create(new Observable.OnSubscribe>() { - @Override - public void call(Subscriber> subscriber) { - String url = String.format(Locale.ENGLISH, URL, stockCode); - - ServerRequestParams requestParams = new ServerRequestParams(url); - requestParams.addRequestParams("start", sDateFormat.format(startDate)); - requestParams.addRequestParams("end", sDateFormat.format(endData)); - requestParams.addRequestParams("ktype", type); - requestParams.commit(); - - requestArray(subscriber, requestParams, KLineBean.class); - } - }).subscribeOn(Schedulers.io()); - } -} diff --git a/app/src/main/java/com/wordplat/quickstart/utils/AppUtils.java b/app/src/main/java/com/wordplat/quickstart/utils/AppUtils.java deleted file mode 100644 index ac0943f..0000000 --- a/app/src/main/java/com/wordplat/quickstart/utils/AppUtils.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.wordplat.quickstart.utils; - -import android.content.Context; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; - -/** - * APP工具 - * - * @author liutao - */ - -public class AppUtils { - - /** - * 网络是否连接 - * - * @param context - */ - public static boolean isConnected(Context context) { - ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo netInfo = connManager.getActiveNetworkInfo(); - - return netInfo == null || !netInfo.isConnected() ? false : true; - } - - /** - * 根据手机的分辨率从 dp 的单位 转成为 px(像素) - */ - public static int dpTopx(Context context, float dpValue) { - final float scale = context.getResources().getDisplayMetrics().density; - return (int) (dpValue * scale + 0.5f); - } - - /** - * 根据手机的分辨率从 px(像素) 的单位 转成为 dp - */ - public static int pxTodp(Context context, float pxValue) { - final float scale = context.getResources().getDisplayMetrics().density; - return (int) (pxValue / scale + 0.5f); - } - - /** - * 获取App版本号 - */ - public static String getAppVersionName(Context context) { - String packageName = null; - String versionName = null; - int versionCode = 0; - try { - packageName = context.getPackageName(); - - versionName = context.getPackageManager().getPackageInfo(packageName, 0).versionName; - - versionCode = context.getPackageManager().getPackageInfo(packageName, 0).versionCode; - - } catch (Exception e) { - e.printStackTrace(); - } - return versionName; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/wordplat/quickstart/widget/TabButton.java b/app/src/main/java/com/wordplat/quickstart/widget/TabButton.java deleted file mode 100644 index e4f2a17..0000000 --- a/app/src/main/java/com/wordplat/quickstart/widget/TabButton.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.wordplat.quickstart.widget; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.drawable.Drawable; -import android.util.AttributeSet; -import android.widget.RadioButton; - -import com.wordplat.quickstart.R; -import com.wordplat.quickstart.utils.AppUtils; - -/** - * 带提示红点的Tab按键 - * - * @author liutao - */ -public class TabButton extends RadioButton { - private int radius = 0; - private int offset = 0; - private Paint paint = null; - private boolean isShow = false; - - private int topDrawableWidth = 0; - - public TabButton(Context context) { - this(context, null); - } - - public TabButton(Context context, AttributeSet attrs) { - this(context, attrs, android.R.attr.radioButtonStyle); - } - - public TabButton(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - setButtonDrawable(null); - - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TabButton); - radius = (int) a.getDimension(R.styleable.TabButton_dotSize, AppUtils.dpTopx(context, 4)); - a.recycle(); - - paint = new Paint(); - paint.setColor(Color.RED); - paint.setAntiAlias(true); - offset = radius * 2; - - Drawable[] drawables = null; - try { - drawables = getCompoundDrawables(); - - if(drawables == null || drawables[1] == null){ - return; - } - - topDrawableWidth = drawables[1].getIntrinsicWidth(); - }catch (Exception e) { - e.printStackTrace(); - }finally { - drawables = null; - } - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - if(isShow) { - canvas.drawCircle((getWidth()/2+topDrawableWidth/2), offset, radius, paint); - } - } - - public void setShowTag(boolean isShow) { - this.isShow = isShow; - invalidate(); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/wordplat/quickstart/widget/pulllistview/ListRefreshView.java b/app/src/main/java/com/wordplat/quickstart/widget/pulllistview/ListRefreshView.java deleted file mode 100644 index 8afe353..0000000 --- a/app/src/main/java/com/wordplat/quickstart/widget/pulllistview/ListRefreshView.java +++ /dev/null @@ -1,226 +0,0 @@ -package com.wordplat.quickstart.widget.pulllistview; - -import android.app.Activity; -import android.content.Context; -import android.content.SharedPreferences; -import android.graphics.drawable.Animatable; -import android.graphics.drawable.AnimationDrawable; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.TextView; - -import com.chanven.lib.cptr.PtrFrameLayout; -import com.chanven.lib.cptr.PtrUIHandler; -import com.chanven.lib.cptr.indicator.PtrIndicator; -import com.wordplat.quickstart.R; - -import java.text.SimpleDateFormat; -import java.util.Date; - -/** - * 下拉列表头部布局 - * - * Created by liutao on 16/9/6. - */ - -public class ListRefreshView extends FrameLayout implements PtrUIHandler { - private TextView statusHint = null; - private TextView updateTime = null; - private ImageView loadingImage = null; - - private String UPDATE_TIME_KEY = null; - private String mLastUpdateTimeKey; - private SimpleDateFormat sDataFormat = null; - private LastUpdateTimeUpdater mLastUpdateTimeUpdater = null; - private long mLastUpdateTime = -1; - private boolean mShouldShowLastUpdate; - - public ListRefreshView(Context context) { - this(context, null); - } - - public ListRefreshView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public ListRefreshView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - initUI(); - } - - private void initUI() { - View view = LayoutInflater.from(getContext()).inflate(R.layout.view_list_refresh, null); - statusHint = (TextView) view.findViewById(R.id.list_refresh_status); - updateTime = (TextView) view.findViewById(R.id.list_refresh_updateTime); - loadingImage = (ImageView) view.findViewById(R.id.list_refresh_loading_image); - loadingImage.setVisibility(GONE); - view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); - addView(view); - - sDataFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - mLastUpdateTimeUpdater = new LastUpdateTimeUpdater(); - try { - mLastUpdateTimeKey = ((Activity)getContext()).getLocalClassName(); - UPDATE_TIME_KEY = getContext().getPackageName(); - }catch (Exception e) { - e.printStackTrace(); - } - } - - public void setStatusHintColor(int colorResId) { - statusHint.setTextColor(getResources().getColor(colorResId)); - } - - public void setUpdateTimeColor(int colorResId) { - updateTime.setTextColor(getResources().getColor(colorResId)); - } - -// public void setRefreshAnimRes(int refreshImageAnimRes) { -// loadingImage.setBackgroundResource(refreshImageAnimRes); -// } - - @Override - public void onUIReset(PtrFrameLayout frame) { - mShouldShowLastUpdate = true; - updateLastTime(); - } - - @Override - public void onUIRefreshPrepare(PtrFrameLayout frame) { - mShouldShowLastUpdate = true; - updateLastTime(); - mLastUpdateTimeUpdater.start(); - crossRotateLineFromBottomUnderTouch(frame); - } - - @Override - public void onUIRefreshBegin(PtrFrameLayout frame) { - mShouldShowLastUpdate = false; - statusHint.setText(com.chanven.lib.cptr.R.string.cube_ptr_refreshing); - updateLastTime(); - mLastUpdateTimeUpdater.stop(); - loadingImage.setVisibility(VISIBLE); - ((Animatable) loadingImage.getDrawable()).start(); - } - - @Override - public void onUIRefreshComplete(PtrFrameLayout frame) { - statusHint.setText(com.chanven.lib.cptr.R.string.cube_ptr_refresh_complete); - SharedPreferences sharedPreferences = getContext().getSharedPreferences(UPDATE_TIME_KEY, 0); - if (!TextUtils.isEmpty(mLastUpdateTimeKey)) { - mLastUpdateTime = new Date().getTime(); - sharedPreferences.edit().putLong(mLastUpdateTimeKey, mLastUpdateTime).commit(); - } - ((Animatable) loadingImage.getDrawable()).stop(); - loadingImage.setVisibility(GONE); - } - - @Override - public void onUIPositionChange(PtrFrameLayout frame, boolean isUnderTouch, byte status, PtrIndicator ptrIndicator) { - final int mOffsetToRefresh = frame.getOffsetToRefresh(); - final int currentPos = ptrIndicator.getCurrentPosY(); - final int lastPos = ptrIndicator.getLastPosY(); - - if (currentPos < mOffsetToRefresh && lastPos >= mOffsetToRefresh) { - if (isUnderTouch && status == PtrFrameLayout.PTR_STATUS_PREPARE) { - crossRotateLineFromBottomUnderTouch(frame); - } - } else if (currentPos > mOffsetToRefresh && lastPos <= mOffsetToRefresh) { - if (isUnderTouch && status == PtrFrameLayout.PTR_STATUS_PREPARE) { - crossRotateLineFromTopUnderTouch(frame); - } - } - } - - private void crossRotateLineFromTopUnderTouch(PtrFrameLayout frame) { - if (!frame.isPullToRefresh()) { - statusHint.setText(com.chanven.lib.cptr.R.string.cube_ptr_release_to_refresh); - } - } - - private void crossRotateLineFromBottomUnderTouch(PtrFrameLayout frame) { - if (frame.isPullToRefresh()) { - statusHint.setText(com.chanven.lib.cptr.R.string.cube_ptr_pull_down_to_refresh); - } else { - statusHint.setText(com.chanven.lib.cptr.R.string.cube_ptr_pull_down); - } - } - - private void updateLastTime() { - if (!TextUtils.isEmpty(mLastUpdateTimeKey) && !mShouldShowLastUpdate) { - String time = getLastUpdateTime(); - if (!TextUtils.isEmpty(time)) { - updateTime.setVisibility(VISIBLE); - updateTime.setText(time); - } else { - updateTime.setVisibility(GONE); - } - } - } - - private String getLastUpdateTime() { - if (mLastUpdateTime == -1 && !TextUtils.isEmpty(mLastUpdateTimeKey)) { - mLastUpdateTime = getContext().getSharedPreferences(UPDATE_TIME_KEY, 0).getLong(mLastUpdateTimeKey, -1); - } - if (mLastUpdateTime == -1) { - return null; - } - long diffTime = new Date().getTime() - mLastUpdateTime; - int seconds = (int) (diffTime / 1000); - if (diffTime < 0) { - return null; - } - if (seconds <= 0) { - return null; - } - StringBuilder sb = new StringBuilder(); - sb.append("最后更新: "); - - if (seconds < 60) { - sb.append(seconds + getContext().getString(com.chanven.lib.cptr.R.string.cube_ptr_seconds_ago)); - } else { - int minutes = (seconds / 60); - if (minutes > 60) { - int hours = minutes / 60; - if (hours > 24) { - Date date = new Date(mLastUpdateTime); - sb.append(sDataFormat.format(date)); - } else { - sb.append(hours + getContext().getString(com.chanven.lib.cptr.R.string.cube_ptr_hours_ago)); - } - - } else { - sb.append(minutes + getContext().getString(com.chanven.lib.cptr.R.string.cube_ptr_minutes_ago)); - } - } - return sb.toString(); - } - - private class LastUpdateTimeUpdater implements Runnable { - private boolean mRunning = false; - private void start() { - if (TextUtils.isEmpty(mLastUpdateTimeKey)) { - return; - } - mRunning = true; - run(); - } - - private void stop() { - mRunning = false; - removeCallbacks(this); - } - - @Override - public void run() { - updateLastTime(); - if (mRunning) { - postDelayed(this, 1000); - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/wordplat/quickstart/widget/pulllistview/LoadMoreViewFooter.java b/app/src/main/java/com/wordplat/quickstart/widget/pulllistview/LoadMoreViewFooter.java deleted file mode 100644 index 61337d3..0000000 --- a/app/src/main/java/com/wordplat/quickstart/widget/pulllistview/LoadMoreViewFooter.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.wordplat.quickstart.widget.pulllistview; - -import android.view.View; -import android.widget.ProgressBar; -import android.widget.TextView; - -import com.chanven.lib.cptr.loadmore.ILoadMoreViewFactory; - -/** - * Created by afon on 2016/12/9. - */ - -public class LoadMoreViewFooter implements ILoadMoreViewFactory { - - private LoadMoreHelper loadMoreHelper; - - public LoadMoreHelper getLoadMoreView() { - return loadMoreHelper; - } - - @Override - public ILoadMoreView madeLoadMoreView() { - loadMoreHelper = new LoadMoreHelper(); - return loadMoreHelper; - } - - public static class LoadMoreHelper implements ILoadMoreView { - - protected View footerView; - protected TextView footerTv; - protected ProgressBar footerBar; - - protected View.OnClickListener onClickRefreshListener; - - @Override - public void init(FootViewAdder footViewHolder, View.OnClickListener onClickRefreshListener) { - footerView = footViewHolder.addFootView(com.chanven.lib.cptr.R.layout.loadmore_default_footer); - footerTv = (TextView) footerView.findViewById(com.chanven.lib.cptr.R.id.loadmore_default_footer_tv); - footerBar = (ProgressBar) footerView.findViewById(com.chanven.lib.cptr.R.id.loadmore_default_footer_progressbar); - footerView.setClickable(true); - footerView.setFocusable(true); - footerView.setFocusableInTouchMode(true); - this.onClickRefreshListener = onClickRefreshListener; - showNormal(); - } - - @Override - public void showNormal() { - footerTv.setText("点击加载更多"); - footerBar.setVisibility(View.GONE); - footerView.setOnClickListener(onClickRefreshListener); - } - - @Override - public void showLoading() { - footerTv.setText("正在加载中..."); - footerBar.setVisibility(View.VISIBLE); - footerView.setOnClickListener(null); - } - - @Override - public void showFail(Exception exception) { - footerTv.setText("加载失败,点击重新加载"); - footerBar.setVisibility(View.GONE); - footerView.setOnClickListener(onClickRefreshListener); - } - - @Override - public void showNomore() { - footerTv.setText("已经加载完毕"); - footerBar.setVisibility(View.GONE); - footerView.setOnClickListener(null); - } - - @Override - public void setFooterVisibility(boolean isVisible) { - footerView.setVisibility(isVisible ? View.VISIBLE : View.GONE); - } - } -} diff --git a/app/src/main/java/com/wordplat/quickstart/widget/pulllistview/PullListLayout.java b/app/src/main/java/com/wordplat/quickstart/widget/pulllistview/PullListLayout.java deleted file mode 100644 index cc7975f..0000000 --- a/app/src/main/java/com/wordplat/quickstart/widget/pulllistview/PullListLayout.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.wordplat.quickstart.widget.pulllistview; - -import android.content.Context; -import android.support.v4.view.MotionEventCompat; -import android.util.AttributeSet; -import android.view.MotionEvent; - -import com.chanven.lib.cptr.PtrFrameLayout; -import com.chanven.lib.cptr.loadmore.DefaultLoadMoreViewFooter; -import com.chanven.lib.cptr.loadmore.ILoadMoreViewFactory; -import com.wordplat.ikvstockchart.compat.GestureMoveActionCompat; - -/** - * Created by liutao on 16/9/6. - */ - -public class PullListLayout extends PtrFrameLayout { - private ListRefreshView listRefreshView = null; - - private boolean isRefresh = true; - - private GestureMoveActionCompat gestureCompat; - - public PullListLayout(Context context) { - this(context, null); - } - - public PullListLayout(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public PullListLayout(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - initUI(); - } - - private void initUI() { - gestureCompat = new GestureMoveActionCompat(null); - - setRatioOfHeaderHeightToRefresh(1f); - setResistance(3f); - setDurationToCloseHeader(500); - - listRefreshView = new ListRefreshView(getContext()); - setHeaderView(listRefreshView); - addPtrUIHandler(listRefreshView); - - ILoadMoreViewFactory loadMoreViewFactory = new DefaultLoadMoreViewFooter(); - setFooterView(loadMoreViewFactory); - } - - public void setStatusHintColor(int colorResId) { - listRefreshView.setStatusHintColor(colorResId); - } - - public void setUpdateTimeColor(int colorResId) { - listRefreshView.setUpdateTimeColor(colorResId); - } - - public void setPullRefresh(boolean isRefresh) { - this.isRefresh = isRefresh; - } - - @Override - public boolean dispatchTouchEvent(MotionEvent e) { - // 解决 PullListLayout 垂直滑动(下拉刷新)与横向滑动冲突 - if (gestureCompat.onTouchEvent(e, e.getRawX(), e.getRawY())) { - return dispatchTouchEventSupper(e); - } - // 解决双指缩放的冲突 - if (MotionEventCompat.getActionMasked(e) == MotionEvent.ACTION_POINTER_DOWN) { - isRefresh = false; - } - - if (isRefresh) { - return super.dispatchTouchEvent(e); - } - - switch (e.getAction()) { - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - isRefresh = true; - return super.dispatchTouchEvent(e); - } - - return dispatchTouchEventSupper(e); - } -} \ No newline at end of file diff --git a/app/src/main/res/anim/dialog_enter.xml b/app/src/main/res/anim/dialog_enter.xml deleted file mode 100644 index 530f578..0000000 --- a/app/src/main/res/anim/dialog_enter.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/dialog_exit.xml b/app/src/main/res/anim/dialog_exit.xml deleted file mode 100644 index 07c4724..0000000 --- a/app/src/main/res/anim/dialog_exit.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/animator/loading_rotation.xml b/app/src/main/res/animator/loading_rotation.xml deleted file mode 100644 index 610f1a3..0000000 --- a/app/src/main/res/animator/loading_rotation.xml +++ /dev/null @@ -1,9 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/btn_tab.xml b/app/src/main/res/drawable-v21/btn_tab.xml deleted file mode 100644 index 2561bbc..0000000 --- a/app/src/main/res/drawable-v21/btn_tab.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_ad_image_mark.xml b/app/src/main/res/drawable/bg_ad_image_mark.xml deleted file mode 100644 index 7fa9530..0000000 --- a/app/src/main/res/drawable/bg_ad_image_mark.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_tab.xml b/app/src/main/res/drawable/bg_tab.xml deleted file mode 100644 index 1d6178b..0000000 --- a/app/src/main/res/drawable/bg_tab.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/btn_tab.xml b/app/src/main/res/drawable/btn_tab.xml deleted file mode 100644 index 47ccfaa..0000000 --- a/app/src/main/res/drawable/btn_tab.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_default.xml b/app/src/main/res/drawable/ic_default.xml deleted file mode 100644 index 7effebf..0000000 --- a/app/src/main/res/drawable/ic_default.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/text_tab.xml b/app/src/main/res/drawable/text_tab.xml deleted file mode 100644 index f4650d3..0000000 --- a/app/src/main/res/drawable/text_tab.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/vector_drawable_loading.xml b/app/src/main/res/drawable/vector_drawable_loading.xml deleted file mode 100644 index 02528d3..0000000 --- a/app/src/main/res/drawable/vector_drawable_loading.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/vector_drawable_loading2.xml b/app/src/main/res/drawable/vector_drawable_loading2.xml deleted file mode 100644 index a234cde..0000000 --- a/app/src/main/res/drawable/vector_drawable_loading2.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/vector_drawable_loading2_anim.xml b/app/src/main/res/drawable/vector_drawable_loading2_anim.xml deleted file mode 100644 index 3abd476..0000000 --- a/app/src/main/res/drawable/vector_drawable_loading2_anim.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/vector_drawable_loading_anim.xml b/app/src/main/res/drawable/vector_drawable_loading_anim.xml deleted file mode 100644 index ae053e5..0000000 --- a/app/src/main/res/drawable/vector_drawable_loading_anim.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_left_and_right_refresh.xml b/app/src/main/res/layout/activity_left_and_right_refresh.xml deleted file mode 100644 index 4cffb51..0000000 --- a/app/src/main/res/layout/activity_left_and_right_refresh.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index 4e3161c..0000000 --- a/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_simple_timeline.xml b/app/src/main/res/layout/activity_simple_timeline.xml deleted file mode 100644 index c44278b..0000000 --- a/app/src/main/res/layout/activity_simple_timeline.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_with_fragment_and_tablayout_switcher.xml b/app/src/main/res/layout/activity_with_fragment_and_tablayout_switcher.xml deleted file mode 100644 index b1fa1d3..0000000 --- a/app/src/main/res/layout/activity_with_fragment_and_tablayout_switcher.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_with_pull_to_refresh.xml b/app/src/main/res/layout/activity_with_pull_to_refresh.xml deleted file mode 100644 index fe219d7..0000000 --- a/app/src/main/res/layout/activity_with_pull_to_refresh.xml +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_kline.xml b/app/src/main/res/layout/fragment_kline.xml deleted file mode 100644 index b780e50..0000000 --- a/app/src/main/res/layout/fragment_kline.xml +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_text.xml b/app/src/main/res/layout/item_text.xml deleted file mode 100644 index 4131c83..0000000 --- a/app/src/main/res/layout/item_text.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/view_list_refresh.xml b/app/src/main/res/layout/view_list_refresh.xml deleted file mode 100644 index 9bcb8ee..0000000 --- a/app/src/main/res/layout/view_list_refresh.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index cde69bcccec65160d92116f20ffce4fce0b5245c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3418 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 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index efc028a636dd690a51db5a525cf781a5a7daba68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2555 zcmVDi>vW`@Y|P=j^x3Ifn%y?#weBmhZgZ z^Srn3`_5s_nkW1KfDd9V!jFD>F_Mc=&(D`S9F8`G9j`|SbWPvU-)IaU`}$WdghKD(z^U%DuFl=dhBq1 zV2N08FaBOdb12Qd668Nb;&Z~}bITyD2yV;4Q;V)Yd}0yejcD*w$?M!}^D9N(BLyEz zzdw5PC}r6q#BPAbGB|lDe_=J@3Wft_XJ;=W1)n8}5Q_(meMaO(qlBrMNwAM~()TMt z7``0qU^YGKgUvTFF>zWD;p2?}U+(!oOP=>E(#D=LI9;^|21mP}Sb%-B3r<$-f`)GE zf+ENH9giPBhLMqxk3?>Z_Ib>|pGpO*ls1Edc1SPZ4+Zs6n5(m@o)w`qhVIR+3x!nc z2QWA^sF+UVL`bPYG*m}z-@eUAx}Y&)U4(ZX!1ID&B)9UZ-m)SmI=x*&DX z(4U0VQSCNkV`Ff+G6~M!-Uofd_rTVE5zbccg%jm(Lo!1!!}0Rp$Ve*N38}aK2$p*n zpm(?p)9??FQ;`7UThq+UOtDt(yU340PTgTf-cvxbAYdW+ zodS8MfJB=CGHd^~s0fLZ-EJ=tYQaZdAO;5qU&BEYQVUZvM7db#>3OfcuPlI&kC9O8 zXc8ynO6$TzSy@?tytqki3G?eco<8$hd0*Xm)s6T`#OF=Nz|?XUQmTHh=zTGLKE-+| z`R_lmJHKZj zYHDgW;R5zROF(6Nf!D;<$-4^>$-4vuLPcAirU0zhk=)$eH)H`8i{&*f0hE))jVY>R zmqT9B`&@vr{-k0Zhyu=?I~O1eC@L!YJ}zQ*H377xy<8iOlOj14B;uwl(JEnwjAJr_ zIFPu-00|bojChNVBak8YiwHKSngDD7gUQLsn`8k84<3AZYHCWgh-vZ4u!X_jGYxR) zq8|Q1$V6o6;p0n)Y&{&#F~E^rJsc(EAuj77G#^obxT1%!D>?`(A_PMCRVU~=tY|yO zHVEaoPJAc#i9+(48VAl77nID%R4M5zcJ#F_)$kX3y|RRI0$?(VKa z&d-Y*IbZCp=~@DEYr|PSAG7R$NTWpBz(_|H8#rMDBOQAaVG81;4G>?7DO1YR#;Tn6 zgm{iiHR=MWHX0flE+A(=#+`2^eCq4#-GFC! z6M$q(^=<;x$j4i^s|lc;#5~q2T)%#OKVOMmTZ!}M&%cE?jVW#BSPIpK3EjjgBC41R zU=h$eBj6^$nKJQasbF=Bl6MMNSOesJ+RS09kH^Hs{G2bqzT$RzJ?=lyi2lg=rilsXN0U$-dvIO{gZQWn5CwY0QYkn1i@vBQ*i6ms==x^iJG#36RN40+4*XRgHY0OkPO<9mtU5JZ^U&KR=(+$Jgyx zDIL$YY}xWX3{k7+k&+4cB2-?0JVEIZU7}-f3eXAOclCI0$TI=e3k0wuC3c^-&6_uG zR6N*oMPDbVp?Du@1oKFGD6fK=08A@$~dMVygPvL8+hkiK{R{*ed% zA|nNnV>ylomVT*i&f`G~^78Uxh|{8v7Nyn{92`s``gUbyWd@x=@k0-m99ZD=a0z;Q zdshWyo93XoXijn<_WCU1LY%yQYs2e-LiK8Ob#)<+1PkeEKVFy8hUToOsJMz8en4DQ z^L~*R9P1F9Y&P3P+^sSZR1(zHR^hz>d%;0-P}*QOB+vhlIItCWIUjx_iP%Vah~b^# zk7wprN{B$5*%}@mp2^C}ilsT9h`g9i0RaKeQXb;D;hnp8@77Q>s6z=t97}xdB)!pO z#K{)fY;JC@IdI^>ZkmhcTyolI6*d|p5%eVB&CJZqu#S$7Rthzb2>VEHRu*~1>JY}W zbRkF@9VldW5~{?cGD{E9%= z^d0?;k9mdPCi)Wq~U2RobsvA@Q0MM$dq4lq5{hy#9 zzgp+B{O(-=?1<7r0l>Q?>N6X%s~lmgrmqD6fjj_!c?AF`S0&6U06Z51fWOuNAe#jM z%pSN#J-Mp}`ICpL=qp~?u~Jj$6(~K_%)9}Bn(;pY0&;M00H9x2N23h=CpR7kr8A9X zU%oh4-E@i!Ac}P+&%vOPQ3warO9l!SCN)ixGW54Jsh!`>*aU)#&Mg7;#O_6xd5%I6 zneGSZL3Kn-4B^>#T7pVaIHs3^PY-N^v1!W=%gzfioIWosZ!BN?_M)OOux&6HCyyMf z3ToZ@_h75A33KyC!T)-zYC-bp`@^1n;w3~N+vQ0#4V7!f|JPMlWWJ@+Tg~8>1$GzLlHGuxS)w&NAF*&Y;ef`T^w4HP7GK%6UA8( z{&ALM(%!w2U7WFWwq8v4H3|0cOjdt7$JLh(;U8VcTG;R-vmR7?21nA?@@b+XPgJbD z*Y@v&dTqo5Bcp-dIQQ4@?-m{=7>`LZ{g4jvo$CE&(+7(rp#WShT9&9y>V#ikmXFau03*^{&d(AId0Jg9G;tc7K_{ivzBjqHuJx08cx<8U`z2JjtOK3( zvtuduBHha>D&iu#))5RKXm>(|$m=_;e?7ZveYy=J$3wjL>xPCte-MDcVW<;ng`nf= z9);CVVZjI-&UcSAlhDB{%0v$wPd=w6MBwsVEaV!hw~8G(rs`lw@|#AAHbyA&(I-7Y zFE&1iIGORsaskMqSYfX33U%&17oTszdHPjr&Sx(`IQzoccST*}!cU!ZnJ+~duBM6f z{Lf8PITt%uWZ zTY09Jm5t<2+Un~yC-%DYEP>c-7?=+|reXO4Cd^neCQ{&aP@yODLN8}TQAJ8ogsnkb zM~O>~3&n6d+ee`V_m@$6V`^ltL&?uwt|-afgd7BQ9Kz|g{B@K#qQ#$o4ut`9lQsYfHofccNoqE+`V zQ&UXP{X4=&Z16O_wCk9SFBQPKyu?<&B2zDVhI6%B$12c^SfcRYIIv!s1&r|8;xw5t zF~*-cE@V$vaB;*+91`CiN~1l8w${?~3Uy#c|D{S$I? zb!9y)DbLJ3pZ>!*+j=n@kOLTMr-T2>Hj^I~lml-a26UP1_?#!5S_a&v zeZ86(21wU0)4(h&W0iE*HaDlw+-LngX=}es#X$u*1v9>qR&qUGfADc7yz6$WN`cx9 zzB#!5&F%AK=ed|-eV6kb;R>Atp2Rk=g3lU6(IVEP3!;0YNAmqz=x|-mE&8u5W+zo7 z-QfwS6uzp9K4wC-Te-1~u?zPb{RjjIVoL1bQ=-HK_a_muB>&3I z*{e{sE_sI$CzyK-x>7abBc+uIZf?#e8;K_JtJexgpFEBMq92+Fm0j*DziUMras`o= zTzby8_XjyCYHeE@q&Q_7x?i|V9XY?MnSK;cLV?k>vf?!N87)gFPc9#XB?p)bEWGs$ zH>f$8?U7In{9@vsd%#sY5u!I$)g^%ZyutkNBBJ0eHQeiR5!DlQbYZJ-@09;c?IP7A zx>P=t*xm1rOqr@ec>|ziw@3e$ymK7YSXtafMk30i?>>1lC>LLK1~JV1n6EJUGJT{6 zWP4A(129xkvDP09j<3#1$T6j6$mZaZ@vqUBBM4Pi!H>U8xvy`bkdSNTGVcfkk&y8% z=2nfA@3kEaubZ{1nwTV1gUReza>QX%_d}x&2`jE*6JZN{HZtXSr{{6v6`r47MoA~R zejyMpeYbJ$F4*+?*=Fm7E`S_rUC0v+dHTlj{JnkW-_eRa#9V`9o!8yv_+|lB4*+p1 zUI-t)X$J{RRfSrvh80$OW_Wwp>`4*iBr|oodPt*&A9!SO(x|)UgtVvETLuLZ<-vRp z&zAubgm&J8Pt647V?Qxh;`f6E#Zgx5^2XV($YMV7;Jn2kx6aJn8T>bo?5&;GM4O~| zj>ksV0U}b}wDHW`pgO$L@Hjy2`a)T}s@(0#?y3n zj;yjD76HU&*s!+k5!G4<3{hKah#gBz8HZ6v`bmURyDi(wJ!C7+F%bKnRD4=q{(Fl0 zOp*r}F`6~6HHBtq$afFuXsGAk58!e?O(W$*+3?R|cDO88<$~pg^|GRHN}yml3WkbL zzSH*jmpY=`g#ZX?_XT`>-`INZ#d__BJ)Ho^&ww+h+3>y8Z&T*EI!mtgEqiofJ@5&E z6M6a}b255hCw6SFJ4q(==QN6CUE3GYnfjFNE+x8T(+J!C!?v~Sbh`Sl_0CJ;vvXsP z5oZRiPM-Vz{tK(sJM~GI&VRbBOd0JZmGzqDrr9|?iPT(qD#M*RYb$>gZi*i)xGMD`NbmZt;ky&FR_2+YqpmFb`8b`ry;}D+y&WpUNd%3cfuUsb8 z7)1$Zw?bm@O6J1CY9UMrle_BUM<$pL=YI^DCz~!@p25hE&g62n{j$?UsyYjf#LH~b z_n!l6Z(J9daalVYSlA?%=mfp(!e+Hk%%oh`t%0`F`KR*b-Zb=7SdtDS4`&&S@A)f>bKC7vmRWwT2 zH}k+2Hd7@>jiHwz^GrOeU8Y#h?YK8>a*vJ#s|8-uX_IYp*$9Y=W_Edf%$V4>w;C3h z&>ZDGavV7UA@0QIQV$&?Z_*)vj{Q%z&(IW!b-!MVDGytRb4DJJV)(@WG|MbhwCx!2 z6QJMkl^4ju9ou8Xjb*pv=Hm8DwYsw23wZqQFUI)4wCMjPB6o8yG7@Sn^5%fmaFnfD zSxp8R-L({J{p&cR7)lY+PA9#8Bx87;mB$zXCW8VDh0&g#@Z@lktyArvzgOn&-zerA zVEa9h{EYvWOukwVUGWUB5xr4{nh}a*$v^~OEasKj)~HyP`YqeLUdN~f!r;0dV7uho zX)iSYE&VG67^NbcP5F*SIE@T#=NVjJ1=!Mn!^oeCg1L z?lv_%(ZEe%z*pGM<(UG{eF1T(#PMw}$n0aihzGoJAP^UceQMiBuE8Y`lZ|sF2_h_6 zQw*b*=;2Ey_Flpfgsr4PimZ~8G~R(vU}^Zxmri5)l?N>M_dWyCsjZw<+a zqjmL0l*}PXNGUOh)YxP>;ENiJTd|S^%BARx9D~%7x?F6u4K(Bx0`KK2mianotlX^9 z3z?MW7Coqy^ol0pH)Z3+GwU|Lyuj#7HCrqs#01ZF&KqEg!olHc$O#Wn>Ok_k2`zoD z+LYbxxVMf<(d2OkPIm8Xn>bwFsF6m8@i7PA$sdK~ZA4|ic?k*q2j1YQ>&A zjPO%H@H(h`t+irQqx+e)ll9LGmdvr1zXV;WTi}KCa>K82n90s|K zi`X}C*Vb12p?C-sp5maVDP5{&5$E^k6~BuJ^UxZaM=o+@(LXBWChJUJ|KEckEJTZL zI2K&Nd$U65YoF3_J6+&YU4uKGMq2W6ZQ%BG>4HnIM?V;;Ohes{`Ucs56ue^7@D7;4 z+EsFB)a_(%K6jhxND}n!UBTuF3wfrvll|mp7)3wi&2?LW$+PJ>2)2C-6c@O&lKAn zOm=$x*dn&dI8!QCb(ul|t3oDY^MjHqxl~lp{p@#C%Od-U4y@NQ4=`U!YjK$7b=V}D z%?E40*f8DVrvV2nV>`Z3f5yuz^??$#3qR#q6F($w>kmKK`x21VmX=9kb^+cPdBY2l zGkIZSf%C+`2nj^)j zo}g}v;5{nk<>%xj-2OqDbJ3S`7|tQWqdvJdgiL{1=w0!qS9$A`w9Qm7>N0Y*Ma%P_ zr@fR4>5u{mKwgZ33Xs$RD6(tcVH~Mas-87Fd^6M6iuV^_o$~ql+!eBIw$U)lzl`q9 z=L6zVsZzi0IIW=DT&ES9HajKhb5lz4yQxT-NRBLv_=2sn7WFX&Wp6Y!&}P+%`!A;s zrCwXO3}jrdA7mB`h~N~HT64TM{R$lNj*~ekqSP^n9P~z;P zWPlRPz0h6za8-P>!ARb+A1-r>8VF*xhrGa8W6J$p*wy`ULrD$CmYV7Gt^scLydQWbo7XN-o9X1i7;l+J_8Ncu zc=EX&dg`GRo4==cz2d_Rz28oLS`Suf6OCp~f{0-aQ`t5YZ=!CAMc6-RZw#}A%;s44 znf2`6gcgm=0SezTH9h+JzeR3Lcm;8?*@+?FDfguK^9)z(Z`I!RKrSAI?H~4et6GTkz07Qgq4B6%Q*8Y0yPc4x z8(^YwtZjYIeOvVLey#>@$UzIciJ#x0pJLFg=8UaZv%-&?Yzp7gWNIo_x^(d75=x2c zv|LQ`HrKP(8TqFxTiP5gdT2>aTN0S7XW*pilASS$UkJ2*n+==D)0mgTGxv43t61fr z47GkfMnD-zSH@|mZ26r*d3WEtr+l-xH@L}BM)~ThoMvKqGw=Ifc}BdkL$^wC}=(XSf4YpG;sA9#OSJf)V=rs#Wq$?Wj+nTlu$YXn yn3SQon5>kvtkl(BT2@T#Mvca!|08g9w{vm``2PjZHg=b<1c17-HkzPl9sXa)&-Ts$ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 3af2608a4492ef9ae63a77ec3305aedda89594cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6114 zcmV<87aiz{P)QBg$Z&8YKy<2dSjG6I2&!iu7JRdT!gcBlJx2NL9-^PTGD_Ptf# z_t*dbRdw&}d+xcr-QAko7-Mb(cL9%PAop{-%ba$?L0~%p4=0Y}p*W8FU1n`tILPv} zML2!uMd(K8O&CZREHF@fhVQ(Z5yVrJcYBD!LfyzFt;&e2oN5Pm5Z@1b~qKj96+4}@|h;R-VA2(=2-37BtnR`#_JMV#vgaqj!A)$dLw zzAqt=kf%brlHdkMtlkP5%mgwQBTv+&?;R(E^s|ch{RoQ*)slEY&`lQ-Zm%FW<@tmV z)uL|w%v_~goAvXG*IfwH2{j7hrMtKlq}vjs(Nzf{YD8VTsI{f7SiPs>{X2v+3gRt% zb1Q)~2q^^WJXX;T&sN_Xm~Vh zb#=9En0OP&wxC@%Z{GYqE-tQJs}Mm3TMTBXa{GnLsc$2`UQ2AK7a~NTIdi77l7ri6 z`43X1QUv+6ZQSM9m9|2JpMU;2wWOq^>uu=?@`M*IT!7^#gZw+m<=EqrAj0+Q*Hg$H zJ$Oq+P^6h2REa1@$fx}f$avWbNp+}hvdvenT!~)3e7WZ>$&QpcFrEB6N8An?S5|d~ zB^5-n^6EnVzO|5VtXly~JQKl6t4`ZnH?qHmS_oEMUA;k(9l5u-^-~3>C<3lsKL5sz z8*E#~Y!;d{mW8E%&1x=JwThmAI-oA!r+v=m8+=*h@o#ut?Trbv)l*PrWo2c7E!qoY zv?ucapvd#>&UUU|y~?7Ft!1Hy#&Qu1ry?9_Xo~@Lh|Ar;$)A_t%k~~!$?NJ!b|m5f zD<~+?wMb?p0}NHHJDsdpOP+u2+BKGS@&sFv@K-LtvgALql8XG>>WXmgqKZ7WIB_f& zU}@aPypE`=gT1H@oRBLjNl8iR<+gNF7DT_{uWTA=gaS^s< z%wkurUa`v+VILVNZ9(p5&+%~X&FO)h{Q2?zEb7oEUPshb%hUyrC1qui#Fe{(H`iD{ zRqAcU+)jfQUrQMS%gf7S-|N5O0)!^L%Z?YuT5Yf-9N%BNewEc+xx~t=irJa+43>S) zz%q&ta%7!LpwEu;@37DH>(}^iY-Kh0{%FB|wjj};3$QLWfY%M~M`LW_lSb%0be!=n z=>;;NR8>`VrY@E*Tu+@dUH;<5i!9}cfh{roiHor2@c*#Ns?tVRBuR&FuDMdhPL?LI znB3KD)A6ZndFr3ox5@9Z#Yu0oMTf?4EIjlk$D*XSSZFf2wv-7hB0Ye9vyz=WpTq+! zj-?a>uPZK{XDd?v%;qQhv4#3^RHsB@%l79i<(6Z#^lR)?X&T#`y^t+W`7gHk(A$K!h-@XsSO{Q_ z1&MDE-egNtK45#Y=JR7-yLJ`R2>e{TGZ%95=NtUkj`-EQPNk!V64;&s^jD12Z2L5d8ftq zyOG5#aFz8-zzQoWDwsZbKMOUyPa?cS*8WGfB+2Mr8lh1DQ}T@ha9>YYm^g+69%r=v z__uf+P#4t6m8)x_7c3LKpq-|`OA);fS^h;=S--LuAlT)cq+Ve7k_#Z=dI9`R1ZaXE zTN(c;%gN1hCh%JA1>lTg$|Z^gPk_rKM~-+p?EA?l1}H|n%#}T$>{1bnI5thh0oRf5 zhyW?TQ78(VIKDpAD{DT0|E=TTVVd^}lVCZ>RO!CxE{d0Zhr4 zKq633p6N<=REuMsI(2F@aq7|R=va0U@>@OV$LCxXeEATae15ZT$0qqLXZ;fM3_ffX zxudd6u9+^EDQS6mdFj%nOZ$M^O`A4(G&kevMmg-8u5v%dIhV^U@_3+a;vH~3EhzvH zerz(Yv$L6z(hVghCVl{J$++7$m;JcYNby@&SU(zo(Pezz59)-Qkso^K9k!GPWv;P) zO92*B#)Z$D69CZXZRB-#L3&z`xI)CQ5tDQtHr>yN5hFawZ>70H0O|KJ(zQiAM!xa+ z8(8I~Qbr?h^1~-+L_EnM@@-i^M!+~Gj*WA~o%)U+ODTYod;sSyD04m@NDd1N3)6e{ z?CE9I4aw{$H#c`6{h(U;W3ASI`O1%cg{e7L6PLG+Ro7H=f+Wf>7PB>JpV;kstO>CC z@L%XyB__wlxngoxS+#zNh+_fdihgve7sxnJSy@@LapT6};8=A~CIz6p)lcF7>z%Rw ztYQOqE9QhNf$vKy^GyhnIGDTAY3o0jyF&HY#g%z%fx*wF0GO!DEJ|>;7jOYE{}mGx z^S;$|RQms_s;aLQ%Z&}rSbxN^DK^QM?x&2bU5zBTCCAA(6(Ii92GwJi(&%?#;+s~< zm)Lk@BDKY-fZQNQ#c642(^cbuB0p_M5qq_>qhDA|-npa3Sxqa%D+6psajXSF)zwvO z)A4|2$+u{kLd}ek4`)t&f|q+W6j- z0PM_|$J^x0>?nE=#aBIX>}4@6A>O!+88fESjT<+PE9Ww_xSxwv6>LSyhjt49D_@d4 zj_t^t&7w~(WgCuu$v=0Nd#hD8qeFL)eT85DHFdl`B_vr><7ui~v0N7AEpW8vVEJ0hJn>BfdHEZ4SI_DI}ALlgP-T0h7K zHXi<(x6K&=Dk>^!LPJCU-69i`0_@wjZy5dHvQ`1m(ZtGVFFh9YMw@u3| zsZxMNix&M>Oifz~5E&Uc*clguAeCE~ZdV55O5$DRdaPN$5kBlBwM|PPR=S{|prEI% z3b10uipNP|%|RH0jr7xTMBJDbB3=XePP!h6ISD#;^i-^-6*DP7X=!QY#EBE1v?{56WdhMqlpwur`B{lT@#wL)Sb=014v;I1?hKJJVF ziCMeZ)CgZT@jD+Q*6Y|m2w$)FG2(j#Hu$hfz(yZ7`3D`FM40>oy$X+~mWiZq^wQN!a4U%W09`Y}ytox6)@@>Gjsp1aB6&4H(@B9+rxsS>y9hrkD{m+6AQ@Wv75@>#&X6UUn0?$%>?%Ou~~$fQB>|XVzxj~G?mf5Z1w?P7Icu_AM|CxK#VU7 ziKQ}@Tni!CCUh*w1m0G0D93RDK)jrcOG!xyCywt2*A|QOVv)d$y2(_5}*ufmkC#VvUv_!U^}|q|YVN zdC;W*Y$RUCQ^@AC9-Ud%V-9Ts$OW0|>T0%j?b;8)G5P=Y)>g#YFI>2A1f`;vw4|bH z0&tKBuwo1HRRowV+)7ZiQGj3z@_kjv_q8NH!2$9O&6BTH0GWcGJ9n=7^Uptj5gc1v zl7vsf7Y|*&d^ydf0*IcV6rqv)C|UY(%-*jqKoGf`phlOY6u`$!0O4M22w;o+xmL(` zMgWwVnVA{H?IYmWBmgTn8YbUMMVF$YqUBnyifD`hs)HjT0ukD1{rgM>Fel&WddM9e z^i>hS7+{qG%!$)+zi&$b$H;eH0Nlok-^9ekU^T3Z;8=azyLT_X>~!$p!4DL1puuGV z$e3`@Pn~?}|D%0G3{WHAw~2hE04SRgz!~yG5=J>JfV?mZlX%OQFaImJr8sb(RRP4{ zpu>Cbz4x2z*RK~l>W1tRK!|`$W@c2A8{(M{h*ywrDu7HIeND)hutvTVz!~zL5PRXyfA!T@F%8{8r2E#l*Is)Ky`WoRVPTl^nF#g^u*-5TMhym|dzooYzJ>MsD9ASz z06Bbf0=SBNM+Ff1e=YWpjg8$-oOT!7+TKVZq(~2L-@bjkV(z=acKP3Kjy9E%|Uyn;*HgDd% z2wVzI?c0PKdSLwc@z2tjpxoY+)ENN)xEG`A(KW&$^2zE$5_FaVxPW{I1(3nFQm51X z4qSfv>8JNPa-$@_Mu^IuM~@y|CYIq^OaNt`4sy-OHy1!H`>`ND!IF4QQP>DY54gkoLBjT`qL)Riji=><{%TdPj?fX`6c>3Tx+O_OP+0(d(WaLvhg zKmcz2d3kvk$ohW|4kt{QaG#c&<=sY(9EnG}_ew}em@5_{ZixT@+>tHv8&|CKX5_~^ zZuRz%Z;t@d`Z4hq78bSy+zAe~JvD{84q`!9%7})Pl$7K)H!g6c09=GPQ}To3nxIO) zezb)Et|C9!z8=6AUdV0d_wL;r1Fx=j<^HyM0d*rN_{geNt3JVnNw#j>MlVS|xyNM! zND;6YqDsCLK!tpJh znl)3RwZ3Th`#ocJ*~5?s0b>4~1hh7IdRW&f>Pw+5p! zYViPF6n-#0J)IrU?_rzvuVUf*mTSPWTY|8CORXXzY6Xjq+s)g8HkrF0#f{i(&6+g} zz>VOjMV=?^Mt-eB$BrFwUCR@(v9aM8Y(N7Hz0L0p#w66)vuANv2+PUI!F{rA3aB&c zjy9kz=JyQC=?2X8M@B|&0Vm)_+=|*_|Fq%WzkmM+#M0W(>2yR;ZA2vKF(C~QR>FGH0JZzw5qOy;dm)D4tl$2!Yj_%O^4p931dU4P1 z;SL=-JPQs47wuZo^{9y;gYsj9r}TRL0U4N4(bo8cbZ74RS3Hc5?b)*jZU>i{Kc)z} zxBMTLaKiROh77?!4B=nsp4_{4?+I(BdH*rUgJo3oD zb?)35A`G51Y0{r*R9FCC*%o_)((2KM)YR0oUwrWe23dpAMzr;IxgDD#bm`Kib06C1 z^`OTefBc2ryLWGw!*@*6))}|fZuNDduDGw4ZP~JA=YRnNu&Ol(ZF`Wm)<(Wk1f*dd z`}OPhD3t?{A5Wh?{fi?P3)lXhp;~2zSE+E$T{EpBESy_`f2@A0XP) zQM9pD|D_=YBKJM^*kj$hb?b(ICjCvP6-x%LaS@ltE?m-Jm>{bTRTd|41uQ zht;cBFM8&gXZ|4E%|O%@brx3d(H6LfFb5-hhTK4$NNMZLHW^QvKA?TDuaazO=@1&@6gpQS&WUqV9i9^wKM-|89fhxN z*Vc(wiw)??9pO_&wglHSm`HeX;J|^u4+seOf(AMpl9G~+;;Mr3@^ZewE&p3UtUNJm zn^>dZSr?w~!ynRDSy`W-pI@1roO~3=#yM~lW29pNtM``b5s=k5x!TRq|b4{^B1?GF9`<{9 diff --git a/app/src/main/res/mipmap-xhdpi/image.png b/app/src/main/res/mipmap-xhdpi/image.png deleted file mode 100644 index c0de9c5e4e15b53fbd1ce91a62d5afc9bf5de122..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 893590 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
ee_9MMhR}%rM6Ex zuf}slaR-Yc$_VA*1RL{wVdj>bK0({uzdBNx~RbkJAH=i zhMns6TZepoDs_uKk2E67zpg1n_=3U^b|*me&*Z-fg$k0in0U|6$Oqa&3be1&s*!pt zRw65?jmh8##Ztqx7Vv7@P_zott}XM;nSVVYW1gK)#!_$VFy2Yg{!jpiA4hVyn#I&` z{}{qnJSqow7F}ZV@1-sy z&L@0=i~~KfTy=2qE2`ie!W#pP;DK5Kp<21GHJRcfHOVf*Lz75D;a%PiwqO>wi$@O; z^JdF5f||8RODwU2BlR!2i0tHz48@W^O$YOj>((uxY(>UX_S6qdYuRLEr`a5PWe#P@ ziNI4|!1yrYhN9=T3yIzGBXIc)0O`}sfQP$}J^RiA4()Dof+$gfO`pg%1=TwezJBXC z%d|QQzd;o}6ZCt$t2mVu4diZfw95Xja%Qp+DI9oP(O;#&7cNX}zO%5Dmh_jf#(0?d zaog$Y<%EKdO4!>XI;0xj5=Rw=%s4SdHXeETo%l$hE4lmA=qI~e3A`7}xQR$)Qc@cC z=|GEBq+Z@(_ zdUAg%bIf$a*&P@*d*+V~SMXeK&w}AXGPZc(YxK3F9g&6Gg4-J(c<16$kH--C^v;B= z1qXRX36!Dlp9}W{PvV&VHfX&>tXvkrwo+QAbim3;52Y?*d%W1r#cRQ-snhFzi+z8(OtYIN+zd@W+}N>~wA9$%GA=@Gk#i(a zVo4n>bWeBgv}gbR)?k3!LjP?p5Aru=wSRRj+rqI#Q~x7jHf+Aa3~JR)Ypw*9VV6_? z&8^S6NayR@x!B9y`nxH{`vk=+1qSGDJ1WYQhlEswb2_b-uH|z^qsF%WAJ$%*fgHeUeBSp)nKLwp7!Mh0!|{r!wn)6if&TQY+p z2A?k6g2RUypl(o~IXu{Kz z6U0RR5bTeg`*-BrUQNGbyPUOOr@J+W8)Vp$uS<`|AK3W_yRCBc8-7(?yuUOfxr|#s zUffnNA~V(R%d<3_n}X{n%PJ!gY!-6w?W9FH^XpaP7StDkI0uR&3aM;4@b9v2hU-JE zOq))OE`zEK>SB>=)A9HK&@G+)sZ`4oOx6X9U{DbrIX=N^IOavl1qF+tKsc&InARFm ztyaL;Uol4shK_+w?HPdGzhf|-M0!JCWTtdrKEA41H8*YktHF%GD{8P_^-DdvfMOZB zPz9#1>x0Yfy3D&p$Zwp0L7FxgBw zIWHpSm;0mMlTCq#H-{D>#bw#=l*&~bP`IbomC#E$(ouE-uOvu`*9#-=`f%ws>G%QO z`0YVYnYcHg)4~;Yf;?sF#I6vQDx@zz0HST*eDJ-2wd* zbWGsPe@~^C%@7D)O++^H*^$1t4A;iV)toNyEbdWt#^p5qdUSc1k(?-eRnr&~xX*X8 zIFDI}+T*0269>RUd}n&LxZY~_=3C@Ci&e6W&gd5B% zIK}m{LxB@e=A2P6#0>S#O|_UtV)I@^5u#>Xm-*-{i5gI+fWRxvfe`N)RM@jBB%NwZ zYS<>b7%F@zM*U~uZ;Nt*-I2}3kkq4w;F7qnBk3r7k=oCtp0v|cd-$gJYUuLFb*Q8D z)_p5shYPHB%Z)UvyZ_$#@j3aw>uavybJYNbX4dJ%`H0JsKI#1i-AOYstAw89lC6Nx z)?sQjFN-_B<5wXhiXk^USr<+4%d2svH0#EV=a;)gIQaC3+QozTl|qkK0bnc3b=G3q zAN(k_fqA~+RM|IYWvnL7^_hW=3~vdJha0Ig^z;C$VkRz$b`eVW5}-yu@yUU@E-aHp zc9o5h+5L{1S-D;`tvhJ)Qyvkv#n2U&04AFissUN@m8SiHzm8)3*4a2dF5lW_F}5HW zsnpFPk-4Ulr+as0DqE%en{BM?Yl-nsG+DJ)w-|yldDPkJJY)12VMIh69rr#4W6vDL zF>7LZE)O><(Ohg3oo*Yc8zzPDGIx6S8MRsz?W4(}qTDJ;>4!!1(GsP=uN!l{1s?DL zC2wki!9Dbe(Y08Q^7+ZtSf7INwq=i>&g6TOHV-`QXvCK3#w&eha68p7o_S}4nAxlZ zUyvft@EOKDD(d40B3y+iAT^5DHLLCDf}YqjWdsyKKW{msn++SsI0KYJ9eN3Nc7Cnk zA6JsC9<-w0R(LN5zpmC$tOdVTM1dYbFIiEbxBZ@=2LafgZu`NK&PF~HP-rlb7oU9|-< zP;>j1&kOFsfc2`LtfjGbb^S)2f*h3Cx9A8V}6cYFV);m5B zhFNd$`!ZqvaLm$4Ib?;ov22%PXqhz~F+k9(Qa|Yw9#tB{ic2l>bQI>IqQ`ewWpw9# zY!Myl>(l7)DCPeeCoBHq*l(!Ws&Mvv741-4C6Wm#7pGT!q>43tlD1&1otNSmA_%ms zZ@WEV?aV&g8Qj#$VR7WZjwo`7(3>iput!Z`@%{|@22R`WRMZ6$ZTUD=#2^_~v&kXm z2Ht^9WDL7neJ&s%@0i{2R=bpQPV6AnwE}U(TPlOy1+VJBQ_^7AK8XdkbEi2G3dL5s z8@8n%smU%l-&Ap?b`iTa23G(^1g4!FGn-(yy(0!h+&=n-Z7n9X$&$6|?icFkw?FSF zyy8~xuw)d=DX?Y1{(aM3lr|g6d=9-wFTPO>!K$y(@?kUkXTJ0FK#|OqN6hnRQ}^(a zTLrbU6t2vH9M#So<9^aE88mCt5VRkvTL%X*!*xRdOh{*pOxWC_xGal)2u@4*_hwtN zsV|--945lp0W*L*G*wj*(z$LsiL}FoHi$#$2~e@*KcHZVui-3 zWQu~RLB7UAy_DZ|YU`j6GQq;mymG^+l>_7p3f>j(8+!xsYN)fW&vOYBS0_??@UgS2 z=SDE~fUAgfk)6QJh6`3SLgk9D4lT3ug}oA_{KX#-4NvKqj8z95``>n+-W9`J%@W!^ z;|zS3j9aVVAgTmCjenHN`?bVKW}C&icxWR+6mNbsK8amJkfNt`2)d1^bof*-F)Vj9 zn(JG!-t_atUv#KOSk$`(tbi-9(&u5~=x)W4WIn*UMxUro^=QD$d6o=V%Bd(uoM%fO zLIipg+%#-CT_LtjWV`F~dCkrg-w!|S(C?db_v8#k^M5g9V6q+|I`}5h@tMSncFsG4 z5TJJ(`Kr27YKc?+3-gXB+*p?kA0!`DyhWR^ZZdVc)&78T?=qi zv{*Zx14P;J{>^lWBXS_#YqCPv3;@hM|^3&v70`PKto!J0VY*$+;~xR(y*7XGda_khZqO&1#PZLM~w z%w%8@5ve-<`_A5-naM)F8l5{?ZYT>g4vsyY-ukVskQ9A5Sm!O4O|>PRwEGWR#+M&Hpt z3OQoDoq5KxMT>ee-hFI+J?ef61GZnxt&e{QI^&7Zbh>P~XuvK+jFmTdQC0Hrc6i~| z2u36z(#`yJ)HfIX?tvb@#DY+JG^IE$$!E|}U8slYZg|jAMf%!z54yN`+dijwgZ8|E zqr_edmOl^q?*=x?TO=YmIx%L|3E?{kTY$@d_46UV?PmzSt;59Sgk4%&c&PHc(cc;6 zE%R69Umk|qat5M6h5%nrLSE@tpAvnSiRk9E=jGD6-fX~~fOzOY_`(sgftc**C#tS> zT2zwv-|vu1-bIWV>W@JXCBe&M7Un3QouD*fF>OgzRFZWa=fnwKz!mYnNWwx=jhZlh zkgxZKGNMP1YdX0e|AKR!!gl`*W#e)bF7e9yG@57lQ2ijS-$r*ry6i&!4`G0XwH))4 zT-c#>!YUha*Y#g5a0!m4nVRwUQ5joQnO&vW(0IJ>%|L!(o`6d!GKB6q4)XJM*8t{@ zz!alp5#;VUElFe%ujo9L(k_9fG`e}p%wh}nXSt{#aTiKNP__al;Xb)JE{py6#@JeK zv&WQNdC$&Q_oZH`L+vYhVXNl!yU26477d0kg=gVwV+WNd#^RxgqY@LBIWn8 zs^2<1bPy?lS^enHx=OfrJsb81%{g zpKgv)dCGWkZ$CVTR#QGYD?AbqjObdgaMEyQTw&#~sWw!>dK&@Ra1e*(T?o{d?;#_2A0}dFg%azWU znn{bTRjaLz??DE$EOb}R8H|kA6^iqQZi{e;4I2#%Q#*|{o${u;{|Norb#X^BPgJGvg`Bvmg=gC(&zWFq~aP1d%lYDc;#eyK#unC$Eopp>Z|r60Kf*# zyp!jd@q^Mz@3$fsEJ{ofE+TN~Dm*{k-E6ca}bzd_CfS;A#E$L(@hqT}~^ErOLBd z{|cUtn>?VAWCL~Vu7!EQ;^2g-Xrsuq8D++nT7Oxf$=k}9()3W6v2uN?3s!GGddw)o zTj}+|5SI^0NMFuuS`akT$)wR-q7+(nJe8M;w3pV^SQgmb#QgfAEfjN-u^*wnTOA^P*J4pyre7x9*g3`myMy zx}p&HtvBSwad)C{josfHyTSYd@DUJk{4-1lsH!0Q^!2%2@rwrk z^IyWk^V1)uU4GXWS?e!Po5wZl!Y`1X*Vw4{yM(uL2?2q}FiZ?~ z&?e;55GkvGiql+VZkV?eL&oHN{hC(qfM3WdtNAYF;s75t}5RptFJ&_}gIIlXsm;f29=u?Vi> zGtl)as=w9~yzY#ZWTACK{gZp^(?bG+CbJPM&R?w?kn*bqR-|*UsxcPF@V9sKlHC-= zjF&zHNFzHk1>LLWGMH{eFHqt5nU zn!oX}ibW5Gv?mDnab!kdyP(NC$kdR2e9+&w%RvNknBX@FqDic z5}{6P_k3!y^X_sSi|GF}B5E(%$+be+(Rio4%Mj`X*n`F_h})~}MLl-47Wf1 z=(&a;M#NbrEFz@{;OCDqP3f!WNM{*s3Nso(pDN>zxGxt^?5XH>qz)6wz6ew_+**ZKx26> zo4dTF3z4$-_o20L1gr;+1QVbcu6y@fds@qdU@A2z!4ci8+wt8#YSrSNZ)+Nx#LY3U zG`T(WvAEPNhzHlr-R6@5`*%9n=b&)!oy2tAA{wyWJ_185%PwIeBFvicW=LZgYMF_n zs~lTo1fisZG6dh;8o0ZAH)(MdS_CjBb7^uqG0VNM_+R38LjMjYu1ewk@ecOh?3~bW z?DCyYVC9*4T)DQ)6S>Ytzg1Z)wcr2F0-#Wu5wq0!bK=NTz~Yi6ylXeYxAsvv_3gkZ z=|rNS7CQ2i4Ngo zU4pt2$XztgNlG8c)(7m^qiab-X=a;X_xdJtweJjNtq#3h^oxuqA7~}5?Ru^Gy2baV zcP%A=wFo(5KS@6Xi$9-5g9_Zn2(=#@k?aM%tb3b6X9-g%^85C5?iMZFqOo~3}aeUKyRH6Rz^8xJz zk?(S?;#<+><8>4OPUQY>?{q+SJ@EQs)u)H){Bjd?XwCV)Z2CG)%e*v)Ix>*fO+9Y4 zxu^572GMg?tMbBVb24**n{f*hUki#wvs+uItx(}1dg>_ z*3~ofi$EIDKg?I{sefYixI^OQI1B2UJv@h6+6{%$9{_t|gX*urB)P*{Wp#phriYE@ z&_WNPrkBfdRDUp-tmbw!qD(ESTPG5M+tc&;eGJWX$M;wf#6u}-gAy;@Xl2ZTAHvKKO)9$Q13XJC|To#uL#y* zT+m-r7K&9I!)-5!ylQvIuPQSj_d}-G#syJU6(|M(3X_|m%sFr!T)OB0P*Dm_VhIiJ ze{*2~XSgUi-0#^Eq?kM=If-MUMO>ldk`4`Nj2x1U>P$ga9_^VG3da!4~1HV@kQV=CHw?gMAb($-m=soQ6cX7!On(qa^Ksosl)zPPwj|+QcN&1Dx3`YE zzbW(qA=ObS@9+QZywWO{-`aj5SZ~16sCDq+dMPma`@r03fqSKKJ4v~n?8F_kDHL!3 zKd1qJy(H*OHp4#Z#Y@VTNg7nr(PP@7yOy!Cp?U5b3KiG$n6`qDu(kB+aTPdU^N^_U zJ)o9f%tu*KMGD_tE*B-+e27vBNq!wXwdayVOEI2=yV=-wGn@R3+Q>^!-Lm^5_OKPJ z^n7Wh`nyk)T?=b(Ql2y5tU(C|7+^EGYL0vi@^pSJ8nC^t?1$6rFUHz^(+<>yZE>+>)AuX-(;f}q!W0lT75b=JVG5}tlp6w_)xF?$|_ip zQDDNY+n{uiF@SQUCflxRH_>g0vQSqqL^KX%FBbLbQc zwj-Ta;W3JxqKM?MoRjgk5VfQ-Ko%=1h>0<8?fDXpGPaYB=#FOaD)@9f)v>=X)@}fIWc_ z-v$*)v{mkio?%!#$rlV-b_QR6<7d;`(fjGA{eIq$1)CkQ4f?Yo8}Wq+ADvaeSLO4s zin7VFvgi#aebxa{uEZ*;w-uAe0>HW=;IC>>zxw*?hp&2>%SAO6Qb`SXXr zc-LfcH7T$L(i`w1HFAfhfoH6*%)^_BHJ&DuUu6`&*QjiVC`j^omW+QlA?#?xoQ-}?7q^eHF&OY}QT%O{pG3c@A(_sT;=BOnrm4w7 z&jdu>W21K(r83F9m`uY)g_cPT3U)v3_H06!tl|*;`_@phx&`-4q=HY-59+DE@(qI3ku$_ePFLkysM&8T zb|F^oIx=5pSC6QBVa-$hOJFemCMG{dN8WIfSv|swjC^jF@?F5{lZkU&R!*;TyGK?Z zO)@-t_+4>McC|rlv%R`bM=_yV#d6o=bBiaxkV(D|=_W%*e)G(nOgDH~)OATIcCb5$ zt_h*ZuUJ1FUm)}==^PQ54D8eux;yF10>k_|+D9IE{4+S;^QByQeW0h`CCwqFutaCX zmHI+sSF_V{6MtIFZ{*ywOTZ)SK*?%IOb^X#jLBacpzCdpyFq7 zg;e>9>B7(A0;;ySs&iP0T2C_W85nr|ME|w&7BVPu?nnHazp%*>O7g$`wyy;dn4g z>PGFax<$^TY{$ttiH?9!A}brZKH9UbGPRFKx8v9OvAhC(GVsI7<=rwzgWYEX=h0C| z@gRq`RuVnpl^&j(CGTj2b0TX%=L`DPu30kTup-Dig=Ekl_4y4DRYgN33o?p2@-0GRg-pembtr z${wI2h{B;!Io*z*lPg<&w4Oysme)_$aZF00lIC-}#nru(~YM`4CG9nc@PMVQBU1vRG9jBAt3IrwWf_PgH z!}fC>ms1IMf=mD^lN=ZdkF7!n!x^0J!#IEhkM!8>QFoA_aR=dcwJHa1cr~L@VpwpT z%;g>Nzt80}G&zppNg8O*N$;ysa}8*6cCn78tUbF>{wiwM1_^7_reOKut%tIN%Rj=iN&l;muX^7;OlsWnih=u?j+jn{l|jEw*n1VzNwiN~6}ZWv@!LeP za}BujEjA!FShsAxdU*9!w>=b@@2b$=F#2<=AF6}N{+VDlIH{2^@xY6Y;zLEyh^})b zyK-_}dh+37u{_UCxi$4u3TFA}bgO9hfPek%w|&0fj`W}W>HqogKmFOi-*571sQ5<= z>CmVwsaT7J>o`3aYP^#(0X#qG)=%-H5jDAe!bvl7s<>=rH`Jh7GP%M?Gj(*LC%tB_ z4ZglBBvpI z$tB$rkkwn)BOFe}Xq`*3dfF$e|71Elt?>#@yo%|i2%Os}Q<^iPK<^*LYgfHsJG!TF z=SMbTn@yAh;3F^2F{y>?8z$Tt=sKsfn>*A+Rl*>8vIjMKA<$v%Y_K}R(^=E&>O6yW z#`kKaa&~qt{ubZpjQeSqR&OgK*O7pwyoNMDvg_U7C2O!oJ}A-V@a?)eYRI(|57f740*lrBoaOJ{LLEUje(qJWSWL??ec zvDtibD4-~jfZkJKG~}JOaxs>YN4`8kUIS$V4+DUVze7&*Gf zOC7sxM~bCRh8JUf#a7Y<O-`qLg&z8BKsDo)LCR;xlX-*zmUIVxB+~D| z!;z2XlI-i$_38q?($#;kKk^21TcPiKJ1pVZIoQM`0Jd5mJlOEl4|(aZpu^GY>~6~K z6Q0Qs9_-7)OQr+?6C- zzJFhbkF3L8Rx}sSjuq@vY!z2x3t3rv>*2*G@Df`6;aQs8!8-~nVX>l$wIf^9zvP~c z^@jlPa0nhF{XGAn>kqGm(|B~z|C0^Enaq`eUD@FJDwVU(Vz6_1^i8}9)U?}2bl3Wx zI?S)=o;Vp&kWnM5;LgEYydYzr(e10#F?2mIiZ%8)*?nt|j~rnQe)6-+z>dD7Q{LK@ z$rWZX`q=O9p?&w6H(|6!EZM~Q?GuZZ{4kzmh%j3odt9=ItFK%Ao3*Awuxmw!qt4tk zk4;#Rj}E_0CXK)DI+pA+1>1CX+Hviq~hZKDz2Eot?b^fbeOFg z(|~{Gr7~NYh^x-QAApKOlyXG*T(+G%23vNHx^5SJRKv;)EvOR+ggqoWseBE3VC*!b z&bWA-2H$Z8K_SE8HzOf)8C_@P++bRTaz0ujad104eJwc2G1>>lrOzt5Biix1SCYy) z08e-|G8yZ$S++(fqMHz20T+en9fwY5)F;;{9s1?1Ourp3r1y}gEnEe`b0P_S`&$Jl zgY8eiDLgQTap)(&O0h@@XaN~5wR4>)IRY7*qQ{J!4owc$r@x2%2h_U*&B zy-4QkZ~x%ox4nw^U;N8|`S8cT`)NNKe#Zby!?+V#TeRrprcI$!;j(22Ue>bPEITrZ z9nO!%uiHZXz&+l?Wcy9Zs9S~?UQiuB6GC0h)Nx&|{9m_o`BgsE=$NcOp3%Y@6!Mse z7^vH!v0E153E_9`G${Z#9FDi=1tqpLkhTj)4!4uq!IU&q>LSS9PMRJjW;*3>o7Lv# zs|@r>;?eGCMf3G=`y!u7;~AJ9zJSyhvhMAq$pzkoxvZW4RNhZ)*b%?`SvRee39!K_ zo&1L2V*q!(-)(Ub3uUzENd`IW<9W!v^yv$`Q`jw=76c5khnoq-!JSZ;U{427r4D?$ zNlBWs_uK4sc8ZTJxJ!GmNoICd-+9&!C;iCf*-CcWf>bilZ_OY0@bS8NoIX!p1?-v*dn0G%1NFWC;}f#pyV_#(2!G-$6OBwDrAx9h)t}iR zfp5#K9@D9E?bBA1lYV|-hvYeU$2w?xIm8AQQ9pV{jSOJ>6Z>ov_GAPjojh`9lS;J* zsH#tfsJB#PW?`Q5w>lmyyBt|6i71w0;l!V|ExbPWBr%Mc_`skqhU6YuPJeOa#Y@`2 zDVWGC@h7i$7~AoqULlQ zT;sHS6*$8{L++js@~Z__3r^m0IA4Xo)%(%uYw~3E9i!QC94`IIc4>5ok4Ic%W-$g& z3*ZP175bfI48CIwj(jJc7D3P?vODbJP~z{|A*99P@DGHEjrK=-bH;AScU2=ai1@NC zN-}OskwF%E_X|smcW%xn_HOxZX{y%(Zj{kv^S*smfA5H;1LAwEh@$ugbL&uHbb`6+ znlZu_D+Y5U98S2$ul&?lC2TOcKO19SDj?=E`5 z#~xK-xBir)3wLrxd@oNdZ?cXa;uq-5#Qx!E7xT$>t1eorH(-s?SKH(A%w+G3lgb>w z24!KK`a3(P^vTY!_NDadYV=``U`5fUx+?9f?9n;YY(xGtN~5@`trA(Gc|}F*Y9R& zhy;w};7rG5ats;o*9E1)6LrS@(hJUPd*QDl4#HpzCGs9bD3dwZHQmL5ff?WO{cgDl zMrXMlj)K-MjMWT{r{C-O@!ikWv&xY^WH*Q*-?6btP=h_e9c`1WTB;+rn1QB(g}>Xt zRLstoUp72}?fO+OX8BdOi+=y>zt=6Rzkc}Rzxs=Z|NdY7>xbXP-$aLI2Eq7Ai}#Lv zD}O#jTk%y_v{5ED-M!raEE;6YuV+x%gr`yKtF~9pGZdkPj}~;&y9H2VD`eC^6T7MC zIsrU~_I;CgyISP1Yr5L0o$MMPgFpfOb^1>9&dc5powF;q8&qiT`C+``|3fjc=NrrO zQyHF3q?&{des;XPY{#>io*Vo+V(_Kai_Sfj;AKAF#221h%J7BnFZT0ghv^a6VqdJ7 zXd2jKY~ZQ;GNAo^^t@q|vFXmnJcOp_2ieI4*4rZuoOGIkfGy^lLo#_zry2=vSTr{=O|q(P})B~fRQy?D;&s}mIJpWnAl_QzZJ2fcVN#6znUKxJsOZf%ElYRL_5|BrP z*c(+|6X65bR*vAIikY)LkJlJ!lZ9a1N_l9Yb-_AyZbH)0=E{Ai6Pa(>wh)<3 zTFNOVOb9IkH!&m18i-%&8@o^81s~~83~oY5k(HOLUMj?w9bBlyx3=_9?kk?p8l-za zLR)1USG{n3(}>hU3W@tKf6o#XOpnzWqVY$9$IIl{J2B>8`ED;I5*lDw`DBE6Vqm^P z>(X-*N3?23cemcupa&E&aoSgOcGur@%xCUU?0Gok&oh5^0Ofa|P-Xg+{ZRcN8VBS{ z8!_4(?e~!{++;OwUSAlkO~#Yq$Q_TJBu6-WpxxuLO*}9`j0pKd}JLa^th5(WpHH9e7 zcZ|z$@R?mY-wtlEu`A_o3D|WmDB(YW2kUah$+e)(&@wjZGI$C{hp7=kQ75;G)5Sm| zKoo`epubxK$$Bv|AvE~kgTX)}24zkmQ*!K9pEAj_i5hyVNCB4Q^RZ+gH4PhH2Yyz?>W9(*w;CifE#Wz0?(l~x{{MvX?&g7&&PjRl-j zN~d*<;9$>Qu;5iuRq#t^N6#yL-HzR>K8D@icx8w1y_du^l0lCys*KwT^4MhZOxgWV z`d0XZAN}mS?fuyB&z>hp-+OYPA=v6oQM+f~-n@GFgYUk7`0iJ~ZlUAl!~gupfAsJ# z{`}u<5bozDOl0r`EAi8r+^CSpK74aZ10ZX{+Fi3@zX@TosH6Ab4vnqUqZzKjn==0M z0v$U^TYY2hUe5HfI6Oa*5WV`MZ;Pj2b(<^PPj;Rw-)?32;_t|8Kx`rsm_{a=erCdL zmv+96k53$s9xHN~jDaDyTUXg#qN5~sKE%h5zl&RMXEi}xV;GE1J5~24QYSJBB>M1w_rB*JBW}Vi@=g3UA(>3!1SjfE zYzmodQ7Y$sMjo2qEY1?E zm&mlRkrHCk4&>|N+~TUqn!FdCZ?F{p8IZFZ{jx^^gv}nhvBGaX;2 zu1RPhxw;s>x?>Wl4x1#36LPSTqg0qxZg7P-*l5=0z!A^P&CaKPs7)x}Ko3t^LED>z zJ3&EA_PYEN?=E*Q76-zq>x%(Cw2=fA+G65jX=+T-oAce^eO+O-Dcz!J=V+-TX;*d>LWb+I|4YkYg40(q z)g1>Y4X6X%2Cu=8&=Fq)I$8hW_xO}K5CqQI(}A2X4H`?vB4Q2or?~2RSYtx=fmY5w z6^<|%b~!dXJjKKfdu#_7-D95R?4HTkJ2s(q#(N@?aE^$=@J# zwy9yZL$MugZA&n8l+>%CoXaO$T$f#6@q5|ho;+mdtK>OeDI?+3dk|Ly zb`d0<%H3}@8p~FC<8S-|m2l}yZ~P9Ip`|A24h)-}v7zfI)$wjzS39|dx%%eg|JwU^ zUT%_fY}w*K7&E%qNAo23D~ZRfxbf@8EdbzO{6R$_`SdZ>;plE`PLPa27n;2g?-Qu{BD|K4i>J+HgBg`$@29Fx@0Yue9GaojrFof1kiP`pkX7(r=L}k69E7veyyL+IR-3Ak@B(&g#%6O28ZIc{vIl_j``DpBwj+A8s_gU=Pmh z5Y9GBicRr};wwKDQM|6duKaLHD){uvNfrvHPkEa4)BasH(T;_6-jrY5Q!o9r>dueR zqI37L1cr9w~7N>ToL532B|1En6@KY4AH71@UO9yF>JX&#KI#IgrNz=-J>Q;DxC)<}Ei7X!xG| z8yy{eAivs#Py>C|Z4-MuX6Y^j(gs82KW1~mf}fv&0DC92lW>=0w3*~i7pUjQ!%hCG#Ecw{_&+as$+y`GTs@UNi%yL zSi7Ia5H1nH&19`d>rVsPanJkll#aLSqyMOYnyi4~?t15Tu6y}S=fA7dvXe?TA2g`A zi4u%1KILaNGMFBn1O=yKI8vX(+>=W1r%N~>#FQA3X+cg`r#?V808?jn&c4p0p-x#` z*c~3_ZNO4KUrVkH3?x!*_kGe`5ahVpn}{4d*90n|BA2}+Vae;-12#S7(cU?`oHpsi zLcrx~Io6OMaN&@JZaQf)-V!3T1(oc;6xx5kqp4$c&j1gJqq7KyyL9TXmlUn7jo$dI z%}U;kwZG`~Kf36h%B(Jzd6B|FLSivZcDqMc=K7)pyP$TwZGI2B$emFa3wNKQtzb7r zEaFPc478kEKC#1H=MIK!5iwZW?OQfD&T9rPyyRhGPPp<21_rL|Ij(>Kx7L1i%LiCm z+YYCE<~Z49fJ-1e(ZTafV#GmZ;NfL3CLJI&G)lAAIsO0jZ2)Od7m2@}o(SIjG0}eD zb^ZuVc2}Hgkwm&-cF~tQssb5cZgF4%aMQSadkK&@i-k=B*nu3CDcTp;2ApH zfzLM1#8Gy-^qZUlt#s-rU&EmX@15l5rgWTMLU9JqwG3zuHrIAyd3fG#=jiF#$4%_; zJrpVOOb2beW1OTfFYzH-$A8+ne%eT#i{`KyA(*3q?@0KXUbVHA=p&!J7O}G?>{HLH+3XV zUHFiVXwPJBIPd{Ase9F}o7<^v+=wQ;ZCZr3c0U+4@B)-)wfPxyi~qubed(dTzN)8? z*t^^kA77Et7;Cp&kZ3*=PUN7ZXAXSUBJZ{7kyXbJwv;VuK`tpUyCGD4&uO5l(09yNOzOFJ5Sz z+e(cnMKl!PH#r~_qr_O{XH;c)VtE_+l$&XnJC6q+6P*gIQMnwZ0Z@q;hd!Gr$2%@Z zaCGMsj0)Q1*(@JM2qy@GfipuyBREbK&`ggyu9EO@p-!x#b`)G)ghz@K5V8P{WU`XT z;1rKJ_oBZ>M_vfzLGDAd1FIR{uH?7OLLL5*H6ECk*2$7(*LX{n^*_41CMz7~xb(f1 z2`+PN#|8E`@$=%FBSkXJM+O#ElqR%V2KxYP!@o4~jod0-C%OMAZFeS^V`qc1bMJPj zlaJVbh|@~V+dhVnes}Ogjr;o=DWs|%lSku8r{gCRrW0ed+UjRzIyeJV6GFE&Ji7ln zs`LEhZD3vuxi{O&RX=d?@V0IC@4jz$@HhPs{kwM$fBKhy_3$tL^e@x03El3~6W=Em zJkLlbb|iadm|YE+4crVuH^C@o-2&@&#tyTW809a!80ff_tvgjm+vLq;X}4M@tcfLi z#-_ZH?NgB2U#cvNR%f@=Ws`|7ZXFV!}9 zs9t1(O_tDK-3a!_xPsHHpWig>t*7PvSo`$O7GA_(lRx@hUH(j5bh~D|#coHut*DU$ z589E@&WT%D`3F3iz0npuvQLNd>?G^MU6YxP>KnKSj^0yUi}>9E|2|rF2l>*@B0eV? zlbsOIPRSz+_V<>jtVn%^%O-JQ|tTHdMSkp}_({A{PZ$4jp6EAvc6WN`D>RyK@*+e;s*WV=b%FyYw?3KBi zR+Np#j?+KZ_jiXks ztvR^p$U1QGzGLg;Mn~NYHlXc_ppy{fp0G*eZ~qm@oe+HM9B?%HUxIh)#!53#^xxD9 z8=$pcn^BMN#C+jJ-avR0n--!efHMg?6ie$!te);omakHt?K#)h~RFU-EGtc%S1po#5<(Xla%d6YFTAG8s}MxgHz4ogaliHUmFDUbwg3Gf}a1_yj{f zHopZS@KUm7AF)Ue#j64JXXYjDzT47qh@ZTOB``m+wGEb0KY9-<|LoDJ_CZ!pW zFYY+s&hqIrT7R#oL~zBu{*eG3Y$;{?T`yBKW0h#AAawd0(a@s4@YLj`B0;bB&~m6tN|3j!LDG z9!BTu6yti{_$9Q$OxSfq32XNYA8C`CXdFW^Zrp&^yPw@eolWHea1xzwv~{qqG)8=4 zBBH_$0(p259H-=2a7LU&5Z17uQ6AY;I*GxKGe+X%p;A6UH_(iy-8miHou<*5Kp$RblpM2SCdF5Z8-t`7WMJv&XWfFu@I2^}P65q- znE1I2x0RZd?&lZ=K`(Ie3;~Xz+R63f@Mqu-MBSu6JK3cIBc=^Gtn+SitSlm6lzEZN z&)VVSe3fm_PLrM9Y?n}A=wU*>0dREQ)E3c!ea|E=o%v7<1=l)Sg9*Dj;;J8lH>kMc z3tw7jNVU_GH9M*=1|tHt|0Gt&;^~X->E?D@6Xp-mG9i4akt9RsZR}1@@*=Q!ugnX9 zPOKlhpk>nWxH<#&@W68y@s-?C?b-r^*i_#Q%sd2-Cvef}O#8?-Ywz--+mbKQxc89l zaN^>?$rexiPG0b+0mg4f<(-SM)q&(@4s{0zQOKmj+~P|4R-ole=nWJZu3i*n~Zh5J5L~D zLnp2^9I?x2?CIVQF|8D@NbMPBvg;G~Bg(7k!QLoJrr)<@iLLivR~P2zcT!X5DGiQfsMPDbZ~0V^wl zd_>;0=i@=5QwC@zTFz<54n2Mbr{1L-{WXxK$Aovj{z?V_2VVqQy7JCpId=(|iB|3= zK3$_FHu+}dqjO=Dh4a`bE@(}ls`f_)$I6c##n6lu4~9C%dg7<%O!kVFaEw;xZr#@Q zNWOiRi33Kp(`b@Ym) zVlPbs!|B*venf~+(g$c`#kU1Iv@Hand{G|(PqZ5_lLo4oJ>>^d-uje|Vm4As7n|fd zcn2CRi2xo^luI->Hn6a&+(O8ydzZ*%4zDstSes~cbTKN?I<`GL2lIq=;Q+^TK46<= z>}agv`Lw-=NY&bn3P_cgfPnKOn{AR;&tdlieNOhP;l6~2uVSFI@r)5-|`1j?a0n6 zFQ(P=jsMr?W?R00e z-=NjkmoZ8$`aSWYP&5~NWKIWd8+p9nVz=>ou;94j;-7r?R<{FXe~FXW$6>1=Il$nF z;ke;6s+2fYnbJwyH9?PnR2{YORCOKj6eo8E8J*7gRvhfOkB9~WMgJ0+B;PYBp3XuMAjL;l!|0o{F1QPxjDq0H zeDbn`IFiq9r$NQ(;I9JTGK@28fKQij=!cG^Q=qXRW?CQDTh(Ehl2_5%#UU%Np|-*3 zym}~wG1>$+upytxtHh3{A&f$KUJBAlJ9KPNB?tyhodpby*c!X8 zAU*xSHM|YZz$fe8(6ojr`$jjc4NS=SIy!zIMJVv+`x-}+te=yMJ0*iflYW={Yyt!x z{z<1|dU(6ud;>ypAvmZ_D+6^j$p60HUMKRpp7YypfAjFGzxxj#9^d``;gA2~FCPB& zU;ev?ze$E~jog#fu8tRV96z1ON*0^V$){s-JD`CMz4*!`!|kFbgdH}x;G^C0nHC1` z@&n(5&;-Iw8}!`EO)7jI6P>VuiCA`9y0lVp!tg;$fcFf9_8)Z5);bF!K!@{!m;<5jTy z^D4ft>vXkmCe=FPE#Op!u(!Xy2D6>%_^JodR$mR?#My)+jFRMJ5wa3{LY|`0WlO8v zZ;%-_b@;M-2IKfXiiO)|;|#2DfbdM!uY{P&p z#WG=i9jDay9%HiiEENrde9w!!4R-^5@wD>Lu;}xm-7Tzkt6;QdnF=fdtSzc+@tOi) zB;#VfJoV`G37b?9X8>@V_ZJ-#xpVt-d0n4L)dffnr&l^S;UiF*pN;1Z>yCNGjDw`l z{Rld383Rr>=-SwPlf-!SuX+U=DqfVnII@qnZ}PF}MQ2rVrag5Tb8@e}#utstuk&@Z z_tP5ci*mvQZ|Ak5<*09~FEym-2x4O`{#{KD>BWn;4{yHixBP}4PZPH~lBs@ud2!TY zCHlnJ+em}gF8WCiz-R1m6sr6qK7MAVnJ3Fu)wJ|G!teEZ&P zdspS4oi+wPI^XG09@=Nct&^?}FOB{Qra%^S3lzbb46`e~mtf~Q-nU$%R56ek!QE~{ zc8S2a2>Nxb$}dv8zZg;fXe;O+eb>wCyQ~wGa)LpJMGpkngP=jss4YG!)gF)$B+_Yk z4Fa&yaTSzEE-nQTl4=VZ_#C@?CeMII5n89x{3543wUwAuzufn7s&J zepvbF#A6qeS=_DB1`%C@DYuJ$|NVc~&rN*)@K=BNrw@Plmw)~6XYCFm^Cp?QHG9vz zSrrv`;?Ts+8t4X=U2C{D=)yOeUUcJ`I+DzW3{;T@X9K$~_S)ZUb_VJOd-s4(UUn4A z>1CLB26S#CK7M+epYF*j!fq=TcWk?fS9u1Do2172ez5vo4U^j#(fx)#eZ-BA7&0mK zmd>)rQ=BOKzsb52rhAg?zUxo#%WN76<1H{j5WE&+v%G5}h=3pmvnMOcF1}j@Lku9VNbMApsud_bhJhiEhtFCDEH6vts$Sq`zNhyk~{hd8@nhu8m#- z*>!r+WfQ%}_IQicbQb&EDVO+*5C1$q#^do(@uku4IR6QM)~`rA;Bzxfhg;Ep#l^$* z&2;SXd#Ox+8+Z=%>hy&TmaG;}^x3mPN9^?b!wY8g)!}1jcoNHJ$Y5^(sBJD~Q+!`G z-XLaFj@HB^Fk?kiGUfy)ZGy8S_=nB|H(yVd9S41N$uE)HfLcQXZ-n=IiJz3QY8>U2 zZt@pA=#!@Jh&dnB({L9b(|It}`z<6#Gr!*eG@UlC8j~;=tQ_^9Ht50oaF9mt%9hHlR<{#Q9yPA}FgY#$M z8w;R`l{RyBdbN$pqQCJ|$CZWG|0Fvrvg+9zKcuj~#0RQ})e$~?_q39a%6NCSn-pSw zF~?ip->;uG2)8v{NI9R2UVkQz;sGJ(>kXKg?roldz7`5(&L;6^Bgq8dCWWL--sotL z+rEq5HONlrd38)Fb&2K17<$erf3{RD3ByKJrxClj*TyZ#Vtn z{eJgu6W=By;qlukA7hi6wQWd5f2HKbOWhIhifSVS9N*&yX^Tn8Mh|4BbJvrg36OrL zlGUL~Hle;BkUwUgnf!1sVX2o$7h74OeB947n8K5UobSKah@o*;0#z=4Btu)vzuz;B zEwQqLL8Xqm^s)uhPtF8nsYF|h-d$Afem5`xRZu%k4x@ju7$#wDHEceQU+0 z_v80o6U!fxzXu7GBxhLck)6N!rloa$S5HAI$$lEs)Bytva#Wj@Pa7>O$Y&4~k= z5*eLwCtzh1SVsA`l|x>Jith#!BMTlzf6--}Db9XqyRahSm>23mCGboxvFEFtwHFM_ zzlmqOGV}%B@}T&dY{7Qwck^zLAwQmvWTR^Fk_W?ir0FuMlbK`a8xoybN^Zuv@N z9d8W#j6KNoVmrw>BFZF#Hy!s79h^rKH2=QFDhJ271y9!nmuTYh&R)k*&e7oDo!x3O zo_HGok<(y-YB^aniM(h}z8Je4ykowm-tPC@&?pn{V9BuwN!e)Zd8+WY`d*%`o%qbL zI`Rp0k=Wf_wEMHY6RidL9E=1yA(O$6V=RYU8pU6?7y7m~hFjf4V&=0TNyd+A1na;& zyp#;=MXh_YUl#M=FIme|zIyEoPp@IFQclH+_cED3Y`bWAfBffv_V%y;@;7gP*|Qe6 z+GsGCj_`ujto->MJo)TC9_4K!(h=b2CP|D^y6>G%2a_7xTy%VVW^aJ(NdB_pb$68j zud@r)kET=T%NmJ6>CcLC-5?xqt3w-1=!_$BFJejOIGfnGbGU(Nz4ZV4RfB|>e41}8 zPzH}D50~%GoHkCF4IGm}`Mjm<4FtRPa~WR+_dyTm{XBUxoxG@i3^nc~lWo~1Ij+HVd9LniHo?DR9SnZA{gK|OEMAHKTbZ>j+e6ASda zB;F>Y!qe_HCxyY0!T+AOY$i2G^w17Y8)T;wzsw-uvXA`bJoQLk&q^8)_}K^pB<)K& zIa_Fm*Csn*&Q=}QZUIH?Uif0DkX);T8+6f2VmERDW>@4N7Q@+g?eK2#;&Au^AQPnd z1>>x!FQ*+`c6zDN;dd5XDj=J|qPDmep3?Hp-eJuN-eHc9tIMe_I)C}m33@V+d2zcF z8sSfhEIU82nrop^>?WT(<`zAitD6nF!gL%jbTA9RBuVAqJGpBk3d@~fCttd;Uw_+n zTxD2w1vFkA*_^L@9__s(N}Pi6)IT%APeS9p{4VPzx50*(rhX01H_4BdcE5p8FnmYC zqkj~3e*PgJ?Zt8CaZMyT&}?et^@7lMVeI)OlU?QoO1 zlj%V{Inakwrf+2v9Kl^2Kkby?Je=>Gox^=^D;2=CA%}xKTfi@`Hl*)oAbrZI{jw47 zI9p7V&R6N+mQIEdavhLZKtgtZ<=^CkJS$mSzDd}KjOUMPfxCQKt>5l)=P3K9?|{_I z)$@+=e9zA*^}zTRF4emUT|VJ1qrvpnGth6V8ojl#fEZ%O8{|h9{Z%;1)f1HdX0y)8 z!H?*tGiOnCk8pV3(TpW66B9_CD+mT<0&+jzvTI=zzf0C~)A~Xt% zA-jN{4ap*IW)rHpDvMg$m_@?D1Pg9st5pJB!zmYzzEPQW091Ps*DRJwTiglqB${|@ z=gRogOo*BjyyqY3()mevyy(3;#JF_6az~Re?UQLtwBWsB8HN0bEn=97hPyGRrI<>x z;I|MSf#fh&t7m@us5hQ_6Y95n<`WzrsaDQ_)7RJPDL#wK^OM?)%8AzO#;D}ZHnO*H z<$8G?OS4nuY`voR;Kg$MdHTW!vFq~zhJtInMi!G@c=SdNYtP%=^OH?j*jHVVZGIy5 zMYV|z`Csh`@=22#kvPH2LDTgD2Ksni9=UEZtq$T(uJ~>7B*k4TUkpgb^}Gzi*4>FE z_Ns&6ooIi4+}@A4zvp>GdL%pA#tDvM{0H9TnG9a~BEH+o`g(uH?3WBL|C~|ccrTn|NV4egX7ULBD)R;P5Qej zv_2!5D9mT^8j1h%SD(WQ>FESGz2K8j9ALJZWWm4~X8B?HaGh1cs%+t4gthpUuO@?1 zd9dk;5TS#~w!t&N%i(@f?;BVg%UAh2Cp1QaV&P{LVx1vWP@<_2y1n@=& zEGLQDCu-? zKp@v%lq>4LuYEtdE~BsH$q-8RrdJbg7f+rB=2{>!@N}_w0zE9^(P{tjTq778b#gEQ z5HVg`j+UE#I)70dWFM5TJtQjwmb@s0-ozr<+`MycuVeRnd5I-%U{5bMqkP79ByP9yw~B?JUs`8_Afm@SHT81*$t=N1rF}jQK~Zm zgUxJ-(Ek3iw{KCwBu*#n(JOYqtT5QmJkTk+(Yty-n6>a|;X_9gLU%5_Nap7R?0jt< zsr@B49V6oI-mOLj7lkK8O}{R?Q-@QD9P}1fa#?WCcvJQIdZ za=^$7U%pms(zpp>`I7o_mq(~^CylMXOJLhK(cmBS1g`t=Qkom2J(=@^^9L~epz2u% z?fT!>IkGq&5ka3Hron* zM++C)hs6iD&r>xUdnd2 zGfF?y;7#~UFv((3ZA>~mIrC4l(td4(yp^+ywm_}i=~DR{sDTDEX)6L$8r%xVao3A^ z6?=oG=The|U2h=v)QkF6QR?G-k4+#kVr8Z6Ad%PqlmSr@Jx?e`7dW4{bT)bJY3!81{X3IJwBlf_HpyCp#T+y@bOkb^G|X z;0|bJf_(k{0|SB z^VG&poWJV+#y+nYp zO+3P|5PTCd9LkR-jyFcG%^UPJR^!JX^az8=qZjL87MVVLn1l~rr}td4Lc&bqhhI?m z%A2m)LPY@ui?3rKq}wsxV8`c~RP(AIfzo@jfGIn9Oo;g@7>mv(gya{$#H^Kdy#+Ef zAwDwg`PXpwR#183=7KdQCl`K|gf>g1LlL>knQqg8Ai>aaXb*1mjCr-pd6HT*43b)>5o&WK;%ece)e^w&?*v5yHN ze%p>Zh456z>=j7(=iHC)rI&XVZ1+ka;vZXH{}-Xk9}*gX0m(TC zq|$Q`Xu_50D#ZF3K@ezzhM`m=S@st0q z>;@wo*S1`BCRl*e4np+xd+BHjHo7hXnvZ>hUq!&}9Z{kYNPW@BUN!!*2Mqt9XB*kmZ}GX4#`C_+&f4>#miL_R zE^Yk3?T7Dv+aSapR=*c$B4V;&aL6QIm*>am>7=H>(95%e9jc*IL$EhVW2Dd1)gZa6 zRMZ}L4V8`tx?e8O-5@&*_;{%DB8sj>fjh$|S}6<9)wY9%U}9(j=x&?0vf^UGC0`vO zL}qxe4?QK53KNLgxFcKAi|vI`6GB1QVAuf255)tRtewtBgER4nCFQa)najJw^0~Q0 z=HJx0fcbfJ{H=pjA3h=7UAN>9?#tvPDl6`p+jt^qYo}9b%2mC*Z{jrF@{Yu z?%ML=vGOw6d~L2H5aOe0K|-5ZeLOJo@fA<3Oc@An0Vlc1xa-Q-Hqc=Ys|(|m4a>U^ z_)E9FY9Px%haF(emP5$C*={dV=-TSDs+f`IH#fPpz+jTi@A{AJaUrfY@v56C5j_hq zCSoT46Kn;?yPV~XOgy$27jLm+R68f9$>tUgCbPw`GB{H9v5jaV1iMw_$|5zJA+m*< zoRI%=k;M`KSofz6jDhu{^Rv#)v$A$nJ9a7$gU{wv!AiWrmV4yS!ILj||rz~kEu()Mx;Jjl`UHIcl@ z=2>Cn_La~8FMIIE=kX5ou}0`gcbB!^wXAottvIOy_ILn-VuyvVpP)Xcr}Ll^9-WNw z@OkR9tSxi|v{(c<2)c@A(@h!F{bhqLxRuz$rY1@g3rr`w`U#!aq;jnQt#C$fNZJXU zJO-@@sG+N)5qac&cvSw*-i%Nw_)$P-G)@L_Q6kgdO!^dcK@##~0(zACnhY7iI7Yl6 zGq>BACgt}MxUS)AJ2#;SCL+cw^YNb$jZ46^DwcJQj!EPE)-}eJkAIBR#cK;B99EhC z768!F?&jCvk`3%F!dyRx4(V<}d+>7Dg3RMZ;q+VhufQaU1p082O0?cY(Zoy2_n8%a zKF2;{i#=Y{ z`8%KauYdVz6HRWSW+2=ko?vSPD+^U^NF6z~fec$<8s(9PE6ou$@LnsaEanqPVZa5S z1FfXX^o`jy5EKlkw%WVeFXzaPPQ}rOkgTM}p8!(lDtI~Z*}!Po5quGubWwnE-Ze^d zmd+NS$kYdEm_Q9Y{HrASZlnX+AZu_csjPrZ2|8zpA>1xyn zO#&pxSf1?UPKUu%#^x_xvqea22oyEysIn(trv_X2B4^<8aoax|Mr=Z8ne=yGe)aZ6 zujH)>j7A`XcbCSqdFYx%x|6q3h)WsL|V7B*uo|(ILwjNhyiNE^d2h{Rh9#g2}{fJ1k*iIsc7t72U)M3{l4^N&qnbOh36!PF#z??n!A%$o;ueC_SV&|@8uxwv>!ZQ(YE+8>+)k_AqJKU zf8ST0I=-{xBM%=FHrV0@TxYvI>l+>x8%#tQo_f;O$j|apP?A1PweEjs`bR zoj(L}4AN(a;aY?^3d@;|2PeB^AaE0%E*_onON!bFts|L0r*m7bI$L!^F4@+re)%@K zIMeB@{PKeQMh7~7x%M`fSwy>4o#lbY!x?;rsd>bvGH-zLF~ltHUvyz_E0;_^%J($Fl)> zE8FwA-jrAV+DG>C=b88SdIm*8HKbxz)7=IieVyD5T>KWS35Bgmer`a$cn)dfnx%xhgN8yt{aC)*n@=xp*l+Y&xT7r>m#LznbVMCVO09 z2~K>~!~K_!$MhX=m;SW!p!g3)lePTpfcE_cq39~M9IerSJ61_UZVje`^NoR4h=BhA zPAp!m=>6ia__KICQ9&Kt`0o7h>3W1J$D=PYI7chdA50e)PYxY0YaQkJV%PlP{d`*4 zix*$?ScWzMgT8_v3fF=j9LRkfQu8e&6uFYf{ZN04JU&ThF zjLaR+zK-EYICZ__=pgIwWa2xdBJZkh5>*B#_{I0i#M!mT^6~b~kI=P1vZSDlO@w7c zMEME23>T|r)r}CI&*`=4*HvZ6&VS1roxZt>Amn`S>};NXrJhNp;8BmmuNEce)(_?*H)pdCTrpHfF%f4T|r@$j<4>zv#Keo=n5r?hbNorpe_k z(umdBsF-^TVz3jjzJi?itCua(A&}7OWWNvj*vBN>I6@r^I~nDzwIu^@;0(ZDy2m_w zprcKtaAkb^z5n``pI864Y6%H4mC9KK1TsT1Jc68h`=3=ZLv*zAYD>b*+%@BFppy}9 z6*Ibx;#Gp$Q*mO_>MouOQj@0g$_xNzK8MOli{=#Uij_7CUfIb-p|F2M+vzy2Qnu=G z5Pc_4Oy{WaTcg4EIY(!CLF)9dQMuq>D>!H5M(@v)85 zBw(ve9iLb;lY=u+Fvxff@=Z28ALdiz)DzmlcXLT&U=jvD9 zyy1LOy?tJF>9m**860`*{yre(-S@l052Wcjr3S=J>?0h}Z|XJQHR1?*CRH zJDT)+F7B)JNrkOKllSG{opRNxDL)gp4ce{NnG`gL8K_)z`(O zGSY(%*9K4WN+JM#P;Ud-{poBejj zkS)Q6LofapkyITBZ^XeKXt0(cEl z5@UGc2F(nL*U3%IlUp75mrwn{m9aq)yp&`?{=mPFA7Uf{?ajLPQzdBaMM(*5?!umv zr6bwZIsDUxJZ0t}u6MT+$DpwMUnJA}ZGGSaUmMi)p@a5G@97YQpXzO4kY6lu#Nf8A z^&D&UGK8FtWthN60?i)en;nP#Dpe@XSC26Izi~v_gJ)AZqtjn-*Y8h)U~63lP02Tk z`#QLBer$DH%(5Xnf~?{4dWrod?bpD|wYD>Shw8!KPG^H`q~nPWuor$}3>GL#+KaN6 zABaPTG1O7SQ+)rnJ`2q)GKBwOqgtJgd^o>!=W-~FK zEmXckC-XITPT$q>70lHU@NR_Fv-(b{-Jy^4PwikLF*`)j1VilbY6LnjCNeI0;=3_| zI3?Z_A-P_1PSzPyo5ruvM*dIt-%E!wJvX-C7`SQR>bRtCPN(XC{}dMoGtl@CYOL=} zKP3)>CDQ;dhHywWSXO0h`Cakok}`f#J0N>$)}`D_ZVp}1OOI=p=SzbLR-1+IMh;*i zoLZ>GBl*37UV(Xp9c+6uEIZ;ge31H4axV%riR{_KN#6H~w<}fRCo8^f_uFvQNkQo9 zx*YYGP1N_|RXn!kyYb!@>oT?YYtlH|EY6$U-6T>h`0(RmR}NUAv4@iHOByomY{@uChws)BZS^_3I>S?x2_wDBn)@1O*k3QQV zCLMBiK6foV{GKlvZIDQQRKa+*mb_0QB^rHW|E2NeLSgS1yQnN+N9@YP6 zy&Cz~|M7qN_W930fBU!p>W|<4$-n)--@a@jDoAjRHCwXMuP>7$4d{II>Yr_=c|IuD5UgwT)qpsP2RPrZN)&$pqAon4`Pr@5-}!ht99MJNQ{`$^doS zir}+B?bltDPSX<&Z9`237oy*(^SqsVvF>sgLiXEzTMcubtxX91@jDamNYB3L;q4=Q z7@(^|Ft^>ax&RYA9r|CwU;E%^lcU^kl52bGJMty7i||Gk@R zdEtS#Ulyu1vPtZ*)F}+THQw)fUd?YJzQ>B=fgAl`UeTp>h%4e|+$2HnW#K zB-D3LUGl4Pk4~^~#DMu}zB#<*(%`utAkK~s*T8ab3vXjc^ zi!5>ZzLk&6?|uJR{$p@H`4_i>^;SkUqZ3R2NT-a_`u&}qF1!2EHOS?}6wZAO@LicJ zGErsq+X*}IPwBO&=|y4q8!f3QHbqnWFu8s$C~Hq92hxpGPh-&HlDzFwNT1i(?j#t> zzWAJ&V(f0G+51ft#&4v=60%OE!hCZpI=u{vJA zn~Z4h&SNO-u@}IQr)%=^_3=it-3%d zv){Y%I7;MG{}IO94zhzkAI4YRD04@Ty*}6-kYq{+ZLY{l`~G-UwOHuK&t1fX8wEGc zyr|~AJ{6W1Wws52jlcV@SXCns^hKr6%s5PL3;9>OmX&DPkd#Bd%+F%$>wPW{vQ;%G-|R( zA;kkIUCz;Z*HGjK7{*{v9u-;Mgg#x5!UagYZ_;=T1_7YxNW*@v1r?Pcpl7h`CCB9P zU=6nKmG+z~-14srEKr7GP~`bG4$kiLix|P5y9G00>6;K!wIlNDJhF-N$WSPUNS5SS zUB>Tto$PGpB`KU5tO3(EoT>b>A0Mzf6`z=LZS`Z@8Xl7C8!R2)8?@iRd5tJYa{7smX|nBXTz*KD>yeK3(8A8l!q*U@TgY(&}2 z%YO16dI4$EXlgBJR(v@5t~LUH{Y?Q-o1#DeG?~_(Z4ZXi z+@|aM`4QbV-E7%pf5I>eVqo(|!aV&5P0xPH*ZBt{O^1Em^}FwIwF@>ALM)lUWij|V z_}xKE|22N2fM6EK$k3J7d+RT^h#Dq;#8&)r!;Jj;E`Gc2I0eKo?FconUO)c6*pwh2 zG=cfhb$0r&JAC9aSOXWMWNH=q(@!?|et(lf)`@=ne(>YO#RJ=A^%Hb3xzPuxajVqd zeAP~fWE{DUk(?eK=9|oPw!I_y$Gige)vt*?J{wFvK@$f*=FD03S(1e-e{o4JuRvE{ z$rjl8P&^D?_)d68egF0KUL<_a#4~*MK8cA!Kt7W+6&XRtPc&w0Q)d{a(-7n z`^>pVt3uZjWt%K+aWQ2BFYB>k_F4b-=rg;GHvO_e@Vi8_6E)9VA&sw`t>SmBM0<4h zN?TlIva<9IB-#WL{8LBMHyoBgd(WR$Hb28B`S%wMsu%}+UmpN}3$jt2`#!k*orSeK zQ(#`3w-dA7Qd!rG~o0>bd!NuIB^RggH@*OK`N-!n(Gho^MYZTn z(nqI9g`&Xm((W1B_)OXKV89js*mJSP>Xuxa2pz~f7YJU=LBqnMbYk=D70!O>TM%^g z{e5wy=}r2~B9Co;oEP~iG>b&*+l;yUDGiC-`)Lq7?T(0>XAb=og{0ruR#BBLE|r`Uo;FNA&6Jnb%fWk9Ro~2SP9@nyB^}j)gzw}YlOk7+YCElhuK+W z459EPP=uzOg*=tnCroGbL#N`$h7oNyLo ze?tEi=&sSCh37f+h@;Q&`1hGT0*=)Q_mtB~hPwg>ub~ECwvRhM8a+67%dDU|Ux1x~ zx@5=lO%y*^hZjjylY7iUpKGDRZqcWxdcl5;42z(-%+7Ym0c*gn>G7IOP0nO~w*p=H zL5&;IJ30ID*+>7fbw+~r%O=#>#H$l`3@3rQ@61Hg-MixlPS9A5RQhf9xE0(ld&8)K z&+D!bUl%4`6A*)@y(Gp;O}y6@qO%EM$K6S48`LI>WVMnMhrM_u9wv=CdMo2U`=h`0 z_8 z=?tuEKIWXC^G$N{853BWNyMbHPxL#V-sNu+7#v=3(3&<+`>}O*1Cnrlo*dfP7vO0c z@Fv9Mh^bZYO((uFBCZ_(C65m5)%FY~ z*_c0Bu-F!p&I9WsVmNv5%7=$mS^JbVV3731pN-&4LdST8^Ga-BLb#Yiu3*8?>Zo4% zI?l@Yu#SJ*EaPJvj!6rC+ASO)=<$&+QaHElIotCg^?dqfXXin(gB5U#ads47{}N&B zCQC%0qxuZ2gx_-!jr;iuu0ls~%3 zimv*jg}Yl~ouU=hADj(?z(N9kZ9yI%RRS&=>=^)xvkzLGXwN@|CCA1^ z9hXATr-Pks2Ms4)qu&XlrPm@H_>Wr<)lR?3H-L?IC&q*FO)j-Jg2NBdLvt z^y;DNm<;06+6*87z@xbXBOtVte$S`WsG@;4yQp8px3G;i z|11r*T z=m-oC9vdu$w|eM^&bE|x9Dx9~JI%y|UsdPqq}XE7*To{^JL5p(xz#bgXg(h?B(!jo zk6j94olXuX(;$DVVvhwh zx$^fz_7T6bXg~>Wf(srhYrHfrRmCX5JakcEfH_jkHqnX521mgi7h<5Pv5@0vsyGr! zJ4SSkFZ^@3^2sv;9o%#w19}tobaD;ug`c1=sy{_s;GMN1Wa2Z@G1&kt0nvC(tRP~s z)X}L1Zv{ica?K{2;Oy$kw|X{>PP+@<;UV!N=?*F(=G>jHqvyB; zBS4AFf)8#!HNy=Q&^AG18ypOzHKtAWI!A--+ZX=`0#YrrhXKU<`PPS9z3sWS1~*om zOdPiQ*%5Vv!MznS8aLUD8>g6jY*hiL34U7v%C|z(+iq) z(Jz1X_HX`=KYsgf|NJjD5dT<1&h~tp&ueTZCXVNpGXWY^9@+^}x+woE>dD$nh z*#e%nbdwu)!at)V&pj0U%?36BDeHT8K87@TU+-&Y}m>SxJk zb=19qty)IL9X~?ZlyE*|>*wi?jXN;M_Xd9-s@(FwO>Y+a*)yosQ5cj-;AL-hIi3um zBU4uf|6UIB+wv-zOgf$OxpYnm{y;CEiAPSBt+40RXXlENH#ugx5W?HUxl@!q!?$hN z5!e7Q{_E^3cO=#zHH-AU!2)|dpJ)To4%EeJBin7D!9n>b}lB2jur1<>V)0#Ft2@BJ%e{^|xO)W%isOc@l*FV-5B-DY;5U^Zdn6sT|bF`(nl4A1NmHtGdp2kcn@=i-!qw z+MEr=5IJym>Nr`Fv;3|e9rQ5=H2Xhro9yt3bJ)d-B%hzKnM7xlTrTHf^pZ~z=HQkN z?as@q+9%t~mIIR?1kI=a3Qy0`dU$Vw@|4|}_GB50^2I*qX!sMeUkjL3{KFM%7<92s_YbSfY zjf|X<4;5zslFekvZ=QMsr&vB(@yA!ce7;`aY^z7PyF=dDK{&>Hea312dTw#}50rSn z1-N9MCDBsP<^T9I3-tx+JjR zuC31(vfTq*S+HWCaa^+XoLM(0`pJqWd=c2zdT$){^093t)kZ_U33jxzpRp{N<}ZRI z|I9w$S?p`ls}1`>d2z`fx-T4)$vvV+4h~F2eD#wZF(Zq`MZZ_LvUrk#xbxHhq6r~| zE?cmQ068L>Q~}?>?A5>~Y}hKg>P4mVV9FTGdGLr2Tg3&bOyE>}zZq9)=&1i+FiqHfnROgmwHNeb@18epT7O_@BK#`l>O8H{hz)4@&EHz1+V0p-sfWr2EiH- z8Mw|&U0V%`=#so`&y3%P!8kvE&Yl^UeP)#xJk&lGwFPT>vbVch2YvYlP3|6ew(zS4 z$bZma@fQVk)YtC?7hal6X(IY^ER0Hza}tfPv(GV#i6(d4 zX5U8!gNd&b;)jGaIfA=Ee8-=RhgRbTB^!K1k0%>Ak)!|Nb#?8d<5syVH~FKlXaB@D z6JP^J6Jzy*7cw{C3^1mq58zBxeGIa}8gMxp@Syu{D{TbS1v_{XZ6MQyeC)P+P6=7| z?hHE7YUtq3nr+m9ZPF|6?8k>-ltXp^A#SkP+4x06-Rlh0q4HV7s;4_k6{=JE!InU< zD|~Hc?H&t%6)J~#eTH^<{>MKRDt~=A`Nuld_@8g(XYpmT*Cg45(A}QjG!bH&KWLJq z^|E6@Gh)XVPg?~oa;RfXmVEs$;mM~QXCOQY{FCI09oWc6d;wxrSF2%4+kd=ya@Udg zzO6z?efw3DwBXe1$=~teZl{1n3bNoKR%yo{nE2HQx_LEw$^W3Oo*$V6>ZCLD?ylu9 z`x%D@IgJM5nXbh%&x~wh7UgdnBxJhPv%ZE<_>q%eZPJ+mPapOTHhrYX%@_I0XVuAK zkNADUc6iPYoEiGWKX@_L?}?q^QY2s7pP3>^hmhaQ!R?5lOr!TH*yR2Oc z+v17}9V*-L)yD@%2Y0YM|HTJ3PNBqz8I(e@AaFiP5ACz+IhEpR$IaTnyM}vm6U58H zkXm^Hgxcr6$HeKAPQGJ(W08|vyFpQ6Yl^H1W)kQVw-dfPUcOd#?FIbc`mzAI#g)!a zwQ!v8bFyv$B}x_{FX#BG1@^&*Pur<5L(GTI54P3!rC+e%*nC^)0+(FB;yZy!{kpbM zL0>Ub4*zrK!bZAM+<*{@~-Sk+4y9Q9s`v?y-Vf2 z;NRt8h)xBs4_}cU5{r@We#%jO`7I~bHVtqU-t4TNkf!(R*ttUqyOhUpsA*wR*$B2EO0WST-`!v+cfRz% zi=~qpXNZo^_v)kz`Qp%acPvh^j5t}(#kEb?Y~xQik4Am?@#l$Oxgb7Wq7jqxlXPXP zzAOZY2Vx5U6MNm29b9-Ou-mdqJH z@~U{kGFE(@O$f)A`Zw6G5MdAz*)wQ>2H4kQv6tb%o-q+k%MK{0GdSSR;3}iMGMAUD zY&B6<^3MR!AK_H81ojnJ&@E@M*Wi}X*U{WyC4{T^@>cxNd3ewHMg?t?Uo}%9zCTH? z#*ZIa&>r2KlDnaQSqDE0fN)f%rJ>Z7L$-| zxr&$o|BjZ^gt)qcseYe2S))Nq9ADQ`!B59XaO2npNesN}*)+XE zbeCuYjc`A%(S2fIQvNk4`@54hyib1q+1s!G-hce|yWjri?Z5lu|LyJH{qF0x&lAT6ptC#`-np^<){M!aA9o>!cI`qmWG; z1|A&MDDKYH*9?_3f7F|+=;H3F_6L?22BLY(?5_^o&EU330QjlDgK8)_8{y`a<6eL= zb}6!fYxHc%Joi6^4VGoXYXPRmXDZd5=7hFUFMErj8@GTEFjD@ z<*7py7W}b@mM=8Hub(NS*0IHekKmIFTx_%h_m97=Q?OM~zC4}F+FdY9{0Y%$tp!(U z7w3>Upv2LiKSBhaoNNFsk^zG352^fdTWf;hYpa8R#O3Sc;B;-#=N(~f!elBY9Yr30 zXtJX+b!$OKvej_%;?0JA_~jNO0hCWq5@PXWb)Alrw=yJ3VC+_)$Hfj@UB49WycOQ} z8hn_fZLr~Jk*RoK(D8L2ZNyzCZI#Ze3wnxCXvdIG*#_!mFDcWfRpZVVKa(R8A(zj0 zdV8GM#2|J!eAg{LFDmd70r5v2X&d}Q3}8Bo5wEsD2Aa&o+2+H9n7xCi`hG{NiQhW? zfVO47#KWZ-4-w@r0vGQ}t6?i6fcPyyw#jRE0pcXGFl5u(YN<30a~4q5hWO-8bq zut6kSEVd_mN_^L(cUxXlj4jpebk*-P*mPHmUU2x4R<7>BY=N|##hutbZjvU&$)}w1 zue(_Mg;2E3;*)u|D_zmI{Fe{A;+NWGVktS@cJA`IPL@aI*%ppEA=|3+fmdIg5ZXSN zp;^L%M6Nv##4p8|RFB`Kv{g(e=&aloa;}@^v zP|KF3o}~G@6UO~X`svkZRJMUJ%m|26+ST7old-Z_3|sk6h~267?(D9}G96C2@=rQ) zzT{HZbbXZ(|Hcz1&jtcnNbG?pT6gx8d>zO?Q|-h*OpDhB6fB09M{hMpt~1U6~E$ii(Jt_ z&*%01s)M!d@F$c0)!*dmyg|hEA^CQbw^u9@mtN*yY%E@$#gdf`x+}MK{c1e)NnN(# z1Jk=JJ0UGv5p1%>7i(9uWo0b7Eu-n8^^lEBhZ9`=$F{+T#YULCmkm7kN2c$-`l2jt zJNsuhcSMgyaFZzx>?a7OZ<=kpsNFCg8F;^4Bio|>*a$2gZ;O6%gr{$CgJp7yXUT0m z%$9olSwDl}?GEc}?lm?3^I!Ceg>cbbC7ff$x<#2A-1hS8^&Ska&S|W$9HuXzl1nqV=U+$Vb6v@;?{n zw=Otz|CZw%9YRtf(Py%hf3^^$tN0B@)YSvoVHTZTPo|eJS#xltImZq^V1eIrBL1e& zyM{vQ((fOZHF=&Qb`YF5d5?!+r}6ErZ%Om&XiOSSp0;JQ;G#4Cs@3E#4Fu471`X)# zy6-*P<+gWt-vpcr zo9&UDoSkgz=ZNAQ2-Nid;kyEEKHvx9|ETQ-e92%DD1A-9H;L(JKsx$Zg#S=NZoJl_ znqUgf8^8r;OD25qY)bA)>%6?Z)CVE3V4`ZE-V;vq9d#%EXyQxbEx^XJ51%!DT-^*n z+bs3pI0Wswa}#eCY^MpGtUNz=8CY0qCKk4f;h4Fe9xoBG()onAKf z5mV7rx9W?}E649_lxHN5{Mc-=*xBm&gSk6>$bL3aU(+X^i*H@&es@>YAU~8t(3n31Ork+|KnM!E9gR>Wbr@xtV1`k zeAZ;c?n3Sd(aSf9KZ_;lZdt~+EvZo;XxRN_)X7*rpIZ!N_dtFSgGVP{Ye&ZhrPagT zWi1W|uTM0niB$a1s!k1rKDEk?jXM<;S^(U3FAB_PYqO?3dpS-G#~V}MYs^6#;|X_4 zE!L=WF)0Jg2eg~bN#oDQv^hI06naS(c+ABfZ{3{Tx~6d=UK|U~DB-Ly)ZsAAIF7H< zv7McC6PaUqeEHS?VogHzAuloe@b1pRJ)fOVxbq9#1*OqhzMA2q^-1CIIg6TTf!U%` zj9*f_#--x5V{+qhoY4V$wo>cb&Dv|c&Zc+U2hC^2t}pg4Apo zJ$9D2ST`6FK7s(vnfzh7t%K!leC#-4oh)6Qp!*u9YKvgrjr%LS{zKeei#opWwOz5a zd~KfEr0_F4TL>gH`N|xXrAnh^f*JZF7B(Q+D0$46OmyxN32Vj#p#Dawm! zyXzHiy9(?O6ffhJObe_5oeah{z2YT^oa3SoamgIio2n}ziSpHe; zr59PYGmU)l^UN2SDV`|F%GwA5=7$_x@pT8LceD2YKfz z$G|!TGUkHBX&n;OlFEvazwg>Rz!BJgv?|tz9bNDhh_nPDb$}C)(y}we0t~^E0}?FA&|zgSoK-TLvH1#vB9uVYANsC?=-5TP zQBY=bZqhS7BZ$5PMSXE_=Nn9rKOUTfbo7FO?zX%!IvA+fbR@=c^W8v5W=B`_+_7`M zYnXL`_BtY^bNYD9ZV@wh(8J_x*AzADCUDWny>r#?Frr9g#ISA|HDTXOl6z+<-GX1#bK0+55`f zAta-^wpD=*z6xJlb*|jAgI@hl4ig)pdv`!H5SIJ&^*S$W7X~SGQU_#t={rkg1Fp;- zw#R z6A`v_jUU=*8thM&bYOop+~M*vo4XtFECvJ&e)WMy7b2HCri(|Tb@V!&|6n$Lv*$~P z;Ik<@=vjzxZIbNSC-%F72$!^bGI_a;^N-CmdBXHLP;zwHx3aX2DIKroI{8TobH2#F z<`tv>rybykj`LTHd&NTwFv@Vye{5n>XST`Se5pyj30CJDSVfIo_@TE6I-b$k)+NN0 z!kwM?{3H?9hR2^kE%tT1QhDcVyUqdKHT$G?B51Zu}WbZ(m7?>a=E<@!MGfcCd7R_z&>=+ytG zPuJy>er>p;MGgLH;wc|KxebVP?$e(xIfYgG{gCn+1o(si&OK z*d`ZyZGZzodrYqN6=Z}$4fg7K^&Z}KsVIn#HqJleSPoBsP`VCq`8x-r(R2RFycyIp zHXP21d&ZfsBQgKUF1AKl40Pwv4h}Zb{;oe_KkY4!$tJdK0jcZH;>C~mtPhyv*S2nf z_WVz5*#c7eq^7EmE$Y+PMY_;S-Ld`I0355GsSoSEMURzaOLu)zY&oMlY6q97qx^a{ z_+k=@C(Bd1wz6}IMiXtYuf;G`220xc;JV1hBwwjRNzrlWBw!0ad_j6mE}V<;{B1f{ zPw4Uob@GDKe)RiiNjj1(I>B5!4+pW*<)O)bwXp!j3KGsfFZqTG;Z?2xRp0$NE$ci? z%s}ITVdrEbhySA;LNGU;JmfteTsA<&YkGBA%xO``(g{t^r z=w!knL9fZs>2^d3a1jxMZzA;*J3)x%^)o}h`imc134CY6AN8Fd0xgjZSS0RTM(1q2 zxXWQmuet`ecRauWSX#SH)jb|VyU7E8qlw~75f5ng&<3X+edxKto5lC=3TnWdnvhM` zuKANhPJZKTTR~-u6ZlN-YQan^cqr_RExO{Zm>Qa&rXQNhp5RV5N;N}~CM-Who z@Ed=&f^Lyu&PL*7M!Ry)h@-vdNZ}LH3XUVnCh0GNw-gX7qX3uB=P&cKqHm0Y9RDoIYV zhg0!7%9-Oa*krqbBfU2{4totRTIAC@Z<1L)yp?ko6?eg8fe!3L!`nqUwN7g+C;QQL z9aasX%+B#uad=|501QH9%40ls?R1Wj{peZdBsdn8S63z-lGSZ=2A6HP9}}qoY<1*b z5`(BlW?&@2ri-H-gEMEYN2{{1I=_zL91i{9B1Goh{tknP>ePgOlbcqQ{D#->nh%(p z>=(a!`_bPo^869h>B`MKH!d81g|d?poTy^|uX@!Y7Zdx7rDo8(3!( z_CJ2;R^O449AD>a=JZmp{gLT+4XnIW25olsG8TXSw|70dwxoK-5Fu|K-Gnel*&U4V z=mCfSJYd5wo6E00bs^xi3+>LNO9(Z%WM5x!g+6}pb^3o(;Re8!o0KWvR#yH9r^H_k z=uDKx0Z?aXnozoAr`9U(u6O6Dxk=@=SO>icVKm8NAZvq%P9Ltj5d87l1skJ}hI)P5 z%TG*Ri9{ded;y*LMn>LSPBX+;2?bj{`N1DB{(Y+E{G;=S*NwWb?8&a={El4Pc3xei z_Gso3qswPaUOuh;x|^=^Wee?_h0vI=l`W=pt@f8TDB?9c?rR!bFg3ns5<8Ldd$j;xNfBLe|(RbR60iJ_@$I?QKMSzJ#parEmZBD?z+Ki$|CMWVF@5klrH zY`Qyw9c{6{t(RTsa6bNd3sNmT^%l^S2)@ae)$-_W@gNecWs>L4++Ow(YMK4_*HN49 zzt8oFlro`Re^Z5Ar`~H)^3_oTYcdGGZJ6qA6H7EB__YPq_$|hyBmWmKJKgs6SDl*_ z^grHzJ^VLmt zuAaQP-NN1{bx0pJspf=u>&x7&G$=HQ-Q>1AxpoQM0>{Jmp}%e4(SI%IsCzH?(XR2d z%YY{2ViR$Z4MU&Ki|w31lG(>W`)7J3D@CBBKa%!c0X@;X$&$J~zB5R0Hz@2l+XR=A za5l*R`=W&?ujBvnqrE;!)|EWIo?TC(qqDL!tTNXBgiBsLe4#b@JD;bmf}IYI)x~3LGR?*zO#R22 zDA0u+{jcV`X3vcw9^PcG1AE4y$wHp;R!rE+wq?ASB2CH)!>X+BWKS#yXs@sGf{)ZY zxJo8JTrw+M>G7O8U0c-cKmT<{%}K<|Cl=X%^y^0#+ablmwIy;3Ce>}Si|^yqO#S{Q`Y4=%>g8hgZGFi1(Va;v78~KdepSIU>gatF4~Y&8#3wTl zg`RrJMrE;r`nmq38vIAzGCC}oX9QbQZn802Q8cJvgpgBAU~}h?RDzMcw|bZ(OoAWN zXs<$;FVV@B5@Ap`WBzD(4G|25R4^F`w-xoS4OSVNxO0HcRLtoZO++6Z7-4CmCAX*@ zT{1eFWDVkJG}{+k9yk&m&65Mh-Eq=!RUVDuM}VyJiq5z4fWZLbk#3m_(CD2lP;2lX z9~Gi(g2d1zU9FZ9mvg-CCcLAOzHBn9g)=+MJFAyD>G2X&kY)#T&;2i8ljA0Yd?RNL zkeqm)6bAiuz?@fTuOmd-hh6YApv6y(Syeh6j*bBynk;^m>>vmUmOABkDz5>atQt&j ziELo>h3!Kp{lQ0wz3`yThXw}?3{2PvG5py=XWp|@{3vFAckts+4g9(z){KW1VDbO? zC!fFl;+MaE`}`07@a5Pn77ye zthc5-8znA$)w%ZR z$E76)16D7(P|i&3%q|_CNoRUj0bnDu{DDS$^$`MpBIA;LMEam1+vU4dhEACcUkP1s zI$;)@%_~g1K9G;VWJs15eUnhW5zq*zpDpOrzWMT=Sak2wC9b-vN+|ubB{d zcf{gl(onHButl+m@_h>kvrY6jF;6#-2kOj?0Ji0~*N%6KuxI1`dM}_c$hVl|1uHed zYgZ)TU$q%N;CJ-Md}5RHZ1>tO#0lST=J{R=TH=bf;A_v|)y_TdNNb%s-1Pu=UY{}-U!_HMBi?NiLv~j^B-#lrRn7rY$FQ2mwQ=O@cvR7vv zc9)O5d**U@>hdWMuVG$o{CX;SYfJhX&sp;mFZcPlt)?Hf1@MSxIhN2gHj~6|b#>&(>dt8%kj^Qw z{-Ce;STKl4vJ>gJKXNdF|B)owi%}T?ukBTc@3q71q@M{-o!#O{yo?8zlP&RFKtMX* z>!TK=qsLynCz=dS04bWxyA)6KVUr#H>?x11eP9uPP}yQtK~|2A=V*6EX*snEb_9R; zkAFWjiOjaI`kx+^Z9+JTIEKo{f|Ea(=xZnZFYw8UBOAbYEIL?z6$R`kFP-pn9fiu; zT78;qoUw9ulAgBzZ3`lbZ5N$Z_&pr7cVhrXx$!SnS9hCC#)CZSb@i#9{)SK7Vz;^h ze7NsiJ{gRg?Yv^AwGrIWtIQ%G8>ks$*?{Kz{Cs*;&S#0J#hIvS%a28HJloL~`*bZl zpjMoXhr9=-!_s&;V?$e3^LsJ;?z|m6F=*qr_^Gc}mbS1Bja|=HS4%ffh)ZzB9@n=g zZE`R?J@6XNe3*1)_4nQG>fzm}gs#PIihSP!{QK3HdJb{6(ivDpF~9Ie*2Qs_4lKv+Fg8>Gvb$A2}Q* z+0pX9RUVC}oCU21SFrIS01outX8LgPCZi9#*728fjjfWv(LA~0F~-r}@vwvVF_C|N zSN4E~AN?*kh4e1J^EtMGRxo6@b*1~zd#o(H4hyiDe#|Kp$h$=m<-SAX4PFnEKRa82GMw!nA6_1MvVi3KX&2M+}roPoN#KbNJ(@lLi1 zZ(?*5kfV>Q4TK@kq3hdPC_p5C5WmciKa1{Hn;5;leIDai$FUchM4K#rK>g$NTc?>0 zCOuykOsMm-jA4tM=ksLXX@F?EBUxUn=U~Yz2GN~QEAMo5VX|amMR0kNVI1A9>dVJN z*#?ut?+#UgCGt zJsSBAyiX&JW?W`>cJbR^-_Rd^MSNltiH@5Pl`rA*S{#^gvO{o(mb{XF#pIUGONV+k z3~n8AdE*n1JX|nr-v1czj)F`&9!R-G}XpqR`pFz)+ouA5WhWO%u5Jg*$;cqDc*1 zSMxJ=I`_t=Z@+2RL;BjDZP81NSUr<52{?{eW3X;J{03TGyHh7dvIoEBr&EkjIk(?N z{>FBA1BG;6w^x1qHoyEbSiWG9NHu)4_HZ$XS8JOVceE=q(8|Dm@&`{}0~9|K!sGW_ zV!_!0cJjS^1|PDimvo47==B>7T*BoW^Xu|(S~OxKF-WG0 z#70inZ-Sl7>g@2w8)yt)a2H<;xUYio*7gpgJgEyg)5Rr$N{2&={w{0zD~|>|e&}%_ zu-enbF0sL6dQzNxUE?hoAMErY>ikFhiwB2y;HNWCF^VjTN2|<(p>KaO?>~z9BiPR9 zyE@>XUCX?Bb5VLnr*k|Wxpr|`4}N8pQ~j~rO3~ED7PsO$Z)Ril&@u4Y51jEVxz0z} z%|xU)1@_@>g0z$a!G5pbBHFg;2#6`*ytHI5E{U&pzj0dQm{KJ6hzCAFY@5mqF`zJ=$GttDV&_8w(epLi(UFTVPF++O-fb zZFcRpMSBxRf|w}H4#~6^!QiER2ao@^CRnYKvx~RnCg6PUoz3Fo{3hOKo1l_MJUxFP z1RXdLJ^UtMMt=MH%P-^E3%!cJcDHzToS|TuB%3(SzS)dC&gTb%LC=4qyE0>y45BL; zjVZ~5UphZ@=(h=Cx{G5QvqMIdEu%4Of8yEm`WbpB5?|04-ivaI7RALPKZfI>mf`W! zvv0KNf@Wp=J=c!A07MUMXZ8&CAOEtSok&nd-UFYk6~MO3>8!&f$SYAQGBe18Gi~My zcq)m3oRR5d&Q8zr@zMC*y+Bf>>P*SSY10*YseBIAagA5yJu=|`{q3u|GT<@8k5d7A zIWkFbQh_*d{^{m`QNUJ>qJE8{{J}lKpDfFSwxlWCIoZnWGg_5ewZPFTxKBj45_zao zY&4E_d^t%uJ|m^{k&!*wYK8J&DP*>K$p-v|kJ{*^ucP$hD$vg9q6yzKD;~7h>2Ir3 z$Co_pwaG#97xFhDd{GkkI4iE}ObckAG$_)2{m_B{8#6bM`$Vg^_1PEBB-<8Q!MjGX zdPP&C>vz2B#NAQxj1L0y3;Oow#S*p|{;a{5>n|F-(dna2cuf|(aQd{l5UaQ?c$3*YC9@Jv7ry4+pcL@%7% zV#QY~D}Mv|j-Mr?388`UnttVcXuc4hyOwZF2-nevW93RRS;I?5pHWMEs3jL-(PJGFWZfo-!|{Mnqm?6SoRSjp`7 z+2px1vhrxM0qW=7aJw#VgZ^l^+wCx<&RT*me^?MUSt zu;AgtZsOY~1jf6}mEq;Ae{s+Ne;waSyI2xiJDGgJ$&1!?3em;~u?J@>r$MO;gM}N2 zDVGL#{O~MC=S6pPwwR@PhNp}j$Ez!0dy4|m(8lF&V9f`Ev&EQQHJ<4dK6~7q+b+Tr zy~ynaRHkHK_q>HWck4@nU{n6Ky6jqgz0L(vb-@4m$44#7eO^1qp8g}44|?C9CrS;YwgJI?ODvRQ^!sM zExM{H5yXN@ZF_awGt?bX{-j25cS-QRMYJv0WI(7%uy#T&+fpfHVDx=&Mcp8)*x@(F zY(2QgQ8U@<#Kh$W zL`O@Fu($I0Tjl-^qeH2zeb-bAoa&#tatWuC@977H!0$02q47RexonsQ&L-Mm|%fyn}pr z9AMR$Z?0?^hu1edY&@4d76i&U{9u^~FLB+X&+ZJBkIp8dNimZ2#rr3?@b)Qh`d5fH z+mN;DmEfc|1-#8^U2k%#jE12t>YD}HG0Q+qU49R&J)#M{nR zR|?**@|63D4Zn@6RKK?IB*SEn#h>~C_54jSl^=N&A|pwmyNF$z41~56 z`3Xr*cC$jMGdPTs#>C-WKz{h6LwR)3$N#R9uaoSN?1#@W4$2v2VQ?gkv4qy}Th{MjWK)01Qe4lbK z%X9LRw2t7RL&rIBNA~7GJ}jiUs5^#O-t^Rnlczj<*$)k-c-h4&{yDsffVxihnAW{c z3a{(O;kaaj2oM>+4W4T71~Ts6nWPz5y}NTe-HxxVjDOXNlA7a{CLAWKxB3>%Wc#=P zVuju+z8A_E9C=32{_<^w6jY+`E}50H4P=9548iz=CRU&Q{MT=P__zM{?EbI+^k2UH zlYjev?Pm;Xd&z8|U;QQ5++)&|;W`@IK0DjgxaH9^8TUL~d^f--*9326<+00#b!=bS zfVIyWIMzUKl0;K4A1MH4p4DVL)!Ah4TpoQ4;7vH$)pJ3+qgL6p>5CoU?YeK=K^AqwSodS>b6yhifNVYVmsV(p5Qo+tT{GoHP=9S%tQt@pvJG z7Xz~PNB3dF}rj`%K`woocqME|Gv7C|H37U1ZJIu^8Q}! z1zm;}YtEcOc0Gg&;k*)GQ?&RwR(-jS;W~IJb>TP0Ld_~K?ZbVqG^ zhc4D^b+z{J!H4;Yj*@iAW2O3Qi%(Wq3;61~VbWs1AAYw@$Ipv=+yWA3F_`|aU}S>1 zPS+p?j(Ahd`k@Zlq|X*&zoF{6-n+|REUTj2>HZ{H-C6UZEA+G{ZQzG!ew)L5`&Axd zMV;=^GO5+Z)hBy0h@ClWml?vHeY-cV@6B(5upqNZUf?i3Ee0;4QzNo`)Bp(2PNLX? zKocnu+(h<+=uTzV{`+`F6E1&qZd$uaZgszZ6|z{xc&nS_=Ko?S`FFpNy&^CVErwYs zPpQ!lEFFsB9r@VoQmob{zV{NI0+;c~du`<{E4$QIOzx^jK3AWUM<=D39&fc_{n{`uROsC72{cSDZlJqP@k@#oF0F`>Chu z2-@)?Hws7|&F7+Wjh{|D)^9 zn=RSW`>vm=TXn1M(A|>TgB%!RLO39TmjSYPG=rXLh;sM_S$u z?|N7VA9?rUq5;WPt71x8Iw{?Vt_xffse2F)Oshd4RzBRpkG_Q%v>(0p-&to&j)7gj*>++jhB z`D;mRrT(58u}E6>@gbnAt5+S|@3*d{L63g&O%xPM@#rHi`6()hUQ`2z@3MuOwaLP` z9r4uT%HL0W;8mM99Pu4JB0J*cxkUNz*XK*V40?8fdfB2jvWY)$83lg_pQBbvsnnuM z5^8iv%VBg7RH5@SiGwH5DdeqI@U=;iG#v(n;P*@vCmX4_tT1TrA4IUy;C5EdV9qC) z=&A@acj+*=9PEkdKAcrx4N1!0_axCsEZC-x!i&pzmF#MUn@mb5%KL-ZL46$uv;`rB z24{mSmyYuGyib^BoI8z2ZSH8f;eOIr(UO592(EP27$M7+6MSju(7g&cVgby?;QCYH z&iyFYMxQ~?!9g<_eTEF@@Dh|NirJL8v)eE9Z2G;#;~78To%OdmhdG zjKyrmKLkq-*s7(@V4Z=Y{I)IVQg~6pi|5}weD|~8?enub2d^If&7c0s!=L}^)jD}k ztHf+-@L~QYO3{kM#Oo^?_+6e(lSMjN1jfl3_UXbw$X0fW1jyF3_QarX=N56 z6FYWXA0NUr9b=@E`Lmv#`MqzRKK!cAqM85ivX{=*J=+b|QJ;6VwB>9*6_4pamT+{& z_l#w94Y-AnHw9gXwpBSORi(M-g*vmto>45-vwWZ59w}0Qj7K(jM)vdoPaLyqI>ZKK zRweIMph|80rr>pn20t}m@+QOAm7ncx>dp@;ch{S&f*Emq^g~^9ooD5r#{O)rq|wbq zyo$^Qj|LBH=0nEWNFj2^5Vkt{hDEDl1=(CttRX0KKPA<-EoljH7%oC6|BOBD-+TWoN(f zU}=9#9KTJN3||~QHoqHHV6$;w>jdJr_;_@gh_fVKM?Q_!1}|l@lL-Y4`JUgJ4r)c2 z(NWh-E{OlL4LK5*eyqOT69;tA?vO>j61V6g!mW(TN5`P(dA~1U=GkvR*}88q zVxr>xo7W98nx3iAH_)_-r;JvQW8MD_0}C&%+OuXHu`N&Qz<^mfHHA>+d{;yKwwUue zT|L^72s06XdRe^ruFnRO&f#j1({>#ot9*3-vDx|`i+cupCOL#NgEFgRYM64T;OcvF zIg?bKodF`ujzz|OHsMz2`>MFXP7gKopBi;rEz>dB>RAMp1WIfz4(&ff;OfTrl$m4g zX1@8vvyss?33n7mg`egmQ;f;z^A&})Nl*5wyw_$2;~=9$F=&4eg_9Vl91t|#($2#WOfIKU9FuULx-Kcl{N#ZAqgWXW;$k2tnzSJWz$%^UY zF@twk`VNFH-6e@LrA!V?;5&GU^gHfi@;E>;P(MK9y?Brc`Z&j0G9BcmMP;Y>#*ox5 zrriZ~iC6i2tkTQD-K4`}Vlu7*qb07;b95t{QSZLZC<7gRaQJ*azPyX{pcKOWGuRo(C9NN{@ zug4UrF^Pfp=9XD1$vj&+a@`$S=~GT0r{hbz&G+#TlcP5q980ZEbh&3GaUeV4JHRT> zGk`lWMY%a9OL=0`21vybycMIZumo87q0!$hyU90o{%(toH{J0Hger{^$Z-6T@+$7IJJA#Hfhl{3 zzPY$w5nBBbkJFI(#)s$Nn4{7CofcRPT+WydGk645)aeGP`_a7;HW-zxBT>Q65o5Xv zmvs-_L(7X#&Wv45jtF617nkFX5uwustV@RmYb@tTm0@Tq3!V5hM`o+(GlT=LoRlcX z$0;AGL!lhUB3m6h1u;?Z0Eh2^H*m;fl7%$N>Mr{YC<3B$6vH4>^5B@`?#G$gcC^^| z@DpBwj|JXx`s<2A- z^1JUJzWM3TYV@Bz{Piz?`S3@7`JXn^{&H^-3AUa%ztJ)GnSNK%umj$#7RR}>wzFFmB8w0GbgRwfOle8a$ z?;8I%*|eIn=N9<}8CJK#Q80XouPMvrM03I@lOXqY!f@CKpF5y~a*#(kk?&1{dtUCF zV3BKQe|}n-Vr^T&=VGn#AJ+1{~*MTmNRAh!{keYeYCfP~@OGkq;zy>w$g`vK zUOZAymQBf}PJ=bD>T*8CkB02*DF66nFz6v%;yPj{8&oM6_1(#U-@wKe9c6cA9X+6< zQS#C2+^&ON)>gNsOE(?c*jcRG>RdLo%?0ugjgankfj{aD(g(9OR<4qTUuZ|z3*XIz zR^E$s^pW3L3@-T$el(U0CkExqR@Yy|)~cM_9v?ScomF=OA0r4V@7)s|VC;gCJ_PT?%wE9UO{?FIY^F_8> z4!*+fOW>YBI^^#t3uz#C=5Re6b2BSHtlD+f#V8d0`-N#!!CmCa|lik%Oc|z6(h$H$`^7ZN1>e)1KTm1j#btl+8oN~;93|3q3 zvjORFf*Y?mOdgVwH%>Y72NN#A-FEi)m^goH#n)3kVZ=K&KnH|&PI~b@LLP4lq(dLL z__mmqJaDv^RuOQeb57y8Lj4m1y|XYvKXC!PX>0b(Ug%_iwYPL5OULZ-hklqoNM8^% zh|c74tRprlyNUSr^L9Un)jAzpBv7zEfo6c6m2y>cLr zV6O~Mr9OkpHDMtc#IZkIWg@t9l%$UFktvbpSMPGvBO?$4IKk-H!4~3e`Rv|vg71Sh zm`0z&TYXe1CPO@I^?F`M!-}4cq^+wuXy1PSI}b0u`>qb%4-fzMFaGA?FaGA&t6Y3_ zKQF;(4yJXwe1ZNF%#Ez$Kcl5J+ z!C-@r&Eit0;4V4KJM`*m25)PvHo`Mst2ZH&3AWRlI+=fyzOm{a~%eOK7zW* zG%u^!GXeyd&EgA|Z}rbt)_7(M^=5upHo0%I%FU$9-L zFIxNvX>sVpb!C!#`P-sbGB~f{3U)qK{%{h8SBc#|wqrhT;Nay2&-yXsPc@eEKY4cS zZ3D2j9`3ndMwsIGhfju*=(YZGt7*@^`?lwvTW{<6KQf=~b@^y<V0SnU15v)0iydwy2-x{eHgJFC>)bZn3sEh66q zeI`WG)2io-Hln8dlUCb6-DM|+!db1`b$KdSTJWCA`Hy2@XvDGY38=>(C!J!b#mZnHXhs`YMf@ zcmEX}eBWt!Vii8%q^Hn)QQCFrS53Bj3D710lS5mAin75^*&MzHQ6Kgk#|Ll80R`D{ z4eD@BTfv$p;tpprkPrG=PMr`$M=}C5fCnmwg zpY6-59hiJw8$X%2+cVP!dL4LbTetGchtw8u<-ENk<2%vHfMcxnyT2cgNOicP?NZAVdpd7sM`2r8EQ`s3n#}?1yU}26X`m1n# zqdfse!)0mdcG8z~a3Vy}6;cGw3|+<&=#>|nbWCQFUi46R(A_co6!5o-cBLUff07F7 z^invJgS;2L(Z~iXAEr9M2e4V9UUDkk|_&v zp=pNl$z2XXqEF9L&bE~5WY>u%d%g0_X&@Mk*TtW=`*~4AGrz%}7n4Ls2eb-sRw?l@ zGvD^cBrq7{qwZhSS^UZG{=-%YzkB%WU;pjHpZwKdJ^aVsF1qIplSM}dZykJWRVf4A zW5~`OY&)MNdcJc8gtX7c%V2NYN4;1iF(en<&#ISTv_R9nftY;wEcLuRer`a-m&i3qp$h46iK#!FS`#2?T98XUoF(YcJ=t|g`X4WP)kj=etg|1o-vSgg zH_#0}c9R(eH0ZOs(~SY47aMJrm;AC34gXcj{vza;$@5*l2R5amp$z#@_MmOH(>Tbs z`s2*Lm)lQXogk}|x}yf7sGOP`$Y!O`i z%D_6CbS29vi)*5(VCc=opI)|g@tbO|!C-@gj}2|YDq?3sfzoF=Dmj>r#f7(FA z0CK+{MZe@Saq79rAAbBHoaD&<23*>BcGMj)8Kmxs1AC5pd8dOyI&qEfo+Fy{>UOpe z2gK6`qkh-W7VQOe46?g4ah0y?plsUwlq`Dlozm8RU$$7?PIf-P3$UI~gYTNH!SGLS zYF<62D}sQ(IQFW4#fqMQu$i3bW;!uL;AEZ!!!b3j$&30Y;Eiy?Y z-9;IntcY5X4fvzREyGTmeBe{%@S%b8w)s|`JnTukO>9Tir+Ghnow};t9%1s~@`$wo z!=xc#3Ht))$Of}pA|@k&^qH1>fmpGc-zTS10KdU(xH#M-@fq#W3pqOX?i&QzfelWK zM(5NN1Xj<{Lc9A@PfLdoGRjA&lb328>H~SvoD>((?FW}^gFNWUgUq8J-tD9MCgPs% zxwe-pDzo`j_miTporCjF87Hjym$Ks*M3bYQLb&b8yz18m*6{i~!gg(!f@AF{*TX_ z+&CCVG9=4>{9fuslAL_k-{F-OH30gIn=pW;Y$sd1kHQnqwH_nAH=!L4Ivi+yM7Yr( ztLp4==Wx{Tcx>zV21($k53*Rh$)U7a#~^rm`|G?m3$6NBo+39706YiDO7#W$4-;x*S|qQj8jN48Jtz z!3-|c02d@z_!>*HlMNDt&)=)KC+Vc4HQSX)zAKNMcQC+f8BXAbd1wlh;Mi^ZwdDu2 zj_7UMg@QK{cO{;)0Ez{TBo-&9d!0WJ#Ji@4!^hrMmjS@VuKSl)*-ZgX)9C; zxja9l{?kT!--Pd{C3Fw{G=`b(^A^-2&#~{Z7iq#i<=@4|8)@wFQ~j&Xn@R|V?4iXjex2#GEoWWdyR?*FCYn9QAidB4?@U%< z%QK2rFUjN2@4WF%14Xo^QQ$Bf21*1#U*}+y`Z54!SF(hZzf?Yb)&VGq?LBWO9pA_g zmoDoxpNkC~(eTV9Tbvkk26qOjuNox$HXK`hzsU&d%FT0iF*T;#M+mVS=#W4uA{T~JpK(Yie#uU&Bi$<_rLCT5Ks4Cw zxp)(pdUZ(LOw|7oIQA|Rg~9YCo>{$TqrHtS9`s}<_EnEpez1Z+wmS9SKvVT)JDO{E z)=qTBeOf^3X7Zxpj~@l&+N$7-Z@+zb@lC6O@7}DDHh422Lrc7wRg+J>#)Aph4j4Q% zurhnP?U(7{Et&*+_uF1RlJmW*arK<->^6P#=NkVP;p%VLy5ku=I6nmI?QvG){G1IR zvt2xhO)Stz+u#LAYrNBqy;lIGaX*c_pN4VVFS#gr`ddxmPu&gJb9TF}4AoKjyVq;E zIs~^ruCsF4?6D1u5?^%i*IBe%lU6Hr@K^BLAT+WonHvu72b zWry?p4Pz;Tn2E{Kr*JWRD$$uN>e4)Pz5!%%Ee#-lEpeT_IB#@3Le#AcC zpa&fia~->c>g7GJT0pEr*8tJs4a_F2`7J5dKEjNRYcYA9-QegD7&0A*y2$>Oxh(Rt z@3MUDNT1~NR`nwz9c2um6AeR=c2M07dv;{6ixoH%FN)ap`f5Y&rWAEUy^{`yZ67C! zN?3mv7-N$3`g)Ds*rRjEuXtrIq_RblB4vyP>#f4%NQMBDEWfar)xaiZ_@iJ z^xMw|8Qg&!@^HvR?vXg?`JVih*rUu*4-PPBIAB~KYp+e502AWMN6-PU^pkZ`;vudr zrj@?IOJMpfH`pT8Ef_(&7N-pwA8lEEU3{z`C!`S_s}*etfv)Vu zyA8J0eLCP7E})pOD$3W*e6LI+;;fMvMhJM|Nf0YK_r1Xo?W39wWO3c6boNk(qzbJ3 z%WTX#*?UXU*^0CZRg24RldF!oA0_6vo*jH2td5{nLkl77XExrfiwfaKi=XujQ7!%| z`X{r{4fMYK?k5jF|Gj^_+5Ug~=YRh2=fC*H-ZJOeIWqDY+g&=%7CHh3B}A4sLzCNO z_A?-`wQ-$>D|<4RHgNJp`|fOMfOY8jQWUmYHhZNf9tLcy$noG~epB#w3Rrjxq%X38 z*{UDkz3q-K9h;)&h)jo)&>=rEpN8NJmaJ}^#{0>`Z!1gk_!$W@(Dh9?wl`Y+FhO9o z)LRqfe^)`EpGLDoNwdTJBLT^R-n*_1;xx`0z%v*jTXks^$_yDzGk5I0-%*S|d>{s? zY)qE@D0SECq%uVRqZ7PVVz1+Ai!uKJLtawu4W8+@fqp4`-fASD?{c_S z5{Y84Z-wwoUYzFvy@4e~1!8m^PV#NDT`LnUl|rX_F(JOG7~Db72<|SJp`?VmgvM#4;zhvAc3|0jb_@qi z*WewqEgQq>c!mhl!QP!ftTfE(vS-Jv?rC;xlcqa6l2@5+1#$9*lOG>3g9(VQQ4c3L z$D^=X>6ME0(GPF2ZqK}a`_03%287-!`QbOes>*x8NP6d6{>VaR^-0Weqr9H>z@cXh z@1J_0qniG)mBDv!KRmpuj`>|eT_#-3?pvMR%AgfN+Y=4kM)IqNw+%2}*Rj}3aDr#U zM4J45f(D+}1vqE4!o>h(m3qj0rNfcK7BNbRbA`LSzJ{00OvqGm!cW@t^jl`1EYFud z4f0R0rwsWVtV?8Lgl)47%FjdF1fPwS5np*(Wbw$p~jaKUypC z`G@=?Z-i@A8)=s5b(Gn)ZDehawkz&owYPQ}qUbWXe(d{`$Q26)A- zu10I!KRiy5NY=AjgA$#zHL`W{@EH%X_os~#-?s9MZn7IV>*I(~{8l~0sB9|F9ni#g z146<&7-`a<^Zc%q6KhVL0D8Z?@CIGDkrCS3#hCI-fA~3^l#TOZMGEcjvbj9}I4f6Y zvE%qzdJQiNrZ9ON2K!j^L;|;@RA=wO1^cnTOyzXjSJEtjAz2P`Hv?TB$=5F?)c~NEiXU0KINC+q zRYtHyQT+6G^u?g`W;1i69aw=`eJ0#h4#%XQZ9o#Rk4FUeyjy@96fWaHY*2X9oQ%=0 z@Wd$oa8||Cwb;#h%MX6BO9?7K+yMC4RxSlDn|jVX`1ef=O{2c#u|Zem)qgM`EJmu& zpNeTp?PI?w%MH9_uEg@1UV%4zo-&ippR}(l-_bns>>hy*zvE4pyX>^18^})5Y|{P4 zU%`npVvsr;_fuZUb`sQyK220U_sB#P{XEc)=zGim2fyP;hueQ*YU-VyOJkG!8A6>E zi3VxgCmYa3?V_1tmmrKNFsus2 z@^yi~e8&llv(#qlKq)gYIC5zAHi-7efuJht4NMNy3FxK0)alXr0H#8qG2T%wpRXWb z@F-JxvnvV4VfL$R%VZNJw@HBcT6_RnK&8L)8v{c9nOF93hiBDI-QDv@-D`9_pW}y! z`Ot?dqek2cpclsw}TuN)7~!V?Q=S#pXzAY-uIK={Ra=<|D(VE@XNpb z+lPPs$A9+li`TDv*07G=IxkhA0-V>7tHg9rowjv@;-%?~=_JrY#r;+%u{5)yR<|5F z@6rr(luTL<-jxs9>vSdO*Wo|SZ?5=R=Oc*7keSbZQ)T~YA9{&yFMCGm1AWs=p+q7m zcEzJ|tss@t{xAzb(M*rv4G7Jyv!g+n=PSQW4|Mp6m!xRybvCW^ZiOz#)S3NON42z5 zeqbW69AmR1BJlm5AJ+Ffl-NH26HeIC)~iCT6L{rs*6e zInFA}@&ES~mannjvse} zjlOht(O~W2_T>4oZ8zEub!o9domdNg& z{QPZOEaR#Ezvvmd=e?QI@u8QzynoXQVT88Q0P73gb%MkZ4d!CqH{m_4J}DDhfQmof z80uv&uM0@;N>^827N4G18OFC=3i~;OwAX3at_ja5RySYSURqizXOrSUX6(lbGyF;oM%`2wp_?iH(Cqgr5<&W3{JG@h^YffgwTDK7F#G*auE+xetD%Z83Rp^O76*puB8s6S`%RZ$qZ}e^AGXB9Iq; z-EUI%`B2#mKbVhiU-ic6H+xB!I%{$DY|ZNBTIAq&G4hCl$3P~Pg0AN4%xw-oxOMDS zH?sT1b8+in%+}K?RO$LErxV#dU3|pvaOWdSIXT)Pc48a)Y+?x={7N!dAO1xLMUo!* z*hD*Z>d&r&KNFRY2&1o#ZzoCmiHjz@cx$#(ZG(R0AXgX}(Pz~o|Y*a(!4 zl6Y6s&xoUU>j7^3fnEoi+GXWNW(PSUv18@jJzXUEp8v;u;B=N>-adGCjnim!Gf_&# zfAQ*IX78j4e{?28wsWI?cQ1x%<3J3iFYM-`<&(!pt~1(`6Egk;fKdAJ*OKMP4g=OO zk0EC_IeXERi;l&JpzgMEnvsbdmu9Z~A8A}hH5h{;!yR@tIeU&VUq6dX8>pt|77-pP zkTt02-` zV!IH6_ssi;j|N-tXw@lxJC~N!iFc*P_e|VEjaK!2{@g8E=No+fqdeA5)(Z;ml(`=9 z;WHnp9W=@Cp_?!x}DDT(dpQmI0|{sUrsh?E-t%wNgJOHB38iN zba1knC4R>|8oCR5@+9ZYn>vp_|0ln{m4UzdtG|5sqd)(PhgSs)+ePu)^MAACu|3V) z9=}r#G(7`84b{s!mc8p`JPl@aBu>7Dr~yte%*{%tfjR!++sqYvTS?x7$#?w}VbH*){ck|?GJjy-<5zq?`oZXGs*7huC_4s2CcXjwP&>Y5ASf6r5-XTz zAbkdd22utM22XVH8*6-nKMFOsZ=tzWxdH(?wp_kXSlctzuS_$>_#1E=ps##OxCb;| zKor?CFt`;N+Uan!Jz30%D@%%iH{g4fpq`VNkCyJ)K=p^6_`o`po!LRK{U#VI$@F8> zFFPBX`OAn4pXK$xau8Sc6C$OY*eNd_>30TWhrd;}+rnM!a0VwI)<@^7q{88mm5UrWwTSy{cJ_{G04(+q}z|%O4X4>qyoRNOWU_iW015v~~9S@~h-`^beJN=FVhC)=@}JMldD^t)sBd7d%5 z($7bQ2u?+rA9b0@Va}(?g(F~ZepNG{d~Bv&QZ~68MNopRf$4-w*$>gN8Zch~fJYsi z3t%VD*J8w?+KCOcCfBrDY{bmV2bq5|@HfG0-j`BU~1J4}eJ6I%X$HU!P+EtZbLRBNSF2b2dz72zbIt4Wgi zO#16;(bv5`!z^;)kcmG0RB5l?vsuhG5RE67fvazZKmQi&Jxg7dgfPRM00Wrp@9>Pa zH<07c76$O0MvvT})mi;A=lhtAmwV(oUUay@WBVx0^(I>s^C-n#{E1hIn^5blCTUlv zV|L}CC@J?d7>)15F4g~|7@#^jvAyKQ)>X2Sqe&N)?$q6*S5`VW^y{Pl^VRh_+9W@+ zhbY#5d8|H`FsY*HPdVU?pnUwcuroL^&?O$DB|rL%02_^oqJJCbyV1RH1KBaY<%5wn zPZ`gXe?iUO>X~P>zpqVMSOc9+$?8ChrP<(Y^DnMlv61ae^gYTS-d?s+yxUK}6+36s z?TDD{Cg>lybH(kdv^Sz^ka8Dl1~j9 zyT>UA8QRkv<1v8eh&EE)9n6nU*=|g>GP9d*kB#O^x{{J(P6u=+0z?CS9uU9 zjgB`j9f#*tJe{2Pt&Ay7jg5|pIT*NpV}-1Jjb=u;%D&(AO5zu-biVk>PappNfBDZI ze%rRPKW{+zXKfc1Y}t+VZ4J`V=ReZavQwtzW&p6vXn^rmD+ZqLGr^8CTYuhyc(#$+ z?uaHW1u{0Ky~ZZ+4G7m2(U4_ZX<(e$LL9fL^#A}s07*naR8ai6RgiRjT^dLIS#ZC~ z0B$!BDbF>@77)VIKngWznbFp;pSLR>NH4c|6;A^~vvFRE@^#2$^O6~IPw&qBS$Tic z3p4z%_O=;yR<_4(0`#eG0{Z+U&g)FV57t3SMZ1>(b>9skRkd&-hV@e(DBl=$qlT8qEhC>i9Y}-Rk@q z6t03fbZLzjgJP-Gq7f5H{d^#SFaOn zfPmxKAH8%QCHq;4ufPBP;rTZ|Svj`P=i$SvU+?Xa;yn8z5gVApVIK{oZJ}NulESUP zWslxE`sU3K4ekwMc~|f$1OB^o^KA0h&%UW%=HKzpU9x@K3L7~7(01Y1-Rq2t0Vb5b ztH8c(^5)p_ltm=V?JxFX6I&m_5&%JV!kOBAK7Qy2R#bw3t_FE>0R;!cvx^z9Pjpk- zK(&SCa#@ITLQ~PVE2T&ATSK@{eeV zmdJ^hdMZ0 zrr)-jMrD4RFS5D86rC_#v0nJMp2#kKPB6Bliknb6ZNL;$avGF5xaDlNy9+ih+GzH` z=W#%Y-*_Gx_~}ECQN3fQwZok!2Lhl=LIGKDd){D8^nliVqb|)e6#J6k|N1-}><`{nKHw24*G z`UCYff?_X|4R99=F8a!66F-Yp**|BHW%7=$+Nr$|romy-W{mh*5i72VF*Q83Gjv9~ zj|$L@)wR(nE^RFFs8IAz#aR2dt)#Q}!TVHwI{kI++Dc%naPQkKl5sJJF29s_9iiTj zn2<%=uozryI^&yTPjzi=VyNSBJXFc;SPUn>Pc-}33GlR)vzE{Avb z{D6*=v)lj4?+{+ME(oHMVPb`4X$b|!AxA)DQ5`VH1{Gy|c7p?h){Qx*c30AINR&EO ztIy@rvVj+O9L-Z_e7#_0ccR7P1~CR@_1a&*1UYxJfYDTh{JW{e}FD#S>U zi{|qCBEoRe^PXi|+F=^-B}=eyb)eUII=xkbO?>or)tBp);d0!U;3#kUba_|a4SICI zrIn7U9_9DM#fTvN83a5_9>vaAqA$7K1?58Eb z=Z{sIJ%pPg01#Yx+;B8RUL^9ffBa7$e)`xy4>_7eW z!{62++)n|7%O1J}+0 zkWELXFLv3_2MqSu;e@2FBkGN#R^)!tK$gv{=-C)&1il}vjE zH2PK-w|cjMRtCqK|oXI>o@Fzt~}+`+3#wiDgO)# zlQfun7oYm@EaLNnrAIG3{5{X8;Tx}zKGg9rP(`1^I+8jGm>GEF8Q}$!Y-m%M z&KnSxu4by^?&p7CI?yx-HOtN3Y|4=I>h}#Evs*UeL*GRDdAiW?dHmE_GIzVOvG?9YZZ&Bxf$_nf7lvp{Q| zjd0m|gAg)x!w1%whvs+w*nK}F9RtrE($@?#9?Ji0Z)C}HIG+v!0%)7rPPb&9Xyu=_ zGyG^isRKo>2+dy-dq=qwjz0S+c*ozr~;KsqL5zudAK< zg7a8fgY9eS^jmF?-bEzcXVcQP`|zmmeDhOolecs+0jj}-dOvv?Jj0=E=Srub$SCE4 zcOMUJv3yqQ6lq+7b90F#_UVCU205#D;@r6lEWQ`k=q;|GRyw{%lJ1k+ox$Xe?)@al z)!N9JYY`d9V%i1jB;LSZ`Xi0tkVU>PvGODg7hj@7 ztg$NfV3t{7k!KToozaF*fqRDref*&%eIN3cMhYc3eS#CW)xYBebOz(2ls_M*?K#xs zf?4}=fxzPn(8uxmlFk*xCp#GIK6u|!zGtLo1AZFp;=I_>F~1Cny~MT?&(J-(&{Mxg zf7v4qXHZ24^6RrAlKfZynwtdlg{uSrW=G{=)vx=nYaiJAM1oEkN&MV|mGP48_C~ka zW_2>0=@i3}n+Or0Q-Aazr~dt9&lcd==zQGs#Pk%ugLkZt8;zBH=e@_JJbJ27AKSue zfQaVP0`0T5l78iaja14$w^MK{Na}HV3 zl0lxvX`MoiO}JrCyFI_=ZnzkikJqp}r=LPwXSv2;Z!{_o%sskZ0fOsTrz_c40M~#} z;Fvv51c@{M8P;%ojnAEqA36GngjUubw?d5X31){TS%WX#{f?bV8z(6s+;;@ytkR+{ z(0GI5q%T7*$a_F2{U$r0!IW4A6SKWzc;yM=j(h76y`&kaSy4DN0?Y~b^AQoTUD7i< z>keED`N-P}J{Qgp`niK_>G{F0p1qvxKm71IpK05uKp8n@p`0*q(gEA+->bM^KmY#W zW2*@EC;r~=|Mw41e)|03fB!fC=HV}Y@ym6{UL+P7Hy8`gWP`1v3*?>nU*?+62uz#3 z?&AD_d)5j--DgwGUuI7)-sm@yXBPsp@I7c;2e5oEDzRFI&&oS!1BeBh>i#!neV6>- znWZmJcU!~mCn@TC*AY!o|KaSot~G9S>9zp_`<>q%^m~K+{$(X+<;rZg0i%}+aaFvL zI=*tYYvN<@_Fc(#I!5L6#1_$^}K6LwR+jEKR*zFlWTuPnt zIW)+vvrkqXbH3?Kk!)ztE1e8FMSdgl)SF{NFPvF9;$PA68G?KrtP5LC$?5i%Ar_N` z?8?_*(4b>6pggjpW6*8xY_apwk>Sum&6zBZciBy2GyjDLpby?+yn6#J32QvlZ8k20 z-4eTx>jUdv;hjN6b)`T4yj9t7$!jnOZg1fPAM)9P30JuXpDj;)aW6l=;S6Mtuejll z;0AavTP6SM`|mPh!^@ue^{gPrpsR%{{OZTAOg8un{`t2}%QPrpjSo5U`(7UM)@Q4d z>0SFlbz9l(KJYx^F>;<=0keab%ltN6GK(oV`L>#FEAor#=8wvFie)FZwwKxcBYc{K z&%c(Fo;nuOzl4%^jNfp=<$IT3K7HE67?|Pl&#SyIyo230mcDk8EGmA7juOz5L$7SM z4!}u0Z!xX2lpuTcda|Wj@Mg;67W|FtIqa;tn8IhpMv(kV&8LGS4&C#QBr1_FeJYX0v{*2i-W$nkpdFtqE#hwl2c#C;)H z*#ty~dqq;r;#y?)_FtgN7!4nykP|mB4t12QC{Dl5SJuvFfN|hY`e&KtSwVA< zgH9GW?062giq~bp&wa@96Oc^viptC+=vMBMcd}BTV|v7B@e_3Vol>A+|G|sF0PnY> z@3t={QO8h%!xZGc<1w+s|B?@Ir%wP%5htV{8B3Y6(FlJ2S3XFS)Wh#u0*xpoxsf7a{N@iIHMa#lVW_bg&*{A;Wx@u4%= zlmkEAB1zW6?#OUBT-TR8hc%f=6|E~avDZa@dF-ZK)@GMM9{x%Wd{)ME>S7k?OTF7Q zS;S3~vt9dXnH|Lr>H7MM-r;T_Ri=R=zxG?B=Qr%jOYzBd@jOHTpIvgOJ~y$3Pk&o+ zRDWV>D=Alq|7w%;zy!IV?$P;_hZu)d#ETK-j$o7z;DW(ZryAItwhIG9PIFgenZv;?I%I=4(t1eO zA$YKff=7OVr3;PSoB{$vcfw1haOgCtq>in==`EE{C(enxRW)UKkgpR$SCUH~ZnuKZ z;_ionzrTy$^epf3pp>Hy#*xC!B`0cgfF(^<(5Dfam_c+OGZ=W{^>|h0W8Nk>f*?qr zGe#3+)APbZOE5s^if41U!y~^a-622<_6EToREOj9rEc;)OS!FY7-Y}$8r*DTMyI6n z+|F^#@hFkA>SWU6>jop98S*j+QraH+Loa{Oso7RA%E_txCR?^V1H!L+6MQe6s8jg< zSHEiD`=SBifBW#OH@|-Pmw)`n55Ic#`jl_{45CyzULy#d?XOWSZH?g!cr0o_XdtX3 zt$T#`=Z1Z^vo~1+-3Pjtx!`dOTTn^fOfY4oS0`t0HV_02!VC!6jvudnm1pp)bGabU zJ^1m7hJhg0#m2K0?DIClzsgqZX*Sd#(4a;|*02F)Z!2=-nCF!5w+De4?tGsto8JgV znoj@lLKl2C2+i(79{ZW~#LK|SFzPD!)4)A-`Q!8*_h@H-9UeAWQhv4Hf6QUN z?#;lI`&5VA^M1NdCpw_OcEywOO>jN+kiYFhIfUnx{kEJJ-Ms$ceLoXo`}o7d?*u2_ zo2Yu)Gi1F+Ziahe+fXY;CL48(;IFO~DA{VZh>sYT8uO!-q4=G>_Z(dEu<+?*cP+~* z)1}r5DE;9bU86PO>C&O_T?J#XG#F`c`kX>`8{x`fKR7&$@&en+9QgudC##57&6Y{7 z>`WH-8;CXEA>n(dB;!^$qq%2g z3r_r8Tf9|C*ZC(`@Yn<#vaB#KU)YLob?+FG0D)9aX28vs3u5a~2`pWIY&Pa;gSRJU z`f4{g<#cARcs*?}w>R(UW2~Z+Q#~!ab5y#B4S8yFHX*BzVNxQ0c+z0>?W?!>(~sxn zQk4n6KQ^t5;P;J=mA-Ra>D`)OV#@WgC^KH22;eA5KL1+M0U4aQ#Rb^8W^5*Hi@^u;S4 zck?~0ZYJ{r(hZ_%)q$OMPuU(TBMO85l&lKPzgJgEm%G8!bvWM&2#sfhFPk&*e=A*<%rXu>QMO?_@|q$3@lUWV(Mm@R`*X14lr-M;C5* ztHT>$1sjnwsH$$1zsdR0ir3Eguvmle#Tb5jn4SEIJGsC~%^HOOPXy=nTIq#G+~{avL}j2l#`ib_mNhmn*w z#VFPTz-T7cPNhzUFEYmILOm6ltbHQ3@+yzMKAa4%xk>4_T_v7! zsNm<=2?J!QCq>I)VmChd-uA&;5vY(sUbb z-RyYfj0P(PFYoHGy{(Zx{&3uR+gLL=EI)qyvKK)J7J`I_h`mviKnozHO~3N*S!gor zoIPt0xQC42yn6WA-}}9XpZ~+(d-#*T_`e?h?SJ~kRtoMP_+~4m#y;U@}?Pz$`%|ONvz3Y(UZ_69O z_xxSB&WE$m-jX> zeR%k_x);`75)&Ld88~s(#m&x>kKwhD*?(E2CI0aN1hgWr3F65K=!WaD33YBlP(Hhl9wG2ee=nx^%JV?T=QEy1*G2F$A*;=A{LF}s zWhi#Khyir=@}n?(W!__VWamlDTBAS%MZnBwCjaO+-os|Y>_?XFZxPk~l1`^|Whgh8 z%JJePyW`mTd=Go+Q1FH`ION=Rchb8`{`JG4E&ot~p$?b`G==tL``!6!@~xnw{U{Su z$mNyR>Cjil{oit=&&f;wU6Ex19p-NT&N0MfI5vTcf-}6kk2Y>M889o?fowns8VnVW zPhRmULWf=#;qy&L+V*#*P23-ib}yU7%iKK=aOZiDF)&C4FE9|Y+zQRwhOwIj`u2rL~x z6%V!|Sz9<`fsdt~ujq$7AIOarDmx zr4EktG6;BGX0CX$)RFHl_yyZRov&qs6MZ_+(1C%(&9ePgsB)F?%MU2@-=Swp)W# z!|3_GTLu-49%jT(7npxg?k=+vG}vjr88B?CKwhq+91H}#*uwTxw%eO7Hz2Hob#*@Q z+n^?XXrW~EJO@KR_=iUWx}5BUoTKv(5k%7)NWHvf ze&4;a77qEfGG;5f+6rmwr_SM427@~tnaU}!4Svfv{97kI-oMSLRtU}AomIE<93p=Y zeVspFI*s~!XO8d4#hT=!(K%n`!PGN}FE_y_ALxa?^g-L8>KxsdKp*<6%X~o`+)8k` zzX`yqs#xU(HQR`o?~x1U48!>5V~iNZXf-fJQHfPPu}Vt zC=LMtVg&h&!LxZ!Wk}Z9wrjo%Oj$eVprbH;(U}{{2>-~QUHC*u^k2P?{-Q-N>h3zL zq0n=0V;g$BS}D1IpOYf|Lw)c(CA%Hv$Pw&T5|vZ(1dBgg(&Y*X2PfOFfv?U#X?v(u zxowqcRZzpOpu}u646wmI**3zaKsAHdt<#-M$^K0-#{|h&UWC)x z>enWa{8U8s(MKtIG>R1RJ@J9wZG5$J7(gh-E;N8b7Yjk(`xOC@xcIsxGk*iFO*dWRW3qLyI zf>i#bY)0)e!gK*sx(qQ+J1N?dWldu;Zae)NdSG<0LVcnD9~@67#8-}Fb9?-F6CBGs zAo3jO%%(1`v}MSHOU}ufWbvE)28R`tvOZ`bju*_@lHl2HF?=<@twL$r#40}MYNTt{5vPt?fbnGKjuTVEEK!=zDRH?o&ABK;F>|rO z1%D4{K}l0@^23c`DlL;r(u`yNccI`eaD^9<#Gpm`AdkC5l{rkL63VPNAe^3fF?M?V z`XbF`?sX2GoeKdEOwK^%_}}WEyZ@&{+{* z`8dm9Px5r_AJ0LYv}*tE9#_P>BhF%MjSXAuhzUw}UKP8xL7Y$O+7A7!NhC+2>05#P3+F@;g6+O z8m&HnE|Z|9ogR_C_G<@qNHzv2J{bt32U|aU16S}Ju^!r!KltwJO-d3(Cu6_kmtCK% z*8sG%?kD@cAQC1Fyi*1PFa#6q&stFRZ%ZIjF>W-oNu zIjv)55bzqB6#~3$Q$8^@dT3$T?P#jt-mG;N)ODyhWc-s+r*ZO=J3MTB;GXBM((uyf z*!KW=X3(H6tY%i~a#dm8^uy1#a_Lx-A&?z9)ElUl{&ib*UhFqj4A>fC(eLhbgmkti zvCZj13k1i};}IV#5zlk{fAY`&yN6%?&0jzKumAo(v}*QlI@pq?T=C`_8gSPR&w}Yt z&%e^A>{WhS-nOa+HThIzc{X=I8}{}mCa8wgdc(T zrnd891h5UD&D3N+WwSsq2lz~r1q@tXMEga$3&O9~LA}a0;WEco5o0wQe_h=%NZVT| zqfQp9zE-p7^pi##!i9?UBFE|;#1+-^X}-t1Cd|Dab!c#%{2Nypi>8&)%jGXOStTI^ZD zf~wY)c5i1v+bYzD62Y24`E8%0UxRgYyH`#d#3q>4Rd)B-0zGUO6;ndraV!zdU;>#g z%cDcEtKZTup5(s=rWA1RLr(Phid9kcbj;kNJiCAk#@1E#v{K5COk}LXU0Ro;#mMB~ z$7?vkJd+GZ_VM#|{yVjeHCTUQsro@5vYp4Vto&cvt{}=UQ{8mlfnhTFL#KI*t=cRO z<>Ll|w&zVoKN{X-j5SVJE{heco;KHRx zvhW=|{m?aN*E+iESShy>*MN7;xzRkcz3xLmCmfgPItGK9+u`uhyiihduOl1pfeX-J z+$=$z8nr0!i9<6+qrESFz;Jwq>}Zfn(!QK)f6Q236J%aw;Q5>lTvu{8-9XSIukUD0 z-`yo^CXe#s92t(G5|hst!P5Tm=T3Lto=j~F@9p+7N>J`SYW%a^i3 z)60cKA6rGA3Jl5p7)aB*UZ5vR6h&haeA5^q?KdrCwx8T^XWrrH;I^>$r72=aVKKkNa-tzHnSw z6UHG8-PsHOJKY(#&hoEhp0s|*W#4l;QXOgW^~o-W@JYa{V`{s&3A&Ev>Z!~5;3X4Y zC9!P~g9~7^2YRK>xKJgk7b&^xn2pUP>u^p+EYp>YB@TY+;dSOO<0h>OIv?Lg;s5_2 z=N@5*_HCC_&Iji%rx`q-;yVEGay;7p+)fEaoJ$?KN}ox=lCv}H8-Gkk^Cobe0R}yt z2He+VRPPTAIp@O}oW6GI@$=ate05@d$P1pG?QUv7F#_y3iQw#-Y>Gp9h>r)3hppb1 zu0B0#p$=ZcsKZ+RO)42a^u=0&==jjEZk8uM{&NUmL zeQd@yD7jO|7W!tRWYbW}uN?ME0h~fg^vR8fl)D`gllBN#cHbh-AAH|Ns3T#->j-O+ z99bGNK8&yrBgrO@6W-nH!0*|@uJ^nE#tP)3t%Sg+WmdFJfqytiQ|oF zNQ^-lNdE9Sv{E#X(|97zp~{Dx(whZ#Ir@^0p%kQpb2~m)%y`jDB3|fxaqM6tv6sa@@(vst$Q!IY3n|KN)#|2;*qzTs(DE;Bbe;y1 z7dP%F-Em&ULoaa8>drZ|P{r_M@{JOUUzHXIJWwTm$2ATw@%)+%w_;ss#&uf6OvSn}DJAIu{q-yLI+h)&NM?nMv5$Hyg(re(=iobnMO`MOpx7pUpD!y+U5E^_bFUOmVZ4k#dy#>tx z_lGF3Cm8e$aC{7YywGR1Nl3Hm-fVhPgJX;821D?Z!Kx044E>KsCLNqk(Cm834;1Gq?xH`@FTKDy*xTLbn|ayEfqo)TbvJX~)hNf~^5N9kl> zTE6Xrp1t+>^8qiu;T!nc7A>8x8fcWdLDK8s@Fnkf$O(>WILR|`<|}Z?0>BTq8?#&e zBtQQHt9D(c(b|cYMOJHT;R^{|xk!{ZlWF zc~X5}-3~~6os4F2o8a-1Dq8|c`o4kSkG(ODA6hZjfNmQq zP3UeAtDs0#{O~*-`zkzoN|Q&HHOS6=wpteh_BfqD8o~?Q;c|9!6C->}TTGm@b~6$C z>ex%N)H8`8qkG~U`J|jQLf`xns-ls8j>VBVBi1DPQ=_hpQn!cS4Fi)Gv>l}4OZn@Yt#I>z(qNWpx?w&b}*lkCB3ec15 zFz!-H#K7-#?7BfEdSY*9G&U$DrvwO{HvsKg40zVZEWfVO4qy)D8ylPqDvxrdb?tGB zPqiFBJp9G%bhIVG%{Wx{V;mXn8X;dn`sOoW*wc4qVY zAlDH!d&keQiG=LGHYNZa(-Q@jeRMe_ONcHa9S8l;UOkX-nQS0v9ng}cpzCzvz+FNY zp+U%2ZN#?E<^1LKMR7(!3&y@&gmZH|yvgc!uce*=M;F=abNx8_@ar|oLjXNbhtLr7>Ko;U5l%2sret?jM|!f3f&GCuMf*|G6Cg4nQ}T z7)zd>cY#SsusdJL?Yg>h+K=w~XLoWOKPtYcV{rRgnOuG&={}CxAn$)R-*t6laVtQw z>@UU!gX+2G=*P2sG{|xMP~0?CO+xXyyy^toO_;-QxcaC1wfIk^KHKLzo{v4KnX z!|6PIBDnZGSemlORTjzfSSpwNTA}Uq13K93lRVQ6jfsh`lx+Eh40Jmaove?J9chMJ zj-p8m9=3U|4VOA{XeVoJk;Q{eK-EavZL`W79%{4qz6chdM;j%_7~Ca#>K}88>!&WT zeR2dyCgn4nY^zK(=aV5HJ-ejzo0C6z_x4fk@E`P+(ea77AhH0aCWpO(EOWsHSN{q# z3~5uLTA*XXzgBn@065kXyX@Y8z>Pv%Lm9{!(aS#=H`=LGx8lP(bO?`hbewLd!IHwL zC{*$Zt>m+fhmpWibg+RKyPX+{33z;TvZL>q_MHJEdEk~M*R8Mq=ltZ5v#$F(=5L2hi3hQ9Q=5=#p4Sd zanYFrx?mQFYymPiEr=MTsMK|QlZ70fjRJ!XlXFOAzkyqJ!($VeU)ah*kcVxkgy z-r~1!`c1Ep$*#jLkFex~Zl6LHhR^-Q-|)WoqE_QG?v!KH{6zmHymY z@mhua_V54Whwp#qcOL$aKl+ys|MqWwy*}sU3FjV&DYp#(OI!GgK0RjqPGwKd)A6m2 zP&(zwX^;LRd6j(GTX`KFl(}aE_v~S? zRS2X2>fid*-b}tm@Bgb$D17C_U+EvB{oSepJ4Zw#FB&m&$m9L8TC_;8y;jZm#aC zw?q(Mj%?Z#e9p&-guWL82tW_CQiy)^7BiO5PJ97+`8@$5_B!E9AI#8rL zaw*^c@9}8UWgJ;t-m7Df$u?fn2X}pyxIQr7?>PP%>=(ehl;Gm3>jS>NmNmZ(B;wi_ z!vAMLrzd!M=e-+;$Su>&_qO?Ejse}14Q`g-7m?tSe)YFIx~^`QJ9+^e$bi7PD}(P^ z(YxP7uP&dy%<&^J90Sp12b^;?o{#b8N>$d2rECUYnC`{U zvr9p{U%RmaM<X3Xom{2lK z0q5f|pbN5letF{Bne@^Qf$dCRfg_pWNk;+y@jf+r*X-cuqQGs?%{EDK-VIP3OQyX& z^?&&G?iz*>A=}3+o6f+fMqx%qHieEo5+@LS&l#hvbpph};HT;;Ep?7)K}Mc(2u63u z$y)_s)I`w1la0?&)AzyQbe}sj2%tW|QM9=^VmBeL@0L)$igS&K-wdj(^e;duVd7Buws`!QAoy0%U0W1sn= zU>bl*{;A4j3#tl41+V{o)<81%Zb0zy;phL=@3*r0`r&{6*Z=C_Z~FbRmryn8WDDNg zmXw7~uECFk8rzC+UDJy$I?ZN?4ItPP75b6YanqU3gnd;rDeO{)SrZFV7fPFCY(MLMqc%g2EJC$-jru> zV7sVvXOOZ^$hx~VET!Ot+++U;A*qv@zjsfIim0E*)<+s(7=C=qQ?&hSJE1! z**2ctTjAP(US9a#)+t@gROI|xzQH4>vJ$G?zs_M_md3aEse#9vX6|0;$bkjkhds!w z9{6b#4Ke%;_DY*c%OA?(pPN&E-lo@!bb*Txx&~LC2}D~go&81=jl)>pWUox%EG}Gm zP8%o&ByWS)64?PQWkr9~HUZX6?5~5a`C18@o!gJ)FQ$(ld*`JqA9~m#eEf{fz~PUi zG6%QzBU!v|UJiW^OERT<6!Ehv`0Qz3^NpXAsh0GD4ttvE@jiw3+fHUKtB7|)ZlcTc z9q*bL+E0Nr7!+%4v-a~8FRS+-3s4OYAD;AlvH|8+YLbN>yV_fu6?mQ~+B*q`wEl1OyJPWdliJzlR6bAQ42T9c(d{huFT+e)?F! z*z&SeOwjV>#CF{Mbc!##F5^f;hjROL1h}>!tVtM;I~TN@(@J%5p{NRL=e&f(e074dYy7u{<@J>)4Kt8V^<}#9(|ni?xSD_=7n1 zbtk>d^O7Q9TD(5_&3+r_JocMRI$`EHx%w&txuK}ctaFsS4 z(8_){HMz%k=zV=)ROYHDcb-p13;h#Yj|t9X%aI)}Ii2rAUy7;D@kJ)Uj>r1ZEjb?# zG`_ecUn2b-cp%$p)x{=`Voc`Ke>=W1vnmk&m2>FRh&7XO_JEA;zG~9g`tTyleObz9 zc@D~>cxWwFd;v4~()r7gr?Sbf#1gyCWNjd&9D>>4FJ?rQ#}=dEdzD6M`KUnod9i~( zTXCZd9LJ5bLD3zRuT1`NXn|5c*}?ZMJ^J!^$w`-U;vXU=%6pr1Zzh($-$hN}LkC>P ze2`An@ySiRXfhHKUGj(3F*Mj4CLMq%z|LrGK-%s$eMu?n(-*h2Rf}1-*wH)Vox=b{ zvGdSF7fnDUrG=P(P2RD&EP{3HoZQ|%dQ#Z9ezUu5z6tXt!k_$)-|K!m>gYy%Z!;`n zt%@nd4g_Xq0(8R>2zka(iGt@jwA2U;dAn>-$_5} z9Qt5RXSK7NbSB>}IZE``VOn`+>9S6MIeEm>apjl`sE5cpbtf=J5}iJrx>E;-3Vv+Z z_t^Gy3W5&?nN>94(cb{43}tYKQKZg*kS@_Lf#~oxQ1Uq*2UuSB^0tx~Augl7%r{2s z8jKp)alkqkuX?@vn|urhTe~!%ipp^7$%S zUGv~yKL7UN=l}elKm5nP{>z8|<&XZ|R@(fK^colx;^UJxd#%3}kP|XcKJ>?`uN8sh zE_5c=!Rc1RvQ9Yw^(Q=oA9m1rw({i=1T-?EA1t0=l|2Zy{b|I${eS8D^QX&>{J!(M z^%Sar!j5kA#-+K59FjxJW7#wENDhUpncw|C+Yu9v83$uzNu;=lEiT>c6=>`QpccPh zpS-sKO7wZ2d+#}!-~8^md^7W$GnlB*vB|OE)Guz+$z3J0A6rPw$9>Jjg2R;)L?ge_kfY6gux1twJ zpbH!YeLTh%(EgLBugY4*gjbsSebbSI4KB)OBdFG>cPTLOPCKxZf4V)q!K3UZE#OwR zB>tfBz8%h_sXy9ib%%ZNM8+E=ow&lIj|}=)K-l@@FTJGcdpZx-llfk(q;#SxOD78k z@!mN`)y*$VBz73+Y6CW-izl4-udH_Nfvt8rpK_i({d|J}lQ#|?RAvwHXi_Kq4WILg z2iq?GNh|(>LG}sN?&p2&ii^;9y>8%1PZ(_msJ2u4a{lg~pN{XI$Rm7*;@c;it6x@M@#M3|*abdO7qWLs!$COyocweCOKL z(F5Imm4Bd=oxUr^1>p6oZnzkHc|@9>%j6r5^+(eQ-Cfi2^_`Bd(&(ULTI8SxX-2*)O;IGGTD2^0(*y(sa`s@0N>*Vx(6$8KHVP&obOEob;0Su(TKSDdol=nGcGuv3N~5KcN`^1H1BTzS&n}!?Q7|` zc0hgFO4EwCa^#o!|Hh9LaIG*{dvOG)Js!OCE8DK;Q6-qP&{mDz!JPUym=#vXy4wE$ zUZ9t)zc_7r$idY%Zk#wicuwQ&@HeDA?Z|W^GuXJ;#M<>zP+8C3btMfU}^l;S`ndoL@5$I$%$1{1S zk?!i^T5`q{v*qt-3mNR9Wbvw$3CxwORN_C)H zdM%A{51p$cUojGz!+bp`aD52J&sDiEc%epx)(;7a&weOVTzB>jbQF z(_!fcE8U#38awoq;n!;@`i0MDL2TFf!#CG*obN*mC+^V^gs5#(X-02j=XbE7PZZk9~rp6{*7O`y!tEOx%}CG z_~Xl;{OA`AAPpkJ+DB8NO@P<0d+?m7_R`2}<_i;~QH(t1h;ata0B`H-htVTXd4e~A zl%QYP@f-Z)g0gbb(8as@^Gbt~H>#jLs-S$i(TKhYZcneX6?g;jawhli2+E%Ku0dNK z?=Ej&XMY5M?>Ct7$_Py{er(fxl5YqWtaQx@L&Ua({XB*Ruqb=_sDO}t@Q*(SpMcL5 z-UVRz++fXb@OazH-B%KFJkodDE92`E0DS~P-Y0nUbjnTXcuKie@x05=gaNuHHt>Hq z;p-@~rvYX4GF)El&M%LTAKLtT*efrP!sG5C#0O;IKC_tNF=0{SX9W}=l`mVsWV{Fq zp0rbZ<<{0G(y6!Q4Q2S1!Kw1(V@@ic&vefBly`URY%#bi!Oq8HzY7NYoll07H^F)8 z-c{ep%@&l=|M=W*Nc_S@1*^-!Lcssj5x!t+wfYN|1bZk}SCgeq&#JlG9M&;rGb@@_ z_fFlomg-{nRHU18&(v4-1>(_;Fz5#bdV4R_^H%Vl6mrMBdSq1$BW`ftL=XbefBK{c zc0}_@5%^vT9u`5nhdY@-e5uz+SdDwyPJyD=%4DD013-dhx2^V5qN8%-Bsez0uazUb zMP`1qob+RGPY>%rul&dAt~Wc}dBccsb`rkZ;Y^*lDmw_+S69{;MumD^!hTb(i2SB7VUnSN(ud^v|Wh56CoU}N?z!Pcm+R^qNO{Dl6M*zb`= zeG>4@cR~gCRy#|Z@4F74bVbzzhIUQof$i8SKO;HWt#{ZU&+Uw95FtOPpmF_ z{RGo-jc2z?()kAZcdtaJfs)T%`vUUCdod#*yw$_=tOL5^E8*E7(SR@sj8phn^w{&c z>$YXg9}{4&xS})z=S}lZK(0bwyFSaobgdAleXM!v~nzaVC6WJJw`tW zU4vy8x^fJrYjlkPjFkvrvXu(i%Q)lUN(cQ#aewIGOD1{7zgGu?LH-um-qk#O;Eu(Wu3ph#E#SE^3 z!&V+`p9jobVdG=zs};co$Z1xV49Y}U`N@=*qqiBzF?8^NaVS3rbP^sjCAV~POe*M? zcm}QXH2i&=af-lr4D)CXpYsag!RpACjQia~Rz?aR1{}eF3;w3UE2*nq$eD zchw>D`g8EaD_O#K2DQz4(D_}v(-GW^c9t$~j?s|q!{ zP8*}T&L!9>o?K>Xgnb49`Ne}?&G4Wb{qOYwCa`?_-S1x>zWU(uzy7;FzWnXSANTZ4 z1Ifw;V1?&uf>l)ag3;#@GdZqyH~1lx=89}KqjJsJAegynR}OUPc{9D&b6bdRGgVub z4-e?uplWq4J3k8VTRlGi;K!MI#-1l=y79`TkG(Y%{WLG1?HkI)GM54HhVJS@QoQ8?MehmdDTb;Fth+uOxZ;3_pIbULKt~cHdj)^bC)|rYyF&!I<#CJ6)Ls znmuKjaKv-xfv;|xj2YvIc4%(|(MoxEle(7Z(MnI{9}DCYA*EMx!08>ARiWW*#F`BB zp@XkfyxfAIL*@7b#xjTBAoU z_8A`O=g$*D84&xM=t@XB82Gg?oZ~xQB+)6pr!#=*9k2Z?x6gT#^d0yJU%|)U3Xh@6#}uE#n-Bk_ z5rRH%hR>vcx;9&)myPeTt-$LzF)6{rg+3gmVX*f6kl|oKCBs&Og55+;#O|7rxyyCn zp!*>>Tvt{*TS~s*76RG)+oV%WbY;*501t9~uC2!pp5d7byadul7YHe|U;3>_@^ zOg^_OcTfedcm5uU+n->)_Upq*xWZj2@wCR!<~ zih8V{#qNJ~+!8BKUv&3^?`sJ>!ngK0Kd*L-%7+5N{93+A)7R^lj2+Rx+2H1zaWdaO z6Xy6;AA-%`U{zTnnVh^bKZePzU4P*d!D99Q-+?yGskizmJFMtsMY=XQdHnF`5)XGT znKB%;BG0 z^Xm}Ie#1rc@gps~wV1(JvWPFfh|rGf$rKTu^u9^g6u8ycVED%ttOSIx8PF`+jhXl? zGpKZZa3Dub5?R9UIiGQyySyFa&evhsOzs&h9Dtke&cN6oz8KX|_HW?B*tS%iAnf2r zOVG7Sg30h3>)hyYG?mh^N}5K-7QASLbB$oeGst6T`7@r(F7P?UpOPhTSU9Jqm7$Zt zoWd(}98|^2*>fsRGCnbLJFf8CI)WdH2$v2IFP)AG{G+I~>wssE^o}R@VM?82MrS%X zQoI=SA523%*nrM&_&BD|Q5%LjLbx(rO1b6XL)n$VZ-;NN^5{FQHMmTV83HeBydms= zc~vN@cp;g?eNr&^aSa2_3mk6F4835*?7z;}b^pT?D(J#rwV29s_&OYwQoz8eAKriE z^5Eqj+tHxWEX%8HAA0v!fAjMA;}0+YumAWbmruUziKF;f4@n;yaDMNpnj!Dks?`gE zonZnWYh3!R$|lnlrXRr$84rKH|KYKjrx5Ttxs$i@?71K<2Kc&x_FKv9y?+KaHy!3d z-9IQ~JA*zrY#GG?#ujko+q#BVx4PB){Tf(#$KUI8SOKeMe5s%Gf8@4e=-8}Yr?#Y8 zu{AsrlzX|jW`%)u3_HkL`E4;QflOY<;66h4H41K4kE*yDMAx)M&$beR{iHH@c{SeY zZCh&ll~#6XrGqKcYTP!nr;bORlbR+3VR!{2u=F4i>03bs72Tts!wG##JM0Y^sCR{veveFX-+&80^WxR1hcxHUgus+*xz|bPhi1qSu6U zvG12ZjQ+hmuzE9V8`zUGzQ{?p4r?0^JUk=&qObnVtCLAk0_w#eW+l2#=Udgb+E2+8 zkuMnh6WaX@&s))dZd;+cr#_VTtS#lA>ty3a``{^Pwzp{PpSSwAw5vUB-FY&d(aG`e zATTq2j@;eP+i3iLtCG8u8MEQymw5Lo6u$V?B+;Zv3n$>`%(E+n^q=Tm$A9^2yGyhZ ztR0#Cpzq`BCA~fUK+rLtPSjn+BfIV?#RZvsPM}Uy6D(l9oE%fv@&D|4YmX+|u#!ET z*_m4C@nEi8moSm#9y@oQWwEpz4$hvZA6d~;2+#W~(|>Zn;ehk_OJ!?Q_X6m2$hP;I zm~;Q9872WCnnm&zI664A;;8=H`~BdWUpPqzH@;=eg~_7P=R4`fL=hbBW5b_Xx%gZ~ zb?HpI&wRl?t`~*KFjZ{Tx=j!9t;j`+k)S4-dVXsBcmADS~XGP_P1;OaY zuxXPD_v;CM{IyTCgs6wUJXTMnjP|U4N}bwm5(a_E+q04?6OX0i_=_e*1o;ZFuU90U zI(Iw(H|qsv)Tkg7FyB0fH2MdRO*ZfPBo7uTG~^8d(vjRiwo}J~wVf%S6nzA$>y*h9 z5_mQSE1f^GA%1RcPesl#9c8C65iaz~Ja7u^QsUsHQ^9TgCvoF}E8H}pJbzItgk=Hp z4YhAyC+!6zBlRK;#3>Q9vRAmJ%^}HtgDG_&2QMD!EeNct-4#i34@GJd4b2G?BmWQ#91_`}APj}stnWw3&tYjOXT79HwzJ;i>Lnn~sv z7bmC;Y2`h~K`mDWk!JTTa+Ef{&?sa5KF+T4!Oso?yQg&~n{xMV#AICMzw$UeUeEQ1 zWYcf^^?$2J>vu*gy3sH`h`{WMzY~K=qnm!VLKs=7b{}Ak>AQTUP*wn!ijac$X65 zJq70~l(MHs8fTTbny1EvoD?u63>yQMD198{B+7SefD^322tU6WiXv9gG$NJJSaXQZ zh96U-(Fw!PA>~0@o+w+xrmbUm%F=-{@)Q!T?6=AQQDCPm1Y*bSXxXwcn)XV4eJ< z*IvJT`}@Cj`SD-><>i0*!GErMwiVLcrQuNJ!G+ws!uz#;2FGs^0r9?Yap)diBE7+y zVF(-sfb!3FGZK`ZjO+sz5;_$6!p+9>+j8)-1~)yhfk61J1{?w_g<)ZrFJtaggVu1F zNwWfoFFXo11sBUJ{ZX>%%s)s!UPkYJM7l6=*a}j43!TDm%mmND=82@<2U#N>jYoYp zYZuSpCS*8PU&7F7et+5v184`n@UcP5Fkj#Cb%l42p!fNG8V&c_y#iTz+ge*1A6J+9 zUunO$2Mg&E1ebWjk1eu32IE%e_AW^Lgg^k-=@7w3&vBdxhgN43hX$?j9{|Xrwyu&HEjvj_Y_-;|G1|*wAK|Bg;|T{az=-uy0oxVyx#D)`I z-n~@|!G>c>z(@K(^NMd-12|vLj57N7IlP^8tq60Vy7r8s0F}5j`PoTFX`m)?fdX6y za^UkFh@}NXk4FY62@_+x&eu*rD7Z?R>gPgd1E&gZ1&}{fW`S9}(1F31`c0=k{;rre zCovrGl}^@8#KqJeLKEL)TxZ|!2A@^*d+tST1#-Abr*d}QDxb!HJY*(xdXewI9i33A z2?OspoJU3P$gJFfU;nid6%5B&D5#EgvUYML;yFFclp#P7>D5U%yPjR6;#_?IGrsnF z)5jpgJq*MDOe7t&^4h&+txWtS!01SfE}z^uVL;J}hY=h#6Ik#bUrl?RV$xZEkztoL zA|rM!T8T;U0vF<^+oIcssk}7$xRN}$;g#O!c833R?)&KB1m0hV`-kU40FmPq z9)QxfOA32I2a&;+`}NbE$7^~x_PBzbpQH0It`3)W&{XKKI;f59z+7pc@oTUu)Qy=d z{S%;H6U%3>1%%3WuD}AN@{X^ceE2@RZ|6;5l7S<=iGj|U7zXJ(pS=#h za5+}4Uo7y0WA7_6>5~uO@t@9ylzpwFO$UgYgzAS6I-$24Zj`1QvZN$5@+Kwtjwd{!qhfAkU5RZb<2 zmGL^=SB9akW^r}7_pcwdWpvD*#%&EkR=OiBJx*AJLaabv&d-u#3AaSpC~|)hsjLQ2 z{tSf!hw|E!PL6|>G>+D!kGa!8RbG*#gvLSfK*#S%y86t)C26ZRF{v_4tP0;|7;nza z;08)$gKtVKZS*QPvf=XUK>udY;gC3>D`z3WQ`m-2_E-5*JMeMrF}?xMA#T zgB}+*+~lbfSVgYfba&7uA02VJ9HcZn-t3iFOCzVlPhDw2+M&0~rSuE?o{nkTtb#Qd z!uITnuPY7%r*&%KLf_LF*UVjcKo75*2?_@~TPdp2B*q#ijIA>FYhbOaSRpjD$@nLeyL zWR+6S!T*$@1gVch{&D35T6@atRZj-y^UrY6Z~rSt%I<6)kLcrbomsfZY&DQy!9Te= z_ve1YGeAT<++#dmVoV^XZ9sz_UQCFTV&IQwTUrh3`Sn)4!4ax_zFpp)b9ms{YG0Y z8Y}T2sG}HzalxPt5x<;fzD+=Fflj?oGdIx+k8L;G8hUGo;Ap7cN>h;irOnFTdsdln zsYiGu4_mo8|E%(4ONn_rKM`Rx&E@^Y&%Gs6TeJsZ?^-nFvzOmqQ3!1@ZBGB{nmre6sZ>o*@tZPRy! zmU#M{GRr{2=O8%{UCnQY$AtrUILDK7NqxQW-vJ?4WDn;Ed8i z_Cuvgp9w;J<4s{#zpdi;Gy)Mwa^7#Vo4eW-)b?5XkokZwX{*;Nv z71qyuWz3w!V~5VKFv=XA1*?t>ah6Kfl?@pitz0L33ju7fD8FQ1ZB9U4-}qs(W4CR! zufUBjB-Yj;{--THaF<@ccDonZYo82OZ?O@I;I%+x^@ktrkp;cw zlM`Hj>wgg+8(q_Jx>`BBm8Bls`)E+ zzkY`tfle7H3y>J;2m(L3f~C2QkoKqdmiSeVQ4lK~Kc;lYo-* z>_g{ZKMkbL=2+yEsoWSpG_I#?HGJrp6>%&8>6fcg+&CUn&d1F7Qh0+WsTIBP4#&ZN z@VTBpka38YNG~9DZ?O$f8l+cVQuhdkaruaQ5iFG zp>Y)a_`P<{8+eBkKg+*zu@#J^oJNB_*BOn2LrW#{;31U;&d+R}d{Kp8==`_Qany?X5>-S@UtF{R5RvsL-G8kM}&VAG&AHj;IbBXXopFX1CI3e$1t z@~Dwd(?20^K7Iy2#~w=Impp#?U`gXyD~}wU$A1ruhsvmHRxqu)zLKA*Z&nW++mhDl zlhXF8iqhPR`mly~^`bmDucWelaN$V&ba8a(9RK}KmdV-$3b!p_TWu_jJZlrmB`V)? z(1%m?NBYu&9j-2JP|B-aYjdt}hn_*}@jLCx+LmB-4!4y#!L~uGV(`3NFu@>jW`~Zw$Eh zF1@Xhl<(5`Wru`(G41f0Qx4 z$cAehnzf*90g=z@WDJ}Mk!(wAOccTSQ@Z@RFIIH-FF8zT|vPQ@pSc;B?|1YG(QA8 z`sYVb=?G+f_~C<2hGzb@zAL!l49*0nKW*mv6zwq?Mz?&B<0FXL{Cl2)ML)H}lAk_% zY_4PVC(u)FWl?|=Poy)MM3(SlkOPNctEJ%@Z20!jrLO#+aRA>xTT`Fw5A(Ubqj4C= zHHl9cR&yKqq8g+TM2t`wUq8IW__ju_z-&gy0%_s1xeP9FaxL*fe(P8_^Q<}CB zmdO#$*(an2FWB;~z68e(`O^El{-56&j(+5ayVJCGwL>Q*-tfXR8$oa`hT{dq4e*-% z4+@?V|KNLeNAz|iv!cWIwd7m&3$o<6>Sr=J5B}?N&lkqWjhPo%b^><0A+E`;&jJ1) zFC+hujl(NAZv(%}zIIk|t@G^DFRdRP8J8)0uFAR|2M2!O9gV)oaOmCOP9E-V^iG{F zr37B#kas*vHAL_9r#HIlbu3jSU{dbreL>ibW_hkB51zX=LdH3l;i`hBTibAJKQMe; z?zzp{Yi z(l_T8yWrV<^Ge&AZzsZb3XH+DkpP0w{RXwN%F_oJ$U8PJ-|2xk5^DpDBFnfIT-)+5 z9-bG|KhTkvZNO^xtJzVIFDmTH^@Rz4QxcetE5gsWM5q8MD#V9S&3Ck0Pp zH5^!<7Y)Z%Ph>k4$H@UY!D5CQ9$zC-_S79b<<(G9>{a0#14o9j&vLFt%>eq8e}QB? zc2&AOs&)e@um^SS4qJpASR|Xw8DV9xsUm-6B!eqWBHi68_!`dy(DbjlL^m4v!&hUb z<8!62a!lB-mG63g@+*qkO%jc@N{F?S%TGWzCi5$=bJx-}7%GoJc9+>dC%?jMGV&mr zKFGXE65RBiY;=1yb3E%}NYvJ<9BCCcdA@8Vpkdpn?g@S?gA4Y!@)j-w8j})vdkh8N zxxkMyym!!j91|?N-Ze;j<>hAStvX~A4_bKTwKpzreCOTE&wu`l%m4Q0f0kUW8k!0Y zl|W>H#Hgyk>9cdxSw|yrY})UXQ+mIw%}%z8Q5>!fuB{-^x=vESM-SjVjN^+g9+l_S z5AwXbj$P1VdwLNNe!~hyWdu(eMe;jbKMhCsFi+p}Q#L6ZpSBRP;t8Gv+ya^c$QTf4 ze@3t!Y?@v>U$vH=7I0yRD*I8G{#}=n|&m=E;iE1^PpSmuS(ed-`6k-dRnu z8nzYAWN@FM>xSA}xwMjLTO7YaBX#UUcSNUuG9i6*d~AfL{s-&Vc3gD{{7_Wj)WL&8 zFizKCZ~T*)E*|FJ$`G`;E?!&3RL4sa7_$$3;USeyW-Eh&3^+W6RsQPO3o3^{lWJh^ zHzI$qM_i&4E{yhz2D}avAACR}eB4XmPHxFZ*C&4+uf+2|U0uj8qr(Z7%=GkM>Xx z!fL?E+-zj^_jz@6fnh#z>0aWet&F+XQJ_sB2H$(YNi1a8b#|W8xcAL1k3_f5zK*hB z)%|Pt_6Yyd<6Ud*zCCo<`B5F}_g;VP@>_4ce)-i_^nU%jzk2!Rul?@jt>5@ozu#oNpHBz0~&ESKjW`1O<7Ye~`Q%rMq}B=V z0^DCr7xYns6t13BX^HP%4_A4V_dkE_^6ayZ(o4L0a-|j}AF<+UM&fx}44(b`)627u z+rs_f4=?Zi;6GhH`{^f_&);kH@s}T7KIp+%KWf(EFF*e5^4IVG^77#)pG|)z5=>SlGB{SMSi0)MZ=couPEDdAIPFGM`!@<#zdsFFb$+&17Ip1|{;JF2=W}7G zKR9-h!G`?~{V8*G<--F1tMK?L#Vk9ldIe(%JUMDMI+X7d!RMX|n++$1mDuP$>&dw8 zZFTSK%C3>4JN4)27XA#LuX2_W$>XB|=vbdQD%x_`Q9U|VkM7xa+E~PZuo;CKoO~$x z41U=MyV^$9)87eDrTH*6dm5jB(FdN4lMdu09J;gjc%vixZ_a>KI|$F9lY@HcZ<7fn zE+8Di()rE+2R>npJ8om4Th>2-kyrvzMvb*kdM0+t}GwE($H4y!Bq*a1iPPt*V55NTCH{X z{`%s@#D>3*_7a^NZbIGyLb1ely_660rj??p%+iOW($)LDf+Hk*P?SC@jJLY2&df$* zL>pDlzpV;4E2ZoDguP#qF@krC#U7Zb?rpX3v}Yz(&p4kQaSpk_8gg9Tj$`Mq30AwH zoeU<}$xD`h^{9Zbt1(;ym&|?6Ofo@jWBCe6$b((+4JZ&hhMvM-NQp@4x7v%ZT8k;Z z^A~1MSXpN7``QJ@X4Gi!7`?I*(sm3DG8luCy+k@N{P;UtJ|LjQj`B2m6ofVR*Nl%Y zG)BPOyED-79Yc|VP&65iWj00Iiakindv{JOS~G~AltxjJkJ=B@9%VS zI*vdq_eujn4}#ID(T^>bDjiw|3Isk5ey*3s0xxJb=#000wjC#2Ij-$g`oXgFh2u9w z(=!~?Lp-3Z(cCimpsFx+$|};f&DKTgZ0@Q^58A$U-ylxsUqyNJ%4?U`-udR`%;$`@u(-&gh8! z*%>`(eDe*RI@t*66&4;c@@e*{SaKa%&;w@%+;Fsoh;1?DN3RBG)l0Bo>yhns#xb|m zA++E!xTx6tjjmMP>7a9g%%kjPKq@GD94~v_Metx=>0|pW-}K-X;R1b?JYiDT(O(Jt z&5Py9eWRnk;e+XJI=8Y1hhPekd3|N@F#A-7EQm;>JiHv+Ra^!FQ}IIItbljHmY=X(Deo^`ob4 ze5v}jHej8L$*Ed_0NGnxeCm9_9qWLrv)%*8URB%}AaE1~PzKbaT=}-8TGg<84Hv$i z+OnE%)+khNPi-qQ*sB1vkICoZBxE!ZCtqEuHwd41zgb7`<@6DMr`KBiH*dUp`TaK^ zwfgt+55PAO2~-?kuG$y0i`1W zqF!{ek&)eHa`6%B$bud;DIE5?>&60mBeq9^>Jl>S+aKX^~>{*KE6Er z#ou3^{^W<3FF$_m@_vEgPyh5!FOUE12l4#$@@cD!|KS(!U;gZ)&n|!excA$|mu=eG z8$KK}a~V4cm;!%TWO!}X>^&~xi7%DDS3U5jt50z`#^pcS!WmCe2`})KKKlp7`_x-> z#=(n;{(1ouGgW$aW0P@w=udTHv}-UveWAUhpZRFG_~E{8m?U8%%)U<_UQp;=o$R&1kZ&g6^Dmng*npA! z(+lA=FqJ(Lq^ShE$-jG-sgIodKE6W7v$Jv&7oyN*7rgR)dR7npQtxPVZW2*36n)ND zXr|~ZI{C|dk$n=TM}@vR*yQwk=_oq0fv@8@(FTzpVYGBU;Mia{ADg#~{qh}?iT^kU zm$aoF?H+z)EgPz9vCdu`L!t2PxYC_(T=Czs{EinCDx$tQUhuiAL-%@m{W-GWQ#r?Y zKBw1fa-^ShF!4*BEHB`%-Wq~Ucm%X8Up{dAOvqcJboC@yy7lW16a9Z(mLPZhmwesQ zH(`#yK9f3M@=;2LKs}%?w@}oI9;#9N7C)YpXRo~YDYS zfo>5Py@SYY4;oYY;2vAOOU5nYL0jLd4G|a$2tCwIuxX;!F`EbuU4%z{kv5qnrb{%{ z27eCMSQZ$*@Wuc6)d$5^i5ZLm>|J{_ru6fbArB%55P>T?8&vF~bd5KJko$sbt7C(W z=sJMd7z`+%GD+^L0?wWV=Xdvkoc3o13Ub07hpux-0A&`HSKx@qc^v0k8K?M=;xj5T z;zMvZ^9~T*PT(SA2W3vl1DA%g!!j5;13KI{IRjXy)Wp}WFYIEZY}^=_2qRPi|9D@O&lD(41V+sM9bTg#_yiGoBPI6QXR zK-G$Lyv3`o@uAfO#B^-vB$EbelB*#V-fBXl8x?5}yQqSAN7~zOeWQTz8yigj@qhde zmmhxkQBNGTQWMSS#l~4Bocz%r&8S5Oev<~NQ=M9HG+wI%cok4Dpy_(6EWud`dQx5S zZY!^j@UMSG3%-L@S~!9)nIZZTZ1rl4{IFreUf)2YyY~;y0C!&*n$tl*a8`Z~7jfA~ zf}wNcz@C;$(~k`V!X?n2MLQSlX&l(?g9=&2dpRCF=*7@9_7$0q_@z}P9X|i? zp9uSq1?>5PmtE;hy*fb_e)i`#e1H3#he;yL`yK7Hcbg$xV(&pNX zZq-0puLz)5fu>*wUIocYX0o!+ZQuRFWE5m7BT^+t5h`G zkXKoLa<77$SSamQ9&t76v|XnhJF|&km@iUMkzV-D4hk>Fb_lfK)~2Y>W{8zg2kDw* z>IggIS?<)W9m;=9&J8~cLs{LtS10ColVt^-UKs!MJVLRyUfq2;U$){P$ZKoma7QQS zdS2OQZQqpEGuIiMk;Sb-A*MIibYnMNI=k3ckAH8+?&i8)j^4)*> z`9@BiB6{+sVyo_+eWwq^GDl;hWC7M!X~_nx(0{bfO6L0x-9 zx4rY;gEzZQl+XU|$ocS%?3XqfQ7~8#Xz6}^*GmP9`Owpk|0X=)qR8}H!_;{+yepyL z;CXO&_ueS`alZzkWoyr#cekkr`{>-0QJH&h6db<#tp)-O^j~U*`9XQv=I+7k;Z7aR z<~)7>aZdU0^5u_yaQWc>^S@u-`^z6+KKR*3vGBNU@?Tzl*6&Y0`|R?+|MHW|-+tE9 zha*_{yDFxg@w8vN0<;&aKZ%C(u}|e)Ip=R4-lTqbh}P+s_;xbn3>)YK>vwHH&VTS6 ze{+5gWjJEJ3|gsWkm0S_olmWxya3k!Y74q{?B19m6Ugg7!NB8{74GrOXX*#&X%Cyq zK{p9Ri1{}jqb(pDzm?5*-7d2}ITP^!Qq`07&GbkY8%SR5n@|F3Ph2f$TTd6LGf+HDmgyOet^+dtGWq&;(2fH% zfa&s@CVhDOWvd-vocJp7mhWWt9MD%^g9ZMN;0DDOnf%4UKcyX8zDPbNS7hki4n8s5 zhpWDmXmD^GHgB+g*Pi8D!~ZoraE$I?P6_32d>sCdjLTK_CfotvcW6czUteEkmHBnP zyE^nrgnKIQ=Y=e#`?H#EAtH1Kf95+u44WOhO^hLjp#S`0Fs0pAG)H4JuQYdf z_%D9Ram!!eO25JAYy92Dxr))fT>VTZlgXqZUI!FAY-=%*lc=FyR5k;c+tDTJ6Yk7*#zPI}3Fr>g8lr?@oU_G+ z`2Hv&gHc4XaicCHs}s-&)DUXyyFLnwZ`T=h75jw($#c?f@`Y~4EmREjtu{3($KrDCz2{=`RdyPzQJL67QWrcwcSv5GF@8hJdLTrXq})3 zLVV*}-@80|8|gyWi;C9$YcjSQ59SHou6v#>&xd) zSGYYmC;gQ?9y~n~51)r=TRW45-V8wCwK4{uR{$uWUNxlKp&^kfAbhimOb6`87wFBv zo9@3b(CHlCR`>kX{jUMtc<2WB2pGd4Z-?Bl6$7{IUi` zWAP|`TOC{-D9;L+<5sU+&cE@b+Bz?=4CU1);5h+d!}Q8mKaxNoxEV#r!s&rR>g;Sk_Zvzg$m7&Ka_QTHn zhtF(aOuz93mpUXEB!_mRqVo}xYpWkLORj@9Rmca+iJ|eYf; zjbQQfromP*TU0cFZ`A{b{Z^4*I(01~L^3t7js#q}7uSw;YnU5cA zE>TGg`5YdV@bq0mP$j|PIDPMF2L;@4@nUc*SzE_ffXlv(EewhrV7x2RuSrI@*?6U| z!0tailO&igKmPQKKsQiT4?5r1PH@r5l~;xKg8QVrmkx~sj@a3_Ne2Dr%BCZ9adX-w zyhSknjeXX4!3h|nDcWlI#IF7HaKAG~$WJLe`wHN|YvYcA=;o@g>E-0X%C3OCU)4ag zMd$n{AF1eW=aG&7A;PN%9YqIzfAMq17iRzt+^Q(jn}`mP{%ZW71#g)KnO_AG;Y~)F z%7Jmr-hFM`v^=^zIi16J{+4w8Iz{Dmgbe)3^mR)+S+!GF9iMjdN)-Gda^l_F{47z=gPyCY1q;c{AoeGn!eEOqH_FL zo}b%f2`y~GzBIOlb~*v$gZKVd-O5_K-}Pkm+uz_$u@Xw$Q97RpXa75(a@=(1{Of7# z`*l5kU7ssMe@9A$=X-v~8+Ys6foHwQ4m9xzPMIa@%hgR29%Wz4&40(EQ3m~0t^%^v zb^L7tbvXFdRdz@MI*U+ggg+zdDDP(L1+6hMS@3ctj<3-g8a4=Tb@qOJARD?jfAu_| z`O9#^i;DUge2TN?VTNzJ=p#RgE7$5-#x>L(KLoO$>f= z+Nh9UQ~Q}xPhAaYwz&5{wL-YYy?)I7Bk*BHF~U=LEH7Q&d^*Rmok%&vwiUCy6|7Ln z0cvAUIX5v6PM);#;F>YvN33K17y*id?tIC>k1weQmu$x>+Y7*fhBt+2ILjB5X!xT# zrE#h*buV+U!E}B*J>JJ>a2anMXEd{FG9MUP*dJcV+y}_XO%%p3 zpoTHQoq4!~hI9?JeK*V%i# z!E%n%(3D>SzEQVzbQ1!BSSeGEA0*)d9s^zW6%gK@XA^C3s zmvUx5nmWL0oGv=Rv)~hDoxP0?F-(NualfV0`%m4bL zA1x?(&GJ;OgnN;6>c{{3jjk?e4M@1z(WFQq1-!{T;maspW1{lL**bOsA?57BDe(j^ zPQh5gGuYMu(-Z5Ec>@aQuDBZVU0!q3RS;y`qy0PoxUwFKVP){u>@{DFhF~$aW`lK5 z;pPwUTImyr!2#xjZ2fumAcx>e)AD84HWkP>&i^19wpDs%1sXS7v)|#W#5v3HBM(dY zH080uO&hubz?IU;!7#e%^Q8LFD}Lf0)`A60MZ|FvKq zBoLW4xUF0}@+QalEZsX15mZMbH9o95dlw#;kapS)H3om`_DPq5*8%m7M|u{uIkJzxFK&OB*JF}tnb0iX8Z3Rp??OPj<#WOT6cU4FI!TGs}LU&Qn}q8LbB)5Yqt zZEfjXo~@a4^DAY#9=+<_?h_)n)?$J**?yX(tubZx~jo3L8}=2n0LEiHx zZ4>oyk^7HY?R=-cK3t#wxPB>Pyz-46R8w$AE2TecMey$a>;2MFf8BE^NFGm3cy&`@ z*Po=H*NY{8t@LPq^rr=W(Rh+9+3fyX-|fcMaJFUst_N&g?zakA0C|b_vtM>EWMDDf zw$mS7KKqORbouDt|M}&EfA<%cU;g5g%a5xBf78Qn{_=y5E`MJ;ZDs$%D$Pgz+Wu^! z=G4DfPi8Mo@bqc^#dl+{&uV2ny1w~ix)0XY{!P?2LX(RRjlfzil~XDoosSP-KB+RS zO$`Sa_ogpsTL1%78mydEN_Baykc9Y|>!&BR@APuu$f8)3<69lsC4ap2yGSJtUihlg z28qT5(!P@IdYX(1VQ!3Lu}NmyL9lJujj{XGkWnt{OOThqDumTZ$Jwy;EfNidO(ou+GMM$o;tkx zUm24#M49cXE1Sr#{QCLuK5I4mY~3Swy!QuQ`=X!3)|e>uc(z|W#Yc>?hkkz#w<+TW zwSIRn;5zA`f4USP-RwC;<*n_6Ssn#miCl}WjfKPYEsfp-p1xP~MFz-osAue=UfvG= zkg9e_4dfijvTJxd$Z*S=tkPtZc$4o1fIPau51l86GGCo5H|$p=r@;IXUG*Wlwnsb0 z(>dL>vh(K%<|3oNvJ4OX)=3B1@ju;%OBwbUZ$Z)ndUNpd+^@C)>i`eWPN$=O*;RR4CE2p- za`+CYzGf>)XONzZ(W|Q(w`N#9s@@<^>qM?kyS+j}1&UsC$xI&JsN)lRi_tfnhd#l^m=ts6MaZ<1RB&tUKgvha%j zizBA)H@ed3G7UH@lw`o~ZFS68_`DPG$QF|2k4|uhI}fJ`-&NmM=R8zr{FUa|WKE~^ z!nfE&fMn~a>#fFyd~01>1Q^vY)>!h+-DC%C`Sf?J*25fU8% z|G?L+%~Mo;cK@F`J8aq3ea|T<+S>KLn+=#uDFW1ex(UvaN-H+V_+{mMF8#n|1%4A? zxDIfS%@?f~AU<~=Z}pW7PahWuH9=!r-{durH8_qt!H-p}oF$B>vwPSBThQkt$ zM`_P0WKG4h?$LPm;m&n5kG%Q^EB3sVyL+B8+UNO~ zKMOBi@wGJD!2MbG0^W5$qTuw|=jeC(N)tv%Rq2%gb-~q|-OrGWxd#yMG?)f>Qy*kY|9qCdmY(bCX>eo}2Og`Be6PSpe77@iMJoIYv3!`>w1s@i0)@ z2JI>z=kv4QoIeNw5kFH3@?Z~Ec9fcK^2ZGVbwnMv2?pTMI1GCD_jZ!gC4Q-CT#>RC+3qBu%`p7pHpv{v(>*4S-Ve}Vqv1EpP{(lZ zAswY@_p!8Gwwpapf1%J3pQeHfYVx2VBOUL6<9b@^M4GNky)7)Py{;U8K^|%^slI2z`2%hSNiiR9~>+R)#zW9r}kmS_g0mHn%tayfOD5C6k2?ko#DCy z3`1XoQjCtelKmB$p<7aE^2iPL<}117^*AT=@$~~d-#EelS2@Oy>%Y{Yir|pLu^WET zAozH{wgYxVNyZ=e!8&mbywkNhgUO;LC~rKtaX|G!<=(SDhLa|>UBMAffe!8BwA-(- zi$mS_ciM!*qrgyGLowP7yJz$P!&N(X^j@}s3^eh9#>S_eOE-RB{f^@9Q^c<}vi^6B zik%$lrk2LhH(K#?@87)ou$T@J$%ps`=mR{0&GF@TdG@Uz91t_Z zF-6F9@-dGYLX21nFtc}yrlCD066VIvRjG4~Xsp7dVddwLxLrC9JAosm55BVSfIT_n zIJ`2_2KD8fa`6GS^v&>Va5)rQ3UxkA&K>E6D91VQLfR zV6lBt@UxD;G8#INf|%PY7z}XGHE5dtz*V~Sh`s;Jd-*;q|E3G8Y91J8fCQVMN6>7Q zk8&I0Z57itTe@KxPZ-?mCQ9qAqLcNb^nv!H43FPqL2?P|S{;lb_5S4qwXGF70{{&% zpHx=x<9`zb{ko5?;^6{~$85*m`KaG%GsXp7pH`4=Dz?=*CH5KsgA$;W#cetTv+|t? zlm%sSyvNUK>%-F6!*S{d|0}JJZKCWZ@Tvw*$5yfhJhqi$>-AvVCrMBC|I>!;u7nX> z3&;g$fh>KUQT*8=I-bJ^kD$@-Sn1rVpp`>MmoE;syrnGYlNk?uj&Hcce__Nrr6p7( zbsYi28(WI(pfByS2?qLyes#?CjdH-~&ObYsuFh}9|6T*o0+sXRGCEL~j;;+3o(XVD zkf!Zkhcz7ODSM4%tLz4#59M1K2)6;HRgh;oB37N_rhV;C9DLCL<*w~-6D)!5TNUa? zCo4J)V~dxnT?JGR8>F)DH(Qna?e3lX7vKH0%lCinf4qF-U;W=M@BWMb_VVhl7Vta@ zKN)O?{J5=^AOEy_0Y4~aY89+q0^3zlJL8GM&%Y=L;$Pjfch5a{1((k`#AEjlwvF_Q zyps+LoS)=nt>kHAF0BOKfAq~xKFrt!lV5yrdGg6$ULL&l{Sz!cX{GMV_iLAWT+o}p zTe()i+_NQ^EGT_iz<1yMgm>;K6y#>@FQS*MceaYsOAoQRd)OqFqm{+y(bwW`!2Qav zRII@8N%Y%hY85qNeRy}ee%8uoD}~Ps`0gHdpY-Ea96x*S^3v z9`|~S+QldD|6nVHcdx#iE^@3_+m6c7+ESY`(`(yJTk*XAjen933tHd%>vUAG__N2C z&wJwOr$7Jr^4WVITt5HtPcL8m;AfW)Kl|eHQLCmu?|q8@@x#w9f7#07FADH&k!M5o z1$upic4Y0li=@g=! zgZy;5aT-Cum8(>!&4Fha6hLb)zF;2S$ge#($M%Y33kyKV59&T0yF+Ktq z_A5U6lj0cvi0qgKIy=|$ZXY^Sif%_Q5Wim?SA3NneQoi4DtL4QoI9gDP_mUrKV_bP z^yJCDjWOXr8px(rpJ-sH1=F%<2hx`l#zff3_9; zt-ZO*jreqmjmEjnyEcG!1^V-o;R^}6|Myl18A6Pp zF*oS2i)|JBc$1%Y-DO=`;uFdWp+ReJ_tpX^VM;F4lO7& zSel?2W#x{+S5|>e*02O;@V5p?a{SL3YfZ-=SZp}RtP=N!9%|=ALsd$bbMSugk2gi6 z$(%G}^s1Bc77)rM*JK;k>4B->&5TX#>!3Ognd8^;)1Q2_H0ft+>0t|azFj_<`Xtk7 z$d8QjbRuR1%@(8lxYv1?uj@J{cqFY8npUGPTiLdN zz4H1uFHf2UUqJYcZ#8y$>GG4G|M>D(Km1`G5M7<^l6>21ANbhbwzaxiO7!WLU%+>Q-DC(SUy#mI!FuU;7qjztiMB~1yVE?tV)QyE!(_rl1xF`7 zT+Wu|&j(5a>psXY(~B`Y*jqqI&m|rC`-NY=?!!4d-X21;Mh|Zd&a50NgopmqftBYb z2-5qRBp8yVsS$3>hPOqN*^|r*2IEh8d85_2ps@cJXGa%zadFxOrfG3M%3@cA? zepu@pV)9(;JQ$XC>5x5}AF%m`VbqHbp)-SE4+t?xq!}I2^9K2Xx7~nVz0x-GQMTRv zsv$+keMRg`E`010^WZ$i&~_Jn!tND}DKA@JAgIEBnOEw73>0Cj?t09JhJszUWi{hX zr`4KmGm8m6{d=#zefg*F{@Uf&-u~|8-QWD3%e#N{`5dw+6y{_x$)OYi;vH$)-%pSE*;Y9t|G+j`tyCVC+|P3K zXCD7V@g^7Fs=+2y^TeBADj0>XUj@#l{(KmO>$?oEDndA~sMuX-)U z`#F8LE^czixIugWN)_aOeffD~Z**51#Nyz-w37R&BK%`L`Vz zBH8Kj3`{1Y5Mkz>j=ic!>s4oDQ$N6&%G0MP!V00C76d z(e64N=NiNd&~v_W=_JO64E z@M-Qp`LBAx@!+dFcg7*LzZ)-BEVSWJ=c^mxa;fcGf9VR2>)-ChPamwht@IV%?N#;p zmSWC!Z~BVQWHq6*F?1E(HJXQ2a)!rs$JsI(GUG!7BwH;WHr0o@%@}}FHU?L;%8)D( zIPip}i*R0zcvwEQr7|m<63Va0U?_oeaAH`|f=~K6qNG5Dm0!gJU(%8>^p6~;^jA25 zFe0={aGtYzdFbQ$7=NV3+i~cF{J)|SGi1=Na!$Oj!@<<`fDa7a8AKoczv6xP%fFSF zoE&S0gYo3(?DilU2&R|gI7bJ!(&*s*aJtlZS-^^)60k;pH#sFs&y2~yd5-MLPK-`C z%i!}(fs6;ktT8!cW{2em%l=F5Yji?5orl|ilg>YFHu94?AG5n2UNZflA0uZ=Bzu5` zBcdu+g9MSrt)b)0w~A zfAU%evKj7g1rFl`zw#d0T~asuo**qBr1a}S?l`P+oq@H%HXg|Wkc>SVvLoDKuMULTPYu=#8m@lR?{kh3LN zK&XT=NTBUWjUP0KbN;AR1M541?{o8&P5P7~T}@r%mOP_T+H^3P;8n*?T@`p+E%1;Q zIvM}Lc{q$Gev$!=A?io4aI{c*`37JfSacr3bM!YD_?5pFWs(h!f(K>N=-4(G`1{NT z&2X`U)m*eSn)G7pt0!wJvwMkB#va}fH&%|wxBDHh^aO;I=m!rDE3NF0|KkVIyuxLI zBTso|KMh88)~3cLXXS3&nQm>}A#nVMtW$4gz|)ydhfKHYGtq@$=_R_a*1eL0NhsS> z+!y2_5pHfL|3Q>*3hk45IxR!p;zMiCEmK6yy-)L*I<9Tc#Za=G&dBz~{vhq8>01qe zhpgyUKbKFx`S*FjJl>yQzFlDUz3zAW)wh5B@_WDc-(7z1pZ>R(Z~gjrFRy<0o0o^b z@{P-b@AZUDGn2io^4W*Ia-ra21J~$SQ6ztihQBG9Pkvmq@oBGgC?I_6R|*gdUOp-C zanoF#;GWu9KzY}LTJB!|)>dgQpS98^Ao}E|RWuKEiBkjGYMm{lcb@L~&EM*wG=JUJ z*B&b4y@V;^w6p2JLt)ykYOCmTL7nZVm6PuQGI?TYU!-p}CnZ`b%xj+C_Yj*_9;e63 zd%9@>A%B&A=e>n$tZk`aJjvAW1P+B(;eLT_E1Azf_z#ySKlL!i{F zJ-jT2^bXrnsSIj3ndn$ODFI$ICwFDo!X!I#SRDcH_f@BGI5@&R0V9B|hs{p#D0{};z}9ndL> z>-dcZA0P2DEWiIvW94GFx!AmZXK|^K5z`roZ5w}vZhRDqQvIsr2nkYGW z=+kZZ!LKgh%}#<;)~+0RY`hr>x(LU%ibmTcHl?XM#@}w6D3Dv4S2LL`RG;B~at#XA zA-gU7-U7#a|Jp-k0=(VZgXafT-pXB_gG7DCY^;l3*D%?)kN{2sQUQh9_rXRR4Wff3;vO;J(4#>Lh_>T|mP}fMZ3BBdJ#^!tVB8n@ zMf?gT1wze1tt>sVjmGSQwgaGLHR%>?R&+E`Im;t%_!P*J3lyJ+rA6b1{liI-5T^5i1X?AafR5z>Lgp@0iKd}d|3h? znnLKcQ!w~<@GJ1}4|n&b57hOS|n>K)@iG50!Of0S_Mn9Y<#L_{nLD)B)Rw zj~v00J4oAGzHBfE*ZG3y+~135+mfc+2#y~9u6PX4dCyjH`}L}b=RM$MH$Z)1yJM?; zl{fBtnsbri<&faz(|-BoD`mbFy?1(W%NwoI{gdy0@A60A|AWi-|A#-i{K{|q-sP>| z{f*20Uw@~2+Y+u|?)hguJmqmgi6x7SFR)(Sr;!x5hqFZ6fc4(X0;qz~wvgUyd*tQS zR=P?nF<BIZHt)BPH#Ll_XT!EsU3*J#^b??%X zMen`b%A0(vo_o?uauxV#Gplj=WE-`^`P_qK9(*Hwg5Y2hXM+!~@p<+81+zUp^{0QF zJOyp9bzfk?t}mUqR}#RtTSc)V-Cha^AiD+pV6K{&DwHUUkeD?ph7K z_xA6!YS;sHtT5JUm^i(c{pF9i)xs+7^N;^F`0rfq-ubQNJ^%F6@yLaxRg zT#d36o!BNaW-qimz$?Fgt_pdc0I1an-#Q6o4~z!wT5Q;dvV@Ikh7CTpJ@Ra;HXiej z+@Z3SH!;cvH7Kk8>DkUK%o}%M^jUV&p6Ey1OSZs-#O34nc{@>tE1L+wti&2?@i}ce z%*bxLc*-^r^yJIxO|OX2e@$)Js?KRUBT<@()r$fZfe!K@1DKEnXG<9z$=OuMcg!dAY#@o@!WJJvlg{VqR$ z%gBQ(rQ%mU&^msqPfLmG$6>X7b^&g9;o=7e+xZFl^xMlTNAWAa;LiCeBM+nNBRc*1 z@pbGD8t-g^brZU#lO0#x2ESFo62ELAge)i838IOgyC(Cd`zCqd zT8&B1ZW+Tfsn7j{r%fW$y?_1615Y4Nj+<)E%E2l~!eHn}FGde$k(Gg1e0uv=5 z2D*aIJIiw^n8Hp_cu2K`cCx{C{_gVEKmMBn!oTmH z#V;?fA{LDkXc;OTes6Z2?&9Uh9sTs;Hk+5@dy^aiY!DUz|0sEf0sDD0cf#(UKKWR* z$XPy|uf>}n=)4kQpo4SI-dl9kuaz^Mxu^Ge2n$`_e3U-vUZASfcN!;wX(GVM86I;-9u11m!!d3bCLr1we4Tq zX4yHO1q*aWIp98y{^J@T_Y={9!>S>lBnLg><34`Cl;;TD`7Muc-^G|tVrAq62NeAJ zHgI$&tpvK*D=NTtV97mtg5pR{FZg+*)hWTCkLd<5w=r+zHkRgUpG>x`*No4=#^Ydu z^RjvVv_S;kOQX{xbNu78bo^CvyvAZWbd~(dRH&qVd}$}ivGzC^9TUCGj!yi;8;nlG z#pr}X{dE5=?-36SZ(mQ$4t8a=o{iQv4G*B&M1z>FZI$Y0y0jWL1}ne88OAB8Nt)-a zYCmtO{ayok9o>Tb;GdeniSb8m!NPCrUOiao?(*I4#rvJt-@W|yH-G)|tKa+m%OC!C zzkB(u-}`5mSN_%ST^_vKgHRq8(De?$=RLsW`A2EhH=JH}pH$&&yX!08EiJew1;RZA^{z6{tT=l5X+iRN@0P(u zdKXai9@I-8X)F ztD^41>?tzE%dHq`W8aK^uhn?=q`+F^?0!c+(%*CUfcAi$wZ%QS=GjmF{aIydh4)f$ zy3V`@*xVEFK5CV7ufRxWuYRMgtiKzLf{I_Xs`znF)%)3dmoI<#)61uS^NY)SkMAx& z?p=vL{r?emCO?*C$9+Ecy_~bMs%z-#uI{SpncXCtY>{k{66vNyh>#2kf)F7brJp2a=^nrUp8c?GP$}C`Y28r9iB~iWIKq>5L?tVSz$6ZN8;dj! zx4INv25)#Uv=V z2*~RpTZ0p^#={vt;|JFhJp6?5W_dW0cZ--mdr%oH4VVzu`$Dv z$aP9A{@L#>DB|%09@3pRek)($stc4%;Hf{^nWOks>FB61lRJZ#iV>(n7&t;A!%ZLE z8hm`mD_^Cj0~1f*C)AljnHbVfd0Qu~YbjfP?I+}CtPI`8UFaPqO8k~sb~EbZ50 zT-txo4wb9`Qv!wgTgx>==mu|>IJzgyib~#~143dr$fR%;a_Mo2jR?mG8Vi!>CNWX; z2O_2-na}{>q|kMWs|8_N-F%W%Ki}$~fC>u;;Z`i*R8YR3d>_24GMZN4l{sW> zc6raThPd&kgenBwV4xsR9X1;#nDmX)gYnwsNj_oK+bH-!uyNY5a&| zjp`KaqyzxjMPawouuObJuO7Qc9=yW~{Ed;qC%y`JB8wLRe(XqV--h_wB@%@Sl!lD- z$cjD#?q%HQFmHvoc6tznc%qS!4c@&k&+JewV&qIw4qd`&tX&L3M>JLEk|P9Y*vKtA za!reo>L>;%Tx-sO9Yiy@vbjlc!mO#uM}xpM6-}y-KHfo)T=Vy^y7c%46K@@iGUbS z8RKgJF6ztBvrBpnJ=0nU{I@kePr)Pe+oJMfI!CTOVbrT3tP_T*;K(z}$X^XV^Ym&7 zF0H<&hIpTq{W#SXs__b+K zmc&VbE>E>H)R_%$Vh5!M(Od-93w;_RQ+D?ThC) zCG^#=w3j~r^|tnvx7y;{%!Vy&Gf>1V+iea{!CLK| z6^6nSX8!sPgNY02y_I`*|FgFL@FIt(V3@4BpBUp08FyJ-f0g_&UO1t%VYp1W z%saDrlwS^Gd323sqU=9}-)+K7*YXK$BbHOzSwmCra!)%p4x8yP*dQ1lfoI3e-vV?o z6R44CNm&NY0xBRg3x>>JLIdtu&#hg;J&}<>2ENyakcGU{u}OR`~u5g<-w)oWd}X8 zyuoS$U72lV_FNEIM!OGv%8N@yG46VmjbpEp{$iG!&M;avwmX)vMp^KX8V<5aH|r8z z(o9dChcy_{Tp2Pw>MSU{UoIJ{8~{@s9Q0H6Ggu<~trL*q$FHj2wPJ(` zv$QJ?W@Y&^5ri>5iHkdabarjUq&snuz^>3ik~>79ihRtPO00d z)J~UND?#2gdP4D|zxYaaAX9Mmd$wuv*W4Z8*X_frnMYMb`(y#Ly zofN)TuWNGKIezm5k)#P+{LA>_WhkFad<^lEJ73l$A6NHi5a}viEZ(}tmkOtSD4kSq zr~r0&7)-(0>_EC!B31YZzL_Q&$Tbb(?X!cwmIwG9_X!0DTh-#+E4cQZ7P z;6R8hAJ|SFF=_CXN+At+h99^Bu%HSfx;?*@!vNo4{Nn9v{`?i|N?X1O%GuPpDf^wIJgppZ65CPR|k$sHY+POXa}YDDNe0lV43K+Uoct2v#bKiennSMfCX?4FSQ4Xut7o+F$h^Q zD)YT#OhI{i;fiEoIWsrNc zaHW9>qx3T#U*hS=R*+X2735#jOM>hIy!Xb*1OxY@~zK#GZ)L20g zpz$F%7b^#Xjjsi6l^LK_Ne9*;{J6+*Xl>-jAs>a0+eg3T9vtf3qoKvu99SM-y?NmAl3j`%D18VUot z_)xC6bI%ztwpF-Dvp_|eL;G~Iwxg%+E86iivw?n3bK0ki$#n0E(9fF$#Uz$&ynu93!EYzruX^BynH9-dW3^N*Z*w%zA4`u9KmsNLB>;ecS3Y9D8) zawi>l2t{0_h3rF1I8K0k(jc@vpeXrg7Blgonb^F>0AtZwTpB*|NdGMH<&Bh4!riN; z@#JA9Ff1v={wOmWM^VseIx-t4O&pPtiIJ%ABF2A~Jo2tn`E+ld%Dr?sVidXpm9imU z+02-3;?E%u;v}8wqv`Bn<~nlaUdm$x*kP+siIZ`pH8Q}jdl{7}VMv3shVlnBF!bA4 zEm;Xn2Q1r&O%zd=z{+EF=*SWAvUgBi!hFC|Hl}wurZ|YVkMWgL2_SiJ7mlXOI2fb9 zZHGp(k*phDE3u28`ve7LYUyx*!up{s`?!DAS%*hBmx*t<_1BX1B9Wqu;WjrvX$QecSeb1zJr1vJNgXG| zGBjRzW1>7my>zJwz-u&6D0WI5@`2GNZ>^*APT^X3$&|bxAW92i;tTYYne{J%pqDaB zA!Rs(LfAu@JlMv_z{fTi$%U^Ir~gIg@`M4>O9SY|R08X#0U?RPv0wAXlpq|nBS0cYnj&mSI; z1_FDpobXgp4wG^(-0Z>Cwtw>jU;%{#Yq}L?(=c@0&FU;;zsoYwox7DE_W^dx7>-`s zK!@4)97wZ%o7u+qsYtXT7_}3O!futBH&1I+M&u*X)pH$1uhBZeAfooF=y#q53Q-<{ z!|5vs2s4D!V;uCs(o<;x`^-th*OX@3HHUC8YLzwyxq41awFB2cWr~I{|EfH)zZ%?o z4$kS=6WP1e)cuL%Gs7Uup)t(^b%sexGfTH`?5Z&$a#@OGQ~;>yplf zq3bf*8EKW(jy;&YhW$NeKfTY91|c{)OUacL-FR=}k>`;w^4w(BkArj+s&2YQQE%ru;5`eCtioI(74U4Br@YRfNl!CN1tQ1l=4|xg2$wtz(en1e8@6nWMsCX ze84;IP~5+av3TLLw#jl-2Osygx7wvoueMwF*V{U?iaS)s+stNNN2bP;r1^CVUP3jYgsUqlTZb%`Y?Zxb;cHgd*2b4{eqGB*gT# zKb9fU9MBgpm)xoJIdC<%%%B1Fr;JnZC;V^=j)?}i*%L)(HERIAqz$j2!G39y~}=ucts3f|yg-zjX%VT5Tq{hZj4wz$W{1pEVN2`R(0A{oDO_8a*K@>Rn%f(mxg zQYq>^?Hjs`ZJKScPxL?#8+jBR4*(A66`sZol@(v$X*_99pl^JJ-X;29l_4@rdBzYX zn&ly-%2Vl)MP+8Y@sm#@ug%U?CFXBQjHRJ}NHsn0;L*-%i>4g#BnfADyLtvHc9v+A8lvl zbjS=C@rSog8c=}7%~esHNNuc+K|jN76E^Apc98YumE|_asvY$nd74!|LbQ(oKqhGh zom$;-oCvE~LUjz`f`v1LjtKeG(!CN?m4-oFtH7!xiU<;WVq|Zp%U_aHvBp_Ai_vyZ znJqyUy5!bVj4;nit6Sz;hN%=r<2@Cb7gPF)QX6H496|u`@t4to#+UJY6bK7LWl7Nz z$^7yz^Q{z>*2tt9!c9LmT&YNS*nkSz^aR3polOt?0#X<&mNC1*up#$uUK{wd3yNYIX+Jl>X2 zx~|^2)jqs(p*>>Rk?fTO8!E@_Ejc?*m4Z>$(y`-?obziZ>79kfk)<}88MXBt7~<*U zAqqQq$Y0BXXoOXo7*F`QH_tToj-FOY)FjZbK8fPIOrm@6MukG!cdWP|k`Y1SkywLS zJ}EP*hWpg9S_+DrxEh*v_+%Geh3COXMMWuBUIyHG_ka^|g}>sOvLq}^ca2Xf z|FS$4w~zTqqef<~EWl4g%mzPo3@Db>1{RHnMJ%B38sB=Pa*!EenE}p0*LN&66$|Am zo&;E4x&s#+DhyhHV>z1E$5zL-LD`-sFK;`rR%ui#>+VaG&-^DH`d7-zX7}FEiJ*ce z9#K%N`2^RJ6={hv&accZF7XOn%UpRej&OaqpluH&#g8~x$HZ5fOk-)dG)A0wjeLPh z;@}gvaw-4~Wz!fh(P8E|AY<8?msrg!z}sub+c(a= z-M;Z#|GXXh&3D@BcVA@R8p=Dy#q0sIM-Q0&Vzqz-dSDFf#^`}!V2FiyBySm@(AvPd zk=~`Dw2umd*Isz?Fvvg)us}4Ya&mpbj1x2)dx$%(RcOu>UjHTa9m8aiC79eJ*t1MD z1}B|$zm2g+SoZi~v@~Y-8hi039>AgEa`Qvd{~dX7zzoY>r^jDZphTFD{8M1Sis|7vZKOPA%(`hXIcwNlCdzVFXZk$2#iiYN6kQsK z@LQ!dv!z=Yb2}`JrTiO9Jg3Xhl^G|DL{9i@oF1CH6)|$Br`{s&UCyk*z}>nAZ*42- zU3M|{GysA(ur+k0{m6MLDl?aNE|ERP*%F3n8c^aoyTuYwucVkBKgVd&D~KI!^)?3K zHrHxsV6uO)Up_;gl*7G`VH3t7S6xikFbKJ7W4xXqMlG`Bl0*j)vP4!xU0veXIj+Ar zPk!)k%D^DJ?^d6}NW4nkAHo-;g#DB9d+*(M+rbs`-k^WzG0N}nwOty;2OE#DRUgm? z(C%(+v_~8F+W=BPt-lU(w}WxC%fQ7pebNI?#J$e`xO@0Lq5*wGd2N!V18(kt_JdPN zj7+-HAPO&Kwv1s_GkL^7F6E=+EeqfuB^&Q*b4!}-Umd`+KhTHWK-K`-1rntaP%Kd< ztiRMliyCWifiU++_Kf;_bxZcA(MJd)ZHV=O7x#Ip=zGP4Pqj6?;HMboUQ81qoMxwt zIymW1lxF11Cd9VXfn*K6S^5YDfWSL<*8;~CI`Yv|m2Gb5g)=Co9N3Q7TML8GYM+xo z^#U(_i{{e6aPo*B`SAxhT=n=nzWe4o*(V+#d56zJ8{nEMv5bhPZLf(cjefeTJaw3t zX*HNE8;Oy(dK%R@<1_a68ViCSpOMbeRg>{R`xrxTv~lG77)C+Rt&WpHE}|PpV`Gdj z@(z9~OQKRdD!7R=WFhL7Z{UNUkLBPawl$$ZvxVH*cZ>u7i7?kc~sFd8ZIDQ)&VZI$r%?MIQhEOm{nRk_Blfhm?j)flpThdqQA znwh&^HbO^(U>pT2%pGe{aa62@F#O19h{7+*EbnP}6lj1tJ(&s=cd`lb!q0~ z?HVQGCBfk+udo(8Ejz-2tq~Wv84V#id5PN&`N7nao>|0+?`bv zH%~;W(UGbUo`_V3N|+~|F@nCbvWBwj=r%Z#_tDdggfnVnLBpg_9v^{q!3X6Ekrhh^-ey%RS zy-9;}4}oyDPWqG$^K&r3S-Kec$dY_k7jgs~HS<><H_L@E>y*l$Ba+Gq0eP(Z4&y|bQ|KjRR8r{Jdg`MvR1BS^GQEe! zkSj_xgFMW}oW}jtwdM93Pe0e*eB+&V{ zE|tNZ`UX7F+rkV=rS7*z@aPZT-m>gQcH2^{X^(~#|sFmv{Z zy>queZT-Vb6h72E{W=q47-ufUd-)~|HudW_+QA)+ zkoAjg#z8uBPrpVS_R_H;!I?{qs1Adz?Kxw2AH|#*H{kco4E8MPOgqn#RNJT-vyv%r zWOYLRGQcY)%GiTk%E(hoEgp^fUTwi;oXl*BE9+|!Uayk4315iUYe;UgB=o!BfuY+m z8>w=!!BrG2d-cT8sRkYfq$AcjRnDJhPefn$UNx6H_4kwA0 z@kl=KvRBp1GnEfMD+6y~h4|uEBio+N znq{&qGo8Vw&VzFle&yeaWw?jp49jOdDX(975u7koulxww*`Ip)_0}Cf4bJczW7z$p zB`cJnoZY8vH<&@?q}a?T-@n4F??Yg~2NsO?n;4_lnZ_}73yFX@WMJPzbkY|B&DxjQRmv@c3c#GBQStBy_Gi#0 zz(nc_45_l!03?p}yrW@7tO#c*ZyI1ijK@c`a_=DP>Bkmy4>-9p31m|5F&d3~z~1xy z9cF1gRd{Gy1rS>KRiw($0Y|{6%}KjP81em6Cm_g({PTe^;@~WudV-I2CXe->e|at6 z^p@w@X2b8$WDs6?iHCjWbO_@ok3WL)5sn|z6!pCD48iq2L^gf&VR$yeGNL-3DdHzT zbq#3_e~kzeMi>T%_2gP;@m(*Zr7agEkIlHoj&L*_jZ#K8*a`!;ZA(4q6t?9i;u*a) zn$`7ulqdU+kygvaM_8g*@bVhIBrLwERZ>|Ijm#(MK-RoM358;akH6{L1Lu(wVCCW~7#@X^6hFnRcVROl`Y^@B7zhY`lFCdmoMJy#G=DrJzhOyS7lZGdi zA<>FKVV0#`l%zrs97LWdiwLyFl2fl5M>Udd#Noq>S^CH$mqUO>@*5ik87^uD7R0f@KqJ707nQ&Trui9k@<>2%WoxZMipP0GgwYs1=xzdpfFN(()b|7!3FqxbW)DWngM8} zGJ680vrEf(Xbf5A&h(k)AS1bq90PBO6OzPh4+S(0q;yc>7Es!j*c+tW?Xe%_$nsh{ zcJ6$;arb(=dgEHV`;g^h5)ZoKszKtcRf;E6A5s(eh+8pG`c1=^F>;_s;*UI5rhO+I z#HhyMuY5CsZE|>zGu4OR5=7j@ca}>dQG>3GKoarq=(4}-l#R<&9f`6l_t^EE8cA4; zJt&YK<<7F-Cd14Q;%8UB179_SeZ0a# z)Dve+3j>RwCPS_-!>G6{mu{EuOGP-QqT>_e=oeB=KO=6IxUKmUsbfoOt zf!M|n9lXWTS2-p;zezRh7jt&XJZy7kD3-m4j2M@?JE7xoCc^__ZUTFq&zIPM^@rT| z`Q{6+w3ps|ojU{HZmZwV&B*LI#7OUgL;>>hmP)<1w)Y%eG@;tct9!ngbWyX{1D3%zA z+P_2oECcnR8Ks5`>)9lS&|v7e9MwZ=DCKVP1USIg?aM_PhqGjtFLkAxGp&pVUzb&B zPzSdOaF1fYa0Wx} z0^s3`OHUtNWcektcV33fiJ`U+Ju{qH=E?H=xieqKUc#7X#;?Q3ML;6#Gid8~t`iSA zL8v_x#TnJKO_GSnOS7mQSf<5{`O1+TT(r+!i(AOtHltEI_aCOsn?Z+%sqMjcmA74J z+oC?*BagfMZqwG=7x-L5rf=i6?Kwf?^}@;=?b93*N}l6`zbC)jZmLJv94H^@H>u}> zN=rb|M0c|N=i?G|4|`IsI%tcmIjhbxm>7ns<5lNuiyd@P$#Gxh#Fah{5RhLCQ3eF2 z44ll6Pge}=b1&#VymIvjYX@S$@}0UHJi%SO)O7UslZW{J8B+RU@xeOpDvk6#$iMZ5 zuf(j_rWQ+Gwovw4_1MSQhT5*$kNGjVFr_X@hPe4Lp#e0JhS~nrgCozOhgprN{7O*d z{V>|$OX3J6#jCeS48hWN=rCjd2Ywhu{Yxz`JO`;5gv1$jyQ1A>)z3&kw%6!0^!=fG z;LeC+et}$lK$=H#t4EARUJmR?fO)2U4)Vz{xast&gWw(fBXk2aa>7q|!X4q+7b>4A zRy<2C@W9`ADW|;9FXL%yohdthee4VE0e!~4)%PT$@2WRI3KM6_ly@UkD(Tm0Twocd zD`k>sdL&)8XvJmR3X_NRsK1B}c!cM|s!(AOM26_IF45MWp+31!9%fSKM5eH*GPb%| zmQ_1)&PB3Bj;ZsmEU3GLl?ijNdhJ19wgbI}A?>pCC_4`H%}^{{6_7zz+ktej=2<$A zx`Kl$4m7EIt5X-#zyTb)Z!Msz3X3l@HN9Guh}yVFb4~$@umW~0CDOQYIjoR7J^~7J zNLN0G;o0Ck5L-%#iAvEjjS62{I@4vCSY+bBofq5?VmxZUJ~lkc!WeBtP2PkL2{F^5 zzyys`>_V?^xP33>#CRo;<{THWM&S=nh#%z-K8bVi5hj2#3P;23yN|+9`y++qBhyJo zL853u_Rn$VwVnPhY!0@_>+2c z77|H{OC}fS_`K4>*$lCs(b4RBS{^VKtxPDO^3dv1OGVu@yTWNojO63L&zk8|PoHTk zC)e7~FMr%F-@2X7c@g60pcOST%V*`YxcaFtUqC{n3gUyR0kuHI1Len z;h>bd;>?_N$9-)|lS>$VQweaHtVUsFS_YuNow>7f)!6os6o0D>QD5=b zV395jD=)Iwu(m$fG-*6}tpciL+%>!9t|ap0Bc2+t>+(c{5I7D<*onv^nuQo3M8Tz- zU-Eb6O=CwR)TO~Y_^C(=Q?sFrQ}Ld)yT%12_vXoOjWIiFUegAuM_R4rwF->}mwZ$f z#LxWXpZokw19(0R65we%d6DZX@bc!hALvzTb z%S^?=y!lC(qx%|Zs6EI%vxxYsRF&~*y#yY4@L#gRuW5xXZKJH{j{NYVe+EzVB&M=p zIhv0NrCXYG%NOx6D6n+!m`b-b%wOwF=TeY_gB?tEIadq_VA(OaUqfJNbHT<@cyp_3 z1f0FqP1ozvOEb2T6QAman|dr^6b@Yn$|@(}QYXL40L`~fo@&4T##h@HzWclF=v%L} z#itp}S!EBO645imcEF4fOBWq&^za!EV(FHgNt2tU=tL`k7SXSnf9QhG>4el6#3}fZ zgz~TUwMxMP=uyVK+Cc%x@=O$7Cotq~jw(k`vgA==iZYCm%go5ZwVyL1h!J)C8HAMC zC6{I9;&t*yac|5Rav}{d!C{W&l3e&cT{{)Q+rRbmc5vh8_;I|{aSlVl80b3alqwHZ z;m$q_JEw#)JDO#YghlXsYa#I6N9PHr7?R47*Gc4(cxUL8D)!-tPllSDd1D5U2mk># zv^t~KX7^x;vwxpMuu#|@U5H^n!4NGNUJXGx_-OQ~FmQOy%)@s!Z?MjneUA>0*w_hM zBMCmF?_+uAgxS&FN=)U+en``M$|(bMo*H_vahVxIX4gnJJ^mU8)vz2CI%bP8lGLMw;qOgKQNEj@z~_AyIUKTh1t_&H;XQQH=t zh7XUhwa+Hs-5>o==%oy3^Cu@>NgVryeg`9zCBPGm_}Tg;;DLj+%Mo(&arvt<)-jVS z{kfWCnKHyU%*nGecs&@XS(0o+!gAc{(w8W6%9Ze``!OHhZjb)>-!tfOp>-#jRej^@ z;C+LB3t2!3oN)k-hNV@C0?FV+&#bDAhi5cwVLWbcZ_qEG+9GrNjAY%uyV))?WBI|Y z2kmFfT3$lFkAUmb$gYQASybK~D7>_RP+;w~{Ol*C-=)3ejz4vPvQu%k-elIz)?6d7 z?xUa_sEaCrv=g=8QS@wOgilJ^cLyk;qZ=ks9m|jG%?XKqufO^DVSsy}m`x&z_0GI=Y!BMp8sYvqtae@lb$F@5D z0b#k|Y3Wj~nMoFZW!6Xd13b|Zu0bV%dKhK=1Fs?3VfiOQd78d> zlQ)`je@P2rm4)efGY{&ZGFK@ri@_xT($%&y`DY11E5v3WHVG^#VG2h>ln{J)Oc%u9 zef-HAcSrr3GT<~C$JTM{XlD3GrmR?2>IBOEfK((SZKWuShw$z9iJuum{Vd~evEe5X zD7aKuh}0;FOG#$b;e<2MIk&Qo2)e5r=Oe=HoUYy5@;r>E#81tf>hsq zgeo)hcI42dC*YpKQa}MHuTUOc)|oKTAzWi4jp)G3QoZm4F{OYA1gN?cl|cxxbKL<4_~1mkLuEYis=G7@QdE6@jy&_a((Vx-qYY2=Ay zsGQF++B?tEu0@ZGrvoBZJMq#>$jL@~@8gf!RrZd!?9?SVijt{oIiVE~-kNimNgg5@ zH+~43GU}v@ym97J*-N<+P5BTXlV&Ne@BCSTQ)>7tqSYYM35q*uJi*f^VvV1j<0=if zvp;)uy2{Z!jmI9HyC;Z>ZVxjRqU zFnkzXaTZS_(wV5-6$d<2!OX5v0?9|ER#|a2({f9-0|&2wuq0hVDxc)LGnwY?0YNUO z+92LC>BQT5@96Ys5JujChh7r68tdUH2#z!7BndsH_mOordg2J%!i#Dkf#V z(s)fwM@J^zDx4~`i6a++7c~idYqV63gm}Ln$AkXPHbG;Pdfqeg>S_WiMqor}itqtG zG(xyFxs0L4%%rn_)~xCAH#iXJ$BZg5Be=~B+*2B5 zUxbh3jS)O^Zz8b!EeubLvoH#rA{!d|OOyeFdEo^NbH8K`^I0Jucs{%LOW)Vo&dOIB9TiWPlRFcEc1MVufj2gu z0Czc>`D8^E4W3ag*zgsDf_!wR9T>2bk@}^Lq#i(k z5%}QAQ*Bzk+wT}|IRrnWL1L76-bo!;wv)otJwAf9JOUTI2JrlfW5rM2CNQ5o_=^tj z!aMZVCju~fj`86!{FNe&=kUg|8t|#IskrKHfhS;}fTZ00BaMTN$((Z2H@rk|GCYyx zm00m_^^?EiT3`GMBU!)RpOptFO0U0FJz3e-MtE|XR`&S>u#WWflV_JPoodG(+ z)4q@RNK|E!Sc!}L2v>h~ivq2?_#QqOkw=-WVgi@ILdJ|&iO4IYRpbIO;I5Y`#jWsD zMuyCiw|p4+E;Z>-lSKLmEodm(>Srtf||Ijv&&P zQ%RgKNS^$PM-9+gkAVY1qF{Fy^V50(&*$9tPJ8a4pZl^?UbgK-PQ3<>eX5wGJRwpY zSKTE1)1P;Ba1Gb)pDfjGI5QM^>4*^$5cQR!7MpMZKVPgggH(*0Pjjycp)M;4(+iJc zCWyt)FA0U&D*%-^oihbTW9(itGa8k^s{b;bzf`OOE08hwaDX%lm-x#i4R0F; zilW>gVBYf7u#|=IAd3c0sQB^*iyW=V4Nu%QdSvOlF=)2h$@jz(AhWt zEq}{z1-e!S#e4@vP6N+74<8{{&a&YQ4@a321Cj<8XOTS6!_LzEh92r6ZZ40pj5P?; z0n-+sa;A(lR%}2WMRM6JYHs32b&wWdh<=rE(dfHNT%|I`i@d<0(WRe_iEu4z^VJ~S zAdawC0A?d=Tu<#3HbLQmtUWXcc{i=b@00O@uk;dTx%q26X?4gVS;~)O*cM zuX2Ja9b7ZZN+|Oq!9(@G7|J*CZN9|S{g}#Gmh?hbWZ69NHxCcviQMq+uY3@o`JzJR z6Nlczho8uP1`Ko%AxaU60t=t;2LBAo;I>@MR^BSd;UEC@pJ$oKgpH6hI~EeETzYwX za1lS^qyrT%@#N!S6>02|8yTs8Wp4eYP1EQ>3HCm{9cC;XXs|4$=@gyV7gtx?H=cc_ zefgVjwKx9gU$nK?KZhbu+TA;uZJVuQ)G$l$9wi#ZDA{d+C5b5iQRrQ!rtxP3q#=vK z?n#y+H=)vHCNXr1mmj~X?}!KPP$t6&s?`>@2~cfAC=Y;>_JjQOwp@u_WLmMwKax$` z;cSpISXd9>VF!rv4`Xum06ZiBm`G2I8;lz8^-!9Q<%iEk zh11Yv7PDiIUU%YE45Du`>vxF?$m|vr);@IFQp=jXc@bQes9ILmG-m@3*xT10i9bwY zR)6xZu;~&mXosd_1>j29y$ESnLrO4a&M&u zxa3bTHe+x)J51}SlM6r!#`_#zxW;o zG5bwVA7?2pGQ~bqJCcqAYjXWch_Ej5K{iX1qX)OHdI*nrGvn5fFNO7BYrj3b@t|G& z#m#o%+GczA(w+9V_u1EooU4$#vc!JPz0mf}Dub4n1Hu}FUWZcsjQz2FeJT{PfDF-y zDSE`h9W^+4rXL3r!>l;YqS{F08Vu_Nd{6rUEZZ>>lcz0?YCBO==b>AAY(wQGg90=9 zeGNpH(K@i?Y9UHF`XaGNh{LbElAo_4A+JPX3^$s7@+_}@S8}}5_8HZ-(nJX*Aitvm zs9U4hgu^4BgrZ-?#wU3i0e|pKE2N*1hOkO!oWoQ)>KWtl`#4mir9jA6N(TB0nEg%Y zk`VrVe~g30gy%neOdEPChv?8@n6tRTKyMN*0R0FdZ@`MqIW~^*B|gnvdP>1cqzx#) z;-Zg&aY)O6pQ{NRgj6?(u0TxF6!NC4Col#Q?4{E85G1?-dR)equQ5&tP{*xs5)TY9 zZGkdvC=DFTXyjwy4B3NT9+T@OL@5~`-^4>`qi>S>C4YyA!39`}KhSSzVPK>&=8(~l z?s1;H8N~r5`t6)TOdS*Ftjx2FLADG+qB#ps8Jph0Sx=cgoan)GoUn*KBtEnO6WYBw zKK6~Sn42*mWBZ#`H^51CbwmI}YE==s1vnIrdc%7haw3N9JIgK^Ey6^_87nKXjMtq8 z4Q);&{F4}RCpirje?AIZMxhK7QS(X2@Kw>`7@~*)kzlV8`3m$JZYYMEjgk0I6u$GT z(EvdTqdunB-zQ5peZkX_82!iZ5m$prN|YeLZ>82Rl^3V)ei9dKtTZZ*E?<)`Y2W3C zae>1tJTSfZ6i!Jy!T^}B#XIAg2F!>%&d@1jrXOTE^r?($gj!(Z;UnI4mwXViu|mqH zR8lK2Fj7_k6m$0+jiWAUfRc}8M|g-N6Vi=gQ7rJPQ!)`A;`t=%Ko7xTmQ+P3@plx$ zJ#TY#aN@Ux!RBd)D!1luj?VU2D8h7~+f;=#9U1w0+u}GVPxKe6ThMsQ8GSGfobUYZ$0vnw+jf%GBkLY4vXH>Nx1|R z)vw)!R@1FgTRXJ=nc;|Y1rNZM%RoPi@GMDtaapjQX!RO=T>Xg>0G#MPNl)x33Z zTn(=hoiEF;!rXtTyozq}Cyn{1eIcFU`=m9#53gwpEPruxHr8KRV4TQ}=_@wal%$BA zYKd|D5T)M1MStBIu!RTwJ>;LfcAqV!15hPl=DysaT#Oj@n?H3>MZ&zT1Kxi(E(g)4 z23drszwwbilvwvUt!rQbXoC+rIkR*>;{2e3xHiX8x5|QM54t8Z$z+ zL0cGCUgqv~3RD_9HS?q=A`16|atEP96HHCPFiHVBvxJnrWoW|21RqLEhK704G}J2n z62WwE)ctHChpY%@ER6)QG}8Rz3mgsBa8VdO_(dV4Q`GoHYsIkRpcH1cVytSg8aK)> zJT|@u0XQ3IM@o;H>nn~xkA>p$OD}f!>V!F9aXm%PX`2&fo4RG=C`BmYD&pemzQnY1 zWbO1k#$7JHXEa{}qE3M{4Rzb4i!NQIY$q5)+EI0V1+a8zsBB%w@Lt3q{1!N{ER$Ka zd|cWo{bm}2l=6Twp_ZS6jas_&F4338T(gKo8pS9>uD?loK0)6leQT zI6SHKV2iYm__!R^WsL5LWS?ZW%1oMfDY6%{=YB~%d3A3g@9Z_pjH@%8;M2Lh_NjBs z*u8?W2hA9%IT&f~8RQ9`Ke$lF7&6j(2c*|sP(B^YSvyWvJ-CaZclXoc-2=+uA?5hg ziMH^?x7*&wKLW;9n|tXu$P=UAD>j^UbYQ^N4MVrF=RDz@i!Ao+9qjLL zcn|j^_MHO)%s?MK)fV3PL#FCZ5f><@UT*uB-fz2q^QZ0L?|;xHuRagmlneFJDy~36<-t!mS4xxQ+e>4ayshgv#J(Gy+s_cwqgcPsK=!!f2II)(1Rm zl}?2@>uP=Q$uhD)AOUh&Z4m8|WvRA_Y@4U#*(Zcf@bus-o2f0nc33UsK(niNe3CUV zYY&!gxQ8b-9ACaIZ{L*XLtk)BYJwvHJZCSOJ)WkDi{E}{noA`+? z9Rq~?ii>;@k3_B%L!KiJdirjZ_=#)c7*Y?AL?`qbFFHh&1k>wC?OD0Be+eh+4R51yvdg|TX zQ}m*MOe7!)EnxE|8Oes9gz)8WvCxE-TfO0ok4XZw($p(_R9*`YWnBJ>Q-bjyq6LO< zrQdkwXPNk>+cHr9&poBaMm95p&1(!bX#-deQ?!3DJzv@%o+Y3@ue{oSi$H7umw|iW z8Jx@>LE9kufPu4trz{3gcmN&Z+ z3pco$2SLUOk-?+#gbln@_Tp?o8C<@_^h6k72uOOygKliJ#7$#K$@D#clUW%CK3rldA3&w(1HUTA zk{(M~TnRKFaO1!oo|B);4u$NjobhC(dnTO`v>469GSi5Wi+7;YlPy2n%J!t&8D_3lC8*=%ICn_p)w-LEL#;g3iq9|TD zZ^P)s*N$)&GyLa0p42@|gYY#*qTb+U9WpOxf?Wg|rHZtmo5%Vmp9mrWU%mpMn)k=v zhv^8Hcgn71?4OFC+Lue-99c9+4|H&(V{C&(HcJ&n2AL3k>OVMEJB;iAM{;a89Y@aP z=H`d1qj0Tf8+1G?jB>rQvebU(b1${G-h89I$miH==ShhHbN4+a)$V21Xma9(Ha+ti z1Tx!)vCwa07;40D>A5-h>0Ba;^4={x13@65F=NLED{{4i13Jl5cl}-#yF)$$yb-JszhrHD%32moNyB9 zZ0BB({XOn;FR$u;tlH`1DJV&4AR$@3oyj{m)Fa0^<~?$ucru2BCu_ls|lo+*x+p zEVHCS_l_R%@6*wM^$vd8h#Tf16fXZ_&+U{GRC|_FY+k(6Zh!Eg{piB=_M?lp+bvEw zy^n$QfU=&)5L=|t^3>`j4Fdi&kSvubiL?P3L;|LDjRK`TCY1dBasRO8sLnAObPjkM z!3)5n%n}zcJhn)-Ex5^3&B1{r<woy*5NDsX zf%RIM1YUVqqP5iBvhg7o2&Y8j78OI{;@xH#Dnc(`LmIq-Gx3HzlOlXHK6yzupoeHC zEnOdY2Fd5b2uGkQPx4teuxa1HR+AYhi8 ze1sin{1PWBx^Z|nO!7_Rqu*G%dKvCBrZa4aS^<2kGnMXK_(mOv0lAuogyI}r`OSfl zIG;SL;}D+sn@*|$Qgl?P{0u=L6r)?rj8CM@C_?NgKTgExPi+Gh973O-aHs2(erUGE zeZQqz^XA%#Ir?JI8#rbG=0Z#xDH8*=5H$fQ2Lu&p z3nM4-={G(gStBlprU>u|BSs?cg0SJJd_=IAQsE#JyhOB^5#a)X6uy}YD|r+!v-Tt8 zY7ENI5ociy^xD@GLn8h4Q`Pi=Pg&4Nq?NS?&ghdA!@7Ep{J{H*-u zD4%N-NBrogk|%c@rGqdn0tPPf-uTAJ(nVetDgSD8h=6-kq@(DPomrZw2qJYz@imUPp}{ont+XM| zjFCLWoelOxeWLk<6;&sc38|v6!VCE?FYWW4_1lN1+bDAc!(RrmajSGYGrAiK)jVr9 z-uti|?OhQE|70#u!#fi1(n;DO%180@iU%7Vmzz5Ch{_7DElWG{qF0&Ac_{bZ4JlmdPzp1vE00YK?98AV$9za*DF?0*gh4(_2!VA?<1{q!i!(SC@i|F^%{uJM!Dc%G2X=xi<I*3BEW1+yWSL)&60b4i$(Lfz4}Q7K zHT4)6F89j_rBVn!^+1p1ui@hZGi>YAhD$pXj@u$;NHg~z>z0p&~?7q7c4vBLoJZo=OEh3=hO z{~0*DkBXT}817XPL0BGBIJT`FMwy4yxKEQ4Nh%$O$k{K(T~E*cjQJ!6(J z24Zl72HMM>8OpYMGsfKH#9J659P$EhCmdMQbGm8o0WTV}^UQ`p{FK?anaVka`(*PD zM$*l~Lp&Y5VTr$|i+0Y=0o#_w{e22nj{)dx>Ey^uEE#*_3# z0&MAEG&h!Jy2pOTJ%F=ozo?l);i>G~C!n~rlV4zh^92k>U^>gp?5g`84{p7SK}eYp zR|DJy;EnxzlM`=%FEWmiI^m-A+4T!;|Gf{}!G&wg;?eiK#VjRPQXJg7XhE{y?=1MR zOm>rfm*nYe>CEM~_)S*M)?P!e>+lMN4==X83&<~hm#4^1j>79RCo%psLQlXyWd6i! zq{Sb;O`d)cnit#dU;fv&|G)oR>)v=aGTU##8ZD)#nhJ}q z6j`P`kV|DwMY5e*%j~4HtvjDxX%BwF-omRJ?I*X^+xKqVZZ{d>^DviXI^RB;7Md_jF~oC*LqDrV z!mO$p?6I$>%`zkMwq-&rs2BCgN+2^L#H}GYfQA7a+c2;&2{o_!Y^#Y+@(~irqD$$= zha`Ma1n`ajJi?H6^Rr!WaL+#4QZRbuTybqf0?7d5k3a@k{s_ZPd}QZ^kKoJE_bp z=|nn4z47=U*@5pYZ46F2IK;hZPgcN5UN{6X&>p;px}AdJtJ>Yl-+1!9{-Hq_0w7OW zlG#?B_=k4|KJkqvS@JLZ2FO^>MjN9V&&Txo1t;K3yL^kzGWaJ#1s&oc%t*bw7~+k7 zu|@FAs-hvooH8nWAJR&TQe^&dlgSuttk9c`i8|11Mj1pHL73Laev|>*H6LNWCR6zgcBa|?o*8!7|1N~Cxg(CQ2dgk7|JAsMSS?v zf55O{0(i{LEG$UNFrB>d$3WAE2*N`gMN6Yc)f*ZuVauu^Z+xz4TI=Wm?KC@3`cZbdg3n zH6}$(gT!JsT4poxPmWX60SHI< zy?}SZUK16ZJ@z0NHs#QQH1sHC-aWW-f@Pv8svU~mv9m9lAR+H`OdVy1i*G~$s#yhPOy5}3EV)o@Ib~8agc>2X?%YYIZo$!@}|z+c~n1Eb2ejr?LLK7ib=fTE#jCMo?+&=mC|h zR}M4|P)NNlLIc9tANR8wp2Lm&1=ko^D*IxIU)mYu!uBMii!jmaVD7WuM~J_%y4e2B zm%h-x_WOU-j=c3W%KJqOKxSUJOg>BOj&Xed8nZtvYm3qM03(5!n8{HT<}(B`bl!pzPklwS9+%Iw=7vy9$F$h8$SXZwZ`$kaB=jFT;= zD;PUo1>vRbwspiwje`d%Qv@qZZZ)n{xHUkJ<(hMjm@8XI#ON!&~GShWo^WUQAE9%-p}n zoqxSoZmeR!`p!Lk8uoLiUT6Q{1(sp*VFs{Ue!k?>8N34q1iTu9_vzY8WOW+4C`U%B z4{rYqI4te7{Lu6*!zl)(%a6kom&tMvO^1whi_Aja#(>lybhbDA0FX;tp&{)KhUoOf zIXvgv{?C8f_J8qrC{~pF8E`sE3+N#=EaRPU4Cl{zJa~1qPuq=~C`o*=2Z)K+8hvh)AE9@^)s=#vR(a zqns>z{5*VNKQwy_um9}_?I)kzZU5`??e_DH-E3uDVIbA^UWu~5$=#(|WVS<8G4-gd z$T4plips6NZD(v8$f9*QsS+AGLQNtzT!!GXP|TXEcM<4GNPD@JI1H&G*kjd zMV7qDlb#RRB@dRys(c@?w=~yRSZ5>uh>`s!J*|qY+_3K=G|y-_0wIrWSMj&dwoMjO zo4w$YSK#Owe1>q`l9@vB*Jp_1t6}Mj^d|9>>8tXWzX64%35uU-=mQ)-ofDYZsC#Ewb%=l5dZ`dQNGX_D z&3PMuhalmTfgNm_tH=Zh4N(Zq6NbzDfsv#Cul$;G5GJ_-0Y~y{{z1tCiH|av3@qi;#4-Qe$wJ|#od%(FxyJuMg#njJK*mbggNOrRMd7f#Nb5aF zM=%IohPpz+We&V}_x*Rqm^D2}Qv4F$3Zh07)7XXjASgxKP zYr7(!16;ZF-KLueqc2XJfqg$LGUMU-Og?n>Xtd}kqjlkFv|p0Gw&|W z(@*g7-es;T6wa(`PonLNs<%eeTa4Z@sb&(=P(P&u?Bv=$$-$B_D^ z!KWdXw3d;hjtDo$ZNNk11g6}hfbIhG1vHG`Kfc!fSKp2;R9)7^T08vU=vtHhJz1@I#`Qaq$#NPp8bm zD)J@w&oM{qW$YR#3IIyDT29YEN%r>1e7uW6@~s{Rio#O_Cw!EFd}@Cj_}L)A0BAs$ zzkEUy&I<+S5<%d@qqMp5THKsQu?&#!>}#XmWyh~ZwzGT8R?Qx;N6$;@r>dfM+8VLU z$~n8lC-)(88mF^_u3m6?W!G31nfvcpLJQBuWx$^Jz@XgNphg^KkT?l6N`rgblrYNG z3+=6q830hBhUR|j8jS;nl!8e+>C#M%9WK{H(Iy|RTJZ3gen#ss2QHjgT8%rj*kbIH zma=zd*;%g1A_fxtoo!yj03vLl$62|C@rQ*IezixJQZC)vIr6|r++fBLqpf3^eh$>h zo?@G|gh^@#r5Yi;kBKWN*3{2$x&>Ws&Whw}55i`)6%NP{S>CBH zK`q5fX7I-z*T3|!v_-xPC`~|q$9fj@NI5)ugR}jJXD-;+rftSAK?2}ioP45#3J;&r zPm)0~gi2Q>Ofu*$r@{4*&IGo}!($c!_BhfQ1gOI2(8HI&d>nbyn-3upWRcaE@e5mZ zM*E&JVg&T~ss2beoD4DcrA4Fq@#AweZ0CIH+riXIOIevIpZwvUva%c!T^Pz0C?}a9<@*?b!Mm+WR^W>9B77b5%sN95D;+xp?MCK0 zWmYop0Iu=WHpQh@{#9Ig1I2_?d8+ei<7COP@WDy6MqUa>R+yzCGGruVA?PvCt-BoZ z0fy@ECHWOL^xkfTiZ?Uo44y?#56=@dN#u`Z09w=)+eh^WnkwqB%}esNy}%(YDVLG? zz|0^rAsH+sZDApvMRWJ9#V1Y~#d9d?6hvhu0uU|tNv#qi3oIuatUN_!;yo_53X(ZK zA}T|ZPDbl#W)e|cfcX`7{2q}sY98WRXjx7wJn^;R5J4Z@5}FORpvh|(;;)a)OJ}Sk z@JNa^hhYAWf-A^&M)Pij z#b2D=(*ii0jxMUyqRe`*gE^?^@^O#O917SHoA9SBB|UoP`8Gq(`l}!PpxxixqXVSE zgFxsN5gwPU4(&qaFJa_uu&>6IuAJ1#Z|$=yw+ZOlhx8>=!iuO7m#$L@jIlK~Odb;B zyn+phGiQJYLYI4`T-GBzPYAUXoDFpL>JdQWhVGh`4B#|&E(wwgM>G@>rfuBfV1Fsz z{G@Tp%$T&3uVEU7<80(T@^hWI!#={7ZVgE3PzTUYzWEo-3?r_xYd4-*&>>8>Wv(&k z$#JO3#C71oQ{;mh@_5Y4j*LIVgsq ziQJv&vRC&v@~gXACkUf$)7aNis4GP<#&>8d-LuzgM1mKmn8v81qBz6op*OuVlMKGa zNbP{(!7w?!6Jv%$aQa8gfL;7^q=YbM&RFhAfnjKYv+WS&GhrsQUpWH zqmbpd%>KFGv^(`G@xBCY3m66%)Emqa5|?R1?NN#%gCv=vm3u`dw=(*G;HwgB>1dgII@4SV|IGNeTgtPvN&V^W~YHA&%BHtUQXGE z-Z98g*NtH4xz`Z-y9Me124Q$BjkLWQ(bH$SY6D|g!=4I31G3gO|Hpr5{d+%P&mrYR zS}(ZIK}$BqC8F?4*~OWLh-jo%tTcplMF+}-@szJK+{(Q5o~6wWykxdeK0B~Mnz^&g z7N0)FsjGAC?w|dA`^$GfZGU_1Ui)xkyWOC^Z;{zCPQg9J0P7@6naKr(+hys(b~*ky za6ZF$oTD>vwmt?RbxDQNdK3j3SfZ1@m2{~S4%SMZMjd{t|F+2v=8B)~kNf*8J1~A%l1v;c;Hn1)_39r+2Z=d*$m+j z*Zd3*{=^9nLO>D(cKTl4l#GEZ$uE;73LxosZHK|ji4;+jLrQJQfO27OL=^UrA7uF& zSYvJ_>H5}FlSUO99LE4sC8r>)HdjwpMDm(hdyOVh|mvEvyYKV zm z7Gg4`KeS{i3IG5=07*naR2yD03kXFc?&Hz_27_YS9UFURj#RQmMTK3Q6CQ35H~AoZ zjz+johsBDqO~~VN013 zz64Ho%-a?QftfW8pXGUy=2t0`4)M;1AeXr)ua@z0%G=X1nU%xsi02$e$Wts8T0@yO zzg>8sktJ_E`EvvMb7CBHF&7cQW@%-&T*b#_o64dywayUQj7WpHrJ)5D-EBNo`eOu< zMjqUz0kFP#%H}e^?!D94aS(zwFpXgD6ciru%{TQJw}%qwF8MQqisRB_PZvcMAVnF$ z%2o_b;%H=o22cIk*_xj?58G&@GzJz@!vmCrS1Ng_M;b{S)=_yOKOOOw)d4{L~+3hIQAHIgkJ! zM+`M^goTsJh(Cfm<)DCoo8F$}X~NDwm>bE~v3XHTO5dteCCOTCsOlOrgpESD5->B_#g z4fd}QJ~{JJo1Ei*HWcOlA+s&p%-moA@dfJeiOx!6V}gMrtjxZ_qmJdHSq%X0@(&H1 zukj%~bcbP-m&Ex%ul$wSDx69OZ6v*ELSYP`z}eYCPX}c-qN5#g36|{ul|DR`cR6%~ zq#ktQ$*DavW3!$)W{nr&xHQr`1>vcuiq2Rz+buDJY~5YO2rF>^^O24Ee&L68M14ScL`o{Sme&BIuv)q`nRGC5_YPs29Gk~Gok^aspl zX@o95iyL)3*I8_2No&vkx!IkcqGl;RpZf0=M@WMcX1&!sOZ4STP+rX#g zauyTA!==f&OR;zGj#*Kb$IcF*TZ7j-3o#0FpipMf;0uk*gc;!JGhc>>;z`-70ea#m zC(>rt_z^~|vxLW9#g;rnyYRq&+!LvE%n9rfxG z>cY$c2xn@M!G6L*!wWxcv-f{43mBMS?0df;5X$--Hb6uIYx#R1uAFycOYw&s>j$Kr0mJinbEYImW^^vL*d@t#$ilqA&pZ6 zm8JGHr>nmHW&Gya_Gh=+_Al8_|HF^k-+X$#y?f_jyGMPzLwz_#V|kMF$qPE{e_UQ2 zgOGfSWa_*AiXo!zvT2q6YQb%#)G_R5@Ug8UQ9t7}S@5tw_Rd2HkXbPzZQyIa8uici zF0G`r`XRY|rA%kgWEJgMm4I-iO4flIG74I$cQbM3z#^~UvITOWA_L$+^*?>N?GvDRX55rs013$tbMbCQIiGOB+48}XUs%eZySZJ?TX!Q>tco1@lCrHcB-zT3k zp72S4;kIKU^#6W@sT>x(;+4&Vh}kb>@E2!R^$;2F!dGN3Go@B>upn3)hD)@R$59GAzXfJB^P`s20%D{e!AocYHSJ_#&6dV&+FM#Fjyy3#*pCHmumnsg4rQ%zQ zjC&^&6+a8Z0D@prya5my*1<;tlr^n>mt8nAYdSMmISp_U#NY{>LGcDoAX>U3K#>KO zPZXITKe*#L1e!NbVMN>~(+F>XW3zJ@#!DIi!qlDWF(Dr#;UDE5p8-7H;zPQ?G-fs2 zVf6sG_A8NAF!?LIQn0|1Zf6p*98SERc;u6h>HIfXmRZyzZN)-d;4oGc4rAZ*->nli@NM|iBZy3mdz|bbE>`1>7o}dUkXiL4Ily1ko5ivnT*qk;7(`3ZxyhS z!JD5&%H4)`5B_De$RO}YhY1KNb(y8GQ;~h~9l)w(mXn6TB8`N!pqeM|eS|hjTy_v2Q*Fin;tLceg7kdelcSMVaPf8yXJ@50b_whl<2dnTQA ztG$Du&%0&dL((i29m~L~pFAm-+^L1z$LM3ehWiLZ4CN|wDyb*Rk!_?)bLD%DV3W51 z_@IX7U0CuY4PYQ}nkz!-wHT;~S#CPk5i3;o43UGY@SWY3PVpF*n24sZY7Y$#-NcXv zdE;reX>afk&Je6Z#W$Zwe+)}?9DT(vC_C%M%v8VQ@;;WyIs0P_8t@s6wC>G3z0ugb z*UUU62`&?+K690Xx)`z+-Uc7|1+Dj?!#epkGlG9`_Eh_|^T*rSv(%lFEGxX_sl23d z2^z*<{}82koeXYc#4zKYI}XWXdfY1xFlL^`D0KN9e!2e*gU>tqJQdM9>0I{NKfD*E z**o8+9PrVdI!nQzfU|@&vppIyey9r*_l&VOt!GoICzV=BbHXrnJtNfiFJX|3;uEF$8Nw>=c zW8iIjuncJ(fCH9!_bUAuI>`n@amuv>9oHW)okg}7axSOEc$;}(ihBz&+%sz;W^+m) z_}MX8L43f|s}efz{?ib2CJ&=1Gjhxz_N1B2vm8=NGy-ikJeVeAg14=K6%vDLwskQE zZI976W%kd5Zjex9>}JJrmdQus4?|B`i@~JPhJxR%o~MjCD2KyooE`QGiYTc&@PRbW zN_T;{2l!2$V=^zg#+a~Na(|#abqO+U zUznYxrzB&>b?(LQwC?FI#<<%2i~rOPe*70UEHW1SXtB_b1gE_A^a0k-C~`E;@{@1y z0KR!4zmaS3?45N3hv_mh$kJ1~0eEeBD}PDF;HvoW9AnAusZ+#d8Sb;sGO;|@9{udI zcK3%Lwhw=Cwf*_0SKE&_HW}QS%O&?~paWI~7 zoDGR%#PKgdfCTxgVgv|+0RAO`;~x^kfRl*<$Bt)WW%e1*Xe4U1P!h#Wq`31fq28vq- ze8%@fUU^?hC`Th!Wb2J`r|in_4u{B;w!?nhWgJCg)j99Q-TLKVd1#VG62?;)jDV56 z(WU8I7cmrxLR?ZZ6G3N;{4~&f%OHd?#EHUVJ3}~^5em;zYz(Tf%AtUmof#%cYOaY0 z3z6JQ2ut#dITzehIqR8r9EWpXI5N1Ax*<<>1TeM2Mt^X7f-$4G$C( zg^*ILjct4{>3p(6NT4cFFb7W6Y6=7)d% zgLac?Z5ljL$i+#_#2Jz$JAH>Zb7>G(*%m(%mv<`ldf!r^xDW4unPfywXJcfp{O~30 z^jU<-FJb7Hpvn^829Uhrn*#_Z;@MQTEN6asFW>bLS|(0uR7F$vxXmRDr#@zlABbp# z>GiVW%SGe)?0Q0Bm0_Zs=?N_OcOb|=8wU?Iwu5oaBI*rsz?XaLod#ifWW|RR@JX4A z_l3AwHw!l&VXR1>(=p|hIB0Z<2P%JagBHs=yKa)FvKwCVe$-!hoqA&2;7mNFn<(L_ z&4w}_xlH7Of7C9Ro{vX%fVxfZX&!+b>njdL(#7}wfojk&}$y? z`L&*j`%Dj+NrCJ1KI58IN8L%f)EnRpjExaxJt6)siu5g}Zf^qT*Ed(&@18x`zWCzF zwuQ$}Kcs0UD4kjFvxTSS1csec={7L#fInxt;{5Io8*Vt24-dc!(s>%=sS(+HhD=YW{g?|Ky3=`&0VOj0+!|}y`dz$Wt`B7777GQ#h0R(Xe3A}S+&sh2X=xqaz<9_&CC0T9q4cC?5@eCD;`V_v%&`r6gRR7-Lz-j)~m&{17sxY5#gt@it#w*e7#9K@yCSebsyR9?G_wFhyO&Qd%fo6cE>o6c4Sa7qSRgA)y|2`YaywYYj zFSPwX`n}d)zR>!0+7>rmK^8k2BW2YA9L1|kCtht{G(P&`2q!<05BtS^>L10?ZID0H zVC_fTY|X}|jC&>74{@Dcupv&Y6xFYyTqjo^81hYN1$y#Pe+b6JS%BBJuO^IVT0E&sE@?o5gH?T* z9(hQ(N-MH%e?+^Lx(me6OB!ATzRGV8UbX?5E*HZXsPe?Lc&tgDGMSOTZDZQ);a5my zX4{e*t(0Y`^VNV~@hiWg;Y@H_lP2N0OtgIITnwyv1DFv~MqIw2?rc%?OseS~xb0FT@o$7lIf z(Txakrb_bRE1?OAF3ep9K}NX+j;JKjkTUhkddy$42?+1Fka;ij7pvm8{qqn$ybOM! z4_pZ&M&y0Sr~vRLe4>CXDkEAQb7S7(NVs{_Rj?9H0(Gp&u*wB-jAmbLd8@nG)|yg1 zNZ8_$fC3g$L@~4QcwyXRWkerH5uJ=k=4k@!thh>_PBXb*WeXr^RHsf_-bXh`y2`ug zkQ3HT^)uUPakmMwofVpND50duSB1GeBsA8W*h1#69^}#z>u&~=C4f(kcLSHIlhl;o zz(c6u2Bt()Z$*e8eoLSnlrbO`rpi-vLWr7P#ZCeu8POkrnSl2uNx_Q)f2k>EKwzR9 zFYv2i(;4zQ4W_U7$UjpD2jc?X(Kh)QkiPbYOU4UNAriL~MB*j)#1W~Ki88>Aie7N6 zw@2TmFV`zUq*11_j?%0|X86ftp7?eZ02f_Ev>YsW-^-4SIy^zNVbW)18x?7JXTxBM zG!#S*wCsoxW83{U{OzEU0Gv_pD^*Z07 zm$cIB<}J#DVO6=g14qO7552O=dl{bckP%$c>8Pt7MO2hDKxt%nzY6^0D(b*WTIuF0 z1CKCZGNz7vR35%F#v@)l#3*puBOo}+s-~gZo{n?p{bK|&ssb>yqT*(&=IwjGmqK;fH0azZ< zWR=YOJABlGyetEiogB}>z4h2v!ZR-iB9tBDOP3caS|UXTxmETZ^e|9dK`Zo1mz}1x zm{#1z!2u0n2khlVHlrb~>4jWP33N2kdSM;1Jmra{YI-9H z!>gt=rW=I5YO~Okk!509!Tb#IT!Z2Cwd#~ISsDDHKm_1_a5I?(jvqS*22510(jEZE zdTIM2bM*=zFzE9PBY}Twd#(M(_DcIAn{BLZp4hk)-!aW!=*}yO&c+OPO z$rc98GI`i;-@%Z%gLex9F^9;ngCAatb^^mOn_Hlax*-elJ!dNBWP{C1IErFEXUKs= z!?QWdv1g)~>rG5qb999xlWA9&DUjnIJoKCVobu}KlCTw{2_+w|qnA9e42s)TV(Gx( zot>M2$8uC@2S^eq-^xKcX#wzHc@z)uW<@#oJ$#^T@oYW|e!lDUHDHi4sc4Uwdb#@v zf`KusS4|_tDVKT!U0<1zTh`;P$RBsGO_U{Dis;Jed2^`bcilQcQj!2|1+Y|Gyc z)=ELSB|{9v5DfnDZn^=DyLh@raOEsfG#Y88b}zCf?XWGJ`n#ZVH9LqlcLl`=%Z5HO z&grJ)tARVabusvcubJ-aKpS2(j)`#B*T#Ci8EgE~ce8OxrjC(Y3`Z2_8HQh`CF|8@ zH_;S~JF`lI4ToMhre`|%+dJ(Qnqu4=j`0=GUW`X~P{p{!*z1nJl0m>Z=VrN1vfaA` z9C&l=1!VCYao%E`+|R)q-Y|%;aQau;eEk`WUua=UDD!CR8*N@!M&$kGANeau)qmAyXp30 zI^3O<>9Gqh{2dJS^|trz|IlXN`>&*nxJgr4nHB01v}`w$Wau+->~1l(x(e zV1&&z`OSmt>EFU%<0I>}!AU9M*7q2#oY&a7(Gwop>2oiz!Odr~6RU$M2OP_B;kECz z^FMvNz5f2~_TK%yc9lj>gKCvLTzjuRK$FWwdC~TyDdEZXFL;8lI*3Z?gpN)RV%9R+ z0#aYZrW9ck$s-#=;^(YD-sxG)8Hlo(=k!3lPs?dk)N|oytuDNnNBIS&oq{;vt$R+chYoqF{Mu(3P5r}5MW0xF+aBBRn@iDGttszF!C2U+B=67z)y9V@2Ksn z%Alt4`r6C5iSKV9TO5=gfS$z8x59ohwD73DKF$T>s2nBcfUu~O&?+c|5w{ed&xA+f zkylez-7aGsvi0>ev9wlv3Mw^$(X) z1P*DtZ*mSHX+wwt!258a@B z#7R8hgaX2BV0GW7!-Q9P&sSiH!vNf$u!$RSw@~!l8O69N<`Dqzi8DfykB%&iIBRfu zSr!yo6k6};rb54E5MB``I>L9<&kbe7fq!Bu6op#yA!4?w<()#1Gv~Osv8fI~_@*_r zxbsF}z&H{*!cFTo*UNM&6Q&or%jrI&ybqzxe56}A&Vv@O5of`QlX0v(=4+S@dPYi6 z%z8$82}Mz0^qM>t==7IaYp}$Wk|n07ZET%r*Kb~JfBo(+fB}6eBVkne0xo>9eSn)m zCh(FsFMaTbXE)#xKc`}PSpgS)L7+5R0VRKUoqHQym2r7*c?d(^X<%pMlKb$7_v>_S zZVDsKf)!tBcP*c1KAJZ^n!u13Jo3)9U&;Xk=+Li>cszwwQ~WGX9%G>St3F{mJ5`NS zl0@&&Sj@D^z%9?-1H#0aG4{}8T+2yX97*G+XaY_;7v2Xiap0rzC+_00MnXNAuGupY zDrLNd8lzI|b8zKX+&yx_y#2xyD20hU<%d^1k-&3mvti;TLgFMZG9ZzAU=z;?o>Ff1 zdM<@6uF7us!MC1cJ%jSlsjV9TJ(@Zki6If;DiPwXr}%)x4!mRp9iZYNy-0c)-o%>{ zV0oH1s02Z6xReCQ8fKTNY+A3;ai&mkjQsXM%+c{cRNGn|OCz1bYI*(RfU`?C{uk8j-A{%jPgy zSI2ZxHy^=EX`kYzC>=)tOtx9K$T2c=jyQ-R1wIG?h9m~z8fj!x)?Vo`-~sQK3V(Jb zB&2p04Y|CvjIHmq;LxLNc)nmt3#GzMTQZPEIb_XXNmKHRSC&rGDWMuT>GU)NZKE|t z^ujt4>y%JtDx|#J*^}KlT@&ch8W4+2!g~drY4SZ&BBRiRLf}rXw(voZZ;9n|+GK`!)1Qtf8$2JgyGJ)rm zSHHtL%m-I6s4(!rPs3;OEK^54Hp62o*m-q&>PvVvKV*L&4BxvGm?FbFjq5nT{Q4wNfp!dfCf^jzynnSn=aq4@}&Xf19ds1&Defjj+x@fnL%b zjBEy5CZ{wCKTUmOitz-xk-bM4hF9Ob+1_Uw=?~xhu$}+p9!Jm6W*}xBHqX#&wTp}l z#ZySQ_Nuyw{eYM4vjZwYN}kXLSqCTR0CQyu{H=E}YHhcGpPgdupu9*bAN-IovKg8U zfsQG1kxiiZO}^$$T~UdRamR1B0#8t2ZCll&ly84+W3!2zzqX&GwfqY6>T~TY6;q(5 z{ox0TRWf{EzwOnJ;s#x0Qo=$v@kC z%PK|=&+5Y|n<0&fOs8IETvJ0{eobF>$vi9E{yyA7oxQ zxCTj(FW-~gl2Sj7{+`0s(@!5xyA$V=Of)Y1>%O^)hmdD8(-^T6O@}!U6{7@TQs6)MZq+-awKkHmH`sPZ|LGS zi6mgS%+Dur@RF%vtuVL}l?Z9rcpm5S#_Q*^%qa)~ZT>bS3F6mwP(hN}!j{Qa%S^ij z_*jhL5%I+{iY)O46vz_=h7uC2g%|KJz`_x~k>-$^5jc0=a`9-v%NjpfLj0U9C;%?` zC{k>2c;Z?pP7o2u=y=ifCKKr?m2Qoufqb$qss7pq>S7yyd50p`dC~X~h8z|Jv$*=e+BEEOprN>Q3zXqY} zL{;vUjXla*W6r6bZdBt`%^2F@BN=n)(NrD?%2d^?brXMa;d6k{>hXfBiEk?7YrH8B zdJ$1Y_z)S4#7S6QzR$4;-oqmsbLCxQ@Im!rwQ&t)>$KNh64x~4I^$1?*1%AqFng1D zd3e2e$S>3f`0bNXs&2UXjSZ?ENH4m63ne_aK1-L?TApc~Stnd*Z~2>t{v^x8D_Ijy zBX$RH!d|B5UsLvZw#>c!hP{D-%3X~q`3T4S^}N|3l02W-bmAc2WE$_3v7>c0+{;LL zK#a(52G1~T9OX+}iASPFLgjlf6;Qn!XrF_t<&cW%hE00QcsFxuCmt!iHu8g;c;r1~ z-soTFD2ade(o^l%Uf6D{3z*3$;D<24sUc}EpjF*6o?{aLLu_sTl!p|WjC4*eQ`Ynt zcAHEMg-P?9oU`_T!5S=k6}@DL$8d6-9T(Ry2szZd3`0ClZq~6vI0lV})z49=r%Vr= zvO{SK5v6<1S);DcnlR-wXU3rbi%q7%YN(|UFgR6qQ(U|whH~Sdjj@|!WLHK@RKao+ zDi~9TY{M)0Vz`ZqsZ{W@4vPM5V_;KDRPC8={7X}n|PsX-%rE4yh~+ouQ4sh7%6 z40ROYtQT}=NT$o99hXNG1Gi1}HeqCdwA1S>KRa_(L2C#|5~eZ8Z_3-XfYcl|h{^i{ zyoyfSlvf%cgmx>>K?>7IISRrv0<*ykUMoFRN~#7=Pa5lO$8i)Y4gIY*G00Ak9rcQpJ~8u@WOoXIUdpp(_TA|fdDVh zaqRF4w`B}Vy_;^v10DKaI*-r5;OZ8($xKEl*UTu<=zEAalc}Nojd!8{QJbFm8aTpZ zrtE5fO}0Np9E@1KUu@zNkKl@f3(r@XbF@jOce1vyT2*Og9op45+Wg~>nRbdn#2`cl zAMg(LOskZaZf4Ux|0{%(ms4yx4kbn*o9=itMqn~UHPaNcmoj{{abzPP4M;s!N<`<=?@yu^AC~@j+)?vzlETQ5EDqG!?;Dd(5V&GL7KZfC* z*`zDsK8_`FQID{GE5Aoq_);`f7zv3d3hKqqx(i!KQ)NaUVie+dDZ}Ed&X)SYOR9Eo z6<_P4x=5{EGzHJ52RS^1o`l7dx$$ELPP4O^>__cfGg583CogM|jTJ!rkVlXxtceJH z7LYHj)Mj8lLpD4Y(!NRlP*{Wj)`n25Om5||w((3v!2r*~HhwWtoP8H|n1Rtm$jf(J zRUb-#5;VL{3t=9?Y{-TP5rP4rBkReRJR^kC9H1!GGM9UwlZIdEs9fdW2-yU6iEj!l zh*a8vlmRaBiZlQiw-j=XN1@qS1P`LsC|On58tJb*%}GNp*FY<&Kr*5mylhx(EX`Cr zt+b3W9N{j};|4PWme9r>AM;;EJ6_at0e*)}`SI*Q4MKA@OFtG}vLE>5Q$~x3Wp1Uc zaqkES<$k~jbk8|Y?ku{55jbTeevzp_%XlIdnNGT}Mn?_KZ@u%2_VLaGroHGfPI9L`UO1$`O1Ljys@fNR6H-r%CEoPTRoiS*A zW1Kzok`2aPDf3op=@J3gA1W*2k`W_*r9(cc8#_}eM^1pSJD17><+%6)E++H?apJ7O zp<%U0-g@`e2$S2WSn;lE{3%ZlVWja@C_q0Am#VC=HBK!fAF}aeKSHLRorFm*xyPK>70LhCmk>eX#0dMlr zD=Q9`hvmwDa5lbW9GfEW=LrERJIq`N;%_c+N&&~KdFZvW~lue4X5M-yd{=E414 zj%dNi(da<&A$l1kGLcNH>Vt<2;PPxVQSxj+cTwvZwMbjL?KC^Qfa`eoFgWJ>DE~Vc zb1tHle(=ni-xC;u&pypF@r3u(X>KtbG+-Q2*7M?ylA9>%D6KPa?@(gnoq`V7Za~kd9Hfd;uTz6<%Xv?t&PLX6c&~E8j6j=KQz4FC(YG zLDBB-U*H{lR~BV9ibK{sinD77DefMFdV(i-!qE)#U3h_4QrT|n&!${D&s?0d9t=V4 z4nF|~w7c%kHc9+fo+2x~#Lz=I9bSH&O8=0f6u!bcc!ptZaZZ*`lZ14}Tg0O$FW7tr zi;(g_9+=8I*QjH_kbRUP|0XkJ@vd4_zx)C3IK-amliL6Cq2GaagrH+b-08V5;+^~| zUcGDZme!OVT&;r|w{ws5V6z#g(axb6OOi6S4l~7+a?I|(kxA-_Q;C@_J3aHa+w|;L z$auHy|F_?7hd=%{w86)9)M?v9CiAE8E&6+J~ZM?N@uZ%oVHxEWpJ z7yf5wK-(DOq*LHtgHSJ>yLHkpciU|2bn0c2YqYY)kMlyE8s4@}B9ez~|EF)Xt8ZLr z@BH#|`yOkBzjNaO{_I&hN!ktiEO!o%L1;cffOeRAlBvb?xelC8ZIi&!-5PD@(w@=i zd&s?gyv>aAG7(1ylp<5`qlku3>0wqwZX_+GlXxX)_F;8p5E=diX4*wG74xB7{H+0D zbXSfOiPt}k8_(pKHG(i4>=Q2#!QZx2ucGzeKE);~?TBH7ME=D&C82~NF(h}?8I5P``b#1Mk}gk` zN#x5o$+Up;nh@`aqx=cio0Lmv5<*3mp2uJdFB1m5(YOMC_zmAi;6pq?nu+wn-9VOq z6_@nH&#W+~zx$`5&#zZxPE_cS6F)KX>gX;84M7g%S9;$+#;_=O{455_*jPdunMW75 zkpYnY8{tCqU9lz5!x0kNZE}^#-V*v{z~pjw;%*rR+`m^Nn~^Tgib%)i-RA_!(B#?48BMSZF9=S zks>n=ZsIpwvcpP529YR`wgUMW?1+famr#=oCBL>dC0OK1P1L|0y?6r7Zh77qgMSrs z!5UxY)>WyaY!N2B2%TT%PwdBWhZH6ud}OQ<&0i)FyBca4FFic_QhvlE0r7&4LCD() zjiicl8U>=tL`fDsvk^j286ITM5$Z!6(}+t(vh0kGaA zl{FhQVWk3tA6-Fk5s>+({K#Y!PL)mr8wd^!M&goRg#*y#hn<1^RzSF72x<(vIRX(5Ff3>LC^W2bSwx|7x4$Jm ztLu0OSr@X%TBKV{ANu7x=P5&QN4}g+tH-S{to-#fS*G$J3=t0rP;U5$#Us)$i4m5V_LVEC&X!yDq4m=%9b8$*(we#K4{ob>VuSz3+jT2<7wTuyVs zveZ|CDW6wW;Fqx1A8JvzUF|VE+g+4(+oW?CfSV|%8lg-D z&GgANyo?)6Yvb&=`9l?XHk>)B_XdTZiZu72Zw-#%iqtyI5ATyW^>}c6myKyKv^+zw zP%OE$?SWCy7zqNlMjakC!)Q}%ALOYUURj_qj)^O-q0<5zJ}Cz`7>SnxURbd(h+@Q9 zPL{nw0o|E8`rt#14DiDnIAOqQ&Xm1)w47=R%#L&OCT!Y+C13gJJ=4elzj!v0Qm2qk zG~)2U;l`2V#L=kEhBiEw0R+DLA7Mwni&$M=v>66mr*?CSs#k;J*=NdoUy~q=JZoNX*FOc13)_z`q_rRq5<``lc1s&5j z=NhBXpG|JSv8Gz0U^AUl?`qCbbebuxDO+ArM#?D$s8eG3bbEL^#Y29w8B4cN229U% z#@Tz{B@V{hN$}-3ij4Scq*+HM9P6N$@z^;|!#IZlrWX%yVKygHZq4#$6#ovR&rO1+ zcvnH2|S0byTnEGDf?`A$)ZDt48jW4R03CeyJVayw>*q%fD&;h4UZ>9ZcQU^Hp9x zq!A?S>vH*HHKk6c`LRAAcOC0>sj;M^-lri_W|d?x@Yz8dTT&8b+A+s$bgbdcaUpsx zEu)iX+rm?4GJw&TX0EY0VFQ}!X^h=<+AZq$ql>%k_P06U{(ryG{`Asy&M|!0_Goub zvOL3Mih?Kks=)ejLpTS^Y)knG`$LE5Nd_Nz;dx+x zJACmYjrah&-U=_5@wm}Qx9@x$EFK!5v_s}W zo9O!?6>Q~>aQ~h(!IyXP>gX~Ff8%8waV#(05O0jmuTtcnG?qa~n80)KYdHj- z?Qc`Vc!5h(lX#H9p;Vbhmq0W2AYcx=0bYILbK6q>muF0sej(P$3|u+ zD&O|UXk!svlbZK{qcg^`JcV#|cj@Mq`|>y%TcDgnh_)~=O2fiv!d7_QC_|x3#YO6^ zOahTmg;v3KYQUJ0FH&gYHC$%nrLyaNJ|Gze0;dY!bX0f?NY2Rw1fkM+Um}q-7BmRT zD-|x^SRqv^&0pNSjto5R6GpgEa(SO;;DGBWfWh7DOdwFOw9r!NeUces4xZ5|f-E7z z3SgK%;3^pr^|7)5FFJ_A4@?z-Ls`$?cnPD@SD4?`aR`^94l)Enyq-zrL;VuYC0^z= z%NVecu9QzbhIXg5=~1+@2)A+xxM~EGA75P3G+tJw2&w_l=PNgpiT98W7&6cc+2M^= z)pTT?h5%bYq`%bYsXY9WBk^fG5$v!8T9O3Tv4$kzY7=NZXaH~RJ)~;VUN+E7cGBeZaE)uHZ?I!O20ek$hj{s5QZGgwL=ge z`J&;X5hESKQp$WMC=Eo*0(~NvUN+aW8N-9*9jVkXGhqxTm2L~1!nYH(@85?`52#nz zv%{!)D$As)=`G4W1`hGvZE~M7y9skq!`n8z(o3g7I#JmnOnk+D^nU5MaRQti)_7GH zHaqz)&F(O&$IK4Zb&RUd@xl>b@ez-}wQdvUS~qP4*Wy_P#3OX@?74qd6;$1lQ4-pr z%DkXOxTa19wg|IL(de{Eig%h{9!+7!xiOvPp=|5H6({4ECQTV(G<&HJoYsKH68QnP zhp;Q#cH(*s^=JxrlV81qmaX)t*btO9!hE9t^WJvP%c;{&Z&j{qK!!llX6+$ilrjN< z5R@%mpKPzJD>WSjF3{5V9KNY1EK{LG#%X671^ms1DT%f}@#YIh14fqyaExO+q1Pve z&r@FRX1Rl5xeLq}@e2M9p1ZHHdCUv0_k;F(tif|coTtuu zmfcC&RK~T2D%4IPWrxlQhEHP?n$8_YRje(Kc;_$*VP=Lkm>p1O-O(pOZ_edg5~^`Wz!+KH0@U_#*ZkhQ;m&c{TB% zcI4A3v>F&Rc6b#rP#m(*xbuGE1}PXZ=IL&oj+~Pw(_rsk!sCNiE68JbF_U6p>vQlE z&kyVM`Uf9?7i;};Mjq$<-TWCan3jtXHoJEX^1$28R5S$Pw1((p<9UpUSHbaOJcw@Q z)njD2nU3VUo-gMq;+gY!p;T_XlI}X%-?>n9aRf!q`-9Ul9-Z#5*UfU+`#9dy=nvrA zEzyoo892b8(zu)5_ys#_GIdk$Ae#_*DEvHARZ&*RZFY#Ex6H1#>ulKL*>`N%Gymj$ z_(vIf{7HxB{N6?QC_S7#xcw}$_bLb0zuykt`EeS($?=m6G%z6HlvIq+{^DiI3*P969$^xoeMBNYc0goufP`r{fsgcnRmX@J!?3UU=mT$P;uqU6ykkC-Bd;rcNbw zO6~O7PqEhWY3;z z2l^9pCY&$vw8u~}NgGD{bjW-A7F(1Ic@a@i>Fc1+fu@?HhK&2{pEBnc>Cz=wCxPoG zHPw%aNVSiZovpYWGF`Pj_BYX6oYHN5vkh@tH!w6Vomwhz^V2wdL;}x9whiYeu+;m6 z8f9GAl$Ep66p=!bUvV-P;eeu#P`^P*kGIRXwmH%i&d{ElC->q+%7IJ(DZ7Fbcrf&<^2#xn1Pen;A1-~Z2wFkh8cN>9}rS_54l;8AzB>aC4HPp zgy~gqxB)fuD46wr4J{l4+&I1>li)YdBsWK7lq1`W>T972 zVp49Dqqqekj2ZKC03x&iR*(D$$83!2rA=mjWe^%V@P*&Rkzv40+hAQpX>tjLu_AlK zGM?I?bq7pJ77~WM@~iG?S(|J3bta7mFpmO}Xi(t0A`>@=h6rMszX>%0Rld9=T6p|~ zVF?_*L`T&9_L2!a6p=$58(LxbXH5TTi@1t;sYE6tUKwRJDmE}&hFeJ9|9>v=ODqe4 zcz(Qu1Ba^M2rT(CGVy#4Z4`)tm{i~}aXvLM=2j58^*W7%dbN67)e8z_Gg1` zVVV&^8IAXzOMJ8Qmf<{yw|r%U-IKx*Z2!`?i06+XS&ZWA2;MM+^7nkm(K>cM#%%%)5w6k zjhz^IewjigOoi6bW=BsZDlPpY$DD1nRo0EHZ5>08S!FHV!}iwspSF)VTWJMr%Fc#l zF#yZd{4ubZw92ny*BZT+nVMSK_ z!9FldZ*j`cgp>Csl}9g}8-A!r7|uW5Og8{2=qm0W3E`0%!hPsyCP1n@J@R+Pf$DvG zK>T$8tU;Lm2QP~|^^tcTZ?Ql}q%pJu13afsT2+hn5Nbd=u(PgG0nCwh{W83<3Iw-2 z!36Qta5KFI>F7PvfVK0Nzxy=edOnT4EIj}T-+3p02pO)5=cY2~MY)V_9=3zx>BqK4 z*)gGb2}4KJI2vsV<W02ayk99>KZT2gUhzy|DLAqfLLB9J`zniW(PjynQ~9#tkOoTiBk~azu_Jx29{>4kj+snsLut~RzRr`RE0Quos zAjz=Zlvi%1V;t)kKUEKSmv)Q7+}GVqycLW*H%JOPFl&OFbWL}%1|sn~-KIHb4TWY8 z1&hbYDn`o*yghD?;o4t3{Bw5*r9E)8f6h*idIs}xi+pwoZWw~i!|C;~XgF|$#T?~P zMXlDrSqH!u;;N9SaKk+dLysDC*d_^Ag=rp-AyI(^(kS=W+x+TJ@!Va(5W%ooIi38Q8_>80 z5PnTgJVSqpg09Dn79(CtJ)oW=2(vwWJ>EMHo>v$d*yxxp>GV-79dH2;%BN>t+k{O` zW}o~RPu@qh6DNj}$1xxs(8R!l0v%jQf-#}d=974!T_c45~0Lrqr<*M4+t)9gm zJx+WK$MBgv#b3i2$jWWjX}W$D<7=+L%5JAIE?rkBGo1>`bl^E~UDr4fFQ;}o?Ui+a znJ(;xEFKh(F`Ox*lwYRG-p4@Uu=PxJbb}Pu2zDzN#FYDdj)BY>j8o2F>>pl+chJPK z5wlM|!qay#^e&$LGS1G6R051T4Nwff=_w2yj?Xy!;QO3!cmW<#Ctm%EOlh+#KZh>L z@5-&#Uf>+WSAQG1U_+W=dZ^P{Ck#T)cP?90qjmrQKmbWZK~!NI-h~Em^DM;-L{Mhn zAMHc0uG4*);%gh|POg(@{qnsweF1~nGU6B)FZGxxw+ghf zNKv@vyV^P=+4?}en>)IPq`G#Fg5Zv_qdl>2pJS!QZ_?oK~yjzyYd>GX})V^zc=A zw=H-`d~>iDlrAFqpSIpUE4lzMGAPGu$5b+KD_s^Jk=0$q(1Eq!VVwxZyvsci>2Rtv zi{Kph8dDDZ%9iLf2ha4wT!Fyf0ez3-FFg<FU#;_RU-{t9%0?PzR*U{BMyvghjEXxcK~g}!UvvHApyfJ4FuuJTh1Az zTy}_mm++_P#4T&%`AK>3CC%v|1SK)S1Kh1dT%uS53cv*qH*ML4;CsABJ#TA76Bb=5 z{5Cf6`6y?~{vwQ!7l#BYXM(k^N{-$>CQA8FgXRZA3 zpUBoLcZF4@)vz@`5m)xz_(sp5UOy+WxvMC}!<#a)9c*v_05v~(nn#Ub7hPmmD}7Xf>WW9S9IPQgE17zS3cXZnuqJo z=2+XF0jO}OaM)Q*kqr;b-9cvVp`brSx_|lHR{N)H9J9??oV$4B_HhHUOejp{wOB?T z+u#&%MamgrBbW4hEs1b{tYaVWX&c{se4WptlC# z85q*&bnz^3vW5{Ex83q+imdg61{=Q&7FwXBw{V>bW?c&Z)wr!&HfkD@5>y2l`3pi$ zLz5;INpQ>2AMiZKN;s`huY&ndR<^fr4aFUrnNm2r{MYEymr&f9PUvPV(xyShy0&hK zU#9BiD1q>|-~<+kW`|ObJD@%6ILO_pqk6h<_dy?CE!I&h#K{u4vrpb)@#rS!a$Az%GrS$XvSwv+=Rh|b`Njp z#Wy&A@sl=v`3s~&Cfr5UMuIxCuz3b!{Ato-0P4lP^8uU5aK0iN${b#M9h;6#RxaT& zrS2@e^irEVqnDMkgCjYz!*dT^qljT_I~lmPG~iE7fnNG3){$o5KqD8gYR3SkvZEo| zF?Cdf#x9{?k6$ zR@!D|S68bS&khW0U}m7n_S!#ib_ds~GaKZUMl0t&ItwHHrLs>Nbt2pPY{tbvlscEj zrFgsCMFku1xndjvCu9|Nc$q(YgS^fec(Cn#f z$5SVT!+!wFm%v3{5=b0h@tr8*z$Mm!?F0E)9&yZ&HaehSfMpkEL?{gey`5g^=Lq*t zz++zKt!5c!wLLUE|Clp{1G78ym4m1kT7bbjkjj?1YsbdyWoRczx+Q_&~A!9?V94Zr*- zcVQ#p<7PX>F-v80vz9?P!Xq*HXYj@T zj>n(~T$jCt?@4Dq12y5LX@F~d&FYk&q1-Mvm^h#sYq0Ev^I&=fcBNd*PQIv?E;t>oV_>k}zt3yGh0!5k? z8gu1OhLI#Y@Bk~yoH+7c8oUCMuh5@V!luzO6W{YLc;=~CATC1IMt6)~fzcaByI*;j zZcLlI^1f8XESMETKvg*01qU0y&}t5%0Nx={9C=hoauKewXZ%!ZaE{WMc#pX*59B9J zA8`>h(!{$+Fd#@v+=Pu4x8fA}rX?N^i*%~)Sh~0WfTbynRHRJ@Chu*)RK7*DcA$h0 zDg#!26$m>pl_nKMK_aj-T-^~$6*@-rm)MZP^9NVS=h)M9vW${m{OIlW_6P3;$218j z%bcnN`ATl_6ls(^${aAh;a5DB4QcSB%q!-mwBzts-kHF61L}ktRI(u)%R$)Qr*Q*_ z_oh#y%{!;ptRgU*Dy&pYy*=?Z1rmKYVNT@(YSsj<$T;9UWYkjS+y>H7pIHn?)&q(l z!nsK+!3s+Z8h9*XWGu?4)G;irXZs*>Kst?OH%hStHIyt9poF&63&OoDBYZi5rTnMd zdDb@Y-gSC+`M7z@F(TMdsg7uW9JLS9kAa~aIiXDccxej-CeNuqJjWB4w_pWQ%6~>b zfvJJ$6bZepF&_C{fDSh=&{LZ8ElI0^sj->5B^iFmz_pOstcPa@M2?FOk!#eqItIN= zsM^SkX@JE?{?wUS&<%mc%#1>K$!qAT?jre^zykM;#sPQAi=*`luk^BT1sNwXd_(IX zUIM`l2_;Or<*mwOKsjp4W=Zizxv7#204QR><+NU59=0#yh5IK@A8TJb%~U~#t?#ma z&$R*KrHqaSy!quUQoyXh7q^ucg9rdWcCuLyUD<#(^+o~Ve+4=iNU!#QxO$2GSa&R^ zj7IAzr0Qm5-d{c@>M&5}Zu;apL*jxF^ulQkBV<@bYQn+o9aH)mot**4HBme zW}2u5n+8riQX)wkfuUJO8gQM03#{}2P7(9mM2~?;J+f9q2z5^ROx=~q>8p6Q?I8_< zm0#b>7>#s*f-m`5HZsdN)^EN#aEZrEWzcxmNv5JY{W80&GUai0{XM3SUIKT0_`q;_ zWhw)kx4;+IZ>fx9{XherJ7aO4VUHmc6@#gVJ>EbLsv%Fjtr~?+oz%N&Yz+mc{&C#I z?AAxD6MU8>b}wVdz`G9onC95?fnmJ+ObplL&opHa!$7=@*Xv{OvqEZM=;?BJg}fG+ zuF6!%K1VZvuRI{%oXzN<-432myr9;Fj`IRLHmQ-{^WCf1MtA{T7m2J-HqK)F;@xu> zRCw()y}3pqQxN-y7$9tZGhySG82=cEbG?WUZxl~4F#B8A;T!mSe&vbJpuDrrlr@;1 z8`!Z4&V0&7MdaVJ`AdK0b>hE|k;huqljksG;OpLP3}3v8n;53Yo`*lr10TNJ{eX3a zH{r`U%1&IE#(EDU{Q7OyTB4}F^jX&2eF|?MM%JD8%G=0P=*}srcy{|99%&?M_{kdw zEiq(!@^YXf9&e@tX9F4JdHU3++VuFj@bK`>@3N-w-;e(-Knb_;nGtdx;5n=IVEk3N$Rv^r9wP;=0)C9 z$6OrXpofOPeXm9>Yar)N*VV(zI?LQ|g8wt;uowGw@B44GOFw$2z4_+l_P;*9*M4+w zhpZRcDe$$8QBLf6tLi~R8ZFuh@^{cxB8f%&SapyXQb1Ye1-wLtNMqFEtAjGuG1C!K zMv+5kmRHbdtPKad`$Ov&j`u* z{En%j!zyc!a~$plp2<`%vP-dwT=J>FEVbZPXT;;Hcv1M8YvE$wY+B3TJ9XURSy)nX zN1SoVk??Y6;VArMAs;g9&blejksE=Ty|U+n>wI&p%r`iP(99FjU#KYb4HDtUNEb>; zp8{0@bvj)Ng}7Ge;18V8D$`Psq~R(Cjs;L~70glKMv+LCBU6FpZ61S9!Ae8)1bQ;g zkAf*Jxy+kS3Yg%)iLA@iij!jIHgSyLy?+T4Y3X{Rpk)zP;VkSbSktJ`!hJASnTL-E zmm}};SKg&EbC*QGutNIbmC3k#;3C7&!);Viarc!Km79oS$P{Xj3rH2&>TUuuB5Zlc zgQN5TuTYpbm4NaS?FgQ6%?3E3FBKPhlpiDIt*}VL^O7TMgzjPx9-?HZOpAzg#(T+2 z@ljuthf|b48yn~Er$Ml%b3~Oec~o0Qqcj3_fsytlltj-UT-(@a>)YGyA)}%1zx(rc z^)4MTvb~^!1ni6;nx4E>^kt>krdjuaa62p`+fljZPMnNngPMcZ`PC~WUGgl3O41H# zhA>N4!^Co1A+A#>rB^tH3ENFPHfXTc!VgM|_%;HmuPNn;0EGN2#E zJcX~ZX1Tjg#pYJ|*u%=rQ5C>bm6avs*_IYlN(YJg*Apcg!s$hjD>0;>dqqfmGhhKN z-pl8779gNOu3_Sz2BB$Upn>l_I^`YW3Xe%;DW?drk$85b^DcC|bE|4D>NmWFPaq_{ zmfInn^**0?E(up8Me|?LMW7x&>^QTbUpzAK@f5^L( z7wIE2fx|s%m3PZL(?z`phII0i{8BvN4XA`EYwAN9f0h%WkueQ&ALBI#fbq?@;1EY+ z6a6w9VKB{Y?lBasXVm+VL+3RV5ynUWQ?nuw0Z0ve>MU_t*TlJfF?`(8Un7yT{5l4K z8j5PK=S*BsLOsv0N1>7sJpoiie({bdGZ->DCHeKY zadZOjPtud<-+&OhvV+MpY>>VJSunT6^6yCW8lDmKg_L>IoOH^n)a7-7~2z0Ha2BE!5 zfBS>hfAThEMS6B9jdA7~mzFPmO;e6m*x1Jb2BrtP&d`d{tzu-}ew%!#lT2~$?_xl* z`Ooy!XE83Hhktk)iQB`|$tvp+AAJl;x3QmrC$Fv3Ru%^=7ywYQa~*A$wXqnC8kL;y zI9bPw>bge^^8G*igLd$pKf`cE__35Cm&k*ke~u^LcBdgv zu2`@=nw)?~0=Rb(>FhAKVXgFC1x@>0J={7UvU-z`PnEaN47l# zTTRpVlt+WICYS27B%1fI(2cD$e8;Oih{T0v;>46sfx5EBum+4>NUuY(@`Nd zbyWsTq>;WeEC_t~YyCy8<%#`)8(KLK=ydg7eg&4qix2tI5QY~%*}1!}(=gs;c>>|W zw7K!1*V;*!c(xI=!5+`zt-HL29&lfz-0XWFvF5sHBtPq#cnFVA(BvVyE1}M^JEYzu zzO(?RXhshqo$usf3{;*4B=2me<53k>o@-zeOw)B*KG6;N^%8!j9}-v3)2M@zJn0k1 zFP;pOB>>>d8`(y#JVx$_<*xckxnGxWy=)&v-Ai0Ufj<_&5L^7pyGU=D ze2L&|5=QSA55mcrz@kU`r7_PSCJdwbBiPEHG~A~whrEZ^17%4*e92kpN?rz$Fu=Sw zl_8a1+KIdy!+kqK_HLxUQYBVJH6WKft*dZM@rtW~11(k%%dH@apTptuDy&JgEZ<1K zhzzKU3^MM_!^{>K*xY@Ca|lBKIgRiY8->1*Hv=(H2r5p6*E3Z^)Do1bE8IqqrGrlz zl`)R-ypn`3GPHnF81N0apAqwrR~PcWHqQc9DaFfU=z&m}7rHI*nULSg0ukwgRdD)&C- zE8)-qX!BHYb}37EWY599m$`^r+BP4I%a2NY)(-M(Ugj%G!jngqq`7GzNSX@2RVPa2 zKo^gsk>8dqiHV~Q5dM@-fr)_{j+x05j!+_Jx6vkvL+km zK=f!3rXeOgc@wTjq`aZU6O9J{U1NpMfD07^p6GRwQ#N1KpjH^FlR3rk%aSW%twNje zjYl^ep2}}O+l;{4DQe=ek8e7*l26vR(Fr@XQQmK(RB41dHS?hzIy}}elKa*}*YByU z%YSj$A)aLy#hvuhS4IIa2xm~2-6bhk3SSyhH~iwV>`Dq~(olR45HQnJnexkP^R=-R zrk>2Z^!j%E?wD!`9l-1u-h{~yA)4Ma3ksai;6T-^iy(uAP4t8x$t5yj{YgjWJ0ivC z;$BG+hV{p(5qD9Hb|G9i+l0kyB|t8v$xUQjXK8u3nGX}Ca;8>Q8;&y}&LiZ;siZPZ z{pGPS2-Q3*qh88#6xAY5#1byCWX+Fl0kZ&zo)K~K^Ncrp|BOmnKz7UtV8s|M=<6_R`u)TVuNB9(k#c%I|b`;>3p> z$p=)ezXS+69t+=rc=C`Eo@2aIU*&^!{Q&Q@iihnQ|COG+;{_nC(?tz8Ey$(h%`?vm zvihZhkC!8!4qi?+Rs4CO@~I)`8cLOQqS-oh9L>o#HlFD=QKV74(Wr>e zS}2V^cmZI%IVxq;1j?#5)!?0_Yg?ibp;ul*e4LLbdy^LAH3sMaH3;W1tn4G~;X6L~)yczr&CUF0qQO@nu@v5AY*2RqvF9)l|D`V=G#^oix+ zR8Edp$Qg#V-SQVhOT6X}u96mB>1|ncS}evQ(-hNjVK~m%z{K+dJG_HACr{pE+|Pj- zUT4D=2Cz1c2aisp(PJ@OH_3d12|J5QV`B%^oDry8TY)jSGGK7~BF89PXx*7Fr0(d2 zq?AaDyuc?nQt`aR7*G3nN0lYdG2Fe(=C9xce`hy=!IaL)@fR_KUL+1QVifjHtz0_| zKi$3c7F8O#b7Lg(&pJH}_l}Cx@7$<7nI@Y70^-fxa7Is|{NFmmddEv`|Brva&98k3 zPGIQHy><{ml`pdN)9F@o*RM>0fWNMZGsjfeqD(`UikgoGopL?*d_FaFWU4k@B8+$O zh$C~8;~3W`o(B?g_J{#hE3a~863^F^7Y)U(!n(1Q2GMg&YYp zWPp1B6&`cTUwmnUh(VEytPx2gqxeogg$17-tQj0|kRr1f#ElplNo6PnO!NpTRZL`E z`d+}wXS1%p!%|ZBG4GKl0OOL&zIC9zuJJc76KWZxx#3CDOeLO~fpZjH9Y*{Mia+s+ zN+R(q7eawmJQg_-WofCqNASPxa5@m!?d`@a!)o+2S81~WiT))v9k{-+=JA@}{;TdjF z-uCy^ca-js*=}Q0LCH7bIXgsyP`%W3tKlmG;j?AZeS>2sM6#5!fcF)77J@_GAYn#e zYs1BFb&Sc!fLtSiV@iLM=7=3bL|!CLi1$lkK*qp)kpsbnjcLF};jm*4Q18W%7!e|# zhooU(QVcKxFBu)dmJBZy&g2e^!jmZG3*%C8Y#51WIi!(Fssa-w03=hX3fZ9nDLxHB zRAvh+xh1baR;e#e>yE5>IO&2mHl6(I& zjw}+}Ut!8mtB;$eS?uJ43bXh|skZe1#vw|H&#oO>MoC;liCRC7vcS8W*RQsB zFTTTix1u@aUnp03k(Ujfbjni^2o50RL7t1GZK3zKSsPB(NRC(!S?b5@f?YK2wyZNqL7;* zmz>fF(g5>3LP^pfl&9`)s(07R@)D69%AIb86S;~%p^CWTEuN7Dk$_55Iv64Bls_=! zOYV)1(CQhyNdscX$hbEKCI%rrdt{!tf)b80N;ipt1>Xn|zZ%Hk9rvgisRQy^l-;n! zyn?tufUC@iyQunJ`ExG2uXBtBFXXYLu7jKT*;xukWAMIpn8+KvTjNu^s21N5%s4Qv}5iLa7u)5~KVh~^JDjIj`DODyK0MwhWrK;@oL+B zJHSdOLu|*20^ggi)~Kk2=pofBi<#73Ww*{>-CAm2X9JnD{CZBJ$4&ULE%zE_+R;td z;kY8LTO7gbGBzlZm+X|{Og~u=V(%<3LOd^d!4xgWRfVRBBaI;(kK~EqCp=--DBs$k| zp-Af`Y#e0od3Q0CSdW&CO-SFxTZk7@4<9*MTN6hLXXjsDWDo-cpqkWE@GfDrGN7oaO9wR{^mW3{mn}lKc(b%c(u~f z;niy%^3HnHo?{&}{4C4P4PM*{7Uj9$2L^H!g%e)P<*|k6@ei(<)PPX?*Fd&{={BZq zb2@1R(y6FU*Oe~%0oRC5tUxN*z>+t()QZ1OWz@)|PG^ANB-3AI$}Y!Ch^L#>Xy|!f zBWKYbe)xT+ux_`7Q=g{ZLYwj@f7tw{TV;Bx#-j!R8vspQ|H*M6J@1_cJc0K9&b#gK z%6Xz-03O4mhy3ZSw10C=o`oI5Sx+ZndO0~C34Gb#`03A4jF*9>k&U5_%ve_LxZ2^( z?A+Ot^_J7qFSJMR{j5Fu)*rV1^0n4ZQdik<$Tq)=@=rE;ycIW&oM8G1eB(Kd5_qJ4 zPa$oHb z{2-dFv(FoRim9tqqNEkEY!JoMAq}R3VH7NhC|{YwXF~siIS8x4)eo?o_9^epAUY_| z+!3EV!7!f>VrA%fXhHa@GKvGCf%3U7ag! z3pB*5yGt7*u6m~hKwC6Z{^ZBd*D1s5Y~m|#nR8NP(ucTncm~A5C42{z>nNRBuA#J3eIL0IT@>CtiLN%q1^f21AIENv|`+emQMiVnA-PD}7lH zrC0IRJAn@&X6o~BrR^jrc@mt#1@lN|nXtN|iCcPCH3C49Ty!|6r@UDdqkv0K9 z4-ryC8cAM2IO1XCIfgcINR^mF9m?*QB*>ICi&}hx5Abd5G-3{MksM~BKlw*kpD5pC zYo!OSa)O6o>Ii-sNlYCz4jMinrLj=SllU15n&vn?7(0w^wyn)gw!+_Jo#Jl0cI~5f z>65Ee5QG@`wP{YtjK+Y~Ri1KNzg9r*4NylBs)PR0W5etv&uJUw4u)F-s{BS6rXS+l zz{ER7TBnK{Uzq0S$AfO&K*s~+H=r-2Kt>s@;hp$d`SiTGQHuuUmP#b>v)dTJEE|Q; z2JwIn!KtOFu{k!u@^&VXsJo0Sv=P_xmu{z2DsRg?OH-x-@S5Amb#=>;vKTY2KNBa_ zWl#W*Dq|aV>DuA_Z9c1%HLKRL_RiuffCE2yl%L~nuW2&PlQ8oYRt!RZADIc)GA~nh z;7(NH(HQY7&U!AzC!0rsl?M1DM#SA|4m2Xqkwd~ucJT~yzXzV?vq2>G3;-wV85x4_ z0sIy|(ZUDoxp?v97qTcGWf01dv{S-Q48FYy?!~)UV-g*ReCtu7aFh@JiLaqobugt4 z4v`JZie&zPLE5n#+Dv)reK;hYN0(^)e;H5UH;%8huN_})Pp@MPGCk3?q|vE?txP!Z zEKkHlm?~Z_r&CV6MA1%o1%_DN?1-!<%A*FNX%^O|*k8-kW9sgn3M9Yeqd^QRspoD) zBu_N5=L(()ddp^bhw9*7^FxuvAj$Mm zh>wC5#75?Tzh!`I#n9BaBgDho-8h6-Fc_mmW~Nb*BxCUFJB>abO7Wts)vk>1G)m~m z?#n1=vn#)B^BeC%FNO+A^@Qo~-EoXG4{!Il0?+rOb9U-#ZPi~mTc+7uOFqHmupB&8 z*!9BAG)^=K_2|g&y({n;o?(E@cTw=~UK`dJp20!K#w+04Gk7=q@Ez9DVGL3JljBU& zT*vrfI^mp+!8*?TQ|a&T<4J>8otw90w@_$iTA@m*a-M^~<%ahvpOn>{xDLCxW>8s6 zi=r3Mjb$96(D1f1kb~9_JdTJx`5&(`2ewSNEiiR?Z7E}A#A%!EOp7OOc8{s6((T~E z`tvXe4<81hUeD>dFTfi%FVV1qKQq>$dWNE2K8+-&n0B0vIo&?Xdc&LK56{`WrU#yz z0?jpAi8tLmg;(z!Jcma%Y@C^x1K#(qlMi)7LyP?MG*39*!gZ065jv$A-Zob}NA@sq zH7p(6n4Er*eRfW^z1RMz9sG|!Cpyz&Sx*RHIHFW>Yx!D7sV|+o`N9g{MA@f4`k?Ho zo%o&U#NJb10mD1OoH}Y>%6o#s_we5c%rKZd_bI9i24h|#S9(m5kDlFB=Kyyj9CmVp zX8R>%S-xAxtRL{-&3vZkJ`H})wEI6e-+uZ(f6@Nxz3c5K*YCDFObJ&{afZe+4Xo?f zonfFC(6-uk+j1>ELgXl?RH7kVnv^GBDe#s(zt#oGS1-^D>U%wFy)t987;@aw-q#vo z;vnC0$@VY&Q}!e}by;BWM`O-G3tmNka8OU+UK-tetm@+6pM6r$CCK(GxD7N(muCh> zN90{zI~@hw(#rzZHs8THbuas%GKz$39(+tM-r(h+cytwUTxB{lZD*F;fUotYF=c&{ zr8AhU+YSnmoLzsIQ$$_er`)N(Ae(;F_K{IM>ym~*7(;uH{iu1Eb@wh!kXHGyi#+Xc zHtZuhn@o)cj%}YhlKPLwba}~Ju;Y)kWgzJPqsbAhY+SA9P6MX>3| ztE8=-r1SArPem(fz`u;bieb#c&u8Bad?8c^%6Q3dFX7}GGtYBDF};_vVLo2gA(0*1 z)R8BnN7(+|_g>*11(98M395C&jJ_PtHWoW%4mC_hFv#^U{h144I$gR#5UcEI|cN8Uuqs(aBUwZeqOg z&K!dzVZ!xEMau^ZR0Yyen2fk6zsXBfDt<uaV6$yE*ya(5$lMmcLyM~s< zBrGo#99c!z8CXsgL=CI>geMQ4#YGRz7Cdr_C6o|{sWd5T_)Q1nMnj(6XWUg9zh#iI zEF77$)NM3*MR|MNgd4~RpUr20VS{;KtIMT9GaBipbY$`o^msgh1UT{snn#zUnN-?| z5czgGsytgW2`}Wul(KSn#fQAR2Mjik%~28RMY{k@XU4rWJ5Xd>FohU-CTLJ>hrmi( zL4b0zWFVKGRpT($$+vZ;0yL7V>`)*8>Y67z8~PKxVo(nsEH~HamZ4|80|a5p@E(bU zC_g1>E;YvkmWmi$muB?&)>T7Ub9!BHTr> z*kxqkfF9hAdl_crS2?3@W-++sKwjY!VV2VY*0l1q%2uo6R8U8pv%9Ox4d~fW$kUE# zsSz-CFr1Ul_A{3|BHFGDG?_u(5r?}7qHJ-=j@KObZq^(_OK+vKJVwEDs8r?V#Jo@0rTm9>=*^-9rRuqII2I}DDFbzttO*&cB8!|Bg* zM*Jye{$0(~PkD2A&ZP4l)|B4DpuO=1xX}V{zf=bBb$EO2tu{S-jy08d3Gd?x zw2pJ^LeH6ylMOZ`!?2m%xdaOE|J-k4G_p<*zD+$Qgh7DAyC1X}=N7iR7{eGqlV?7S zv-qTvk+kuQvbNGqTxy^RTJ_4p|H<*sLkGt_usKeTH#lXlRCzY1jpXKYY;f~zJeY2d zwD%|ft{uGgW0E4L%Lr3V?SXdkB6=!uM*O&^Zt@jF$d@q){bh=x)3akZJ0L~d5T4-` zmZuuV2I%db-`5jue2m@apNFs87*oKt94MO!#&f@~XBZh~$%dm!-PUmoSd4Y*O|_;B zdSHZfAAQ&+FTLEBzWR^g1>V_Tyxs2o{91eMd*|CvE?#fvZ#`&N*?`5F4qM=Ng7UU~ zn$uyG7rff=(#s&tvZs#KMryW{yeF+xlR0@SH)XiQ0D(^R68RJ*I2{2pg>3cYMau}! zHHP2^H2BnX3*$Hh)PhD`@e_q?RkVoos3@hUE=#)EoAyxq(NNy<| z*u*<@A_w-ovduqm%qL2Fi~u5gSV{ptyww@C_Pjs5pU8(d$9YHmpq3O`)m7OKIsE}ZCfcF*NW);q`b~ngA?5kAajOQbL&WARKYE>5p1kCv zF^QU-fHfL~_WOoQgPOHay=;aSkWI^A<}wDt99)r47O?#B;$Zq|a8t3Gk;--=pSqMjsgFZL&3C5H#xeUSmfhLKGN`21}terW~J=QWhZG zWM?8lr2=`w$FRU7tp$s$dAWAXtLhq55H}-#L7YdWeZa%AGM$Q@Agxf98otn|jbbQ# zm2pQIWL`#1iN8o?Qpa#)q+pl{f?q(QGz-^;$N~kE752 zJ}Q%pRAIc?pv-6>?0Ch=idNG_iA5T9uVhVw;gppH7jDb`q0F+g7&4HNFre5__;FNx zpEHz>F?DC_^sp)ymX$K&mp>#6Lt^BG8sHLWun0cJ(Kd>* z1xCFBUx~yz?mX)XWx@NEWVz}M_uGbjq;lMNF{DE-+~35H3PbnA6kP$41jC=e=L3WVpPnL-9r2HM50 z&x^9=NIS36$ysT9Cqj4(+a}5;G;~{d9=7mMF~Bp!GdWqun}U}x>l~2d&J97HdY*zu z0m92OJ@FEUjXzxqF5WE9K82$2+6`#*{B&5Ny-JcBg)nm=${%e?j>FK{1b1;ZofScP zEUS1B>{xi?W-QzVfC)%8xK}@!y7&tHXZzE$JxAx-8OTGyyw#)w+##FiKrvY>`6W28=*V&1a4Ol=5^vRFZoDl@9)8KKr z_yPX%1EP=zjL97~h+(>>YdN#Y4{@`Rkm7_9H)jJG71_zgIm-47_9e#2Ap?eZ^ZM(r z$D=tp{sMAzmO+BuHhcFwZSvI9ZSf1g+YTYMZ2N_D(ac8>du_>L(0B8K~Ijo zh+zpW2jFZOAPNz9`J)GpO>L%|FF-4@eCErjo&#HDt<-Nd`7` z%n)D$+EgzA>Sap8P!H9;wi+(V~0yCsSbEV5q-=aqqMV27S5> z&K+bkCn^a1#G4d_2Rhtn=sNObyCB4Ej{11^)AmZt$7k&-vXXUe>@qqz`%+tY;aB1N z6*l5Ij-h+5Jv{$@yY<7j+6O;eI6jgyGLrNyHD%+O7ody}0ptiw=XS?NU- zhIQRR!t^~-C;i}-dL6#PTWPk90+v&N9iW!q;S6bQLHzf!orIJ;n!i)?%+*0sDrWAh zjUkfnMVGpe_ZnNmu}=rN=$l41ttt7*V5V`*NgD0%!7DSaXoEA5P8;N|o27Fi1GY*0 zS+>$1d6Ad)U9{0i8wN0%j#GjOcYsGhb4n_Q(ZWj%PY34I+koXP3kT|FPDOXq0qgSK zJ@$!m@9)a%kd1TH7u9k02;T>$lO{q0_}l)6|KU{eOFpLUCEpr|B^-IMeEEia$_`%e z9l41PLAV3R7JCM<1CIy(b89BvDl^sdr`pKYfu)H$CP;att^PlBo%xd;M{?h*`@I<) z0}Sqi1VLblKZUq637-|QYxcDQHWd)?JlSy@?GS(%k}kcYC&TnVg!1MQv> zc7C8IzZ5fhC!=IKW}Vc9cW|H-K;_mxqhe3rMGN(ds`uyx(rJX3^pb+ibb{fZ1CjzrM_03?yk$lv_`KZUQCfsjZ>k8;P2p(;}5C6xO3%{_Sd9t8KVVl3W^ zp9ou{1WJ?&9HWLV1t%c^t(f&|CFT8;)^dxxpE0gN&TF#C zZRisNPteFBj7AepIgRb8f6_t7qCn~{@l;symUmXPbg(hhPK>5D+(s1*W4iG0ET}SK86X87N9(n!y&Ms^N?C!#PkCh3mz;1p05 zcRgY5`meEJ*;ISw3zd1qX1s9bg9t;HlUhDmFMJW_0C{*kgzdt&a|Ewb9v>=ni6hL= zoA(EZ=e_F(h3}L&-x`9_&NQxTb70)gEoU_nCS2QEO}(ZJl*dlT@|kuO z8ZqlJ#*X}?OiITjf16$;WCA;WetF`OH>6MDDNei$5{c>~r7M{-#`A^z8fHMz!$X!S zO9aUSZr&np!qj~$jhsoQf?%P=g-2wI%C>2s8^p2h9-@SO27~KgUOLnM=E+0t9>&g{ zM|&~y#ZYDH1cf|;yYLW(-8OmekVa$JHlB7V?O^Z~;LP2{5TZKRa1g^%;@a*lv-0Kv zhGq~1N#&GviD>LU15$>Ra?M50p*tCfU!TLF{j)Hd#v!(0Zh_7t+_=lNiAToj;gm&qB!zPR7)FfkpN7ISX_HtS@XB~m#~N@Nc}opcVr$T3 z`0C^9ZTEv$2)|DlMlhrM9d+AtB*8MckPBteh>!<|?VF6;+(95Qe1nH)$qt$Ej=2*i z-k%xXDJ9e5;}@g+r$QOwM~H$Oo<#7NUHDZD?&EFm{TE_LW;aX?Wsk?e5EwMxKwl4S zui>(Vp@@v`F~U8!Z(z;d@X_mKxVec1?K3S2&-GG|th97P9c8*SWNl=Rm$MxK7H9S4 zs0^pYQrCKx8H2Sl_jYh6(M`6`?IW$z59-Os|$DV|@@N_ygR^=3&hr8GC=7Enp zynj1x<4;gNk6K7wvc?Tn{4yU?oS9?VX#v-4lUQ}}l{zT=h9 zw?A0kKsV1BK6nkzBb9Sh8Egm>|0A&>~f6 zWF?OXL(Vt_TO}+TD@DZ6UT6oAWwsyTwfg3sBgz=8&T$W=}o~-qsUkfLFbi zyG&uegW(6a((%)d0C({@yq{0wm3@!18{fd|Om9Tn=q^5u5sQ(Ix8AcMdj@S+o_+>g z&;xGVX`8=z55w@?_Ioe9*8Y?;3?BmSEJoqc$U<-jwz4{Fo@smbyYio+)qc$zZV4kI z&oyxEV7o1l{4IAeOUYb#T-ocanJDv=jRFQ{4yC7kBK^!Zm*fk-Q#Ur?%~y|MA1ey5|pt6bnKWu?75b1BDm^wY6qhnOkjXuz?-~e?eGjQzVvqn zkOR?M7=*i9oLi}79E<}$Xy{5` z3CzFsCTxnH_o)Zs+HY8P^@ps%<=%I~RLAluqT4n~n1er6U*yTN@4Yg}8Cde2VZtuD zK7Ims=z-1DS9aJUKMUym^_f$&fFD5?bYNymH+Li*rDBgxs%P~2AoqF* zS5BR1w@{+4UVWWubK4kEq8EpJdA4(a2<-t% z0-`Zt^zl+SG&)3wBTT)AX5gSg;1NS(?LHsgv~$o=FX<-F8eAH+=>0-T{72M-yOw5m zP2LeLQ<2R_oD_5Z+X&ppfy(l~bVuGhnp%bv`2)wn0yk-~BNks}mFes+y+4ni)YjacwUL2>UfQU-=hLooc6;rugy0 zt#;pex?Bh0SJ!Xm98cogdGVObDcy%O{CIL&i*mwudgAAd80=_iQpUuWiL6(GjH}E% zY&$0Y7L}^!`7o8~bmL8we0kY)4p?N+fVA>}^q8jP%B#u0(vxf2DrWMdriKP*}bd4B>Q6!s3860K`B}(@U z13?2IYZ2uL*2)c^+y*Z4#%=XogXktF3|vLI(_`Z<$R1^&GM1whV5+oD5SOm@A^c^N z4T(%amrf;P$IH$gJE2i_&U6i+g_S2!utE@IS}6s1OmZ5hF1d zZtn8Qbv#)Z7e~Pz0~;+7TrdPwx>$1<;|K#=V_1G(E-*Z_;N`n*(o>f`Q)+XToV$SX z+;tcxNG&%?$&@J#2hRPo?eDztQpv*;PcelNLkr%E*ASzwLqTnLmiklA(6}(V+!=Hg zx-;d}b#-tCUPz{5&dJZUo=h`b>dC{Ks)5=uZPY3M=DDYVM8RXM?r{bn@pzdq*Gy); zqSI03tNXw_b}{v*vE{jp;urfj47FIdv2RPQzEBLY=vR%#x|TSvLuNRIbz0Q-@B4)*y`j zLj3u~ZvY3G{;hx07O(%3xENL!tZVp|SphT~$5xQ{P%<)1ikelm>4AFn(0UCz$rV9` zVx9HS1jImagPEfz@Ty|8-^Np#wSmNE5MsuzqqdKw^i-xH5BlQ_(7*;u>Urs*_M9i$ zpM92e$Ajzg{<|23)QNS$vIf9^bG!&rnC5B~V&_S66LN9~0- zKW=|`=YD$!!J@pr#6Z$fJ0>_nFORb>VsI#Z5g5@0DXn^hJ9T;_ghr2g&Ww$Z^kT*! zj^RhEOJ_zIFg{2i*w7;$eT5cb@vLD$Wjb&4TV=UzxB3eeqD%=SZHz#G(6i&olWz!A zma_?mGR-naKa3$tUrKh5WkBWaAYC|KK`KgAXwXv6v5qN=I!nSRjz)g^W&>=;^ktQo zO9eF0xcKt5zdn1f=hz-AGdX~rwPS=i{k+fY3VxA|OZ71Zxdx2*X`>`%Qt9)=hp+Xn z4&bJXsAIFH@{S@u!Oub{Q?pzmvJa!#Y01>jlBwC6cQG;@ID;>on(frq9{TMt)q9U4 zgw%#J6VN^Zx-T>wS$FN3jG3(!8rVluB6-?hXrvxmdM&gd*yU4T2<}i|BuG4h(#>25 z1KYeZiWHKz@hl3Ky0reBC6~bnV~|K)o)_R&b-E8AP=O52UZzp+wGO9xiPsyX%>%?z zpFzaB2|RHV*&u9aV5yUMWy2WCstgZrfrpo(#aqkq>C3l%GC1_9m+BV)NrI#^j_-M( zWd%;WzLtsL7|RljIOf}ZgDIotHNg}}+LVDspX6-jUJ*XL^V!N3;B*PdCt(=FABo^y zh(X-E&ztF8CD=Cz$HrQ9W4eOrO*~E_<;Bl5Ra3&J(1w#~Iz}5}t{{{01s4b&h~i>{ z%wyO&c$;=auYQs*DLz$B!A=Zk^l1v4(*#XySw<`if6|8L5{LwP_ZF@(^0t1w}7Vy^WCoQ(7kZ&g8p zz+RvXYjhss`Pg|nE!GcSzsZQ>yKgde4udis2_V5SYc<0MH995DErE5KwHqNs2?WNq zV+_(oCJx<73_=YAqkwv1t>ft^1^amwaSxgA81_7h&~>5r77aallW(T} zl8^e~0|c7_YE78XB?5(KanjHtD2<;-uA-YZf=5&MUY;y(t?hv6qU42tBs}E#Pi_Wd z*;i0b?4~pwwp32Tm;&Z#!t$CCcx%IjEO5m-VN-j~Cp8q>K;`4&X@$fcUkI`cRkf<=Y51 zkafHN8Z88d%t736xC#KY@tw+@?PJfa{=p^Ot!2qS)e92fBq-%ii3GLAmZZzJb&wJz#{K0+RP)oZlFiI zGp==P4F#+4gl*b#+a#=zbcj6oEUD}eLCq7c1-l(Z!5aC)W^_sz2620i-TuIv+XdUvpY??rj5}cKAfwkvZ2y~ zAvk9j$;NcI#%*q8m9ck4RYRE2FATBSmrX{6~ouLp9nu^rh^Plfsf|>x*9jLXUVE$N&R) ziI-1tzaL|Au5Lo0*+886_I-n(M19M!$ zA*Os{2rluu6~`yE~Op~f|1@IdXl3Q&as^HDux-xxXK6R$r?a$O#4bJWt#72!5O8SHGQrl ztifEBcI%2VGKF$@c#~i9m2NV--pUo%u0cP>YN}D$Gq{jreZb!GIkna01=asU7x2={Xdk-^??i`0(b=L+Z=pQI_?6~z zC!Sj6uupDcN$pT(bRFRCX0XM+N}4Exp}qA-kt~*^v?_eB0W?5Y`8~7tLT6q`KYnt? zt&hq&>NqSj(iTt!EH}X5r4Eh2B21Rxq2LH3=?ns&U}K)ic@6NphDMh6>xXiD4u!k|fW7@}+NOTO;s> z+bOCI*N-{MB$JC(JRt5#c~(g{`naG(xNz z=|R)xVN~LXuW&Kncr%G-5zHfp#uIMy^0HPeza*7qLdV=wmMUoI9A+cEOp~pT&4APz zF=2EYBjr(9B3fu~@_5I@d8`Y|6`@6AR!P#NtPvK=z!bCyXLyO}Y^zMIIEd%q*yYbK zTk3AR{{GwT23|rvM3&ns^0FivA;LEA`l_EEyoicmt9bH6mOhQ?J*vR|PWot@BF<86 zF%*ewDeYgSPw2_FJfxu%;}N)eJjBJil!x4f(H%xLQe1>#oUZWKX(sNLFFU+KD@R%lvtp)E z#AE=l5|Sb=mHFY;c$pf(tygk2y>~LLcl_9fvrY^822Xk2ijm%WiKyGbE&8#H)6PK3 zPDwtg?cae1+=Yr?;Da}HBUefL!<6YFM$$iE7tzl%b#e^`d~lS-jC&!U(CmLEbSdQ*K0>`%4ReTcsB@gn(buV5o84Va0gx(j3J`Du97A^)A65Z z6_q?GqsG2?DR-1l@-(;fEqsypF7%MhCKhHkrUGEc`#F`i$~3t7`J=4gIuBxSsq5LG zW5*^G!zL{+>zo)}W*c?A4@-`m(MZE0k$@he3k^^H@70 z+}%hs`fjfx6F?Ao8(L=*9x+k5Livoh!iEA2r^wQJK}q<8Wz8cB_3{qcp`6(O2G$J{ zzvD;=Zh#4Wj8D5aFE?yyn@o*-_%4Re=Yhj3r;(zx$1u>q=`gAhQgUX)i?@6Ir_dS+ z<_0d}4zu+qE)bu5;J+pHF+lfJ>L+-K@CFUc*2u1+PC-0#jw!oOVQ)W;f%P^cQP)u( z!B4Lz$|62*J{YD-CDsV)#no#Tt%pr(tj8#1@sdb840epH&b5;84~>fVz#&cN;qxlF zGmYMjS612F2;7Fd??OktxEzDx zbY6BRO*t|(6rO-*K#l@H2YF2|v~}go1t;XAjL$sJ5gDR)v|)_9?lE4Jr@qDxrysQK zAN*O{ec_KVZlN=>c)1DB%RBIAj^l($(>BRP)~TuJ&_|xK7qTJB$X>`Rc_wFHo`6sA znD4#yp7u8eKb}gIcMqO#cn>vJHKa8R?2p|M)%AkIeT;G1%hI@bVciYZ9b2vUOpoO( zNA<&QV6cSsnlTFWpt{5ESv-VJ2i6cd|5Tf;pKlM}c(rZ(p(jBr;N!CsAQTC=Dy4zmCA}?$`Njz0z1w4GMY-g@a&VKS5dwU{MmR6BO_^; zfkzTJP$w;86zWZ-EOV!K6V|P;M%228sia-+j16W93{3Z5c!Y}6u`?@!{UVSJ&V1|T zhs?I1o!d5(p6QKKBr058N|TPr7lz4SX;np@{?5(g4a;Er}Ol zp)vQ;%04`s@R%<&u{M2QHU==wFffH*uz*5PBx}N8ETfRl7v9o8$iIO@AbC{ma9+q0 z91^$U*K_fvXik@~#NWKVD#n;mLLPtF3Vd&utj!=k(bK&lEb;_Ybw)&YNm6i=Z^^X# zrXE5$miUvAmqPhIe~A}#B!GzeUgnhHET&vq#pT7Pu4=FaJHbTtnhKkI@->FrFcfei zW?aFIAd}Q^*wz7>e*J*=5L{(1$PFCUQ-HvcrO{0bWp!&|Qk^9S^jC~0`8yeK!B_)1>0 zp$XE)W1xmeF`<|cKz*sS8OMD5*jU6@#t~uRkcxLB9f@Qa2S%)F(kX%BIKl#xFba&bF=Lhuklb{{2B?^-od zV1uPoWK3`Vf|p1N^CZS@T6PS|qaX=h8OA!RcW4Hc)Z1uoc; zCTkM$)I^apSCkkJvgbS+6i$>>*N^#8SrySJ5N@b~F{J#GKCX-Nj6BZni#6cE?Ky~B zMINM7=Bu&uYdg>z2Q1%(MuoqFp5hh;wsAO(3&P10GpDGcZSPO*Lxw4+(^n-AU`SK> zi~qnUkH|mc@`)r6XNR1IPk?_DWeV>nd62qrhuS&o(A_ybvyUB0Jp==5ZD&*i;)&&C=y~lUJ6U&YF z;@xg5CmF!FOFN*P?4UZ_d)T)A`@e4s45!)W8OU&Yi2P=oqs?Z3%Jh7q_=jhqU-(MW zLQnaZ=jc$TC8%RirNdh{T$5(h5mUOII@+tu(}q$%9xcK2=*7l$(gQO)4dZcr#8hVn zYx)!5_$2h9?uQS52@P4h$|gmPwUtXeuY(?@QD&skQ?J?8S1&$;HvKvqD7kYl9rET! zciOc-f2qCmqpR)3SFX1o-h0G`T0=X5&{BUnfDxQE%oHg)iFFJO^cgzHBBR=OhMhF3 zY+r=OYbb4`gM0<7l!bQM+p)>uCQ8DhBShsH9@X205R3PoxRxcYhhO__WsA~`R6fAN zf-@v9VPSsB8#9Lu=Rj68?E^9j={wuFgM;7!uIkOo-BQZsqX{?fNiO;rCYgznSJtT? zj3IvA;3oARG%`$%95BCN7#u}W`5YQTixp;+c%+EyHlbk?! zD`gK};Li>DKy2aLwz$vHA{N-1;CI3?fDPge;Gi{crg)_H4d{@cQ*T=Bz_kEn>mvqeFxfJP;Tk+|}c z1OOt_0#iV}FAAGx%E)_|%vzs-_{;mm@N0}}nhAcCUm4jD{(UxDSX$x;jk+)pz6dT; z;uu5{1N>~r0U@sPk(^<;cjCpLUHeqTi9WP}#4!bL{fVL*{LDX`lwiIpue_VeO&-B5 z>C94PAD9X~qFVyYp8z&}2L_v)qmrIcl})NV5tdNe*!C;PDF= zNWasrU46CPy~{#%-q{gaXVOq(!KsTieKFtwS@kO2!+R+of*hrat|Lc9I89O`&h=X{ ze2A;ZNu?OE)mRsACh1eAdPAHCFZ&hobEnc6LdGY6U;yB}fci&V+W~IIbDG9B(;go3 zabkAhK^y+lshO;Z#IIU4i994%Z%$a8h;9lKqn9-5lZbBg16Ey9AKTE+^>&u`sBuLC zApSYvV18z1k$hu)Sw``dl?}+0JrM$q^`{rf{4AG7bJ_^0!}_N2B3!(s>7?Uow2Z-{ z;ah10EnkJtNTxw;;q2_>lc>VL^3U2cA2=kqDkL?GqW}@6F_=LR$_~0@n6H$-YF@M| z!-8lW5i=KQP&`R?MG&6-9|7=V8)w?GLBz=!bEY(o1>urL@iJNl15iG~GCW9M>E*9q zzW1$Lyzi0z9G~a$l6~Rmf%X*hLN)HU>B!~!>;`J#g+p5FKkbp{3}WzW{aTU-jEHOe zJKd^`Y2}VdHR^~Dv5B5b<$~g8>M}_%7F~PDAPnWO4S;RZNdu=f?WYqS59UoI?t#v| z@69v#ac{jxx#2ymkJk}Zf%j?Km9zm{deW;pJ4dWiLgGZx`muZ=SnXD2Z#*uh4R zJJuu$i6hl;;hNqdb`Mo~9Tk}+igxc>D2&4H=sA?ti^M_UM8SzHQfX3-IE9UY7}vG* zPIY8Do1QUuTg)^&rX1?o2ofo%g+&R|;|H!PYhk4TwbUV2Xi*9`H6dZ)!3@G_6ijPs z43p=i87WN~CXtYaME;qSXYh?On=FjT#{=jw2A2z_FnWxGd`=qk89au8>B=>G2bqX* z-!LqeZa!mjr^HfrJ*7?+>@n1OJbDeodcmeL!<`SofImHi&}GI>uGv%rV>%KFLo90p zZ@&#p=qHZx?g8uM1&kMrG`G3}Z_B=93U7+!hB$fv#Q`s+)9|8nIP=3zSzL#xCo#q< zbt?^&mC|JOJVraad^!abgK)`uI@cxk2hIeBN@aKCGWCP>W6k2?qpM8sylr8D0X>dj zs9~5|roC5RY>St#witx;A+rl#!zjX#MR+gnGG$hylH(*&x%c0P)WU)HJ&%zy371Sq zb_#Ffu=z|A#*3`+J#1j0J0+6Mf!uvkw#a5RdXC|h4mvNXhm=v;W)mD60CDwTQyyF| zRO<)u7W}yWIm)Sb4Wkeb=j`yAw)3-}weA1;yLe$iiRc}jn=;8p?Q94cQ(kfXf7am3 zXVRNCosCRX+JhK@@SjPY7TKR=V<7mwdjy}@mQcRc0Q82?*|MG#Zy!6bdLCobTZos( zfd{8r51-)q2Z7$!S+cG||(kK45$yw-m3m%nU3y7@`F%8sNCCY@mBM5a6SoA254IBre(Yn3<2uRc!OA}bv{{*9jso%4 zaE)Ek$IEA)c6g+%Ul9i%`N0p-V=O8=x%bP zqwr}Mi+8@xr;OFa311j4wS5abK7M;mzus5c>CWGZNe$#3gdls%G(zE5gHXr?+6X@Q z!(ZAFt?V}rVG#08LWt7QBT73+56O;=+In=?@<#9 zPBB{0&~}|ZKs-nN>nbBnI3sCOsFX{kj7XWTfdHZ>0zMg;A8=PR2vr)~Ed*o^pE})+ zJ$0eozV%Lf>+Lt$Lx5fD#D}^tH}uK~))+37!7$+$LrxDyBAf!5$|-D$79iJ@=hgI;34AT9h|09A__x4OQ(R8&&A7f=7XlmS~y%7)|C1s)!UTfe?Lq4`a@(<0t12CwLaqNIl6{b!@jCpBUND;Vt zvvUEakZ}Fi*hFI4Y4NnbE{C)=ZAD3$1o?Iik?pVeN<-X^PP#)B@Xi+J zl=~8kPXG4NgYAoW$Ta@+)Ve0pX~ou`Bhe(YX!|q}t{y#kMlZ0m%G6KrvmP>CmpI$V z68hZWqn9rRr1)Aq;U+$HMH<_;Mxj%Y)lsCg^fkSP?sO5Y@KQJki;wL^Bh~?UpSg|9 zNt+=4D*V4fL9z*spor&m(cna6ieTl$6JWXAZIp$HD5Ove!?0KJB}$Ys6ygEi?Ai6H zJAzk(T}Y#NJBqBb>h6xLYjZ7J!yxF{B&Fw=gknghAUOq$wQp|dl69XM5l6XSLrHc0 zlicT;JJywHJP|pb3D-rHGDaRMJ!!Y#N(#TlKQavh$Y)VewPeF@Dp|y$tQDKmSfE^l zNC0U-SQL0t`v_wZWM!y4m;kB5?{Z-JCm+s6ARHs9!{~@X1vX4&!~$X}7M`b#Yn0_S zj~Xv1_79ov$zkIQjvSER=chi8cjpmZ^_~cNl~jJh2UhXB~b5DCJiG*oHlPzCU$|BA~3_eUJLTLmGIAb!Ni` zb;+*3UOl^hyF=;X+KZI+5o-&dYzsWBnf@wFrWp2m8(m-R(IU<-aWkg_3?hir44Si{ zO@9Uhl)7Df_({9_Lrrxn8g&{mB$OVmdGm6E6KR;9(RQ7-2ww|BITr&@XuKdydSsBwXVcm_ z+J=p9BHr_qM}81JP}Tr)&`{S{wGRMOn{(x-P}Gx5o3|b!>jDIB1ZF@BBIvj=i*m^J zMVKq-L+CO8dLiIa@Qk+|@p#bVP#YG4DScZxhXiH3O&F*uvGBf$vH_R?w&K4T&Kg9f-IAHrBK0D#`!nyWYwhNoSqQLp+EpPf0hjK(VZ~Tg+7a zVGI+)2k}V%Ep{1|=;8GdfY}sl2HxWW@j_sBgp)=fEQ_4@!EeOQ7t=F^-G3~QLC!D3 z$82*G18fQsgasVa89RUVOC}gIuuc}@=HMwq6Dw85<(=36}Wzp zuYkF1*ETNG$Nn+ym{mql$A^sONqu6%5{YAaGgP2uDkhIMv1yxn8)%Xkk37<-r#LoZ zFZ0`fCmxm={458rX_jH?(28)`+;=u?-xp0QjjnNHq=aM~MO|3N~tmb`zBsqH&#!eV(SCy3L{gkM$TtS?gKU2eF~1@6AF9A2t`j90}N)F2f5 z=|Z%G#2SfC8TDBM(h~Tupw@FHL_ISaXQC>cpiH<*`(Xr{%5X+)iEMnQGo)*j7YR_I zcIQYWTnRhkNFNP~UE&H)WPC=x!W#teY%vN?>dg2cwoTz(YpB9)`HU+sStVo_J~Pc^ zP}LMn!hs#*fOK{Uu35A!=4t-Y<`KXA^P$|p6rQm3Oiqd|!3i^>(+MrNyH2K(ge@+7 zxxSVX1%_(^6Aq#ZX8$LH&bm!UmeN(*C5z}gA!Ztia0?;R+b*ju6HZ*fr5qZBwk2t9 zN8qnzFpjjBF$7b!YM5_;2M#Jza;}|JvP?Md2oHV$vn}VMO^_t*M5EdcCPqJWa3Q>F zZO=0e>bKSpwdao=gwI)53O=qag{9d*hK`V5>qG-TiVq~TzH9J+JL*+qP2A{qL-Q&p z{WMJC{u8_=o@u0)yb$iCUU@-e<&hXm2d53WOK#HSWf_EeD~)Fy^H*+wdM^3jAt3qJ zFyR}=X~X8{fQ{b2gR}uX=+fQ{Wp#}|%dIYe1mRD)0sTh>%cwnup~!1M&e*MVb{>O5 zI3J=wGt%50!-I1OrA1GlO30{aXRRUA@%r;$WE$HOyrTrX&t@Mg9Ih>NO^mo;kSudN z0K1j4v#ESHFjX}k4U7eM!0bJ;L1joqnqP6XjqpWj;VIyRXQ)3bBs+kDbDcd%%V7$k zZKy_@i_auNrmv;aNJm5QHgb`+oKbYCEQ6w`xN~jVm}S)S=1~WFt(JJVoc6~^dFR3E zOobfg7*&rxgvl}fn0DE-GicTVZZZ9m^>7|IKWCTD{`eJ6nP7b!yKXiNMUl*w@u#nV zhtnB>=lUJpPmZ{w&@WvNgra9%4o<6kq=5?V$Z$QaG47ng>+~=Ubv&?(O$<7wl6D$| z*}<|5LU(2i9aI$cPOLwJ5ri?ngBR4p&<|gLw$K8+LuA(B>B&+UE$_bvZ@?4BzeFAk zB;l=FVh}Dq`Iz_Y&dHgUIWzD$-cHs@?)>K;Gi8FQ)4%mRyI#T*Y)0ek6Q>QQ{+!~A zA-LSah+e~ccIR5#`{j>h)LQfQBvSvdbguIZ(#6J&$Dw^NW(@fzx!{Q-g*;* zi}EI#xEOpy-pjIcFux`mz^jvpvb$@PzY|Oe%U$; zk4JV0k9_Uq>3_v5as%+nUjR{d2MalSlYn3W9n#lT1kxdEC}RhVti82glNo^L`Iz=c zfhla-ZS|AVP&n#x(gxV@*US&;XP)m0k>^e+=bikUK_FpL=MEC3Y&~U^_u!Mkx;1Z} zvvv}>8yQK=xrUSVAx}~)4Z_H75OaND7o!l*IdD8SNFBn#1dEY&M*YcS%1?JnB_j#P zr^+BujYq^LatALs9?jmh=gur)%6rezKYJdJfehG#P8o5yyd%==k83a*1E!YQt8VE46<#c+U(eq6lAAF_!sEZr(e*9EO z`Aql}PiCN;xiT7(*8t**u~WA^fPwLRCcXMbHZrMzJnP0xQhJJDE+vZk?zEl=wkb6OX2Z zg2FHH<;i$si04^5283~iAyAbL?tQ0`mokp{n^r9R$*2Z5-U}vE!no%)b;wWZztRxO zf2N8$g@HVD&AZM|tqQsb7w$($pa%v#rw&L<(a3xU+No%Pu|kPYkHA|&@jApP zRXR@u%h8i380|gSUVZt;?FPG@IVxobk#dr$N^$5T%<)q0=Q0d5LPz*d-jn|1nlPhH zpPCj&c!-|sHS7TP7=_!(=$Q$5MH+Wn-4tKJ5qAf4<(q?qYka1Bgx5d=6b4PxNjJEJ z@U(dHrWW{wM}U|0nUpMp9t!xxrLCEmkNjR&D`HVvEDXNia%jZmf;TMJ9sd)Kl^6a23kLBYCR(y^Rq5B z#JuR*!gJQEg8^IQD~^^yIy&X0QkTrAL8#(0umu7J7axzE5N|_Le)2GHc}@9mZkD6! zyW)hBNnp9lLy0YvxDF@?>>vReg+3mF$K08epD1>#G%5{2^OHBd)mQ`(mMuX5@?U{4 z2Tw4yiOpx+Orzm7z?wvnz>8=)28)_Ik*aXhUZPyM@daz)W_ZEck@Fai0>+qdGZztY zZ6QY0;PfX-pEKGx129KaIJF5l?xxq6vN$|sRGGitH8Cn6RH&^l2$O%>6Fi*)hX3Gk z^0Fh3(&aQ&6<-y1;=2Y;c_*)hS*$CRjxrd5lSYTZ;)Ma|1|+WMDi0RVaB|>k7`kx@ zYt@z*QNyF_$ZRMt8L|} zb2uS6M-i{(4CB|MOP0W&pS;4^jjuvm3^6>*yDxno!|*1`B(T2tCHRQEw(t_N8|c6; zn%Tr90}+(lBQu;Tn`0zUIvEWc@F;flZ-X1kK)-GVkLt12cx2k|fU(_Sz-OT0!N-)F z`ojx1JN+Cqfq&d>78omE`OUWb^3U3%-~AT!LB^ec_O7pzHt@7B+;lr@m=60nO}I4!2#+B&$!b<NL`A zoAl31*NJg#Kw~Osf0A{9C#f5E%C%jo2-$}4;yUn>fg(J=StkY_1L>T$nKho^;mS(*I;HGn+C zKnzJp3y(y1;+1`xyJR|mp$_IzB2Iry`?EjMc;k%{QQ07WMUKGK@#qQOi+48Pl!u#v zyyK+;K21IEXUvqUHFL;xBMaX;vW6(`y* zZNYZty_Xtc)HjHr%nm4N%m?!4S4egp;w5BxBJcT)onSdk&rkGeV|g!4ff+A2q&K}O zQ*M4I7~b)!-f?HD5xsqU%-%e#D``{uA!$H3cHB2vL+Fk9Shz5uiN;G-Hqm}U2$yFQ zaLH;a17;vHxy+24SfczEgK#69AUVb)U5rse(>T#YLN9?CZ!C?eiZBG{P5l}k0uwKd zA$V4P6ERev1(Ze#5EY)sn0_h`%0sMRmwGW4QT+&eD!&3rv@G|C-pDkt4YY{`Ug*Ih z1s}4b6ia-|>r2AN3Q$2!MVJ?FOm9U;$&?YnOGP^Q6YfG;4Q}PU`jW6iYb%bprKB5f zM&K$D`Hv@(U;By#kSGct`6;i(!E&2M*mY;V#v_1Fri>ELb#9a5p1P^%(4;O^Y1g@# zIP!dL;Ip)LOMmWscIqDItUq%KwSkkh4m^+43C<1}ST^g&!%1VXQlFN`&d>h+ArD(1 zm)$&pqXFbG7;Z#L7Z>>9Q_5p`9kj?)9`W@9y@#S|7Q00u?a4%nFdvwwoWSQipgCtgN1{S!bjSwy`7+!;Eb|}DrW}EbY z?wGoU5_{N;$Gi`sFdc-cgv~!~zjowJ^*}UfJ;|gwBS0%0TY+_qu>hX{v%7~9>-Od+ z@Ce}*%CQu{oH2FOGfX=S#h%0K`_s=@0^lKm!D)t)ud=uJ_$D$2FPDl4VL5DG<(0G= zkXiS}6u5ySDmvG(Ii~<4EmH(F)ItsGSV~z4`H4>&9=yV>{Fo`HymO>m&r$jw<5F;y zd+9G;MfMOaFifk1PNhrw*t)WLjdDR=HUokdJ0Ef=_*L2tN|~FWunA4)+P|KWaR7Io zVd$|AFy`I|KfpudI!u)C`){Ja$(_g>r`!_OyVEMuMF*#eI@NOnSQ^5IF!Um~$rrpj zJWRvKH?T>W9{Gs2^&xqjg!X4Ntbyf@oE%m@Fm1AX#M(IMoxun;19R$_^`*y5LwA9p z>X9L{!%skS@_qC^@Hubr)K@5jWdujJ#AL@(*HSLn<+Ildq1S>sVNL{7Jg?!@zzjlT^ zZm|CFXRY0QyLFd2OYaN+5Zo|u@R;RH#O(G8Pq6MU8^%yx<+S z3k*}>9D;8+Q!oaHoPhxs{)SfateStvRP@xBo6AXai8G98j|^$+^S1ib=h^t^qjvLm zzuUg|gV)=Cz4~E$huw$mPmVKCbPAcE$4vbPzf{Q{XplkDv_bR-+X-G#<%piUY?5Mo zf+jiJ&t}A*N8t469$xlMy}AhonSFr$Aizsza%+zZ$Ah~)2~?$yq)U!jAf4xc1~&bv z^&%0nQ!%V;x$Bq(Yb z$FeJfoZ^}FlX~#RK1+Qh4G!$N))cMIx^uw8 zBU^MFC^wX6gZxUln!`jGDURh z{dHaT;p!PAlb$3t4^zicBNW5)&h)n7O8fX*7$&70{=o;vOFa^9GuXc>Q6MBw-+Kce z8(&>gJk%4_=ff}GJm3;nE+g|J4^Nkg?BuJ{ubeDUfcPQ>g7Ep9QVGX*b*U5GoO!t9XDYl;;P&!^vFH%0KqTM zgvTHRDYyKU3A0lsF$=QFt#QFYVL<$(6dx;9Jc!_*?_5AUr@^n#DfnyL1=F{VvQFXT zv!8G8z4qhw*1K=v0og5~B;XXL8mR`Mn_^@ud|ydw^WZXS%0;%yKxf<7mK`yp`;5YF zxvUd)JHcB1)Q)I#MTrw09}RLZf24crfP00I<#F2F0m|sn08v~Ot;7pI$q2*=9r?2E z_)fdB5lWgF%1+MLaWtLF@k|Y}UFf9;#(Ium2F@Jg5zz=;5RN_zlV|x+BP<)Rn1^Ko zcyi~R^`)-RW7W}pi;)$DvAPGJQa0X61D0&H2R`#z;cJD?)NW&&dwJ{-4a5yeq+NK1 zyzMabBAZ#JTtJUGlAE6pO%9H6CLYc$C86;(PIsvw1(ENCsnHRt5+@#H_zp8NBP`@UW#a}7 z(`n_IR!f|$b*1qsM~|S?9U`t}=Z8*7IRHPv8ruuV#9jnPR9Xn@M!Hh(Jf%KF#+uGlDcg;L(W#`q zO#@ZJQWDZ-z*3mBdWDts8sZ=mQ!d`1xxlB6uv>n40fieSd%3`)_YlKy`x9X`|XGbM7s%Vk)Hu{gM%QV*bxVMCyn74$pdt7;eKv}wBkXw2a)>p2 z6hc`-W#UG*ZU zgxeRbvJntqm+t0y_f_&bj@R&4p*_ZdmBRt=Zp_kcV>Dq%4H~6vda}d=H(R?D=@pItweB1f{AGN*jWBeY$bbS6I9%Y!zDXZdi;VT%^7`7VHXP?IrdZBQd z<0bgz58Lj~{{k8;+RESk4R!#17LVvP=#0_o^jtQ}i7|#@)8idvP9pU}jc6R|F_UMM z&Ugox(%QO*Zmxe+Y4s=vPFbZ4#6NhJh5%%Gmc(l`s&jdM;QAjm{NJ@iMIJW z|B9)j*YMuKPkOyId}({(Hy9=SC&TzrrpYVFbJ;PxWqtB-2TI#O?Cd8o2t5~W?3b3% zWw^ssWZKs3X>ek@?|SF$;D-b;@ebF;GhtaSp5>Fbcbevm%K7AY_xH&vx*T>p|SXICt-Wv@X)CFR61nm@RyDl*+g2PUBK}6deTIVgT|`WTp?7 z2Iw5>338LD+An0PsI_dsc&Sp1y?#PcSK%|l$vl7bzrr)7|6bw~CmeK2GZ&_`^pXj< zkBCJM+Z`1ago9-F%|kRF;1y#`uYhdNpEzbjcuFrIn}skTK6fJy`K^MP>T#(|W*y}s z!w|+mF7Kz9rkx5H#CWk^FiXX=w2)W4G|=`f?-A|<%iru+#BVCZmT3sYk{)3^UYngVZUjaB*ie|XK^%=8bFwHr5QzqeuyCIGDxHbz2=!Pw z%C&ysLOaZ8=}MNgg$xj&gmJ*wb6}Z(1ig9Aj%9STFomOlb`~>?0e#5k znce(&nqa9=XvE4pJ9K2)?v_{F=gw`kY~U$`uW+2iZ=F8UE~ALvMv=)GgWzf0)a8h8 zrl>%aN5Hd=tQYZq0KFVwaC)*vp0tq{H5|QcyRs1zBgQf>) z2W}g$z94Qsi?=k+(AKoRHi@5N$2I2t}0(COuE8~T4LRrh*RA+~gAM4c#=Y`q= z3S>NejQ+;Ur$I-!$1wDlzuM+c;CaD&xOW?)f$3~Bw%_lLpJrVXQyMvEPbH3hdW(6S zUh44`o)@R#K;A0#9zU?hW(rPua@+jOQ&VbcMCz$RDx^(YXla-N+vcFHFq8%Uqv#B3 z5>CB~W?t!{P?DzT0l&cyH5J-YDie7_vJjPbbrvFRA~Kcs!NKC$h-HDH$EGt_SWK71 zDBHrDgPiCV7{PeqvXkJ!^Sr|V(+EVNa&MO?NDNpkH}QO_n4z?1%X_?LnF?tBX@e+2 z5AHGT@Hyyrr|tgqr>xs#`XGmpd;Vj)e;ct5P4M6@J*q;l5%uA;QO^r(9)ONq@7D2% zu~Y28^wJq+73VT`hV@-n<|ntU^*5{jO`f^mkj%?_jesV`!L zei82%-cY7?57%D7OZd|^y!CGDF0BLW?*JDgiL(Rkww4%h-41lt6YG>(>XueW<=`DW zz@|2yz2`gn!wsg*LPrHu&l=wDEQaBI`0FkT zIY;NLTzsNnxx=WQ9#Oh?J#wKx0$rI7O9j!c!4rB#+1FF72S}qCoR{pnI^+150T0da z!7H@WGt}GHvPsa^>#w!z-}>YB$KQPw!|>yF2idWPfIE)CvWlW_u_xmzG7MQ_Gwt9P z1oS1D%1`}+kNQIG6iPp-yoWz> z427MG#-E!ML35{!>v3N=JHidYK)8A%U;^KEr>u*80Nm&z=4&(cvd%%sL5!@sC3Ob- z=yMmyMH#m{?0}7f95iPJ(Dv}4?=drC7o&I2df-KB!o1*(*c$MiI)c2h3J+L9ml5WHZ^$z=e?{f|zc_bmMm0zkL%wI_PV8TkwQ(Yn^P`)LQz>OqZ1k=RwtuN}T z*xU=uAO3=_=>v%nGxti^l-d$=Kc?Fsy)lje^3F8lha0C0RD9ydkzS@Zfdx(>dA71Z z-uwmNE3vEBMO+^=KHV_Gcq($%pO;F7w{go;$)STU#EqXQ2tMZ`#O#UW$dDB-TZm`! zGn{l**8X##fFA*-^HD79r>*2Fk~wjKyirsPRU!imc=RLS0f3R)%&$B$)tw2;QVXT- zedaQq4L$G8k1+FqE5lIaA4X42@=iTPAxT5oKWN?rgiBO+da_>Z3_NbaLth)R4FJ5|~J$&S1{-A--b_^YatV{0GD1~VRvT*dx*HeQE9}=c*jriM)^4X>%H@{T4lv`*X!dga~I8!b@dlW_^Nh89zD=4b=S=)5*jO*_6 zo@JDujBDNcY`s`_;yCevxHvt~Me5?}!S}bo5n0xbQ}G(28wk8@(jONN@lgfZHiXg; zbggA*LzuAqwywjAJV{T(o%R+1Bmfw4s*?~EA?+?=dOyWkK21k1!O36lFNL^Z3qnMs ziLe9GSkNy57=E);^0J=Na1xXB34|6@TF(H)5;w8a%{q)EH;bVA11PkhgY#Fz$>}CV zPx1-?^R*2?4?eE_%^62zX{Wft?>6+)JN6`m_#C4TUtK@gp5%b!J>-F##~4o|%I@6@ zFsa`y+5=r02H=1}1%2U<2juUpz9UrhVZt;By|&1=N(s*q=K4Gh;CmyFWfxt-r*YVyglouQN~&Jkk;A0PiSL@RA?OQw$I?mTs#DQAFGcM+HH| zlq10Re6yYnV%j<$Een`);;3ut)br)$m%hvtQ;Zg-0xsAjWabw8Cs4-8x5G$TupTXn zA$c(ThLXU?%}1ERC-R+zhhLYw7&LB9LkI7)=S(ZMF}nT>1!Z5(Q`ay*(4+vb?{5} z9(t?oz4Mc{c2vYiWDRy%`aT!k_hAo_)>3VKLgAusAhtYTnV_2_>qiA~L*|oQKO_%k_nS&jkUI>O! zOL=HBeRiRxZe&~xd)t8?SEu`huRJD&X}IyEE*UhzQ`ot4tHnHXv8_CDInz}){`~vx z#_xQmee0$7+P80Sw1>buNj5JhX z^j1tBl^D`fyCJ@$efcC%>>>re_VgEZo$oTAL8R?jny z#mzdr9RGlK+a4d|tcSKUy?OLG3p;GCbf2=8eKP$|^m%YnKb3=49K5$}LsaFEy4xxr z`OAJFGxnqla?rM$z8QXscFUkbrUjdy`2#CcL6u8dY2@cxXB#84zX|1GpV86$&=C;e4Gi;*q|m;nHeAnjj8JxSZs{bxj7Du(Ydi0 zx|_1r5o2-%XZQeEnKc8hZdzuU7I@Gb?O^$6he6iu_5gm_V`?eQ3EI+ELZ20RM&1}< zDOY!C3+0UurKv;81YLJn<7^*j4O;H36%{9tn-cs@-E&?O!Kxbzrn%uj!zg-#+(|Ed|H_CYh}wdBTzzYBVoJ| zB?=m_z6#Szq!Hhw3vv~?FtWiUF0c8mLYdVViM$N=3d4>F`y98c;eo(!^7ajIEC|nf zUMBu{49FO~G;b26(5F#p;3Lf)_ zz#wgn0uV4>8g9av6gz`~5ZI(nEX(OU&t96? zF^ZZrC#{XtjbsedUsM0GI{!S&dQE8ZXt?|+_Y3SsfLBeEjKOW#IjpScI>O?|x);*Y)aO4+tDxMQW za%gKU$`fvpeF(v^O1Uhb(+hYN!RmYQQHV;t2y4o0|GmSs6i2T-)H*wYp)e6*bd%b^!ch2oeAdGzznAIpvt0LLoirR7AqY<$LY5SV8v)?dOVu6ltTd6MZXBtP z^do(?*VkYZe~v&{aCm#W{xb}m_aPeipw#rpR~2%VZ+GczY;2OLU>r7&P)?b8%D2a~ zMlJOjhrMfTX9SA%gv(7lXm_vTQTr?~;4gN7UNR-EU(-l}611tT(>koTK%*C>YW+NL zq3Z@4gE`fdX{tG=&N36G!0wMzXBcvs*2SoO^N{)|ilk#_)vUui{4{k6T+nj-%YIt+)B-{vK-v z-(Zm7DpMiP;kwlJ%_O`QNo=%->GD+Wg|z+s>PR)waL)2c&^swg>oH*=o1!G-}trM!3orzH?f! z45N`iUg2@ugKjfCeai>rd7i1&XED|pglrxv54|(ktXGh@{TcGNPFP3gJ9&SAUl#BD zf_kG&V)>_)II5vGYzd{_;7g0U@o&Ttg7bOj`Ax5zhPh3+__sW?PBSy4Dm(U zbZmws|1WO518u>D{5?Z)<>D1KnY!F|-hI1$^!wjwKmPM~+aJF9LHor6ru5M|Gz^a+ zb3L|38KMH7I!8X(ujJf6!o)%2#g=29IZ}vCpW@9zLAPyd_@_UBz%yjIjnCO4nNdOq znK>fT1i0!SwpH7%G>_43TjyQY%~B`IsHMEapPTr&hSv5Y0`?`!Mrj_ekMhcA2A%Zu zhGf9?(vu$}Ml$lJcq?Oy8@#LziW)ULg(@tSn&cgCKl)f`42>WV?Fb&A-!OjZz-m79 zamp78dPDzUXj;q3N7=57r$Lj8MlB^E zFX>`$xsM0 zyiB~jmod1pg>Y#ldljCtROKtN%*)4#IEiSOpGuyfJP?-YjN)kq{^lw|r$O?ZU;s~a zQJJggDQPNB&BX zH(q{`!{|SPuA~RY;37VLfSGb}pZsk=z|II;WyBjAp6`n^p7CqR+GgT%Pdw`j(4>Zg zfb-T79BwoJ2mzE)b>0cxGAbCt1F0WmBBN@X1a6~fxF*tf;_k?vU^5cNv!S5KH<@$e zeL5-Y+j;}OdEKXOwjmN@_5n1Nd7{lG1(1(5EDo3vmu(^&;{aQp5t;^Kb}V&31i_q~ zZKKH;7~rh8YzM15dg>57D{L4x3D-C0&&2y+C& zkJFGH1;otC_S0b+=a0&aWGesr=O9y3!OJS>=3(79y+`Fv@8Ps7r{#D3hVllLr9Fq| z>UlOkIgj$K(c$eKp6RV1uijV3o6k|(5?`AO%Azr#0U`NIq1V_kx! z_2arb%bc}`;AnbrRKOFHHEiwnfaNC?Q8#*XO##`&)P{g~7)> z7pX5|k$y7jC<=TJ9P3bC;NIsN5QG=VL;0m#6JPV4+M$?f6q>Ia>l|k^oquFVDlT~x zzQBYQI&O1WF?<{~mc3Rumu*f1@Q8|~0C>0DVkGz+M%+m@o1vqRVFr#-%+^n{d*k2d z{nH$3juFB1#_aydn!_1}h3V7U8G#-c1@7DoMvt0@z-P3X=|wg$3qrj`kw&o?JTH&7 zXc=>)0CBQYGO{4vnM{|HezrRl7V}Xl;&mf;-Fi|gEgH|UYl5P+C<79jbl$go9XYplWZ z{78+cy?0+~!}}QWjP}jH#yY}FUvGQw{1k(bJRXuiWj4JddL6S+=Fj~$^@C^Om*0km zpz-l1nIgePGUvXG5pbeyzxeI8^TR)FGu8mlo_-oHBGWx7s|JqTo*syehlbm4zWR(H+(&#wd#i zdB%V`$Uw%)OBiOy+V*$;W7~b@MQA}e*2o{@1@cf|d=5i9ansO{9<*VLs&S;Dra|vu zs&YmHlx-F9lpbL^_0!=mryO@oi4B5y7hOZzAHzeA=hP{_M6$ubugJjb7}4*%L%mbM zr&PEJw_dZ>6fZCJmQ9X!;4gX54U6Ih1rLRhQ%A|jzQ=x-3WJZ8#gsuFp-p*4>^B^Z{BYA-{v6u-~V3w(-*F`7eCx+Z)?m^yfaK!K0&!F7lHt- z5Yg;VKd|LU8}*9nujNtbCGDk;3B+qO4iQ4>KkQt~)6W2ghLn9m2xggpN!l7jvuu>m z(J|gf2h|8ukkP(!k=EHHO5a_K_n8Kl7wsjUMdI7Ol`~F-HJ-*q2km<3=J6J_4vr+o zOJ`DEvhp4gij0k}AuP&3;cPtlaktD2e9!Qp|uXPG`;J~YtOXtPFMoJy}s|OIA9WX-dE$cnl#Wp@gE`g-K0ON&aspxi{PnSjR+oSbbnVX{C5t7R|1!+t_rRA;fauq7cbHB_c$(6{6s*FjoS@!U^dzv z>j2o^-L-^Hhdg|SX+ew(y~6II4``%%-<&onzA~;DTR+k^7iDt(zaEUqu=9c7CwWnt{Y_h4FkD$Xq7Hr!j{kE zP4iQ3I9=Lppa&|!_jV@IHFV&26PzQo$t%VqxX+>y2#L&zV|4DSQv4mSs`~&VPL;`T zWmQ6x7AOHw_)KZ5Gohn^ihFD>lF?2(M@FhmprKbBL1J*Tt=L(puw+!1k;?^2pi^9( z-eHE8*U?hTNmtjt$kfnZ#TdNEK!!S4rb1HjPOWsuQ2+Gs>H)NX+zO^T4esQeJWFR0 zNHjx;12UE~9S89y*-Vt+p{^m%@IU5Dy%OK981#T!orHRk`Aq8qU7zU4y5Z|gb{e^3KxUFa%dI2sMP3OeGx&A1_eTL#1cIjy-D%;Z*3_UwW>s zeCgLwppUiTBb4|5!_=KW*_IrKeLsD>-eGElQRZ;ZTI^ zzsUcB{foj5|KeY)aM+e;ha^f0i4;W=B)DSVf!Sv;`@X%UyRW~WtiA)B_io>N&Z)}E z%F4>htjwxNle)``bK{lo6>3%3;4OKUGJYsxykkQD98)lKpbX8fqBU4!e~V{BB_+Fx*fI2Ee+<{RT7RN3>Z&qb~jtver%jM0v9p11Sp<~)@tjCQJ|pzYtwSgp+6 zZ4cLtJIp>~=Jcs=Y-c}vX4^lPg8k_aZ&z{Yrl@}8~jh8Fq)C~Q}=l;>Q z-ShBv_U(TaZ8D7S&Pyoz;_gqhe(h70aece`$NzHMUU_*t{%CZ0=yMrj8FO~aY)gFY zJhjqU{-kV`Q`7W<#CoNdCVU{}ryh*^oxqY4l;l&$_kN z#H!!!j*kWV!R`8wzP{b~qyJD@(IbOU$F*^f9(L4vBK)ti;frj!O9q zUwt4!Qo8umWJ+s4cfxcVn{BiNRbh8?Ov6o$OC|#98?*V&gqg_S81>Ri9ZiyV^w#>r zof)%DA{;Yl`;IvMFRbp`>#HoA&9r8Wyc`B-uu;t=c`yXY)tAvVh5qc#=i-SbB=C;# z!x<~%*>~g5HoH0bc$)y-b$hh$*nsc?hA|Pqz7u_5RLvb*R0~ z!KT=R%E*(-FhmCOoAUXj!3k4aSV)J zD`3`=^;koifSCON(tnH-42-D@!CBd17r9H5@II~|RiV}Az0>Ebw+SYryL9_x@))t@ zQ=HEbGT7vADN4imN$;rtqp|dh2T1L%%Aykpb)QgDJnT*X@v`^MWURqvylH?MU4Xng zuY5Yj7!&1ErKv~X+IAnUZA3#4pwsPmrqMXEEy_>wOzYId?4Da}Fe->@k zS>1cqU|pFea(GjhE-`h+yL2WK9Y}e5vKummo36E({l+uN-kn3~$ve77xDO9bJ61$_ zX8m}{(RrdolneJZ=NXT^wySK@wPZQ`8Qi<*G@C3nChU_LBh%F*Oo*XV(8%g>3aEd-IZWVZ6Sfhwf2&ubjE*|zoQRa{2m=|-c_IIU3Gd7 z-jKgLPu2%%$Numx`LP)8@TH`6y>Ad=tRXTG6>?$kT_o$P9PelI8}r8el;-QwmqZh5 z9}Nu+g<|kAEC#RMsO);%bH8+g@|JPUc>c1i87K!%FbD3SF?AUz5t$M{J$}*!4NsML z&8olzvXwIcy6^WSU0>_{JXvz+K-d8zuL{Aj{G-&$*9TD-PHJ!g?BdsyaZw*>R*0Q^ zVbeW91eRQpBeKJL;WlyHrHc>dImKw6MPOk8t4uIq6<)!B<8gpSnd&)3l47VG(RGw9 z=>~D-lm+4Xk2j{yr5lLy%`cEI48msW7&vEj(6vF#Dr2?lVDL*?2!mu0RsnR7XXvpC ztuMD*UHzJnK4}oR+@=r0O&Eo@+O(qt#SCkugiNg8DKX#w2=yWUs zvan$7)&H^#EeGtR(6(xbD;Jz@<{l1Z?b8mE5%A4Ecb4(ykYd2_@_9 zchC!xrL{)sWo&{{1bsg9Zu1wZe12NU=hG=qt#Nbsc*fRo=gFbVdB(|(;gv_{^pz(P zGS$7q!;kWu?K+%%$8-2b>ki+3b~Yg4K|Eq8e&7=c*4I*oqLT=RjKTA_%bPskJJ0dG z6u`!gRJrT;a#XXNqXsNZ>=kMi_Y_k~zI)CrE zcrV&y2Vr>GBCQvGgP(6yiuajdHP=xv<`OEn%muN!lG*{%C~2Q;LY&~45N5<*D)?Oftg)M z-)bFU3iz%~fzDo9hTBo=M~^@Ba4=G;b#i=N9ryJehQ;FBjD*^HJaEE(hret0vgDl%-o6cs#?xEK^6sOLY$p$Xei=G>y!UUPZErvK=JvC1 z{BZlpw;tWT_tR&$A9gg&JJIsiCW>ycu8Ux*kC4G8RmtxO{~Lit>F*8HQ>fn8gBWlw z>oL<`^dS@9Mzz`GX}q4~SADVmsC^hD$g3aYX)<{>yP?>ZX3`obM@D6I;r0FOnH@6vE<9FAFPe(yQ0AA9ZN^^ULE3-gT8|Az!;}RxEO=i zBo_iC|CL{g8E@vd^5`mk_gUj09F0r;!Gi&}6MoQ&-bgF3qj2){Sco{Lj;<%|1U(2x zP8bMH9bKq0Mt&A9dfvqND82CoWemxq3H~f${Ionq+B`3*@%?88jW; zF}#J}%0Ec=SE&8)UA%!l_4@Hfs?YF7G#R-~&kDbjypen1r^&Ynu#CjK-=$8rHE!5} zx3J?A<3Z2BQSIx=Hpf`(^T;=%j@-gemO-JL4UA@ktn%T6(HASzQ6o0o<26KLI4+$h zy7{dg>XYM%_P#{1(yCLx8H7`Wz7IgKmp&LB=sVgOzd-T=e%a@eJcCeR&uS=jj2_eY zo+(LTlVGx}Kj9S6jE!2Y2!+DfqE)X%)qs1f`qs&pZg{xhZ){c>BEl zWg}hy0;d;dKW3LF!oK`xI%|kCfCx&vit^Mr1MgDnS}r*|tO4kx(9xSdaOd{S6W`yS zd-mz=#syA`KGV&AMF=NC_u&fes#vNwv&P1ZmHj+YOiK8(g#_@_nP*h?#D{ zV*CIhG;}6Ldx}Pht9db@@E2)>i`rdrW}hZknfgzup85`*_w9J+x7j^|>UiKr$-~Dh{LmUi zbWGLWZiiD$0w2P2l-l4PF8y*X{$Ee<=?GZ(clixRwDg1^Rqw&5egg8)0o_VF|N6GY zwr%1mB}))ugv2a{EyL77zl+98(M~{Dq0@L*Uz)4$@x(;@PHAx?}c}xlP z(ZQhPK_73c`y^sC#l_y^&;DM3l z7`HXYq%*-nmQI@R&rGT<79NLc@)FvBhF*T457{vrCWi3Mc{ChPq2?w{uE$XR@owJS zdZt~4So<*qQLtGcyMQwA@}Af{K%X1f4?MD6{^Ea|@}H;hwG5m&hM^V=){gP$%)X8d zUGcm6Cb0~?98gI4M&~dfO1&yVOShJ3>wCzta{ZD!_7I?WQ1U--7Oyadp=KR$Z z?w23$`^U>8cegX}^7!!x>cEBmoxkw2jGl~+JZRf(cct(YMwM5U@H~C%$qbgfSnarX zeBWoHZ=sPkAF-ZN{R_7}%V05GbRLWeQEVO7?7ms`9Zg{1+{u?=IMqw})(!WqvzsmA z@5s<&j5a3la5_q3!WG|rI^{X~95L|AkXLO&F!L(f)$+!V{$xArcmf8}?u%dEE)~@TnbI&w1AFo2P&Cm)q%2 zf4rSEi?_cmdB#gf?!}k*!35SQ#?!F^*<#~4PGK0L_T?QiCZu>;e>lcDFL_2`BA||y zx0Fe7a$9inAZOTb6ynYTK5I=S`FQ-{hpJa;UdSU`n;t*#8H!)!>l^WTO=II9U!B~(*6nc1E z=;-t*b21-_PtqYypL%6`89wj*gbXGN{R_ZCuEKPCleKo=g~vn_NJs8y=MwN}(pkuDhS)@jk&Wa4xs#w5 z>c7Gc0~1c*7&%DYNtePvP7pCOajy>sZ|V!l%G95SSKt!t8HeGgVS8tM4~=@YSN zk9gB&*Z9JU!H=@DVc;R0^JsVg{!{zu8`f_3WN_mdY|sr({9V0VDoC z`_@UH@NVLX#)*@nNKE1ny`tSN$Hp=F-XzMN0Cqr$zmeF)M-;BSc)Urm*zSi@Vw}g|&A8FT& zM(NyiRa94m0r-Mw-hhFrDI1H4_4`#G7%NvqTVTone(wXQ-u{6yLe;N}_meM}^IejK zKN^;{^n*){v@Qwym-m}`PSALho*>99j@TDc3eBh`fskY|| z@(s^17%$qun^hmb781t>g$g^c{TvTrU+dV1p5Z)EX?A;*?gr(#2GHiIOYeJF z&?EFJOb#@v<~n}0l=gd!)?S#vxtegbd*m(Q5C$24<(Yidt-M!b6g0lv^B#{O zF*3Ki2`yHLK?H7UD{+@CmTB>ct2rl;k%{S?QI|iU6q9Tgn@RP zt8~&6+Ls#jJ{R-+?gwruO!RWQg0|~uNFl-MQ<0$Zt;uW1owhRhGseh3fvq~K3z^d_ zWW03~ns#Z=Yr#YszoiD(nnlJrwWA)lU8%2|{a(=-@mbHv1R2POm2=^OX5P(ffBNOi zCOPo1zH!1y!{bT`M<$fQJDy{;SI)HzF?|qaR+A5~?(j)COdZIS?uLhIr;@CeFOjRt za26dlwxO8KeK?G~f8~->%u`s`k0vlimqs-!{peq?H8A|P9H^!ZiKcQpV zWNKP|{Xc`mZk91#N^LR{MQn1Am(Yx~o$8#uM(vpv)0hLnw)pr;N-3c5}ft)_xg<_kfo?( z^zGj%wA3N@l&Xv|>v;Dz5vd<6gOvv=-e@hG-8XC2KJ7I4YMx9o<+jSUV`m<;*?gon zJ8u_N2IFz(Nh)x{{o3s2sI_*CpwlP*tj$Os&6C*HT-E91Q-3$I#lx>ZIm)5-J$tnc zX`QMJj zXQajtum2+DE?ioh%3$V!h3CnAUyIis$_V_$3@W446+XGoi+XbJmuiD}>fL92r@)#gyI-YCn1Kx7z{r;f$fXw$tza@pk%G{~@nrp{x&N2xEx( z8&}{joxFUMb+n#|3!4hnI>R2(mT@rIunWGR6t@m>LaBRnd|Vr*wDSn-dqZztDM&YXcj{ly4+UXG!k&d5zl{HU^0{8Gy;F@uW8rtjWq`b7SAE zLnXuEhQA95o{-x@nDPC18}m4x7cP6==0VQUJO0Gy!=pY_`0lPF0*)W}ctu~?u0Q_# z_QJpZi|vp8^LMu2d*X%d7acZ!XNMQw-sGLGN-jp0C>_13$4QF9Zq_v_$~YSy`VCql zQeTXlnMm!1mx|}fU_BFu38r=ALka6=qimb3Dr?}ndJb0qhvxdj^br!=Ye@CU$WXR~ zGkI){roNRN;jx9W8NGSeEBEkJ4;Au!WK4C_rnA9}dQ?ZLX3VpOuYbhLvBBP((u{6B zw~bbCsV!#hBbfSo{4`2`ITSskLO%=(^ov?6F7bvhZ8jmO$qVOl3OzkFky1H3<3chbNJ{EIxP7IgnMgTy#06uo^l?cq zO2f#ko$!OcM_%$8+CPIXaol@nTf&nZCEH{ZZFj9ThqJS4Wij5-OJv=mec-{>w$b)_ zV+ozj7(5fzJ?CL|E$0G0*1rM{_mPkDc4)J7D>ySQSDI<-Axe*f>#09SU%h1Rxc>$@ z4|*PYE5S-5>BTbxveeB85a>O(n0;oE`%P~6xCXg?!y6I$k5>o&;jbIW5@6ohWQ2!I zdi|qE3y*%t?*fl9FgR8@X{HmupV$K_%QKbtYdwIkt15IYh#J>DWqf$6=NOriCfnfN zpGiG9E$U2r3^D^Oe9;UI7hEuck9$7>IJ05uQn@GA8HDS;`0mRoR5vwCf4NS~-F_)g%ZtrA zKK<0sKB)5a@Z)le0m9_Y^|Erfc))n+Wy7U3d|VG`%t zb#&79+jDK-&)How*`5%wwyVjG(kcI%&MkkudS^do_sD5`b*#h1%e}5m;^k;FvbULS zhSczgX9oL(kZ_GN%1mpKDBcDviWQ#3OLmL}%drJihIbRt!a{h0(R&p%)v7tAO_(3( zh8HTw45E!X)Xh0?HVt_Q~Zodp~ubl6y4m zSI*4=OQ363eU-s{jB%07*naRP`^? zl>*N0Z%aA&^)`_C-49&Z?n}vdtNIFwrH;GM4bRMx8k4Isy2mS1rf1r%O2kFOYh=P0 zjHS>|2L>$k_h3TNGkvTkn1E7DGZ!CP?HXR}Lc`Mq0o>8~GMiom<6D-i0*GWG^aw>4EbdEc9U^H>U5 z75?lW`3A-<4ZxN$nQYYF;Ah*d^AK~_Et8!#szH*yzL=6TeTdhZL5U}7<)I!T4M#~_S>T~6 z<*{_u$DqJ$tTKe4R7G)}5F^AllOB=#^mK4alL>6zQux+K_HDiHEWZ6aZOZb(6Wu@G z(Rw%a`{zA-BYHiY5t6~CFQ4Y6X&un+LtiX^p?$AE7MY9mD5P_{)()Z0=%`SbrcBeH0fzx}K2=tD)beEKVO<`0za zrC_zWP0)BM+txL{dN#OiF!QN@ShJwhyCGx(1`5+AhI_nZM~)0sThc-Eov?|tJt+jsuY zKiK}?Z$Gj9=a=6expsTwz#Y}o#M&;Gx(S|HM;P6hQz!8)`oW9trAzASmy#i~l)%JB z`itq#txZH`lN4*jFhT8hoc^+lXU^*9$M~0?FiJg`wM}x4NA>-%XU1^^?Co<8BiGp37=cds-fHb?`VJY=CF^2!)?@GcI|mC!^oeV7h68&%bgkWt1f6M2_2$c_`} zN7m2|o*87lTl-cdFQ)3zutqk18$*wk3nR4PAq8>Tq%_q-IO;hsph;gcKe;wCRUU2D zaVTW}d3YVY`TFdvia+=I0$az~vL;W$lL2|uq~dwA21gSntSmebT-;GR?$SVo{?CL+ zZK*wHZK3ei-k-iYJx@pRtDo0|l+ z29q&4p)%5{cQi2}iSF-J7n8;PZw{<7!=G-TR0es~9v+zXFGr8(ny-sL@R+)(7hd+j z72o5ZJcKj#Z~@j}76}YmCD6Dei)WFjf2zB#2^k#_OYZ4UQY==Gex+3S7(Eyuq!l{7 zyDw!dJP%MQD+@kmn$&%J#EMnyUWNXj0Zv8o7~&)}>uS zNLkTxQd}sI!59`J6Q-W4PLwf|NK=GAebmGAgLi@m}yGH6WBjlwYoZ!+%2GNDr>RhNnbemAz^51C2YmBn;YZm0itIEJD+J``VuRJ!M zxxJ2Yf|e3$s=j6tC2E-vz?+9Y2Lp?}doX;Y9J5Tusr2V*|5TUZI}-_EmY}M>eHbTn z%tU4KsRPGrU%Q}<($af_)W`?FgTWi8F7Hz{ZVjeJ76dx*O6$G3O! zP5GCCym)Xbct~(aibuP&I^nrs63RR?>-qFaf?J;Ih94(axR4X;ckhPaC91=kh&Y5u zs(;uIzvz>^dd_p$RBr96`( z&w6PMwmr8tYeVcH1S>ktF017kIp5=(;yLFX9$)F9L4PI);wXwm z8phE*88n4R9tj0t6rt_IU+M7izng+t=wA%FfAi&ZSz(_kpreokFR$7Drt;}D)(G0% zr1RB~VHA4G1q09KAPg>pcw94KP?$c%_l3~Sp^LqluxLgWY6usi0PuF`qiCcLGYHYr zq*4DyxwA&GaHAQ3!e3OyqG-I;uhkk-gOe=IsGTyv>6*WoK)z9IqCxk(d1tR@;Jo%k z%JyGvH#)B3sEtvMKm5tOKOYGMBj%a#f1^;!-z=2$D}`EqKX~z4yN#Z|-6kMlGG?ON z#)D=;1r8d`q*k&b2~nCR7Yj?>3m5JE&IT+W{AfgJjr!|9U3f<8eW8QfJKBPWB2R#R zmNGY+*c@j}W}uGumUQYU2Zz3Eo9o~I{S3lqGhQ<$?yfyLTX1I#va2f34rSSyh#3;Q z`#zRO^nnbDLR_okxwe13PaBxv9b?q-#~#ir_?hkOyKP$YO6fj!_jc)%zZu!AyUf$t zS$ju9jOC9O`wpc){@|y}^SPcx+eWl~=Wso0b{G7k?WH9xK zcs)aVS3fD_Cw{3ud340D@Cu*TZpZCXdoHXvBXO&Loexc}kDiIokMyr5UuHL4jLNv> zMXfF~#we%I)6JQNc^=Q6cr;v#Eb4fSeMe!~JuPn-&5ZkISdRvg;w{Mc|^~Zm$hqWZ^hxobnd7LE5=7 zB3cYK;coL8y4Lj!*Qp!=Y~y}h5}64hx(`=VSs7~H}6U_ zoqN(Ika~Vl$Og~=TW~-I7G70x@MR#)lNxbC8oQfx{XyqL15q5+MnfO!0iQ+7Nj$LC zi^pPJ(Khg-U>zO--lfz_F#|7<`3MRau`KPnv`ud!w}&KlsUyw)YD8xvSX{8B>7{WNPggyRpt(`d?O;J0cU(e_bxM8Z*Z}rjtbprTnN&S-qF4w#`q(b(Uc;0!25F6?WGjHeVc?hyn89bajIGU!pDw3mKUV6=Vmw2 zLzGDVqIvY{IO0N)g##%{x{bd2hg;^Zpze zz&KKJvTakdYz8 zF(c*t%@^}R^(o9t=R5jfW7NaHQ5fx$+v#_HUL7m$H-0Ol3d{dQQoj~MiXUPeJ|x56K)xgoOQP0*=tYK^cl_8 zz~YH^c0Io1Q+X*rlQCB4=#T$$yZSHwc^uE@gJ)ZE|cW`{5P2oiEAA zn#0y-_NTb40-Q z6P~HAH!=jT1!D}v`sVf8a_AiX^p~hrUEoVU>|NhH%TdhZuK1gr4adcJ^Du+Z!Sp5W z%_s)DlvLIw!(bG+m<1ysF6N(SeS>QDAMofiS5F6q@7ipTnS35}q0Mxlxmz&hS3E>r z)vdCFGk5EcH}XlttXViv7Btw(N11@scphZaE4monW8k_~7wJo@48)omTv!x-D`(ZU z^i^ElHDZZ-Q(cE6*7GqOr}%RAl5tcKbuNF`HL$$w^5xZdk=z?d%CA!oqxakWfffU$ zJn`1x%%x5?NUt5${ZO|NGG&lfsG<8*jA@U_4gvL3cR#Dg%*KPY(7Sk7-NFFRf^c&@i10u2nrL>xDSfL~54zCpK)-p^{TMMwAjdQiy7$|&63zMo16a4(nb4c{ z0=2{Rqh`Sfn_UXYoY7R>=6SeU79`*4bgt^G{SxAM6<#AOgTvE3tP8S2q0dIl_U;Jm>AdVdVu78r7JacN**Ysz= z7;F<_+l}(4AAvKU#oJ_zJo8>AWzXIGMC8FuUf!l@#|nqrHT>3dJbLpO21}-b0#9^@ ztKZ7N!}Ggu`Sf*dh!2&oxdsFE@hn7_fxO^csSN3toGk;K`ogEu&$`II!I&#}>N4f_ zaKc#YkJbp9Wj6TfF4|#c^_3Yx&D^Rdc?2hN`BIkYjvHL8DdTV<8Zk3;K3JHa9X746 z3h5)^koP~b-Slg}6Yn&5T0bR2WzDwxc7)VQ3_^z_J2#EzB!h93WFcbl=&S{acgCyJ zB+4klW`dJ_j36PAjr1uL85|A%6UH^IJ4n}F7cl+C!GIm|d8%g0Dc^$oHBL&{Ojt|(s<`{>+Z9U#!x1R0k=$q2t znSC~0u~uw<%fl%yZ%2X;g?aQfL!aV*wDTPY*>$vVR5IzPHGmA@J>$oQJ?ftc6axu3n6_Z{<>v*_h0`n+x|O$wr!udZD>5rt3UJ!>hO*~Rr!5`M<*FsJbcm{ z1W|r{!i2_AyR6Rg6FZMKR-4q=IV^s7J{j`rbA^&V)g(a^1NVNuv7k*d3L9Nsq!e=P zoA+iPFZH9m-D}_E?QuBAL?IL};)@jO?P~4(-plo?LX#)Km5JG)n6;_)zymVxr$<`wV6*+_k`bvFuO$r6T z|6b6q4(rU&f_@?Famj)3tFV#1phWW{3b{d`L6Grwrfo)lNmnr$q|D?~;74yDLv0Z0 zen8-va9PJz@F173385WXq)%I?m*K+r%yNnT#?>ZcBZ=b_K$;B)12;<~WC@;$znK_G z&$xtV8cl~#8D!)`4IDjKYv~#X-VW$FPg?x9Hrz==OU9t_c%m%k$=0Wv3Udw>IrhV%xH>#%%$H;Zvig)rlZ#~+VuT*{DC4Ho+KBH@NKL(*0 z?X@Ls$uBq{c#~KLjEo;H#7r;1s`5Pnd<@DGP$pzoFhe06% zy#~{7uw3rJp|F6x-t{DyD~;cN1zlo)E;3KYP$~CAgVN|x7YRl|@~U@0NP6&^siVRv z*`B){1yw>FS8Fya@<6y_w7Ni<`lzS-|sVy{vH#fU?Q(nSL&7xgx=J)9* ze!9I@$PRewsEMwtQ$*=!G^lTMe^~nj--A);w+gQ{meb7hh(S1TzzQxnGs`x~<5#J| z$04GOAe~1V9hV2U+o4C@yB{UhI9>A1`GX18$uT(Mfo8GG#CT2wkHUXBWpux%$d$R5 z>O*i7#)R+ea*U^ zB@BfYyj9unmhSdo3p?cjg%X}rt*SS)>NftjuB*Y!4uL`zMhKR!kPdc+GDeKJO~{#{R~<6_90 zNmZUToKumNa+1%?nwR0olQjxQbzlgN?2_-|!^>{c;c^}9D|wLqPMan;a6Zz{+Q=e> zO1tQ-MC~S27@n?q*0*CE7=Jj#;7ay+rp{vwRt9;7Ci)|YWCwm74_wdi8K~%CNJTz* zrJuas_sqRZUAi6l<%hm3EJuFz1HW;6+D<4Y+UZv&nr00`z~oT}5T|7UoM+lNx_Hrp zG4lHDHdSPr6@F_y;G)Krh=wl?^#faobu2plL@Q5=!XF^`2Lrx7>UJf=ZbFMn%Lvrx zU3h)r+6{nRsjfp`Yb}(0Sx8XsaNfe%I3uOWnRz20Z_lvH17_XNcoCCF#~*90)`veG z4k;jc?nidjPDggFV-yk)$vA6a<~WO#-_+z3@;r&ck<9Rh)Xcy$;21*jurR6iUY~a= zIz~W7%6JV&>5bC0&Cq~S9nIX#qu^BWkpl}K@9LA%pcjThKlJj)1;@&sRv1w8vgAD( z?_qT+&6Ec}M5oy1#n~|i;(+ruT5+KI`77ejB~C)93C|N_jHEE{{TN z?XYSC2&kOD{(MOE0}W^0ZgS&w(AO?qy5Fvf`1-7_rB_FGeP zRG8>#A*5TogfdE%$(XibgWbo3Ql31JSFSaWr%(RrcJ`CMN~wy!g%uX^nNS?#@$98% zw&T_op1$()&MbT(!{HON+bDx^l(cAKJ>S_cel*^?Id_r==gsqNao_#acuQ_AnH zoMiC`e)6w=GIfqQ@C2_~OdI{{Gc9DBHI919MMs;%g zys|dbNlCTy?D2h{4od0m1e!N^_(`33elxIboD=fH_s4k+_a{vPl*5`)2GRMo+Vs7r zD<^(LtIoUJ3k|JLnE(k$w5gqS*d{}c^s_!kmkZ+t>ntOCXjlJZFkJq3O>s1qDC_yf5pINd{ zGO}PQU466#T?Ae<7pyU!yUL;;kh4*tKf#k;dm#WtBZE+Y>^|AR_@Bvv#<@zUjGhNT z^PQE>IDdMcj@a{{j9kBz;deRuaXws1-!zF}Y&qJ;2g#TTtDo{Jt9)l!(aM{h!_$d0 z1i6TZOuU)69yu3}k|j295dth7on`t3UdkDPSI*w;$e6cVGabzHjKzJE6C<;1id9?c zBQ~8O+a~(0&7|l!CI^Ptkp+S5Qj0G_dNoIS*U1pCF~Ydfg=Awq8xO`P>`Q-5&aES9 z8V@s!tyM*|8^)o=vP;3ap5c0$0qa;-6A%nTGHcfL2KYwn6zL&Y(iwT9{$rfHL8sN?uY%J@J3Oe9L$7PC=8T$7?6LH9$)?)t^5r z?;#IE%lpH1fl4qj%~D2qE+Y3Z;VQh;Q0emAg*hn)<0FTR&MZ{7mFy9uKPho z7U|=ei_Z|HN5Z@!ruAUqETsO_lFE# z9)x}j(DmGF_-OA#J!i>G_nx^{$6VRQAOx^7r!9Ip%F+ec`o{>i1AfYf6S-h^es(ij zRG4y=4IE6TUNI9MXK+|FtP>+05@OEp^6* z1M^Mup{Qve?Phje-KL(Q>X-%ji;SwQ(k1uo{-~|g_p)-Qpeb?I*x5`*2?PJLI$m`NY-|92fDuq7@gCLFw1v z6|KwH&`GpSyGSq9VN#6OZXyIA)uj$Rm?avyw+8+2=#g^Zp?ycb%TPNjdxe~@--C))k>`5a*1y28C39pvRTbVNmp*6yz4 z4=)lA2=5yu_@R!a_-IB1#iUR;7th^(G*Y5?wu*haGcqHZ8!uA-}rwK@!~t4A8L6&Z8%h!a`7f& zkK#c-X^*+!lfrdzcksqfM@zXGg$ik_8}HE0@eaXq#KQS&Ph^}tnsVI+EieBlWxQhV zxG#D&!PhR2Lg_Y#)1yt{m*>%GM`;&&n`dl{o@Bpq;@Eo0jLtD~3zZB~Ue=WMX0XRg zmLV~?!8>DUjMVyRQ;*yBi*MHT+oXYPV_2r-?Az(+{G@H+AO5>-iqqMH&wp<_d;IGO z^^AuMtdlmDu_4Z!k@%BuZrizEPvVP3LNWSr!IB7e}_ce~O~*m3CZ?z}(#da(E16kd9M zH4oNFYvqn8deIEs!+k|GXN*ETr=2CnV}mrgrJd)#SGUymZT7}{ zPQSv(XH4{Yx-pZ<`ybI$CGw`U@+Ixu*rPmo3? z(egBJ*P`d-NeP}aK!b5sIHL>d+Rb+1H@Mh-;OXj zy8RNvWCu zpYhzA*qHIDGAlLwYrByf!BXdFPCq_EkG=yC{K_w#UOy8&5EiPm5_zJg9QUQVwFV=_nPbcn&HpCVpH@WLHDuzk`K zgccv)QkZigzGsDLQV$LhUO=r$>_R5vPrqj}jeG^OdfKFr7jQt9VfZ0=vpnn5Qo&nw z!Vmo#Pohv#`jef{&k7S~cxj6X?QUF|Fk_Kx))nvHd}ECIp^E zXD*ndKZej@_wz|_M!^*w@iVWlk8sp62+@4rp`mnrJr#@rae%Sk$9hz{%tSi& zO}CqVUMf20(U(v1O+|bJhiGjQ;%*k+gS-kHuHL~J?_db3%_xkXxzlJ~UBH<93;GQ1 zzY1#df=eI;FVa*|w2GjRQ;^qnp8j4yDV=vQ%~<@y*;DxN>HF~eLBU#ZFi!uJ6DW0r z7aTE@;|>5<{s{!u>q)Z+Ql1`rGt~+R9FSn@3zqUG!SaMEXk6SqyQs$0L)|WttqvU! zPbh4))xZa9W}~!AiIv%-QQE=s+h?wUA3X+6&r3Y-yYK1zUU+sdbLj{7gazQMwSokx zu4&hv3Y)0b;Y={VFX82R3BW^3-a4C>EXK#!r8fgMICUR0%IRQLXC0k10Gs9FEj($K z_eu(x@PSvFxqbE*j}5Mho%XJg>OwOvQO7nqM3_{AP1J)Zt z=Djw=4})LNM(Ffxb{g%QB8?&x;R$O923nai(QeukeXsQX<_4LegtB2?Ivt9T(CHEd zm6b5$J#8>x5Uzd_yp&Jgwpoi8tuZ115DOaz_(Bk7YU1hpe=2Cr{`DxjP5IKP%rJfQoxG)!Fd|)%1O2_=Q5*G)L0INBBxwu019oMBg*P#G^_lgdJwh*+H6qiG-IU=otwHj`t}o@{V5g)(l6=r`vnTonpH2L93QDQ(KK#z&Z3p+e4N zGi%E@xb&I-YCFFBp>*5~z;?)7;oiwLhi)@^5(4=xSG~;q+g3egcWRmPvFH7xJVQ4{ zfMAaj7%c9erE)s_7kY zA1{MSSLWf6>0S)JdN?Bi`P6+T_3C$cg>u`=est6O@dh!DXS182w?1m$!SJ*5v`2_R*ybB{X<1rJv$k8N5Eb41@6?O`KL`+Oe|T zKF@Cy{;BYrGDa$wcXisMBS2;yT?WSaQ(tcf&R3#g?--Sgr987X(K&he?{#+IC-Z1N z-mwjT5w6cC6XNgtK9%8rUw9?Ae){$Dwd3Juf4i{IALWI6wsvlP-a}ug(y2+jPh?}` z)Zm_1i!$o?iGXc4zV*l3`7_UE5Y(CGUtETVjfTj{b`TY5rE~5JXWV6!?C$zR zb*VmYK9$j*@p2TsTGc*N`L!u;GijjBX0259JZ_!fd56@Wz3}}Gt8aqA;oI5>g`&st z17B-b&97`XGLWzTr~frt_b&cDVgyUCg-gGTsoI!gS`j0}>X760!%rjBjL#P`SQ)%D z*0<$_uq&dlwh3wEA*_>58>MufUw>tU)9%)2b18##JbK3dM%!qXRa?Ko_mww>T_|8S z<;J7)7nG*B!iHFzT^$s^cWoD#7OO+;tz&l9>rOYNO_t~XG+{gM|Ol65y7n!4MqVB zT)?M{!_fdU{*n#Vagm~e!q6H&p8b&t;pV_{>-&V-PWUH0YtuD`*2c-knH<2Y{hOln z`3tzSgK=%cb7`I1X?USHkrJfPDn~G9M1(IY9qubI;aip#;{cvzv-0aqnAn=K}Wa2%W#h1(YEI%-hvTT z7X8Vm*{`9xqqq8qfa;9FbtYkE>1LBlM$z-IV+ljI76>`W<@tH2E+aYCMj@}h^nEd{C$qT za$yjL&oqce(YLhc5T$SL4i}}wMeZ5vhOIo)j@`|>GJxR%4Rm=jxeX?nfCc@hC=d4mk6_JcE;j>e<)zD#bHN z@j2i->3gT4Tu@r)rA*V!Q*|1pu5a}jJ_{n{i0nEjb`rw}?yhb}nH${ttt{OO&B5{B zI}B2L4U%9Uo>$Ge4vNswX_U+cs$eJvZZ3HHdFZTzb5BM{pvAns$mC9^?|ZgnZa{Sa zrw(*B4Zqq%9t(z*b1C7!;>wB845HSnp&@}iv(BYTl-9u+MnX&L0JZZ?&Dc4E@V&R+ z-d=j)sqLi}^UvC(@={tC{tJ1`?5w=&wUJ4H!LfVv83Xg8P0{y2ze}YxLn%y;L8w}@ z&Z6Jg3=LJO{|$WptY?m3;Q0h6QM=Ynl}h`-1AQGxZ&M5HCInW!S7#9t!63^6Q@Ue= zqS>1Yvil#6Ba7jTF&M`A}W|Vt}0|`@I8nHcF*{XAl zXEyjGW$jv<0bLgc5=i_sn|VYlMzy}JP6lS4L(24;)e2vW;^COUF|e$@6ut?!8%x4W z`%vT;U%@$kHAn<&2L6SW$L7uZ7yQZ?L%#Zw9RnBQJ)eZtY&?TK(njMYtv(~PR8a@% z`SiIGP;7<{24oO=cR`IwhqhFbQH;oj$`ooMM0nD}sSkOgZ>Pp=pDBFk@85aTc5mO- z+?g4arYz-&cHzJPf*;<35+j>u3{NT3hD&R$@u0E2ofLkn3g22jhrjE~!;js&&=7BE z58lYZXE5~EMP|ff!|O;MP2Q1jr{6H zd(N(*{qE=dK_9=t_sHM*UV!G^!61|dEFYfHNIdda2DHWZqob-&%JY#h?tafiD23|I zycz9wJfV#B*E!cL&(T)s*{-eM8F&Lwqf^!@@Mw%S3;#3RcyEM1+G(`58YPdkFxbwK z3&GHDC~TuFmY%USN@|lY2LIM5X~i zTYG1%PjZgbvnDK!WtAf~8R|Hf^1@K4&PTk0!prg~?a%WB%@yubhZMT%G~3fF&qgpE zP=0jly?uXh)-|3xqt9^|4lYMqJ60x_9A9zr@IRP!gl8`o=KAb+GYnGB?s*_@-Y0^2 zdAsr0pKnKRyuBTN?(fuA9U<_u49AqzOCSG269FG-tzRLL9i_ow-z7iO7DK1Wf)uUu zc9uQ+)?c*2Odh8?ur)`!2R~kj@n@=61|(U~`oY;W$T1DPri}k~zZ4F6-tiuVz(itg zA8qms4pRzk8%DpNzjkTU8BKBe#Ge!B0Xxh4X{kwQv0I z+y3!ywP{Zwl;m$4TTCco07SYNAN6$MyM)%XYqE_|f^`z0!voX!3RSXvmA7ZS7t%XM zN0S~iX~L`5201PM3Z{43t8|@1IH9od5~Fa8%w_w}z5UqR+s}XS+V=HtJ-+?TFJ9hWPJcmXMxo`$%TOUzMc7=(F9u7X-`7Kf zy*B7+Y$(KJB2N;IJ4Up6QsV0WHmPx_xZc;SYoF@mqyN_qGa1qQIbTl=^$B_gnG+F4 zhD>{{>WoCxPovG6DC&24W(}h95H7rtcCsZ08Csf%taJ@7epVDI03W1d$c*78BO|LX zQhY+ z4lFeuq{7))Y7OD!#gn2unmifLtI3PnNCd{d4TPMvsIQ#d(_{%m>^>Sy)B?}?zPMz@ zhnZl&0~v)T3#R?hOxrVXo#`6RyLRH=-BD;dzR{OOoLPrHGDZE!*KnYJ4cg&cea9LkfG5MqV&{gKSzaW4^7-3bsU2bo}eH*CW{=rzyTvyuSpxEQP@VttZd~i zhs=~-Kh>dIaMWeWyhzJ10pk?U=0X8?l(W*W4udA)0^bUOv!{|JUwR&DCOc>*YPzLYj4}GX{^kjSe#pkw{UwmeJGX;nTg}BU?oAS_46?wN9gbW)1 zSU{)0c+Maf49fY0jgCyc9}%`BHRLdAMR8Pgfn z>(FRga%M9Vgg4B9*P)d+;VTuSeq&4mFtq9ix=ic$tl27K$kmK(9Ur~ORD(3(Yp1gn z#vpTeHqe?)I}TT27Aqtr9IcBAH%94=+I6kZi^qZmhaEW43+}@q7*d;0U+Kl*7MzRs z-OjTa3^Xia1!q3tIIv_2+L93(ovNwt#kZ0M)`cf^HoUTCjtBI-i~FWOO`qz$C;%9e z3DZ7`0IM&2fTPvn{)~nH=B``XK<1{_YH5HBvj@=7jD_QPIL*FXR2_y!3S#Y zuQyOB)1`kg2;b@1m3}h_4<5DYgBNLRV&osgjN*Zpk;pSf6@KbbJQ%O^V&S50zr<8ML6%^$S`P_-kv!wASGuh7Ili0{3A2P$-?n?)Ia8k3SL9Xi?BM1uKuorCO2&mVm;mn zzv-7Dj&~eSK=}^8Fq|(+3d-8$m;ypc9VMCJrezpY3{H5?qUgN*^5cK)XL66i(7#DP zdBE_0TDElIH*m>;`lQYt%w3B5KJVHX3a=MF`TP$H2Ys~qb!MIO(pqD=zmf5h5VtXi z4PR!)yU^1Kg|a57S^FKOodFdOZaijr2AwB(-0=;jMD~n~>EzLlM}dMW^s-HC&YsKA z`^C@l=vuRv0W^klZBx|3(Vh2gmmc}=DzkNtt$93s`fs=Gx#!x9r86iWcqE1IuI$45jjV-uq<7+u(!ciNue6TMF#{iE&t`Dda}6RH$eyvfMOAUl2_k7&DTo;~w7+x4&iAHl4x zcufysqv%UtU2vtzo)ccv6ma39WVW%H?vApm zqHB!|NNJm$MjJbh#sgl8#?=`xrL9d4J8+JC3l^`Avq6pRBiG71M}9>3emBcDqV>p&lsLvU`G_A)4$g>I`=6U&c0XgOUeADE^_z`v zs@z0M6@qUqCu4TxwKV=E9}vJ<O4xVH0ovlI*W>S6qhMQ0K{ zeCd>ufn&Y;rEoOaM&^LOOJ|yhtNMURZr}kuysdPTuIB@ItrV z9p&*u&olWe6>pCY%R4^0Y`j&Sk0!z)+%izP5UY9V_~Dtvm`Q5Gn}I zgmC5c>HuFcWAXQG2EV)c4}$s|1QFXC87b%lAKbZ2!K2LB?Q&*E`wiZdp=98C26SB} zAPvI(GxHC2%{hHs8bvc0(Q4}2JwOD;cw$O3@E`^US?XBVE;>&lZeWbD174RhP@pEB zw$Sg^>{R9Vd<>$YP49z4Ifo}BvMQ!DN;hcCJ7sEY&&;Z$^(gc))2Xj82+S?5(kvd8ouJ}Z~y51 zO_*NWo_YLd+iS19gowcpgW%bo*pPsJiT(`ZMK`#jvrC;uJ(_yeKIQM{v>Bo20QY!* z+Iu`FU|r-L{x|^Xn=k>}x}@vnwI&vP0w3MoFyOUcB5u1q8ZoT3cOs}KOF)m|BU!l5 zS%J~>TbH+@#GVB>iLubWz zp`ChR%;Vc`%fay0cD=2TtJ1UqC42%0CVf~Z3>kq2Y6hV;TvlTkBrMKyrg&UBJna6q zWYEe#6BOF3w8D5t5QB5U1H%OP&%6H3*?^^|LRXjqhL`6S7lq7&@#*iRAbdG*k=;HW z8cV+0xeKNJ(?d*_)N4i-kSnWS2D0*D@8dZh!cTZoG|}~7DxE>Nyl(nOFKd@I(Lsq= zeY0e}31aX3Q=W1{d*I+R&sPLNDSM8Dlh%*!T?|6`7=(@)fj_+L2#fY`@(le9mUv{^ zB@psWnE-XE*T|XRtatNx>SXQSmD*1^GjSDcFXnlIRzE?565iMD&K_I1I(_cz*io|T@LAEDz=QsfC@_NtHIsJIxOt$_= zhn{_>2+gcJWgX*&OIC$Mj;$=p501|-AlR4*hm)HU5`3c79gv3{S-b{bS>-ER}db{!M zA4QiG+q>eUHYPgx*q2&M_-o;zO`~C6(j!Nb=t$a_V%LtOaq@Qh()X)GMy?||mbYqW<~0R)2@U-!yz30YYNwqHCiRi=G~E&(Hz_jP>1X`y z+l6sL3h&JGS$OZz$xauJ$hed@_ar=1YKM*)p|koLAI3W|Q*cwb8ELiiKKe3X=Qt9^ zESAQ1jSsWVO@A8B?S-Q#OneY_xJueS0qkAROFLfYcm(EP8RO}!wPUb{->$UA(dk^Z(f-0KJN-Q+|5O+@FI8=OY|_A3oLrge zQrxTN2|6%bsv|KnEH!mUk09$)Jv3o%qQ_zAgXi;XK+TYlvneUn`G`Rb6K1^dfZuQ86F~SlqJm+r(H&-#y8|~yzi(7c+pE5P3r*+ zwWS*%o9;m`x2fgGwfOav@p&^g5< z_JpEWcc2_>KVH-N=x7y)I+k8-`&J>Q#vA=Y`_#@1^J*L|dfsmH&J;Hxd_Dd`e{zUU zA?okwH=Op{jq$@^uAL3wXgo96i?`r94W+Hn(&P1N{ar@ldRCHOUKckQUXv3UJs0A1X=4fH5gpc>LS6Ukqr*=1aU4jfwSk{z(c2YODU^8!vk~H z7#c+8u8XgMgK-&pGvht)f>T~?pe>+5Nmn1UA$ZZ{xzEt(0z)(=z?2J#*CQWguDZG7pq|?vf9kRA&4eSP?Q-=}CwM3WwHacu>EJUVUcC?8FR#N*&xRMmbqvC8 z(Da(RcA=rh6=Sb+XcHZQ7#!g>zn8MikVGqK)C8^ZEEv2zx73-32YV(Bq=%=`ajddR zAfW5iJbM;tk3kqMW}$P!YVI{wc#c3H2{oKtXHQT^Z|D2*4pP)90tW8P!j$PSEIm4@ z4dO^*HvKrIL7lD_E+ypi#Gpk0mhx;o6f3P79=B=3NnSAngorat4g5#Y8(+oWy9_UU%9TlG^%JQ}3IfBJgqPBWgh|6CG8 zx5W>5qN_h9D8Q3jPI> zbGk2_vc4WNSIcX1WoFO%)=#IumPhC%p~?`t5-j=rGsN-$p7jx4%d@S&`B($1I=p1U zEvG+51Cup8jw5d&-j#YV?XJGy%GcKzqVUo3{xe>kfoLr#J#XYdOj)Z(2ka;$bnOm0 z#w;2I2(1pgo}!;t#*T|lKbTyu)?;! z-TK4JdAleY*3MA`R&aXH)Ts8PEC{8O4rQIYHoTpJ8ZBnFy7JdL!|<)|jzZnUSp`I( z?(u33!^61FWebP$T9Y)&Gm;e6HxjaXOdmj?42yH;YbAq@J31g_>M!~mjzSLYgkmW* zVLL_vgECpJ$R4e0zVRE7ab@s$fo9S$gN?y^{%*?l>yPGb`%w{wFD8egQ69rFJ^@3s z=&w$ce`^#+VR`qt;MQY0PQeiZ+qgo{#i zhFQm0P9CNV9)IXdg;M_J>|S~HYWO_y?amy`I4J!0_@kdq>3?xM{r(@15_jo0|JfLN zr%!xiJAeAewR48&{lA{E_|fGNwmHr-8I{rP=12Z%69pd&uQ#@9fA)JBX^%&YjL?sK zu*1>;Dk%3Kak_glijP~S(3Cet`#a;osaK$XeMyZ-+F#{Zr3if&b2&y@##_Qx7LmA z?kNHwqx$^%t=rj8|6}Dx^Xj@?y|g{|?H9N2ee?0oEqr|Y;al2gx82hjrk07=V9xs7 z5gC;CnW&A7jg^ikLDO?-iCSF~_G-G0_*R{wYE6SGThbv5wSH^-OovM6RN zPw>)H%G8Gp_n01l{>h%6(_65Wkm%E9I2~diT9bE*D3$c`llRJ1C45CEuyeO|i#j7; zh=VcmdOn-#_)pMOfm+Vo_3k%zCLiN8Gk_#;2h{Nds)Cj+PvG0 z%;`%E!}wybgI8spH(^)JGcw<6P9yr+)M{jM0M(*)-6w~IWjj7-|HiA^?w$A*ZR)ps zo^$ONJs9>#HF?rr@R6M%|7zUyCBjC;K>1?%P*`fj=T$-6RQ-|t~8b{5d zo+j+B6^?)`6!kG=Lx1f_JQW!n@t67o7ud>J&Et8%!Y%6dv8(Em07@_6;Gi9FzqI&$ zFde=bo-UaIk20zK2}E?!&R|cw^=$xUhohhMfs6v-C)y1j%JYw5&0}klfye6R+V0~` zfcy_1x@G&)?G&=~fy#Qb0q<%;e#)GpYSjRN2M%oBjjyETg}OPst_O=zM}eR9bUlBg z*(XNhopp4EkpXB8ugf50$lwY??HEnv7lj~nlVM3dxJ*Q0+Sz`(_fzklI}fo5)iDZ7 zG3R3XMo;-CWK*5H?<-vEtG@fFiOr0Z&&XvQs&BWw(GD(SK`Bd*_kBa9uVvH*@36*j z$(KbZbx?*0xD`fZ!bNiPeS!kW&{77zn^yNzKMxLrK+BKumJCV`j3veiX~#H?Ex5L1y+}V>0gWgw1DcEYl8=XYaJm?&Z8- zFMP9*&2NN5p-%1a*-jl}n}ooWJG0>N&iSiP)c@Ox|C7I+=cy=>*B(nru0DiGu!m1N zSMK!XjHsu7v29J**u23xbe&s-b)tQBO#$MDKkAVClTZDFJiUdDG7et)@pk&mPxAP- zj_`rcO1)kG{_k(Q4kzDz>esiMe*K@#<}EkA{~t1JUY!uk-Tj}RHe#rpJ@Mz;+2fCH zyN6n{_wnC}4}Lv7U)yec^S@+R{#A-y_5XP5O!3Fvg`A@OQQpPYS#FNW;IZJPnlNLu z%LCc&oM-PmSDHdk^QdjNWmwsSN87q@cUCPiyO74848^lopUIf{$)dLniS!GG@ogV3 ztogSx(0B>|w{8E#Pb#mxCNGlh<1x;&F>BNCt})0FDz)z%5rD?g#JHeOO&H!N8mqlm zXK73lO3iy+zA@JE#I5nCiH>%mjfrBl+E!nP-;z9)9lzw6JHA{$s+4o##Cd|%r_zUC zN6Jheh?m1=HB04|1ZThot;^i5_4~*n+u&%cwKW1I)Egx@! z;nj8-&7iJbb{*TX`@lz{+1*V9+`k>gZ>R12diKh*@m+i>lsV7KQM_uyr1Kk1SpV&F z+aLbHx3}N_`Lo;Ot=0NK#@wCJ{bVe&V20foEAg@j8?r^1BCL&3vv~}G%P?;|S(BL2 zy!ENm7Y_zIZ@aOUY%IAmb!{|qoKPKEPrqtBwxcfN-m@|4I>y2=1xI zuZSOVm_A5HT|8=qL1}a#uF_QfYWGebYMc)7R?P8BXUyvdPINTkz`~6d#Q7@YS|wZ3bg! z&V2^L=+D7fVay6hPqIl&^tRLI-nu>;(!?*SCNz5Axq&?L)*kPz=Z!c=9Tj0h)+Fc{ zIkkngk*@Rl;j}K}Fqzh<4^ZWk-TyyTfBI`(a@~1;=MGO!OfoZ>OpeK!l&GO4m8dGU z%MFy>a1Vw7yA2!mzhxLOY#8tx0}Z>|aH-l=wpwnfq?TINP}QxG;v~*9GfC#m%;$OT zz5afF``)B_-+Rv4J9Z2!R;*aDR;(2fec(TS$;wK3JkAAeT&hi2v+;ftB$tkVi6=Bb zul-oSVU+~2_2?;(*TJ!g$fDTcpF1@f=_W(W!>suDEZJq=Sf6d5|Kc698P!f^NFcoL zDsG*da3WU3ppE*##D?NMFW{hqqKWB341~E*Q+|hFA-uc&xzlr&wHJkMCb0m7ijd^I za`xWW0ogf%?&Z;8j+fPGS&jg^l?Nh}N8MrsH`tE~tgc6`$|o#{IYC9*UJNmBM>xvD zgjScuKcHDX155Ekkg`y>94pHQUj51x%mn1R*vgy25z(j_%K=ElpAZ@#I@Xw9zu<~Q z>WIZtphWNm8C}|^*Ax7dC0H8ko`8huENbZph%z{Y_QL(u<1R7B4jO(?Cvljz8lP9# z-k0J)U!gjm^bG{?=9(K~p%}`xGntp|8n=WM z>Ba||sv8&2#;RS~Lg$Z{mG@ECBRZ%G6RTkO(>Ln&bN__M!ZY zGMg|c92}1nr|w?f$GpEHJJM_x!b^f<_X=K48g{TUbxvb{6FY|>!(OX)6-@ClyFy#h)YA z3W?%Eq{)nh$;aSruxJ`{e7QjtgSNfC+0-pYZcquVqpqZgs^|;73tZiA=?)!kM!2f1 zPl8c`{weVX{g&U-7A$_@Tg(hLnI-tDYq{?lJP;oYeXqRRERTRWdEju~t>3G(k{|E8LDR}d4@V=wZB5rl zL<%W|P%J#bV5zsR9ZJGI)h?lO^zN?zE~qE#BpY_8JW|$HUg@;kUDBL5@KQTKy3r_7eS{V&k0ynzp@OIApVO+Q=AuP<<+0%U#j>^&)itv@?^ zDgm;MJT9L9bk?9xOt8FZo!GT)_X!z<5EUp{Qvs_m;j|v!bFi_>Czyb1=gB?MjPrzI zVB9K_DTmTuGYctOhfD}`Cg8Poca$$y6^bRd&RXm|!TH(_i-f!yYa1b`pjL>!w_YiF zHU{eVQ+TTzx2jnVLg3+InxL-^1aVAveK9UOMYZfIduQRr3$DX4N}H=%ARZQ*@CJ9y zj8huUvxwfj`pW74*Z#cqe*e{uPLS%Z~o~?KXP;uIGDIU;fb- zPFLUfw^Ld#p8I6s9}cenI)(LHr?cnYe|q#+|L3(&JMq2rty~JfU2}xb>gX{0ix2)g zSr@-`dieD}OIduiL*Y{*o@FimY}U{hv&#L&=_>cr^ADtGJomBEd?IURh3xEIpE_NB{5MY5-~HRuo4@^^wsYz?THn~Xlg9(=14Vvg1)4I5MwKQaFQSok zi270uJi0@JCJC?WcVs>^#GT&SMG7Fn`x;$FJ6wX#o^Bl>_?*#c#9g~pUSr9Ha55TY zCV_fN8@i8PxABm+Q$~GYo+}kTtBA2ozbG#p$$EB*HD+>N{}^YA>9W>FJmuRvo6%6_ z(D!TKPm%v>?aKoA$!M{)pD%np@=iFn4l>K&`TJ_yS6)2b@5qkpSE8qPm6pZXgiUom zf2uW_AO3Kzz#luk^*7%Z-HwqaZa1-#GG$!4-n!5FLV2!@I}m-cKz&w!pv;}8w5+Z1ludqxYW@1Q zZ-a-0%&w-qhqN{2l0tGcE&TP755+0iG7A;Id+*IwtxR50WgZ(2j%fU0d6{&2 z+Za_}G=|uykSs7LO1JT{yzO~lf{H<6as&Q{&qlx3DN19KUA$#7Sm8F{GH?bLer$s9)JBNb<6dMjyh?e!=@9z1v0i__aYRILR?GNZ zG{g-$*V1kD6l~V@UDTIWW|mOO;_y@3+$1A6f(3s#ERU@@gdbJXPHVsVk+!r8qJD&D zHzB5P;k`R5hDTrdZh4n9#>W)DtJmW>#+kjVyv|&-tbrnd_ME-=5D)!q7DDJ4(_ZuR zWdPA(_vaD1j+Z6x@3_p|XoJOEV7ctMa*E|von6OMzXEGzKO3ZD8Xg9L*1x^bqcHyn zk5IHN?S%tQ2LJH#d_-TUoG48Imu)Cr+2C0X64bnw>~1E4(u;R5YZ(-I_im-{-8utC z77RKyK?x4vMZa1@ly1-E;T`N9@9PA`p@1xH@wk=|prlpbW2U`w0vfJ>QM2wk+961k zDMSSI8+5xp;vH|-h62_vRqVFzOI^~r6Bc*MLPW?~d5K8Os5BV8-hx`=##}>dr*#r# z4X$dX)0eN^Ll02kLdykHOm7yc0KAvK{u9q6VC570XzLNI`}xjy{{HmBOFurn9uWpv zWy`M{c?V}Cx~{8@;7VI+$5_MBrQvWmJ8&e8^eh(g3+xH?$m`Imdfz?L@m^l?Mhl9K z4W%rw934t!-Msw5P4U3ePs(6pqxwSV-TUD$CLqJxi=tW24ZnwgIK>#erRDYjFAwX4 zLs|gs4^3fm!C~_j%#vcGJ{b45KQGRqL>&c*D^I{}JwU|s!0b_Jw}uJu2VoVVdK!?- zP+=4e(zlpA%CAfdl)0bmNQ|-_qlM$uC&upg?P?zF1CmWB^iCh$EZo4Wo=aHm@F?~3 zTpd}Mw@d8^N`{4dzrQ739A%;H4FmJw z*1sIX{77Z}Pv8B-=~vrK;i~;;3fwju=p}bkc^qW~1Abg3 z)y)feu1oePuWe@2&HDXqU!8|Th0IczGB}0MJ9#^=FeT>f9SPvMkDfpM{OSDNAK7k{ z)*9kO2Vp1lv+&rBvKmDpz3ajU!BYrD!?}3JOm6~UeBmbdI@T0rZ7m8$Yk*H7oB%J2 zKGzZQ_`UoRHtm49?e|w~T4U)sQ%uL`V5%E~SXZ^2;KVJ}CNw7X zw8f&hkq6!(B4Nn;+IAiw>KUF1KY$$1_gfKO_-0Le_|>e1U;F*j^{ZbVPS30d zY}d!_HhLeg%2le3U`{Ne+%8+|b-MqP!h$!Y@2v6S!PovWchOuw+nIW5oonX92RY&DE>l&h4{9>RW4h_OAE09`IK~@sCpGekXxCTKq@(!i#$1-@X3$0Da6MT_L{8g`8rD$_v5oC-#^7}c($u* ze9SQ#7o(39U&=Zq?ZvNzo9~rZ3NYcZb&VGta?fq~;<-* z#AhPzH|64P=U;sQoK2Rn40FMK_&5J10k;iEKKk+S^s(xh%kk?!Jl(wbovi!i0jI4? zyJ@V{o)_iu@xpA_54M~){)@0smBH$)v{+m`VAmjVZN+f69y_Z@BZt=WcAWlialp ze!|O^+@yT&TwxoO#Q0hHDBtJzDd`gDqyBE4WFQv@kBOfYe-li>&11`if$>&d$SY&~)o(H-c#0>FO^hfDZ|!*s zuV?a0O6HWHCWBsVLmz8#pKW8e%jg^}%_UY}to&ngz1~+c7JBjz*^Tl^(ZmxOFV34t zGeLAOo=TR2Tg!#iSDTqExkiWO50=S^$wk-kF&4@l-{QBl)v7*+=SMqD-fYKD7R;17 zXEMVl>m)^xSKL(=IlOjlW{t7k7&*(rX|m_WdhW)u=~cBO z*)o?==Mbtfx+tJ~GqMO8{t&QB6mZ{N+J2D%vJ8IqvXK6KAD1z9(SH_Y?>5lYupX8s zp-fhyL7ZItOFP2o<_^9MNQJxLP`tbAE)R7WYyh~8Fj%TcO;N~72+0tOR*&)qfh2uy ze=@1UOKAk$#*^ky2sOXRgsTu=I3aO@V)v>jnX(C!){HfLPH1&_Hp|99EROyxy*SbJ z?$r;$PN9&IXOV&fD7yXPcJEn)iYY8YDqu6}!g@z&*xDLBN=Fig7-DEFO^?LH%{JZ7 z{pYndB~j-`%m9NCkjr?F;eyiB>`!Z7mak4{1}UaGg(m_soBLR^7mv10_gOO=k3I8j zM@_tN`sTO3c6v1nq;`Nq!kktCKIUa@RNZxD!ss!0gx6?fjV0X}5nKVT;C|rMzs+GN z)o58w*8u%+iGWLWSvm!Fj}n|ms1N9Jtc*4+0iS$Cd!nx=>iBS0&;e6#%wC~K*Kph~ z1@4}XAH3e1!8#Pe@{IWoKg+eqajT5gmNi(56ys+IqSU`!hMz3xKY8{YZ5|U%R>jxD!>i#5kjg6O#RsoG zuk@-o3l{66LC}DsxqDoSt^cdMyESWbSM8nlr0}r<4raNPP!$h%*0a;o2^MqNT>oqG zBnY_Ca^G;lWLX_~tnA<_KXu(D0$}uo{-k((v=)CkVjMUwEj}j-`rRPfulm9j?5n4S z_H!2x|G=~0LOs1B0AL>`B;;u$my%b1xa+1z{Ce(G#XorC?fYPphxgz|B>SIIqHe8U|-&?U>SA+d1d!|Rzc?-MR9sE z!SdMACIE__fN_&zXs6MwC28AlXWE^&uF#?OHxwFfYIt5kDO_$RQp}h@n>*Z@byfN( z<-n}23#j$y39=L@!hdiQ8VGtjjGAleZ7U;ViL}h}r*u<5cXUDJh5!N?K3>PZB}_^o zx)ui4c$8-}SXgmGXW1sO5DcgAtstZnY;nQDhf2y}`5WcRwEN&CsE5}Hhk|`dj?NvV zPLViIF=XAidNE7e*Z!p4Kfjo@?VIJ9`(Wi>JoWML8%~v%Le5?5=7p~&( zKh^IOxu5=BdgJ%E!NwF)R??m07|!sVX1@{W`E#FYMxy+l=#!Oi8&!PkPqPB0Nafmk z`O$w|J3o24|CQf8or3A|)Bl4Gb#EP68v~v5jEE0TQOkm7m&mg=sNo-S{lmWvUDZFL zxlU+3f5)>;6y#Re?teEgd~5AU`8|K{M^Bd@`SsFTH{R%_&CBcN)gOei1k|U0X>E3M z^^@ptu@4S;w=Sa>-<^xM@S38|_h}+63o3m)V>1>TyxJ7^X7`QS#_0 z*}yu=vnhD>my|hurP6vG&4F+3&D}QcjkR>XWzs?LhF>^Z=g{+tV~iwdzn;?n()XHQ z$ff%o?+-^Qf8qM{>Wks;<$nn7a#aQb?EFz7CMs)`n2|r{#OtX!e0{Jr`X~3g`eMAWaYtnNX~$d9W7Crg)H9Y zu9VehOG*M@vVb;%KXff^@yAOw57e^2t-bX8-k1Jv$;hmdMVnQ!-&*&OQ-b|EzPBYZ zl&QTayO{7M;EZ$qDF?5BpDQk)!E%u@{NpTY`r1=j(ij?CTR$Cqj0`(yzN!qw@|eif z)A)S-fJ-Ki3cG%v5eV@*2)C9unm^WBMoX249qJdGASv(BWqjhAwOG0JmHS!yxA9SB zY~oveC|&Ppk}wOPcAylVv%*#HwQg{=<|KR_?ZKUT_^Mu)Lz zN$Y13Ywhs%8bTReA?RLiAcv^+zKJlMB;#gP@yw;qi#!e zAgg;q$MN=vxrd`z>?as1v#)R(TwsXd_8aPtyp|aH>yX9gN~Ydxtm1+T7)Zty`X{`y zN)fj1F3Ji%M<}leE5pkJHf0^xtsvDa_1NIii``2vo_GDZ*J%i9dj@yF%;F@i45JM1 znAjgNgIh0tBe$Pd+7ZLP3-^+!@A6a;e@D#^#%G5t8F7z9pjPW4>%q zI*;K!{`6C)?|t)&r|+~u!2LSVX6{Q2KPnEVEYA(k;k}1jngFIY@NvN_T%i$kpr+DV zLns+M2gdj-IK*={pqFKNDBQh(Q|(LWMRx#c=-!4ySfnvS?wI{M>Vyu5-^_TBm}Q!f zRlJfF>-H+{Hk82#D0aOZ(=Y$Ui4#q+1L#7c)_|uls*45CTsG107-<93taT-RXwiMY zeBZarS?O+KE?~ThDcLT1i>7n0ImhTlE?-Q^BJ^VuIne_Dl<5doj9cF zF;9rUr4zKN!wve%*jYNI-MKaub)Mos_c9Evs7JaoKo_2i^A9huE7uR@`$$w!NysUp zuQcrwV0iLi=>41Z?<2JVxwxYA9(?$iT@vkL=BR}aG<*BMdG5*6ZzL#D*4`*Bg>c7= zNL1PS97W{O>W$f3YlzKm{aNALt+R4pkJ-P`I~HZGLvwAcOeixEL|L?^&CoJ51`8S+ z%kG^zqlqWsw>V~34@COC<$H+=H)l(MYLWuU>-9pnA7f5X?cb$S}OS+cG?RuXU^O+El*li~V}%4LpLa+qL1=eivU{ z!TrlA@+|IR9PmoZVhNUmcOCg@&&R^4-JvOmV2||s;Aea?Ub1mEi z!QG^%fDM$THv@ahBG|NY%12zmL1YA8Oh32ca~lji^MMqVPvlZYS*ULl&{K}C6I^S# z3Fv6gJ8QP)QmR}EN7>-L2VOk@q!EKqpLL8gF1u%NHA)-TwMjbOCCPY5Jj6E-M{_{RuQ z4Z_PBuTmhN7BMbb+~R|E?@Pbk^isg&aor{dr#F6(rSR)n;{IkXka5-1`Nuw+Ufkw1 zo&R@}Aa94zDaKE90K0XY<>$DGo0r1#>-C;ozb>+L>0!H}sx!AhZDP&lh_7{Mg!SznS|8d3k@km3j4b$)q*Ia- zMoY(9ZQPiWmGXlG#Dk-Sl_}mgoOjkE<$vc2I+~(7*j#1SqdMMs8@9}P7Gs=6nN^R= zYsZa{%&*{xa*STD(0z2)y)NR~NNpmMpl<`3`1&z88Mz5Cf)OEwvdjkC}lfoOFW5>Oc%e6iQT$8<%UwSCG zwyqyhq_vqrB*k#Y+|8G zNO!+OTFGT`o-#FF0EPk%zEGKR2ZsWJd9Lbk79DOph*qcM#kX!u>}18{4Ww$NtP1#j zF~MIJlTE5~Siuc8w%^o-7x<1O;EfL4D|c?Ca1|amajv?hHW_;_`k)Nsr^xp*e5)V5 z>Dt6b;gi=2N0%(N-XHud2rFm&Q+bue^8GLi@^x)+-sBF&&l+55+WBlU9t-{^W$ODk zO(>j_!EPJ&$VU>Dj(xBBO;ve^3z_=G8lDc+11-D(%~dy%X*7%1?bDlg&aI=(e(C0!h|;9EZ^^QAxPphB8&^^*T!J<9HJ zcu=;FOTA>kvM`}>EedzH@bnt*aDkVwV75kF=`dd52Jm~izL*7l+UD-sTaxa=uoC{a=nt(}=p@hp5V#h_> zW767SX97(!ZV)z;7lYd%TpTd&Qk||X<`?9h>Z$?wJqQmD0;-7;EPwPCV|3OK{Ei8V zHlg;w(X#HH-+jtY8~TT5ZMQhS#0w@pa}VKseW)0*<=sz_>3u`^EW~3?t4Fzp8}qf? zJe&VL{j=7J{0CVF-w~nwG~j+3o^7nM{;e+M3mS?DrAnR9qIxOc`c!RVT`d{E?>|eOH03K@pI#kn6Z_S7)YQ3yE@hicD#>U!v@VWlXiObO?}ekB z2^ivZKUQDn<~Yf7b`@nk(_ZlDS}9=ZUY?$ZvkLSKHn^rxfU9{4TfILwWitsn|U@gy~I7N%>vHb zZvXtL-1R>CD+%BqNXco3&DNcqwKirAw8^n>e@jp6gLRNuC|1^>tn!ekpC<}&Gox4$ zT3Ww-C|aV_(p*UOpR57%nV5if@aw7+@(5$nP#ofBgq(QAv4IU5h>EkeoFyo530L|s zA0Ebs;0#=&qQat^Fm}X~SNR|7z`BnQ;Uf*25#1q(v!YaB;iY5E0n_M)U{*Ncy0v46 zrKN(J(7Jv#h3i{?d3yMR&t=*ASg>Wa$)%5?aMMnsTR)b&*EtJea6kNB7P=RIQ0ECx zwZTPW%3Msfc?#iGXW5#$JA2rA`@7zEs*V=u;Y4kvW zmwa(k5N_IhXci2#S2}gpe<*;HA90)*&+@PfZIdL|DdSTH^GKpttun?@oGIn_)S9pB zS1EOH=)W&8wzmAtrXh}{h<;h>&T|*O_~6H)iObXX|M*L%zx<=WKK-jd{le+1xtTte zBJ$2{{(yJh^7~3-pu)5q5ikK>->d(w4`MpW2HufVtsUH%awXAcY!+j@9uHudWm&4t zjDHbDASa7pg2f#J(;qGQz#rli#^fPTzg!=*QA}|N{}{A5V|?YMAH_H8L8a-_{VcTx zkIFpaE9Mv*OcsE-n9*&#F*vrNi@JwjO7*yJIOZP9gNM+y%~zDIf5MA$`jA7f3OigT zOJ8bWB=lu2^@)0lFJ)}oX1T!FTU9z6GlZe|dP zo;Sgu9QasXy^g+DxA1m_j>K>0V-~|}2hZ1+w(dOik0vR3cHS+XO$Bi_FZ}3L1IeYFKakH}^(;35`d6kMiZC@k9sr+ZEMW`WR z+d50Dh=upXzuiU*GM+*h@lGMk4E`Wj(Kqumeuzk`_|De>gFMP_pK@cmzG$WvGg#?5 zKFpXANtnUV9&G@8ET+HnWZw0z(<`~yeB)bR>uj((1f<^9+bOp&d;&$Pi<3q{0&HtDNLBp{gG+G!RPT^%OWcW1cYy z;bypwwSWy8xwkD%%*E{B9Tf~fyeNh@hEN&m=b{jD=it(GH36}Bg%jwO*(#$?=#_6c#9Sm7EVOyb4MFv)WuoMzWmC61AOt|##_GE`Q;(DUk2U74q8+*p-%2MgY;LQO+6R zHCiNODqAC(rM)doXX@4{6)!ZF!kMw;goYgr=F&Kj1{rFbT%7Y+1A$ce`+JuU(3;rG8(hf1OQejCud^o4}*>YM`D%W$5n zEd?j#?ZFSfl56G<%A|4~U1W2TTuO(hV84DP7tDnFvuCp2J@e7>NMLIH(RoS;kSKpQ zKl=8e$iM#=YNv4W^0%@&ek~#Y7fzQS_?6164RQhAZn5Fv>W81t_42!I6!ZQLf&X`h zSDOi)Z3C4urM%~kc=ffZ=Pb0zjTeC+&Xc8FS&|YnJ9?m9= zzW9yPgD?M4ky9inx)h&WJy%VhOD=-eUa>Yh0^~YZQEj7O zv@vTDp*-RF{MirHK3PwHlGQLJM!DNCY5gxe*fhjit7h}>z3=&G@V%#3zWANfzxfw` za{9A2o%zd`n?Q(}zLV8RUk%@r+k$XB&~I?h>OS~uWn=o*0v0eP>qQYq5W!!++r&`T z92<_DgUQas#`^j)L~h+>4+F{kG5@Nu#|fn9C~&@CGu5fvx|Q0ne`B#hMg;C?fHm z@-#*`Lgi3kA+~@G9P!ffx=tY_|BYsXe-mG8?=sU)g%Jl=B}7|ViWZM4a*!8Oa*DUL zmGFVj;FslZLn1UF-DsygWV1R2ZLOWBW#eS^z*S4Mda4Ze1gF)wGMY?Jv2$-kI10w2 z;;Z$=tLkuX{FIGy3954SRTm|fpAY#}+Uq>$wln7h!{P+@yg*vt$*Oy;kCxs#(CaMJ z!@Ir&#N@8+-ilV?j>6wW%96+uj}L5LV7D!a=o8SH43~zbYe4(UIB4 zf=y~3L51!m+Nq(A=9y46N`r|~LTtY}sbIWaehc*Morj|xyxhB`xy|4E387%^HKBgx z-KHO-T82k{J5EAA2zdzzSY08Ez!pl^fd$n(gG)F_nUn?i+3Y-m?!LaYJmez|VMKjg z2Gj#4)u_>zmlrE?c$-jLkR)ci%~~Vwx7|LMPvwr*ZtGjv(U*^c3<53!nzDUH#N9+X zb*A;>wHaXw@03!_rf7CgA>?wPJth=2FkCiB-K(R#)neJVY?&LeZ?lHg81}&#@m1$M zzk8oqJ7!MNqS$W6x!)^FQn~Rx!`vFxn(!7kP>*2C@Iz#GiP}r{LfpD~2aHF$Z;b zoJp~~lO^7w4hDvm+r1F@x>G_n#>;t`b2__KbXcmx-*$Z~jkbIczTa7f|LmQQoc{fH zzoQLLE>1rQzr3RqQMN}rmznr0du1NkPmwBryi?zi;EmE)+-}1bu8a3Wz)xemEXh*c z^*4`D=aR4Iw`ue?+@xHsy}{~GYT>T@D+ew_L#ObGlB}zBp?iD~{KCYzQ(DEH;#a6Y z`G})z{6=e!jLO$JS1g#1L<4r>l;0+(DhBP#N4_iH%av3+bq|s$zV3T|92|AZ@@^1Aqafs2Ju+stBET)WS4DXljx4|HQp z8ec9GdAWziN8?R)s^)eibGTAZN6MVuW$-Vg+1?3*S(YbMd&hF1&m>$s@ci=A|HGmt zME>;qFlBRt_z*fdFjwj+k?Pd@#f1xvci?!uC>{x(^CwaSaxK4kt&Pim z_*Ziy-Fmz5SS62H?57gc6Xvg8_*z!2lo&1R_ybm)6w_^lqed)nuce6PB6|M*Uo3gn zHn_<%#jd8;KlyIEdVVKER2xFP@8=grxl`_o4@ckt06+jqL_t(}$ z+9akUDC`t^^=4MZaCZLeXM#7&<5|KdA&S+nYOz3`-fX=3{r~)Q`S1KjR*LwAb-x?WVhU3xqI+$>T}uh`1YF}vR?W$CEF{9TbHV5D4EB^g3Joi!HJa)l zr^(W8T~j!0-QdMp?U7rqO@`2?qdr1Nc&>c(XxCR3#)M+y=&aDey8cY*+wP(X;9yxC zAf)KnEX2;O2||ZuUj0(cUumOMsqpU7+LM8U3|&T|=_Wmo$f2zyU% zbp(YCRam6-aJajhxP>P1Hpy(l+JufS$&#dR_wMbTO-p~7LSj366el+kTr{1&_X={`+i_s&bdUoWP!ii;Ppu;u_1!J6>W!Z;9an?n)#p7bSn- zg2zo4eFsmxW#K)DEluxBf3Nx=jctkuMnF_wW9lYC@bk(|1)dygWSXo}mBypR1#i## zs|k2C@{mGC5rvCNEKy`zYLhE=Qg$SZa{ym%63b4clzMnA-mJ~MvdZ)3$#_6@*l|NG zQCJ1>&DxT+bA2FsHc34OK{UB99X{>oWX^(#I^FP)b_=()CjTL>&< z`QLTe5$`SZ;>|)RSy`#8nRVCO@sG#lOJt!$O&KVzyj+B9xVaM?5g%AsvOpVY4u;$Q zJKie)@wx&ZtJ5nMAD~Pf%tnZOa#QQWLh?w`p0*?OsqTa*Wy3+wE;$W$Uki^Utnu4S zRC%Qk-ZwxMZ_Jkfgc5@s+Q9{`68aV>7l@JiLr4ls|HZ1iLv#>OdRZg1g3Rt!NFB!g3S6rvvb2z zk?O`%BE;XWu0ol^gwN_DU$bUQt;I0fGOO%O z41^~Np+9tksXCZm1a-07)k8CP{eg3ek(yLS+@xsD7Mamq{!tQ!Rwo@pD6g|BvW5OJ zpR~cX^Ug91=eVQcU_0;GJ|FWSU{)}9TJ&I$IBQGgEzUNuuPx#1wo1ocuqU8G(BSGu z9{&0@!2GOdqv+$Q;Kh-ZtLolfV5;o$9FY{d+1Jt?yaW!trw~Mk(A5P)#ALf;QJP>y z7DYSy%58cRAnI-Hfc!S$qQE}Swf);~KJm!uKYs3=8>nAMX?`<8WtpD>ejA^%sk-vM zv(A~QfR`|-WPE#cM`1!Y=z%gN%})bNzV6Y8zN#*8vWXIT_tD+-N0)aLH8`#3P5FZE z!}=-qfmfxk?0!vf9ZKq651zZ2`jd@U6eOSi*RRH30VYsbA9s`}Pj)_?r@-EL*V`gN zp{Ae|E@fZ(opzFk3opYP!E_sIX^!_t`x@idCyT%KmJmFp&>xinG`UXr?%{y!DBBw5 zN8%;$U<{d(T9~*{nfN!13f&)TH2x$|%L(ufWBDB8+grF%c# zxeaFOLm}U8^x(5rmw?8dZr+hxNI&yWQwsl43ZeCH-&?<%;Ld_Vh^fy{aUs}mK&OBO zJ4LL)-ny#8q8I(L+7Kou)J7rIZLtx-PZa^47XJ?gy)HEUnuYn#1BL)s)f%vyH46WiEX# z!3*E19aw(kQGCiE3zX-|xo+pq)9aM9l;IRHSmTOGakR0>O>5d5N^f2BWk-i_VKqiR z{6Xso;}Mr1EbKj>DLkS7jTF!y{8j0*C?!O4#XWDG+w~jYuCBq`4yIGU!#P*X%jbUi z^wU527b#qCoF4rj|1VDuzVxqapIlKt^w|`!l*r(|wodS^7X!5Ra<*^nHepwrP>fj> z@PBYq2w6yLzY2(MbGvIo;ru+;N)|dio3hjHtdzQ&b|&R!d-2T2dTwISuBVSZlk)pi z?y}#^()o8;4r@y;lCNfk)Yk7zaBQytR)%Za;!~)VUO#ha_UUDosOUB&h*EcWZUs)r zMq?~>n6|M>^KQN26pfI|4YtpjZU0#%MkAf27(P!F;@X3y;>MY8SxxQedhwor6e+(H z&QriotvNNmnUtt*+o&d5tmSHtI7!N-GbZ)_Dth2f8G1_a8$f3H&LvkLvzzB=G-h!f zo@`iTW1+Lll&n`%)a_P~l6><@3SApUooSCMHD$Cmc7)1#o8~x=^x-$Zk`=gq7E?NZ zw)#Eu-qZabKRA8ocfWM{zyHw}Prv`to2REb-}I^6%d5e<%f|0f>3Z_|-FQ*7!%9VN zqCgI>Rq0TK>RSo?mX62=9hl(d!al3o=%j?T5#{~Zn5eoJ$3`q<5xdu;H^)pIanRP( zxUxgnP0}hnIp9tq#FtHHGqIgDkc~SRhti<&!L~7&!dl)Ycgc)59mQ~FQi;1{`GJS> zc+PV{S=M69#bie9b5>usW9?xrw1Jv*wXk>bj38ef_KOy3JLAz|<&5{v6+2l;9hDc< z=yzjNFu|MaUUX_Q{=$9=lr{XI+!Gl`%Xoh!jt4!guXDk*W9(5_eWttsLtfEVaK`=9 z1lpG8Bp`XJFSiUKS+>!D5^Kd|x+r~2JFZb7TeYBd` z^bc>@(KVas15}x-OLe$0F;qO80?u=!^6Mz^_oKg_HNKea+<2o7@tecVw06V0vwUCh zJ}5u@4-rn;FPDy;NFj{T&q@TpFuUUPi#-Sc=a7C7EO8A_Xjsu%A+6^L#cssyvsnq@ z-V6T+*WIIE9Yp*g{s3Ul1+7e9Z|Bkdm{9MC4#I8IexOWaAIb!Bb{W`qkFEwpWKe;# zw)7sMDMfuIye!Tk%n)>dBX6aNYF53jx4Z_ESKjp!F2HIWRHp$isBi+NW>X#o!$tVR zuaxa0bb@<#V6#$XSZm|g46ptRq#wTUl$>2s&==7#e+I0!BN-S>fepKfE(aMOJ_7$X2c&&t)Bg&w%+x#4p- zd9;Y|s+!s@mb7pke)0Fde2Xv~7EgZe>kccg+f(x=3GFddsfr8NT>rS4!IK5j1R~{7 zu-4|?!=R+&)-DFoWx z1rBLhkM7(-(cTol!W#pMBi0eORt~3>xFeiWMDagxcEqHd>36QJQLMbTm6_i4I2u*Y z#-Ql-h&w(}*d~4YU8#M^+c6Y(xSEnyyA}NQB`%AZi?DP@m-@mK;KJSect6WqC7^W_ z>Er&fXuO}nsNIw`MYAxjv3F(a9}fZ)&RmOET+=053!fmEQIMnLBhTA>#Rn-EM|Gt; z2BZUj<9oe^rVLTuVRVcwj`xkwA z`PDYcbj|u5qT%}Di8xB@PwHtsm0x}DMnTc<#XA!!pH6svSHkrte)V+mkz5gNrs3!S zv(Z^Xj@lGoCp42ni;TzKWc`^yo6DVp%C8Ah){Jov3~oCp9?;Y(W}@TCn~2Fed6R3> zh21-?qblx++Zl_MO>h!a^nyBiA3|m=QTinFS;fxUnet{klSXl9h2Wvy2(CI_%cB+5 zb4f2`RH4sT#$kEUx}~ZAYa4xGo7qqhD27})@y1P>Y5%ye4G!WpHtyI#-SNmHUS-zN zCQsa149%p!(t+XM{=3t|@BC%T&F8ZGrAYlKWrEA%yKgZ% zy&s<2q{Ex7-J8V>opsEEb&Adk+&aFjiPt~+X1u5kL*Dbzl+RDh1vKDK*WdZm(}N#; zA$cmepLpNt<{cj@|EzDAUKTG(%JswA89lz|*K&RR`sx0^{Lh+Q|K-!=v(HQrJbUk_ zYVK%&0%OAzEqa|2{PH)tulG#hBcPcm&_9B)I^1Nr+IIC6_Xw6a&Kh-=at~LS70aVB zW5%?U&xe$p7!~E~`nBLpcxBPJZlj!sfARlmL!_rtdVjuko1af{eW5eRSiDlUmDdI< zv#werSoUbw8pG?KguBkQtuqC$3ytV`M_<_D>R#a+JN!KPAs`EgF0{XmUn+-%*N(jB z?|64-Qhq;}$~U*x^QYcl**|D)=2uQ7+^~D zMQix7;#!M(Ww+3WS^HRmfkvQ4gT~Rv-WzQ;&{^(nfJH?dniJ>UrTkEpFo& zNq{`Ts@7m%c$w5kj`f@=JNmc&#TBzS8y}lsnMZ)h12UOOC%-ArTJU58Bk+W;J-Y`} zU$N`@5SonYf`9Ud*hSp9u0I5iZos|yEG5QBKlfMsHXeYFA4x9>D62vTO5aP}6n+numJ3k+7j<>wvY z^6t8e>shcg`oh~+&jbR~2wBTtfE|A70*eg9;eLJ>n_IfyY~W*0brwt=km9r>IQkvV@^ zH{CaZ72S)Z`7f-pxo&0neW!+tOJaW4v zE0#b3kgm&)ow!NXt<%>>fVQcm0#eDRzA(dk}?*Izl}fK@GljDU`ZHCirN z(uN%SPa&i%#7AIxmcazIo127XeKTS8JlCTMLJihiLq(uPn+bS}^SJd_DUb=y&b1)>I{2#C^EN_=#)yadw;oN6I9>)-h`x!)*V_4de*sqTy<}9@x1@#-)XH~ zZTZf2JALYX9Xs-TILyTpA#ycLA-rkb-ziHI*U|g`_D@dNU;EnW{O39ly)ywFXR$Rq z#k=~+*Q;YV;WGK!cf(n2){dat^klotY1b@wSMhQSasD-EGQ`k7f-$S^wyvM*6Hf=Up+nYPk+7ql52ig`IX`Q+M?=M zw=Q4wwa=}W&keUplMw`BmcnRXn$h1T9~%FfV8mOvxmC&1*T!Y#T)krgAbL&7x_IaN z6Gl@AI~oK1T|D>E+UA+l{lEMFoo>GU;_2RRwjMXD>glIHs7%&g3Tk<_Q|swLmQ6k) z@ssmM-V^PlH1no;UECD&`oB$h(4+OGbGJ2VV!YKx6iote!Xm*M52v)Uv{F2`p$)~b zzBr3|3iy;LczC?F@Av8(f1B$^6DiS&$&b1B7S2uh;=`W^i5I7r{?C7K`rrTF=T84s z*2ed>Tk+Fed4uXt}v-Rx)w?RS~NVFHSTdn|eKzScJmMr-7I>ng1;Bh!SD zUMsUtux?x{Z(`5R2dr;jdN5KIUtWRRBVJJZ>F?EN6I118j|=B)D$kfw3TV$ew}a`+ zYZ(_rCY=|Ld?;!nYP)D+_mo_+*!WH`hcADdSScP$o(Xn4-mAyliWNlJ4M01t^EhA? z94A|adJpet+$2LEV`(+3{mQ-eIF$U9w#uSJ;?aXS1@8e%T>Vd5!-qDw*%1}>OMMvb zf6@k0(XRe?%}Sp;=cP%R25D!v4qy1Uop8g+dG)QN>a1?TfsY3<9N-7miEr6Y^vnZo zvUtBHH%v+f{sB*PV*DcC-{2RGBloz$w|ns>xZtLo&pz9xG71b6E6|;p0Sek7JQIc$ ze&7lnAA;i12<0Kc(Xh*OS;5Y!uA7CYBEY+{~7( zeOHEp8(c556q>2MvPe4t-@zoEzh>tyZ34ej%F5ZA%CcVjtMBL_W@jK0u3!qS!S#HC z(PcYk-ES;N;JV8TLyU>IW|0g(cn`=eG@eDJcA0B-vvB;>DRo?f%sMHFg@zj#WpmcO z^2Ts5b;7(pzPv{yAtkux0zuevUulQ?P1IT1Tht%nkcaU~2COb^;#ydFYnw_~8^{~a z1;Uii;td-mt~h*lXGe13m9PE~q_u~k>nH;R+HJ~BgQ6KVM_#u z{KmT;KRuVF^o1-QFIV@68qO^;3Als7r_6h_g#s-Aq~T7i}Kv-zd5!5#ZNEgTC}Lyh_E5)KMB>Tfgmh zVtMhwCu3<{==jL@z>o0NX?3eU#hoJCGsIJrz=C<;*xqk=!Au6RG%Ka&qmZqoz71ko zgD344h-=@nSW;26ne6XqM=Ksz`5qulffF`s;Bcr}KVXiaUR$mHcG>(t>J>$;5$(}II;{R9{jSj4zdmf@N=$n{Zn%7eho0%qS zmCvy@zBpN;D22AT-;Tw(B|7(RFjskpj#v2Lop4+RhaerCDFa($m}}s|wEP%zX~M-6 zji{I6)2v|a+SoFIDD^xhF6Dc$GK zr>s#NYR9-v?U+mElOGA*dK^Cb&JVP1@vlw~zw|q+{~7BfC7M$9#CvP}+B{s!e+p^1 zKfm|B)5Gt6A^b(dS?soL{L>%H>evw!Z@f^v;v(=iWw}l;ylm~<4aIjOP>mCQX9-Th zxk;HnV*zfL(JDEd?wAWZbIw;ee8ICdl1(05mH(Obhgs1goTaA#U!;h!PQ3Ad`ahh` zKM=3^&0nmFDNfcDavg;`9rIw=(M);NgoNx_K2ivsQMc7;g|nSN_e#S$u??w&(Br21Z~JF z-dUEdc^j1O=BF?0OvqDirkBrtHpM23{98Y&P>3au1b>PG3+henb)Mn|e(QS!tTw2x zWL=u|uR88P_}r+EiRWW1#SzyxSrd!9O`WVae6zKf3G)pK)hVUK`mffXvcBuTmmdwL zEQ>Gx@BZcK|N7g1efq5*yxel*i_?2M*YQbf&wyC}y=t=dx*6(AZs+}7^rDuW(lf=| zn7)2nKTl{m)}@8R_}uBI`d!LIvIM1L<9$luNk5?!*01J{Y+R~soo~v^cTO?d@1bp0(BvovzPUf4@8-j1}Zl`RrJUUa9vweSFWfOFykE<&R&11J5|uO+Aw;q58UK22adDWJI}Jaa^ivdQr5$Bf{?+i zK0_J3at^p-M}pUeW7olWiILYXQ_O3ttJ;-&uYD_2>dK@*eQM=|J8MfPtI-}!83&rpuKR$*xT14-sV&A5x;tX z1Hlz=xNcTg1l+SE>U*1A^*LY@_kgtY3h-Q90-}2N6B>$LSd>;h%d@~cOOlNzbjd;& zS3J0ql7e?%#|Q@bVUyk<_DFZ}c4nSJy4EJ{`@oIA^{avuZ&0r5EHBa4CcV&X1SbmW zTs;c|7rmt$UMSNO^=pfq76?bT~pvVVBK@UCrk| z9Ap`MltLKOd*s=tPcOgv+UYxA`rGK~!7PCHZ}EjT?nn!s0RGe9v+0L=9JPb*Jq*|2 zFXk@wm}?ji2C*y-db_i*h{f*A9oH&~V5m#5O)dXp zcJ62Ndtj{c>&L@Gw|hGhxUE?~6TT5={mq{@l&1Z82#o$0ZZ~FbociZ2CYN6Ogqhl+ z%j&_h*JH}}i}RUgZ~wRNeb?#dpNv5k{z?q*RRctqba3nQSZSY( zu^Y@NH_8Wx^7XSP;ksWtk-m}eKIOA_K-bSGhh=~3!ik>HT=gDofu=v*R?sZ3d++o? z7ycr>Cw=oa>fZU{VhXM!XTKx0#iQilm3WvsMTLV|I`Qtxn2YIc+1B5ITbMLc3RScV zEMNnNaIot~%gp z^A_E`y@3cfHnThR|D*EwZA#D%n{SPYGwM<}Ot2V}M=*p#4-^qX!Ge!x^lp&f5d`t_ z9aVrwSHw0!VP%X5EuC3-Ze|2ehl!i*El9U#ZHu!K5`qrs!LaNp!NWy%yhxhc~ zr!Vdul*8^PXx0zsG8UXWpDtc{a~(Vh%=^sU$s||&D?#U`OYu=4rhYC_TqocCfm{+ldAjN>zSGM; z>|JqEdN)H4=IhsTPyG4ZKyw=m=d65=fVg<~C#p+0%2IT04c^nw=d#*nG$~uxFMm5B zuXUQ?`TVI59tzQL1OMT6=de_dXFe3HA3Qzyi{C$8fAw>xvk!Fi#m9dkfw04_U(1>m zk^GA`PXZJVO(Q1%qGpt;EE%d&R$;?#~~8 zelTBWS=&Y!DKCiprb&Ra&eJ?S@$BjTfBm1GuKw&Br;Cqenf~KNs(=%+7+m$z^W4vJ#4;i%kfiOLRtIrdYfg9p@qB z-sJE3yPi2+H&&gR2)VF}D&@BRbo1)hPY=HMIm|E1YHpa%|7vvD#L8T%Q^2yQPZ@9A zz4}(lqqc{uEWg`AKSG~-=>7WK1iQ+&>*{dPy-uI|?2R>nCR15N)!F_Bwe?vr%~e%B zrf~Pn3f%dF>mQHh-bzWnpYqunQ*O3+z&7u(VN`!6*B|-R$J-?5nbQydFTZ>Gt$*>S zr~mgiUd$Wi>h!+Gq<1FdU)4u-p>s+$T4cciTR6Lu(Z&noL9A%&*9rI(f;vNW(=WnN zb(EeJY_e^WpDcwp>Jz`a*o2THr6^Zf0_!`6yjIssao_q|{kTnP&^(~f)OfLQydW41 zSo}K5E^qZ& zDdlAZiRi1_6fOu8%eah>gTFktmNx!CHezjD1x&Vu5F^&)m-tNx%b42)O*m27-j?Ua z!;)EN_^4$8(TbxPSj(KPIGPC;m)e1%6kS}G-_DRMoS3CAPYx%m6~{X1haCog*1Exq zmvh&y?bhH}-aIDio5{%`ZHgFIY)}}R6^t1sbvVOUVxzeo7qM^x5FQT9I^2Wmk3I>NdOsUa3~>;;Aues*cQrR__zx-c{M$1H657hj0{_f@p35U{du z%UE&i8MkFt7GXun%klPkjjOB*2Ev$U&&bugyA-QKZ7d6Mx;?TgI~`#P;a!T}OZRr- zZbR{&=i0TG;JAh6cs0BsPL`xY0J9Osfd@E+o2t2vPuP7B?xt{;-?l35Ir5nh1fTWm zb!3bN&P-0!byusoMBU~sU**mBdaxa3!RKWRWP()pQyfa~TD03nqulYQWsY*vUwt2@0uXI~K(t9|3Btn1CjGDH6BsYpjJAnQ&hG16a#Rl@1UwZNM zpo&abts%Bc*5DdQgUZ32&L5-{pI6z@O>yMk|KL_nb=Di=9l0w+VGw*9$t$<&BAC#! zF|FItLBH$7U?@H2wKRo4(v6)X3qCe6=~)?E1~F_5V0a8SnDvw=j8B@|&zNt*8#t$= z70*UHv9|zIqyDsMRC-y5-^^4U*iKX2U(Yiq%v~ZzWwywyVOa%8$uZOpdi4wr^5Oi% z1JZ%?M;ZN^DKzU;Ijohaa91#{vS28Dn2|aJNpRAjsL*aXo2*qMANTxHxG4$aQ_I*zjCU$7{%$Xnt3XYc|YdnAyDtR+N{= z{NFnLT8#XE-NrGWc=BF{&9@V1ir_3k%9U4Xr8lcixu0dX=UMjqm3!Ep$u|;g z>N$nL#6d^uMxk80YsdPlFdul(H>Nn;hM{xS-&LgD_9Z@e?k1IrwoBf+B#Wg<3MmZ5 z>ZuO(y5R_q@D_hi-rIHS9?i{i+N3j6+O+u>o;q>M# zK_Vr@A?K<331JBo&AdAxc~o4T#)BxHxmvF+5lodl=c;HYI!6sqLhO|310VgZ&xot> z3Ex`r?s<$BB5`onZM@!ZcTIv5%iJs$1f%%QKrSB}jwBrIiuVz~=AuQJPSCZc$&R7r zetPh|@0=cf{f|5M?~A9aAAdc?FJ-8mU|H18Kh%28+!G&s@sB%d;#*nHsw2U$9Uv$8 z$3rhZ{L8KX`bf&&_qN6jBRzZfhl4v@ypdaDGyG>MgqQFC$0>jxKRx`(U$vRYUmb%p zVVO{stJT@PEJP`EvlM1c+s=N^{NmP^J@}K~jo{;WAN$1V-t)hha+yMylA({^y!n&r zkz$fkG$D+|mvGLt&d!~$wC?V?kEOW&YP|eM#jg$&DDGouqB@*EmEud_zV~!(5?<|O z%Ds}J8vgXb3Abk~1}~rP|K9I+SpCbVi}xk?{^F-j7a#aU%1!H6?ZDau!Nt?h)gIAk zYvZnel8dFbMewYUgigFguOu9EM{8Ewp)0qFX(tTc8;ZBHhEy|iPMY!>i156@Sp!Tr$6|@cTS(r z`uUC&$oIXYJe%~mGP%_5rN(R{BOH$Jx(m-NKH%Ij8_qa2>9T%b*%(py?56OeAM1md z;wGvb%i=Y+&*)~}LA}3HR^b$>OPjz@B6uWeXG$TZ->0~WLO*aJjd4?Xw4lQsvfJR` z{yDc`{HVU{-K>43#!Qc0N9zOizZ?Czze^pU@(z7K=J9)s7hU&jV<^1m8Vyt2Yhy0; zlVzeiYv1q}5NUficZhxUq(>$#(b&s=;9S&Rg+9mcH{Q#2$&hd5l=Q zxV9|6jY;Ko9c`=rIoe>Mk3U}DpuOO&-tfuwKV(*BWhXa0e6luZvgPX4XeW7XBTcly zTDOUk`shtZl>zsIrGyZV*iacoE=ANkT84zJ^>YC~D|+vJ5n6$62T#{q zRnQ%<2wLvpiD01)geZts)~{d{(}(vnE|0 zk;#!YT*#!y+vp3|1_bFtA-rp^2!{Zpqf{PPng1z&+qSqcM^5lXr_5mFTtyKK_{F=I zpmBi#RvsMAOkYQOq)v2|+54gn`)D2F(Wi3}4 zD~R1hD{xTv4`G7(72Lh>ehLeJwb@)4dTuj1!_@F6_909k*-h9h59JbS#Umi2p<{s4 zF5#nha5p;Wo#)ue!YGK3#+;-XgF+~nGUf#^!kv$>KFZXHN^vX%@%~{Q*$gV2D^IoH z&`xjQxXOiqyTW$h>K#Trt8Ig+g3X$leY4njG^JBRLO?5NTM&a!T<#Iv2Gmuh${$E7 zwOQQYzXED)2_9)7nBZFKKE$#aP)4w-x|CI#j#mS4^pok z<#&{E#G#;gp3+;;fx@Fb0%2uJ5!j<|k*&`YL!M~%SWlR81HHuytXsU*Oyw_TK?i+x zLxD6YC9iq9bc61P&*CY|b*Buv*PimC7_KM`JgYWt(z?|5hMmUqpgh}D4?!E&x_ z5UGJSGhz5xeM5f!wVOV+bo)LmdzAEDOLK&c9*)q+>cFQuNNYgXkIB2ns7xX%jN$%4aGJzb)+C zy1sZVDF{$(}QpRd7IIEE$dUleso}+*3A>)A(ve1_bxy3nRMusD6YNX>+IQ& zC2W>&J6K-7_>~m16vuaev>jys!w4w1!k>JjusDO=LRpV6o0LL5XEW@CX-7eXr;B%e zq%#2jZ3@^|}bWB>r?aFi3%EH%%m;qsaN;!qFk337b;}2|lRNmLG)}CMe!s+1)Sx{SQ za`_9N3C3{rT1v4#o*Ss0D)B44)X^c=jtPie=$7T2tMAS-JcU#AEKhYbSyP{=fXF$z?nBP;C(Dx^ z)!+YoHxExQ{`prZ_VmyH@bjlHy!OWFiRk>f_{Bxa06B%5=iEQL*IIbq#@R@n zHAk1G5KZxcukfn<=RH)r9R0X{UN~1#{p(OT58f)>amDAzA<8d3#dn*R=*P7mI4wE4reMZ<*D!Fn$&Kivb|5#JY`!v;CQuYwo;#Cu_k9)5j-<1y2H4<)enil<`+cHG|tM(@wFpi6xj-K>pGP~lg#i#p6QXOcu2DRS~!yi=aHkhH)^p?ASh7`Wg7 zjCb+X{=5Ndc-OL35RPWC3`hdY6nM}BI>6THi^@8<4%IKELZ)2g^A#yOknG7MncJv%28tNAXKu3F7W%d!_|}(w$HXoZuSFnJu^cTuCHo82P@xA7QiS-4tI@a-V$Um*)a=@;C@GRAq!>Rop}mH z2AXYhQh(7p(iWvYQe8wZ4&1@jkk`+_ACx1nA{Pf=okAGE6dRdHOYuST>UNjG`goNv zNKYuQP<`pZvEFmw`3{NlJ;IuVsZL-qc?1W?Y&CopD9>WLMQ48R)jpFCdY(d7nWMqd zE3d~=5ZlYIfPpR#M4_*Eul&kdU3!*g>Ev+-w|K<~oxSr`K%b+4%F?#p7trtcbMMVu z?@;@~(1o>y@5rt5G9?aQMDyx)-@2c_ad|3N&mqcAQJ=+xFKd%#rU#w3NHwa1O#j75@dRauat)1rd9+8GsCqM9xA;>p8`3~BoUWeQ{!TF*e=L!S zw7Ei-6N^kS0AxU$zvqg&c%>iGg8^@)c#N3v#Vm%7(CGbj*01XqztB3vzc^ig;V;@b zFE_#u{mSX;o4FRg^xf5maA%iNyKA0a?Z|@nQwX!<<<@)MIem_pID7ZU4;R4r_05mI z+PfFSQ{&nPf8})k!Ow)N6#f(wE~kB|aKHT|7@nV}7&@EeVJ?^{9vAQabS=>u=WqV) z>FWDmZc~-cI{e751#1E$xZY&RnuRZgn$k8pWPL!Vgkp*S`Ym;-`mY}~ zR;@m_eFp~_BOqw!No2E~bS0#T$eU@KmMV$Hl|Y4Zk4!YwSHGIvjpn*ssvx%+>XVX z7@g?Lvxo(cx;S6*s!1Dh=LSn5#81khR+<$s^{T#W%nV|EU!j;PMZ4d%fk0*S1IHWV z)W3jjh*EhDT$k)RoQOVy2IZ)_z{w^fv}5HNvE~B0Ji}30D}YjKPXIfd3M;3)K5Mt~ zbQa?_4lJDeEm*ZF%jR5FSujoDlyGjWE4PNA#1%gfWwNZ4Ds-WOXoD4kX_)jTjbkln>b(go?k0D31J&G#i9M|CVR;SSIYA9>vz_kQp}xIbQ)^m2z-K7#5O3ayzJyr zKpkpbeVzF-#-ZbJZM@&0wN70;@)8C)OJVV?DZH0E(WSxJD}Kr$?lNK}>|LbgKHgT$ zkG1>WRZR4i7k+Sh@rCatvox57ykl(?EQC|(`=}dHV2X9W4+?;5G-<9_m$vbYjXc=t zw9#9^q#GAy_*@4lt>>lf-tQw-7!FXxT=;?&ExL~HBMp?mpI6}Gs^)qkoDllA+m;Ro zXGI>>Bq;EY_1J{T7k>#O`~yA!u<$DQ*cTh{JF1F>gvVnx<^PH-*rUaCF6^U&4=KTz3$T zAQz&*o?>zY3NwzI*r+V+dE}d%RJ31c-N(Q8)T5_QbgmDD?$thy9>F6iOZsY<+TUw2 ze#)E)fo(DZJ;hO17Q>(R%L4b#a0YHTM1L8PMhothPtj9H3ZZ=P4GM{T?r3}E7Gy24 zx}%v*SaeSTJ&HYeSIG`~Er0hVTU_NFytnkqt(`W!^&tJ~u$mohSF*vYY&BNiaZE*h zCoEGYhx5Xf=k?R@WbGr5gz@O& z_}|XIX{ZNG@(fN-Ds@|i{=LY17J6Lr)kf+fisy#2TUwGAI!fWIK>QTXq6C6niQv#S zbclDH!)Go_B8%TOj%t%2zBVZE74iUAXp#Beet^U`y5cu(q#?i#q%Fa0eyeRVSK54 zTI>1r`<7p`rwMym;I4z4LKDueI`5F>@ZN`h<50A|{ujaZ*Qbk5{%ZMutfMc!7v39V zAs&Bw*9ZEoJsTr?nZgr&RK@#$`u|Na`eBy5kDo3+_R;WMd>h-O0HTA3Kl(<$rMIz3 z)-3LiEOw{X(f$AFy7On-mgJ!CYwvUJeRp{G%|pMTU(YSnZOwpW8N_G~e@tR%~2xV8;1$M)4LXQFxNw0!k1!h^|(0H0kI(Xug#QrP;<)LJ{T z002M$NklM-6yCTQeQU*gpT zSTf{T6AQCe(@v$v{ELnq7%RRw_$c1xgMS1YWr=%vx6{NU_jJD$w(2#!D_I224$6tL ztg}SBtDmYBE=e9DCoY~e6P7ASjxt!sWGH&vH_w8>crS}76JHp*DPD1r)bK>>S)-ea zVFs32^Qv9Ft)3Ch^acELHW7JbNkM z@~d!QGBO9hmjzgCpaWiGz9T6XZW7j}wsq{nZ3Ys#4s18;0JqUp z?=OWb{lukuMYzhJin30q!%dqBG!?OZ916jOUjZ=8^@;yhoBOsX|!#@JyqrJyI=jqTbEW6uQVDh z7}ftcKsXLU-W0dbw}H%0XPNm-ZlcCio4?p86unall&MV(aG_^=JLdU*H`?-Qc?;9` zD45z?|GZwJE44vG=IZOcH!<)*^%rkp;Rq+XQi|U)>zeX=wnxX629c6XIs@VGm)_U9 zhdLhGqI9D;2b)&)FF(8n9#9%sDTp5g06On+aHy{C4P1+^N+EKWkacFDbNuS#rNcR- znYcyMchK(YFKTBXT{uL$^MRW}W~g*CPYcH6i-`k|ZJf8=M0@3-uZ-ebT;R;$T7ENL z1_QjHjLB}E!`T6DI8Xy&6jsl$?5#Acv+j?zl*{b0>O~(eqRu4r2#>P$%YF306v7)R zge-p(y)Wh9abz0n*wL@@4#b@>xZno!@R9P82m~`$^>A{nR=R!=2Im0g((9L8kDh7Q z#2^2u5(NF5&y4^x8(}o5GnPL>WboJ!V>d2%^_nbjvtEV8th!9Es@{XR%G-6^09R1E zbvl4})~{^|yEB_J&`wVioH%6KI7G;L|vz zAEDC>dN@+P*%^Xv`3{{2*Wd?y3EjJEj}{!Iwh_pAo3h;c{a@O)m!FOQrF>Zvnc_-N zzv$?LlTUwcJN-lo+s#)}24Bu{m%C+k*mu0dJ~yuO&MUN`jJ0Ddi2Dap#P0jpcJ_@w z9=?3?*vEVKRCNj@Znqs0KWlV4D&fNMA=T;R(cB#!Xy3Vix4!rbrMt3S`utyMQXqU# z8rz8G;!c*yHq6;wZQW>XV*Q{sd;13JyU(Ub{{FMoH-+@GpKLu{?vRwhb~)Xrl+0Ot zZLXr(DVlq`mYN)J6a$`3=}&=U+1<5{ZYGLbyLjhc|3d37S=2(b%}6>=bN|ez+qLuQ z+*QA|oxS-&?zQ1c)5&Kl85q+zwWCI)Q0ni5a(qy?m<06<Uq9F%Hso=BBiNkvxvy=;a+Aez zjwER<=XjA(>a*ygU+d#oI47R|hM{Bz;%dErI5*q-AKh*~_ulrkfB0M5&;R;=*nTUQ z*hkxa^!~|y!ebzppR|YZVC1ZNGA1i%aJ}drdS~O6*2m$4Cn=9SP;gAVa}-93 zLIX3oVQZ&OO9`A6&y9VoS@JdZloy4L(r@B^#);Az4>Z5Y=$S|>3;LC{fvp_>s)AZt+3@8SDNx0el+zcO)kZEqQSFhXpW62i*lcF;!@+r zc#2e)nZ%>O=EgalWAH@6s_gD(GHaFtL<{u~YdCp=%;bXp;4?x}?cE&Btal zCi_hUXy;KNSKA66&kzJcZfp_^Ki!-)o#k71n8_CDhE@vG?!o_Ie&XQugHwICPyJw) zCgBsT$cl4;9R-J8EpWl@9$lZ^-4I{2vPE_xf5P`Aw2)m>)^1s+H1A)Dv;vBpZoI6uolWvg^26e z*0QO~S<>=dfhksL+r6LoWWv>*?Zt0ByS@JUE8U+( zXIWmV#Jkl+KF$Rs$RAPDtMXe)bMwYwCTVqsd zy6HNtJe2C+;pWVX+7-@VV=@W|o7srBtPraS>ekz}I`p`U7A|ZA5yV{DakZ-6@BsU> z?r#=O2TOtrAxcgLhdXA=r(u;}+=LtlmSTi=-^~ri#t|vgr+plRy<>WUtM|<)<$}<_ za8Vjt!J7rt{uFeAlr{*-3m*ir>cbrbE@n5Wz!>EWGsbKyb3mycmRB55Rh1y7MAG$v zBQ0RzyUPrv87y&xyOt2Wlz6*!9`hQU7funR%oEDBwW3{WpdX26*0ECN{h(IF;!XRA z+dbvR?_k;DSD2LK$Bp* zUcN5r!9+=YA$nzsj7eytEl>qCP+LS^$Mdg5j6o z(hkaj3v_g+`WgBL_QK?`*5~!E2b=VKF!WeHCFV>xJ+ff!ysVVvSDuu*0}2XR_ z*TFB(8Ejkbr86T7Gb|m}kR(jX*Lo(rBZR+~lTb1GFJhla>i^M_Gli5zS|nUuWfgp{Zf{%ug}Iaj^r74 z$xnQIJNa0ypdCRm8*r81)}|wShu)`Hf$#kFuT`ILk~<>LjC~5;#jDSawRhhRn7jLm zmtt<3bNGKCpVw}v>b%`kXM>SPelT3z-;o*rY&-j-KiDq+%wNqK_w*dlPH{YcBjt<5 z?7^o;d7SOyb8V&>>`pqK)(v)?g5waDLiq7X zck%XjYI4dEWw5*hZ~Wa3tIxIea_ty8DN*|e!`o+msCey!`EH8SThFOP zFeIdQjj|U_!M!oW;qt5(5m;%oPh3%(4sFS|cVn$fA+U+eSVXweH3mg9J4&AqOLuA7 z2CVu&k=#-HJD48d8_RR!T1xC$%Hf^`@#<5p_54_Mikg&nJY%pl)Be{|1e0m@j-42e z66}JGD;cEd zc;P@_NhzFlwuG;6W1@c zXKx*C<0q@$Y*3Xq1KDBP5ybj4-l4ylJPOalQ;M%X_{dnvs&5381uXoOW|RwcZj92# zuJMqnUI~c9BPp8J#m&NPGG&nJH@>U5E&V2V#;S<__rcoDom`?Y zQJmx*JlyPYzMkgWaSpMS?qaUm^qlvI7G_a>%B z*0UTz`?W*=OfWQ&QiIf7$=n7hyq4TuUzyFtOb}{|>NZPzLfLTnUX8+B-ZOz$n&Ick zmD7h+;6`g^?XZfM|5$4XXD77YQ-CX~_Xwi~P=}s{{$~?CFssXi+s4**<@ulS}76cgAUOsdTMAL+`|uijbfv$@-TC|kcXKq zTo$b`NcFD|*KdRQy%>PkKac?bQ#Y=3#^ANhAo^bP^nr#fL$oxL0zJOhpk$391r@+E z=~7!`K*OPDedMe98L|4}PaDwRP`~-YAX-p|pYC;!8fvL8doej%tQlJ^tWj4V zZGV`rcRT<^pii^#yR2}O-t!l}HZW0WxLOh*cBfg9>`;mVXMI`7v)*jh_;o(vn{RDr zzw&e2_Jg^qe&Tak9dkddod@=;f~4r%>%~JQ-eEJC}uXyOr|O_{DRD^1vdufAGmHZ|ykxuR4a} z`L6|g$hMx)j+{?DnbPufcr5>!VQH`7vwGp5kOv8)LQc8Qqv1SZ#Np(9_>SpA>6ZWozOyRl5@wIw3EAXY)~`j_*GZ&C}4`G1nDp~fEpP@A4<@l{)pqqr-=9;OP=LD_?&*kVl}u+ z2^mXc?O5!R1QUD|%6)d$`r|QxW>8?=3NJxhor0T2RlSyi988tDCX%Z2z*v6ru3U2a z&}^wcY`^jZ$I!X=Xu3AQ)$v8j;GDmgys2p@(Bh5(r{}xw13@P9110|OF8w#WqaSN0 zdE-!O!8MT!BmbIAJ`HaaKh{s@rYg&*11q4JNgyug#hv9{c_xsTHoTnGaLS99Wes$u zAe_&JGVj(`>+#36g)=5}w985TeS5pGIU1+3&E`_(8YKx0_ ziAjY~)~n34w?0?UY zyBxu6P}Q?w@m7_VkgA`0cc|hJ;KY|zpAjU>Y|<2wFr>U_cIpnc$+xc|y55ib)Ko55 zA{;XVIvSubkmWzEqa0?*QwZ&Ou(chCsrcVQGRp!sC=SzRrJsHh81TKyU9{=F2A_5a!EYo4+3@MFwg~@kK6HJ1=2{aHwa1$Voyy@J zsx2sgx9S*U5$uI`%I0PEUIW*)>bw++6a>t?aB$8|@kZ%@pX#|bjsbJeg~6NLq!Dih z)$Z#Bz13dH3Blxn=z-QPR;S#J0weCBo~&`xZ;K;8a7s7c48@5ukaYTjc-2k21pvIS zwU1IA(#%isq+hRKul!c#_eM`}^-g`80<2(p>jSK%@|K&yPWnmPuS=LdIfHtM;0o*# zP&CD7QFGxjvoTCz;t&g@1&6$qrJP>O@03#><#u={bn#9|2detQ|C&S)bLBv;a7&nW zmHpHSj^wT#SjQI)7FJ=%of|1w?09;uOdLmXsm7rc>UK(q>}P;xjfSt=wSo4#5)(U) zZBu4n@^t|NK96JKY09Qq`p&u-fp^A*ciYwS>4&y^{)hiDf&B69{JC$pM(TU@)dbH5 z>{&Y|Bi5<=+KeXU3_o^g@XlaupiqD^ZN_m=Yor3&F4o@9_@JK>%voHDXxBk&SY~T} zWoQHKh6eBnl{V3|B#d^Qba z!z>4?Gp>UKm@OeYMUDF%OCR1BlKPFGzyU?G{;cBhn ztmo;IKhTjJU)pZ|;{R1vS>7I~J%VR%x7>$XYf0&;l%Y>;Gql!=%66EwV-sdg;9FVI zbiiCf$DIy+Ixo#8E%o4W(M4nGm0~eOVU&*!=NT8tN6dD|v(E8!EJzuaf4D>&(d+EEdEg7P?zjo4)5gy8>NAr!!$7rdpX$WQgvU+V%9siM zc%ifPcnR#X`0mIRMH>1`DJoW?Ot>8m9hapu^d<%;@ z3vN*3ITuY-PX!||^~5L8)wr~mkBJ#FCWVNiIrLTdl3{|Ys!u5*VBfXr zAWP%fu69Z2y11FrUpqUp!WzRljwYiF+%EUsaK?M0`tDOYNhoN+=8xmGGWoSHD0))U)9TIg{ zfX^%npV)E}cSXTdl;K)}S(R8(rrZfKpcPJ7B|wLY5LKm%s2&RS40_fW`3&JhuJS?T zRd+MK9tu!x`I?;pjbg#$M!c~q^=plrMhAuBrbt8~XLXZNFIkyfw`&*AUc=?Ft_nM3 zKb_M=#%#Vbah5O%zhEe6e(TP2uO6@sx7ubEwJcdvw;0e^sw$K~Mti#5ywbeZPvee|&u zoHw^`J^!8UjTY4ca9IKE;#j)`^gRc-4FU`Pa5nW@0_SYZp_3I34`NL_giCmYFGDS* zNGHDx$9?WrFKG$ms9>rY9!gSmYqR3O9mRg?01lttVSf!*dP$wE@+KaOQUdibi@JG& zi||Pe(j$Fv5WESjgV2-boDYQcOdmUT_VH zsUe)%LCZkeqR@+6y`ubZk{eN58;9rxOKrRawn{92i-Jc`PZ+e&7)7rg4a)uEP)4VYF?L`pskmbKrtXG9T@P=81i9?t;(3arZ-y2aHiF;p?mh z2gm9-dgS`kk1${^pxH-;hMx(a|Lvn!x4+RDgIoY_#%NjZ%;ITl>-)5=jL`%Ij>0nT ze!YCJHhX&*UGjExOfjsOsRLNdl=(Xp3eR=UY7CCiv!K-tUOp2-B%wYBoOg#=yDVPU+yAky6L~Hm8+uaPuTy_(jcMpCd7sdx#Q}-XoTE==iYxLkmTQpv> z*j-TSaxop{B>~TdCg-m|Kby&n5S=o(Z^M_9KDVCz?d|NhzPMfb%YV6zV*X-l^`6_d zcV7%nv-FjzJyY^#gBT5D$I)9aSN?Oep04SR+JmB8dr>Z$064jk>*&xx@ztA9-ff-o%pI?y~=9LhfJOp%zz7@8WFS@dzOajlJaws+o}@$B@G$I6HNp@Q|1 z6rJ-qW3Y9MHpgLAN0ZhvaT%??o*O9ZPh4g{6E0rd&c68@6&LS(=?|#j}|H6v$JYeY5cdU zhmW{mw7O#vHpaHQEYBXhn4WWqd_P4QuIxISG6W6QaoUa5QW%pIr%!&eHIa{QAGFEL z7yjA{!xLTFD^622lOKel)!A!=)%tDDR~VVVRn5_BTMc zO-!Fv7VDZUC^9EtG4{nAjmkEF5lERC>trw#wTvf$yRKj=Kk^6}MmU%#;UmNJoCH)} z`bsbqHcLK+L5HWxqbw2#Sb=$AoUs5`1`jN3NqvJ(u0ubw6Dyt?JSRB6CXc6`o3twC zOce3D(9X5N&|K|;?=uvfG^UKAMNv1|<REJ&myAFwVKk6?1q?xmYeZyY;ObqC-N6+(>Er53Kk6~=ywAa~$oe34Bq1X2Pn?Ked2rL~=AT;g*FYB&V#&JwUhWrlqDd3eI*X_*w6(d+shO==9}&?J zS}}(a7GS3tpqSg`g!fmU|K|4mTd!>&M9|CSGTN)in<3Pizz@LzW0z-bKuo_|oYb9p zDGh;f+M$Mom%7VpuK-kYi{$SqI)PfJbbgzeeFB|~;fo?K(Or2|KIP?zW6%hOAl)BY zeR=Dfz-XHnnVp#dFMQl42bdLS1mViA=M}6b{l@sw|J?+SRu3j15mUfkSOfXmd?5A{ z)7WJ)JssgltHs0)E?%>Xm6FFTD#p~JOL@)#trXMRV`kdRo5hNzKVV?`rMVlE9$$Ju z>i{8i;$fCLe|c!=Sr4I{-m89hgD)x#9 z;8CMNDQ9z4CuMpPkLxH!LTgzv#!|G>gJ8uG&MIhdkzKc4!BFS+r;WLW3U{IZhV1%9 zbl0=ND{NNo5r#z@@T9-N`|y_XaUIvtfpaW}y{DY%yZSnO)C&u(jNXmazbAQs753B} zzGXQZ1$ZBPqcrtS*%WBm821-?)Q|cArh}r_J;g?8Fb7lMUBC64;L@J=D5%e|E~{<- z6xVR1E_zEnW%%OsoI@HV;Fap5FZfrYb{oa8GN&&U4lgdsr*xjBrA+JN@;KIg0uO0F zq`%@1t=E@X3&o#2`nsN=c|E*bPa(XX!e+CX*?t{Jl>r9Al}(CnrWE#SV6E60$A(|` z(paEdaZ81FY2k?nM65A>8LgK;*X^xiQO=raIDM$|>3-(F*iPGhbOv}z8woSsJKO%Z zfyR!di9p(+_p=5oE5}-k6-4*=nEU*+LLh7|#=yoiQ zl%s?M*biTXT8f{wU5=+1VYSS8%!Z|LIV-4!wq3ff>R$dcj6o3(4I z(nUP<^zlEFg3*qUFZ^E0VdsivA-teKShohxKyzFWknmQ&1JLoi{mQy zz%y-#@~PgpKJLXo+HU>Rzh6Er)A;NEU7f1UYqTZT&RiLLh(SG)((|eC_Fj5omO~SY zv-YhrxURm}dZMfZb57pF&xEt!;vQxP%-W71%o=*~=%+`i^?d&7e+b+J{(C(@-p>By54Vd4YPVc5P9JEO&KrHQOq@LaRQQXxz4E=Gi@mjgxvLU( z&#UvAgdiM8Urkn+)EK2Ud0~zmA*g1tBlvE1U98jW+kxDg$uQSv(bh$Iq3!+s&(v|E zq4!d_DR9cuUZN&XM6~srXz#(#Oxm+={d#9mzEByh$N%^brW}5}wvNAR5BPZR#b~+T zW-=Ykp&zaBu6)o~G#c{>_ST_QeM*`b*D1X1y8dw3=g#ySRsGn)Go#)le}aU9tY|}&SW(# zKjAj%LodS@Fy@g%jW(5EQRE`K;8O_iB%0?1F99 zH%4AkiAa>}*AtY{GB1v_ zR9C=&)0=sMqi)c#-*NNk_B;!l;ku?9;RoQvk<*l(4;8#a8S)&3{E(qy%v_j173GS2 zgM;!iZ^Y|!R$hcQ?Qpk-JBg8AabR)L?luVCi9lxtB%$LX;=O}m)|s5ia;Y^A6i7@% zI*X2H{H?%!g8Q}3GJ5Cb=eO^@_`L*oHCaOB5x245`f|c%WgVbW!N8kt7u>;LUUy^A zghW<7HnF>4E!|YTxGt@!y*}>n3Z6l+I@!j!f}`)EfX`pi%>d5!&AprT zhB5A0XdP^T(+6gzt9YK{Mtyae{Ypqv|6)u(xLFj6i}rD$v7=y(_Pie9Sm3lzWv-~x zRwg$Tdu(fYgYh&jJnK>5hx$;W+tFg;Lcfh;rT%P!$qyw&|Jl|HeyUwW9W?*mff36D z=#-=3B^3a+;R(GT*GPZ}?>%}Da|Weem?YtPM(I3|z{E3|a@=IbM1n)?DRZkFG*g)+ z;C-N8To3CFlLtH<6+Y#lOJ&y#Q-9^GI17h8P94yQ_!J6xnsM}wMQ^O~g&Dv{VJ;06 z^mNE;rB!!r=1)02MjG-FUx*ao5#w-q(KWmFRxp|uCdMdy6MCqxx`pGYcI6``{C275 z;I$C&d&}ZBctsP%lP_h?<;Od?a-pYnE&Lwy5XU8!Qq^0Z7k?@DE6>SS-0~A|tbL^c z*Qj#yew7Ok(uU&gf%?Ubgy?J0+5PSG$2(-|Auox$&guXk)X%le;G{}Tdlm;x!>mi0 z^CxXg!8&i(5}u-kCfjzcdEI9zId5D4lOOqPZi+uW0wqL^8x{Ap1omBn@%d}dN3`+X z+(*l}j1mA7WNm*xn_lSe6azEGSzazWixAK=6HFKYhYMjCoVkQLs=%=eSF+4`CJZ-W zG~xO_YnRPt2nV(xv}8G3 z5Z3C2BbZQTr&7Tt9ePg~GV8zVK=Ikp(S|f!)WXe-k%R5ZR4%+sBh=dJsfzurDnq>Y zlUw*Fs4KhHg5N0@WlC4vX2vOSyR0~K?%(U*OmWC{F9q=Yt#4;p`*J(Pem2+9&txTR zQvee%Zwhq9i+bT>thCAj*Zwhr*@-4{l&m~q99keye^)pw4` zNI~4gB|hH4^!taNtX9#*o3BM36Gdu(zhsuC$a$ zJAK~y<90Ir(rm#TApv~hKI3a#F(J-}z(Jj=rBVb|s|`p|inWMlNM4VVTnmQ;N( zmuS1hQg9OuXQ$4X)gdKlt(s+qeJ4?`{9jFaNvk-@f+t z_EzzpXif4}lP^_%l$8`WpqyQBwhN9-ld>!<^?+gl}=7H$T1XBHO40l62Xeb4=vr<`N$EXv` zi#~%l1$6hLDTI(+okGBxvDKa`Oc+tQQN4lKvkH88xfd>hDCZJY;N1xkUk3)Q^07_K@^*kZ z>rfosSlKRd#?pm|>u5!tcj65S1c6E%eBy{O^)8Hw8rJv}J3H{621Ux@ z-PTu}MO=fE>F5bUX7*&$^OczJ5PpBmBm&E;SouXfkGCZim!_D)^_eoF*qXz zGz4sQhlKrTUSa)GGT}ojp#0P;4`Weg)vkMti=K{+@$=QDcTy%aJH`Uf6y>oXVtC~> ze+FudSci`Z?Go55P(JHDX3KhLfEd@7GP`{JfdDA;;+$a6lYfKA0GRSpujNw4GB}Hr zn^7}~FnTb;!>|yAgwjV$X0Oa#5oFQK3NI2uslubY$iGK%?I20$hC_IwK*PHU8Rs}+ zO=^gZmTKzmR|Y@;tL%J<}}cpKJE~hugyc zBMsipmjkQA!}TYYa1%q`t^Ad#fWpdOKcf&XC8d{z8RzEe{-_k)D!;dCQ^G!%PLm|^ zXBC1X?vWOdPoBZaO2&GLzPPi>|3NdhMaDB`@}S?vPo~(OJ}h?fq~uXZj^)9P3wX-Z z=OI%a(3W})&U=SW#ZwkUk2_5fw2Q>E8>;)_%GdY**F`j1I3Qw56}31NLf#SU>Q|id zK*#Vqu=S-}iVv8Mct2VLr^s@XuYPSZ$Gtkq$2AiPrS&w{wBqAw@U;Yo6?Sa5=|{ya z%J4F-;0EaH22}4$2bNXB!jGq`cvJOZ*?ssbcklAAVdq$h3TNq_U2)4#|KL7+Zw<|o zN-4b5?A6|Y46aPi#|;K<)$m6}6o1Dv(DC)pgFP zV$pL@xcDqO319sZZe^XfZS7AI`)rzs(e|P z-U_yq!*|-n^lQJ@`o>>RL5$8)2IssxlaCDsyN6Pgo_eY>vXC`)S%Y`}`g18iwUKwx z)CE^t7LR6o2j|o2qKnREoVA7&-Zn=&Z&GuYtgz1lPGBFp(thZOMYuLQnenhT?_p%m z#!Lcigweak;R@I{VE|=7n!iDS-9P-9@Lrp}@|~=>U#(tEOtfC~t+Kv`x3kvv zT_l%m+_a;&4k8Wb?VE6|GNRXzKJK{Y4hZwp9<|#{&<-h8rxeSJEPrz(LY`Bzb}ym+ zV$v6>&6`Xt%+VfMU@lnvU;SS2*sLa;*7vN}3i8sT^(xwCIr}U^+xuA>@6Wo}&Z)Ov ze0%%GKmM)lcYo`Twtw>7SGHH;Q%}b`Y=Bi|;(1xV;%VG5O`1?_97#1h$`)r1IH!E1 zz^xIpa>yLTqlC_Z_4OSaG0ifCcmrvS5;aE{^xmYh)cDp3rMUF^F6)^%qnyD@ylBq& z>((YyvqS3ep8BUcPC3RcvQlu@{}?2e!K-mrxU_-ji=sz4!9Pw?-nFyMbk>AZajTcH z;^+;wTs-8lPhO&-z99p8}b;)mY z*gX0K`?POLV{$i_^pnO7>o6l6!NXtHhD=Q+R2SogO^-@Eu(A}7D{4Cm?;BHQ6D3E# z#ltKm*gyDSd@Ji@=eAOa$&$l+$gOBMQthaTP)+||SX-vuxkAHr+; z9(oF)ex@QKAgl_~CniquwU0)XSiIvk@8|0f)=%ILu}righoVC<2tm6c@|E3`(1Qj; zOiPGf<@H#7HE~^{-Mo8<`%ToYtZoY!H!8)|$%-n*{BlQ}2I{@Ba0sa| z_u}+=#qD>6Ex{(sZli0Vaa&KR93@Y%Ze((z)MO%&2dpM(* zcn|KmdbjSd)`cf+HEyB>P-;XVj8W=|65R&V!VSx*^s&s<3E-r64Fhw*zk^CCh*#>A z1brPs$49HP2Cuv*gc#H1I_zvMTz-p|%fO)GIR-QX`MyqG9v5wGJi88t|9Q@O$jW+p zwY3wuP|kMTF)sP|1}AE~YqrPWTpniAid?%YuM6Q!-u*&)_er)xB?O!mwti>rLcs>U zsZIA3MwYw}Lu?aNE|9N)^^7hIl$1N}s+20F$$PGWVU=h={8Ktw z_#QMBamp+6ImCVPQ19SB+$&?qNv7cI3%vT_OfnRY3+Y(Lx|g4Nz}?YBw$~G1J_gE# zorV8i4GtGYtg@sPr)>IoxB9qEVu%#@^tBp=U_tqc%x5AGOyJf|4ZpIESM9gQ+K7oO zPr(Bpnx^2X+xs`OIH&L#E3P$Tr3{MfX+qFt=M?Ir(Z;!Tgwd3vD2xwg(`AST5uv&c zpDJJ1wS=-M5esl^SMiN6g!L56c6{8m)@|o_1!r_|!L11hlLXfblV$4L{agUk z7y40$`CShH?zy;J82hYvl}rdy-|FSyb1;pSEd}HJt*@jcg%3h?jOD_5KtfvC&)J1< zXT{@Q%R-uRjxP@$6S`(U6!AOk-cF+?2~Qq)Y`gRAj=}iCKiPH*OBJJrCmu!4&!0ao>)kINYw8|4~%45=y&&=#$$?o91}W61-#W zOUXWOo!c5us(0rk-u~TxnoyeiYZJW}@6|5haLzrePwd(lgAloE*VY|(!Z%viXlX-Z z9T(Z5wXDwdqG=oJ;_Y@A#;vuALzjqA z*(rzn&VU^2i8BSO&$uzyX~)tuv=QxDEBMw+HS=4A*N5U4%G7uC)p^Ey>L+sqKz!oj zwaR<+}BvCWg5Qo<1C%G-+`2TW@a9eetW?zxwCDyZy>{ zU!DU^?u&oa4Dr+T;i+WJ-{3JmG;7A7Z}6%=pp*WilY$FSS)a-;pXoo+&1?LumtFXi zeyun0lCs`!V2#h=)%w3Yhrg5_Po91qzZtnPUNq%RX61rThZj|}xCWrnOu<&WN<2Ij zER~TWWkT*GoZ+kZ+U$@HR=6#%p%XG`c~N3U*$v{v)d^z-ow5K@znZm-<;_ED-q){Y zGnT^F*ikLwQKM{vhx}ICP}YV^DgXdL07*naRHAHTBb9v=LQL?gzlr3)uDCg~wTCq> zKyPD6@h=tM<~gV6E7?UIq@O;nod(NkJs=h19RRZ2_jX$ zaRdECn`?8faIQ_^k-{7AP!>JpEV+GmZxdAL!g|oR;t9~wZnxV0B%Y;>OtdY0R(JUx z6+(buxKN6qJWLz9|L}s=uD-y%zTEWckY1r8ETL#6mbU?iZ}7Y~P!!8Y47iwnwrI0A z>-{RMctsSXfkMmNPil$f-QU39gT|V?LsBHvy>~_Ir8scsV?d9EP52D>-64!Yj<_p{ zlzkA8YYA7==ZXVA(^1`5KiE;`Fwj+>b>ud3%Qn=_7El7sV6Xrp z&NVBOU=`tBYle%33e&gd@Fc;>W;7?w6u$TROWXHe_|EobooF4L+Du8XTnX8JxqO-< z84GB*7^P4>`>3O~(8;vx2(lqwT_|VjdBoc>u2d|KvF5Sr*=R)mhyQ*SedzGge^CCm zV7^*GS_tnzBN!U|tl`P~)pm8GguCjASV}tsQ@5B3rGtWanvigr&{XFh9QQqnTJH@E zb|tm$Y+SL_xiiJMzv#SXgjoYmt~YBu0$pnjF}yx1ATKatY6O3S)8pforGRUuw5buo^D=a}JQpbG>=bwBgR^$>zP+^+D_)OR9caFA zYYOk-ZZ(JugNv9aUv-~xqH@4#HrVsc8c;p#TsmV|`So87z)-hWzD;Jd^P?Te{TKf1 zcKX=E5mht0c!lyQq0%J`@8ijoA!`IPt1L?(cmAv}+&w4X%Hm45kB5A?ISWA}OAE`= z@NR-y%mn|qNTJdTMhPRFq!e&*n_~>BbJA&bjdEBdqjOdy#~#d1pDB@}NZ}OnS9!c@ z#t5wx_wCipGIMKE?O++p9B2vFl|Jtc^!OrJOUzE49(F;C0n~G3k`?RUc zF6-M^Q|*Y#YI>Ypn>34ejs<3fFAW$K#iOU3*|0|6CFCB2crc6AxHgkn;c0fuOvnc| zCE)IBUrqUYDZ)y@q2)D$xVw>SU_0|&ywNV6Z@yT51vPn)6j_@kxOstYtUG+@qbVIv z6`|>h+(z%d{L*&&U;Mq=yH`&?nx*hBB%sya6e1%a99TCyC39c$l-qu+T zcdE_oQ0n~1{k2C|eX9ROF1r^gfs~A0N)ur_q*kqz_0C1K?#!CRJqsllw$@4B{>m3( zigk*t8s|+|jyITMxtChgc3)+5K>WB>R?_)9FGrgRpxTB7+Qum}W(7}^%==t?jl0vP zA0%5mnnki=9Zdm$qkvHWXWe}D?R;Ys3nP@5Y}Sy45B+&8>A?>N`v*VPd4Au{74$n< zG_$m|W9Kdx*^30;yWjZZV9M(D#1kpopPaglvTx0;wU{=}OV-)4_`%0XE~M78YCBd- z>sV(J1x-*8vs~jSHrF{bL4#YG%t5=X*DR%V`gJ@?R#I-H^~>p}cZ~~0#ES+GwTtz( z=#Ph0eciDYa5WZPYg-@vcxy*bw%2~^E8DOCgJ0Qx`Pr7?)bk6__5SMjJ z->D3IuODOwO>w<7jve}`ar~@4X)Pk=IF>#GPkEc@p7A7D$vS7j>TEyN#{WhRN_H7n zZuKB1)@Jy`neniEW;u<#jfDX)N^)@M%jB9-x+xy`5rsxPxDj5NWU7f?{_D7&a1ZmU zESj&07oFe_yV`W#8alqQa8a!TE zyRz;UcPxz2$LvsxKf0tBPyPEiPVHzpU9@WaVKAtrn#gb@(=?9!l#x7A^_xp*9kcAh zk2V|FDr4Qtodpqq41E*WrkgJmi0d6ovi z4>@lp4;Jo1*wkq}(9r#lwy6w&;eKe#-TVW-+wKR63yi*Ns$Ph{TFlKfnVU%?K0Jst z{GSwC8SY2n`u_ORcrOa7`2K4pn>>eUPnfc0j7G{6zWX~S4RyupIUrblT$E7)o5#BT z2wsHLLm!*xA&k;!ED?1u^%(T`JTv!|cPFA9p{X!Y4R>P>?iXH0Ksscgyy5lT=u19u z00#LJQfeaWmnRI26GwRW^E`re_3QVLS++!EzZAR;XfNW8tc|-q(HR?rH>JjTm|xW>q?6pXq#{ zt2`!oo9s|27i+6BbiA<=#2k(x3i>K4g0mezRm`vk~4akYz6q zn#%60v|#9G`jNH3M_0gD=4=q6?4j4naI524%Jcr(pCW;VMD>oW%?r!h4)+ z>R6n)`q2kG5+p>cO11N9Uuh&6cNWyY_#67DJ&J_ynzhCcTwszGEMTYf zDPz_UPgtQMbcyQ{4o6EES#^{iK9y(q=GMvbb~SusOE#*KTH1k0Ie~B~*H8J}sf{Rl ztiQ*#$E<(%#6+%|X}1Gt0?fHJf=#x}@g9H)Hh7`LUN+lQ8nC#)h!vu%vGmsewDoK# zQ~BP3X*TC64bqp?TQmv>_u!Y_$1_j=;*YkL@N)_MtbTpUcRV+wO;BVZsdgi%4tfdQ z%AkOaV4FZ~Jzc^#E6=XoFn3ux#szK^isG}P1gC*zj%A344_|P+0oNom!Q3=i33F>Z zX)PK-b*0N<*k&Ai?upH^U!*K@!OP6FgzEb44iiTxDrnYvxO?#RI6}x+PAFg12VaEX zuBpQei11O~M+>2ud8b&im^2nmD-$5BQxl&xhVacD^Kwc|8?rQ`8J>ehnTrg&2~1W# zY48#V^f`o!+l&72m0*glmOwuNl^4A6+7ni)&gnX{Nyw|;Zu6M$q)faT?Yz2Ou$B?9 z-fg|!_kO>;6UOutZk{#f9Pd!uvbOCXdZsmmpGetxymq>gCF{BE*021Z=@Q}O{?-eA z=BKu;9X-blan^>WtOWZUmyn=IaGQ-#v}J8RN;lyzM1y!Ff)t>$EL6B{k_VFz8`3k<;g!&J+rt` z(!c$O(NJp*pZRpkHY<4e;xDAra`$CLeKRE=exsjJHcbMdQmG&O#qzr_FnVf0u zr6WkrTSGddewJqOXOdRmoK196_C~4gw|oLVk_eC7f5XWfKT!Lyg3o3i4bFu8v3PTX zef;U|^pPj(QdhTEf9_vyzxa#4z5V0wzBaP-eZgpQN!dXg4~*8T5}88>7{yJ4txgzU z$E$nB;W3%%u+?iUf2FD4o@3NSSsSE@+t?B#M30ip#6&l<<0W@nZqen>x@1z~tj%qB zFe!VKuHoHybu z*jU+3oR~0ZBF5z3?BZ$-ug#mZiTGWXBaORr6Drz!XSdK$dv0vuiKZPZ!^Scr)53M| zjyx;=KvnGn4tyV42t6((%IibrmDqJ?kAR)0c{dM-00_qsXYZrW&`qe<;Gk#x+- zXTAoAd7iu=>yRE8U7m;Oug8fhD-}V{0&7Y*7?K}_u=kQ5bgAwdKYAlN3;xluh8zN9^e12*E*6kx4Fet z55kMODO@togmv&P5|DwA$#TFPM&R{Sb}@;%R7B!?b%vSg4#=r%CEOG7T(+S}gUsy~ zo!&8<(BBB%!GZYq5#vcr?P{(}mx?>PmSRYRsygFYGZt^hSYLVL&2bgAVNBg?1gY5X ztp5S!t%whPg?or~(vFLy$ID9BwaKnH8iWyNk132Qw z;6!8Hn~92u!2PK~!wjlu7+RItw@z+mX)wGPp;M zk*IwLd~k?e(f_tLEk zO@F`OC1Aq(lDBKpfos|lKM`js_$-q8*JBO%f4S|=|HdQNw#RcJdcQ$`trH85DPOS| zYl_7*SeX<6#z8?9NaYS!OEHq>MnVh0{OzQ6YYqpV;FsK_1snkDsJKj@>Dfy#v;2;= zZQ|=gyN+$xZx2N4lo0vYiS*TWtb2FbYHdQp?ee}97QATcF3a*P%b^wZkk{txx^ddf)**e-PMD!6{L`Z6VQl#uGgQU<4@&8K&ZC$9K-hW@ARY+7Ro z(lqirCXydIr(oeVXkxD3!6SN6KMCRpgL{grS})$W62Q?YMPQf=YPNol*|~9#uJs{! z!k=cXkhJmDD>Wts@LIyBjbE#HGe25)#aVaNN<_Uy?i!=uI3 zJ

grh~a}d;+;8u11_Z@cgD*HAA?@nxVmg0 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 z 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 z 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 _eDIp{ z4b>Aa!8h;vg-=G|t(w_)RJ#P$=oyR#^;S*ArnxaRjr`_$IGDYQ_A9AVo8F8qOd7o? zmipj%9?>bE-n!oAmHOiMQ;17K($Ns$JZ%5j-u0KqGj;gsyWPJtyuLb@0ab>}l%j;Y z1T#s&_B#pP8(6hPM)8^nX^lR|w?ACIi#mF$(9q7jV^BD%V`Hn$nLNXVK{}kBM`?ZI z)z$j;`>Vr`7=#(AjQ@-a$?JB<(J})_ntf*p&VEY9euiMHi_PWuBJX2(+P(X43c370 z3$gq#V~K~We&^Ae@J=M7{L`CW{^hxT{N^8Lyyh)3(dW$@Wf{&bbhnUld@;kO=jvfN zjg~_Xw2p`N3so!xRv6-1IA-}CW-PTu$1x?N>@yJ4F;{fS7Ju6SzgoZ29>CzHsE_B! zSkHqc3C#ZMf4lP!|9o}$lYg1mViYm}?Ju08LGWHW=7a_3RolN-c%PlosQ zsBPL~Xj~n=`zOg3L!&BbY68h}&KF%1-Al&3#tl`9j$guQP z_0@+tGJ*U@8N7}_jB%Mo4}f*EECpsAy>JsipuJyUg6PIL}F(T{dQHJ>(mqKRLCT}AB#C~Jm z$wXc};6HC;D;x%gs>!8IV?QOJTRk6c=ZG}-lu*bxsjn4m-e@tL-pW&`9`vYzTABJs zE(9HYe#xMk?qcDCA>WK*-!Mm1g=Z0BR~YcRMK=2&hgp+xzAVlrIP5*I%7eke8X0<` zMXawbR@X@(@HY8XImRF4_6exK>vvWAuNP8MNN2Lsk$&@NQ9LLprxUgzqdpH4N`$k2 zl%kWWX0la-D;7cO?Ub(@Q>Nn4Zk`<80mBIL?knN%gc zXtS?w@`uS+7$f{U;WnVcYgi5s~b<7q&s&o^*uFrQ4(rpdq|

I8I1Mbyjg+qjkX5~qG+8qfh|9*=CPa*F#Y(>r8gdPe`Y}pL zLe+#ln{i`~gN(t)gzm&*Gg@k2=)(y66kS?x@K~X+YP(L!8n0s$f%*(Sdn%T?DYD^j ztO+51g&mx@phtO%VI~|j80=GIfXP-mE8w^QoCcvu2;S37$Iwfu&I0IOc&J0uCx&K< zIm*q#fsxenGl6wYw=2BxZTB2XtsmoItOA*qgoI6~7bd7|C6ePQO(_L7-mf$C4#SNy zW8_f+2pI1MmrqA;m>3^^CMn8dEa6W@tlCV1l-lMco3=A9$9vH4IX`jgu_9kxmA9ZE zEK(ANxu%WYin%5({ai-jnfkuV&=j`%IJ_{z7)cIgr;MI!^0}5b@Lc%Cw|5GKz1w6> znRmp+jSR+1)gv_Zi}tuIMz=mSeqwrWUGN`Pn6o#7QC)FK81Bym?XSle+em=)6yyi- z$K&92zMm|Z#*u!PD`mnnABOuLZ_nIb$5CunpN2bpaDk^VFXx2U#0v-aGs*+wOj-CC zHViwwq)m$SLG7rASB*l9;#&%OLx8ct_!qu~r{VU?==31v(cZ$_AtPIGbv0TG(vDC$&w~v7FT#TZ=&NGdVMOU`WEvc+d69+a+`L*H=jx*bGq=AK0vOv>+1YSl z8X@x*qk+P&Gu1O>U1(x}@UAn;;8Fb}p94TYOoOiS;CT+566P?Vc`U~`BAC5SK756@ zC^a~pP~qygzmmsL9bb*9%8Vi78Vpx%#!qc(d4aZ%!I}15HNJYQ3paL8xHckD7Ep?u z@T}x4=7{mGkq=!Hj=3CJ(e){pe5=$f7*)L{#uyA1w;4#MG&Q!yxbz7lc;p0cBgcB! z{VGh{EIm+0n?e=ij%m|aP$yh?Ro%j48t?5l94likI6=nL>n6Asdi7k7;MG}3>IWly z3_^8HIgp|S9Mz`!x<0SU%xZGKJrC=11Wx0@BFo5DFnVXv&T$nF2jBl!c_x0^92Q))jXwD2OzHZCiGtIy zMw_S03R(#1E~OouB0pN`%gCW9Hb;hI#@ToW;y3z1mGy3(jJIIf9-L9gdVchUnLlfy z`AgK#D1Smky{azcrPwnP`ef8X*61T)u_q5T`Yt|WXT?h{?E~iX8 zQ*xJgcntl<@zP$(e+ntj#jf+-7{9Z}%D&G+MkP&QFl%J<^z(t54)pO`wU>vpuu`y1 zrp!A(t4zAfg|b){4tVtD4_512FR#vgkqj+d4G;cim!$WP>L7=Kb}p5-An3Iy^^-mjFa4V`E_N>%W<9 zbEj;hf4Dj-$&%33{a1gjBqWt*43>5CxI7cWbvM^um;^I>*Bg6x-(Efb!T%VMTiCeu zONDM`WakMxew+wPJEM;>9@l59JH6MwzI7qSn+sjDfMZ{!#fl92Um@83UyL_a$9svT)`!lEIY`Yhh)s;~SpS@Tv_*e|VduCropAEcxL@_n()+R`q7$ zbmkcY@%DsmCi57D@T`>ax9lyfZ^lao9RqSn&J=G3^E}^RA20Zfb3kQpv_O{jnCK$= zstg|Lj|CC(4&29&TfAvsoc)Cp)i8Lk=sX+0HxUX0U)zuCIg11a5IIGT2^pQbtKS4s z^~2n!B4@f9f|oA$tirtlaTLo@N>$eHQ-g4xt)TiSiax#6?H8nsve0j3X98EC7a53p z+M)QIzGkJgAE)h4Z3efp>Zwy`4HDM%dJMv=t0ziJyLYA4r7_%srcP%rrSRsx$#eB= zn__>fmCpa*jW<@We)p9S)PADEI}e5lP9}Tp#t5?~@ODBYe9Wqk_J_jV&jTUr7{RcK z2r$V2n;7GSKTnkjWf#$QX`RdJZT%|*b;_EEFmf-y`>!$)yibOyqcIMLxeTQGXCFnO z31hG|8CtIp}ThEbkE z>YPhB6Ihk?9OIJWF`KZPgz&YaF-&};)b+fTm4&Vex0Gph8H|Gy-Hd^z=Up4+1CIq8 z<}~ooaYAyNyt+95Tx(pJ{_215_MX0It3i(xiz0&t3GV8gq!ovzzIQo7;W|CVv57f%jY`YYFpOL?)Sdmfn!M+h71qwT8Dxg{UAda`S!O? za)|i!^D?$NKI3*YyB8ex0ov0jYz{m;B@Da=y-y9Hsvg>bK)v<@Is@^kcwvsMsH{Fb z(eL3$fc9cAP1eo&I`pY-I2o@{Wq1{@)URjq*m~|>9^$)sGAa1Rs&*pZd}l)DO^kFDM0Ph#5+i3662LIZH$L$Y72_$VGMvf%*Uf@TmaWyxQn~zZ$chj z>mi=lQK+jNJ;{N2d8oEPpzYIp@M$lZelQ~OQeJ=8*U5okuI7 zRp0Tm{^NszKiIYD=7RSsQ?|dF*6dd=GGyqguiEanxwZeM{%s1(6Dj(Xk}p$U@0A+g zV)@f0k+}ZiFRw1#xSpKKdz2zSXYWp%zQ#l-;XV9_O$_18Fj+mNqxygc$zZ`Ye>e)G5XwZ z-koqyrFqR58gNhtW)ry!%d{xeXuT|4fL2lGt&!1fm@#J`uKnCB)B;pXD&;j>JP?KA6Uszh^z?3DJz z^^)0eO__Iqc(|X$9UWufVE4HX?w(l;!jw(S-FQEpgVs-7>nMj;gEg;49*VWI>*D33 z_us1W7O}407-e3vlU+wWjA7GU!w5S3;LTBZw;4VXvaB;WrtZ8t5^3n$7;+5Ryg{3k z`rZAXWyt(V=R>!rkf#%#;oG8pM&#z|bG6ZU`N^Mj>_XmBy#7?i8GR=_Eix>eA-*ub zaJa~UddslVW(J`J{&j}cjN_uvgfFjK&|R0k9j)PtF*vk@6Gq96LM`(;iG-SV!kztc z#>@UUeq*j3zWe8^-CN(U{bbG8ez`th>3;lX0VHGSn8DqGibLtQ;dNC)m7_oZU-K^h zaJ*I9XJ0OC@}=qT&VE3lrgS$jq=V=K&*fzDY#-kCRvBjP<%{<=+rmdb{7L&4^G-%L zI6S)jPTu{J*Sz?xR!84&>;^-qSQlP8p^N>PL)Z)R6xKQ6r3@GbyF?~wGIMZ!2J7tK zE6IstOpK}H76LYVjcvz=WbBWl0WYI(wESvp4nJ`MR2`2YsoD85ByTRjyub8le1_Rc|6nc4P!Kgm)X1Q8vdcvOO6z(CW5XBa>Ky2owc_luA^9DH?*Udm{D_i4~zOX#j7jj{AgvusMdN^F1Jd<2K zm4}Af^lfAY8B$yD8$UIZEJuJOtJOP(uW_sS;90|Q`++Cf4*_n$iEiiEiHg+ZG6BxK zTT9cH8@=lC^5x{$={0bWHwGCQbEp8O7gzx)Y zKdrRi^Xi6sV+fw$zA0-aKX`Q4q*~gCuC-ULY@VBQCPv8O{b)~C1m4dr{A#OyfB*GY zR^PjIbM-_*Z+*UgchrLwmDvamff3TAx--FK{7h!fRw9LeqUsW^5aF93b_quN_F!~E zItXnYi*W|D7}W6sYCi`bNm{pwGV$2CYp*%9u>;arfwr6Fao4p>Dk9npqgP<8D zXcfL8tY;51fMzvcUlj5Wu4`NT_+AtB#Qe_yUT`>kP&uq4yon+B;am}5}#l#G(qec+E_-Sw*LR^LT zR>`9bvB$k7e&Ho#Ts;gphQ`%Afft0ARL|!b*LMp~yq9svlW?`w#7iaB*$amc3v2l@ zqr%=rtum@6TVh~Si2E7MqhUx8!Wq#9j|9w)HpEcQA{!5KFofb6qlXETD6}Zn(Folb zaFU_eU&koAnP*U+A5@q9W*1vEy;SHi$}r%xvCSZretrgWbuSZ-b}|I3OOh5IIWG!p z)zvPr3P-ark#HpNobkzXns99d7DIJBmRQ7FdD-7)YoVK z#^}{Cd~eK9(7|*eevmo#et2Mbs?(m(KH@71JUQ0);PCPc=3|)780z;JGF`>fa0wYsb z2EODjSeLfDGv#|G+6os1r^(O2q=hJkR%fQMI(q9+xmBLV~% zP)i@w=T(t~XS#N3%z+a`jGjvN*Dr8Y-gABJi~e>!I?V+Fw10En;26HqFeU!UGBj>d z@;<-w(dzRQ^$RJ8SFgRaI)C$p_U6`pbL<>V(DPH5gedK`M{`*}&*UB4ct2an>6KFD z|H&VAu=bmU?1$~f6Qm3-c)YB1w=iZ;{WisWU21fD`DgVVwwn_tYoY}~lLn>-tASB_ z76grlQQ9bOdTw5Zy9hGp&Q*St)c6T+inNKSV-%Ph9B4gB)evxqSUJYPv{#kp@h~@` zhV@~W!fFv@7Gi^svNf1(9vJxgRqL7>{Gvrb#lXov@PiQ}o$xb*(oqW$&#jR^0XI5^ zF+iu7gfsKqS~zSkd$8>$b7w}B`}S+bXA{O7%v<4@JQ|1TS082|-R(Gr%kkO^znTZ`x%!k$ z$-tN-9OgXbjqB))Z-l%acE;Xe$4l^Vt?W%51En$jTwbgU%cBo|vO0e6{ptzF9Z$y7 z19hWI!M(9gcE!IFYKND2M@4NhF4M)<4j&)7)xKnd)gg%>@;c<5jx+{*@@e+Q-gvPi z8*T-6h6=-*7l)TI{O`T=?b*|L`11@^*-{-W|J(~1>>1R;OotAOQP^IrJb~SN>iXbS zeY=d{-G_z2rgJhD_pZGWPGg^YZ`YnL@gz?#SqrY}cP8KF*>6OHjL!IZd**6~-oM#c z&3LkpFr8_4@8dr6N^Zw_m-kj{0B4U9gxluU?f2N56Sn=BG?fUXst}VY$uP)bWz89sX|2^32q%*u8MPNx< z&b1o$#@Y4iZ@%`*>hJvOcSaHY#hZUNiC^|Rpz+M*Qr8MeA>a}ojETbtC4=U1lMw;! zaMKyw4Nl&_DCvj{wH?1(VoED50zc6t|)jv4?HVh~;^7Dr5L= z_tkU#;*+aOg;;IknTK7s@6Du#OB`h}M^L0B8dn3#fKKtPK+mHig%Z!;PpSGx8|~hB z?RrQbD9UG}5ib!OI@j-Gp2_&?xp>2VIL4r)F50@(wX>~)MxjYGlFTqlXE;Iz z{Pcs7`MCS`0M5Ry!15fN8NYjtQHJ^6Y4V1YJV`G;jo)v>Q{|nFcsV|Lx{wwI&>aR` zu<&5%riLh!VAFBD#_*JllpNJp9$dzQuu{tT2;;cNLXLhp;$rcLEwV-5?XN`3XY!Oj zoAIuJ2M-R~o7i}Sx9}yp0si1I@7Dx)?X{>Pg=jnCN(9@|yDG%;KTNzZM%z2#Y}m)^Je!o>zrF zc)`^iPcXl02Rur^UEjy+RGEEBT)!Ed>JV0+1R8$xefEGhDWB4O49W_Q@uxRS#|Iug zH7@kEW=>vctJrdVo~u2Gc72NVpD^g@a93vRcGILOoEr~LcxfFK8#A8l>hrAb1x>I| zO|`w?+Orla^vU4%v6rId7@e?G+fkwGOI=-3V)-|HRiD0$A>DPjBQksB1Wa`egf6&XY=a5zUDE=*k*~8@U_R;|{$@ZZ zrA6I5>Oarb#Ecbyj}bTZbgwcDLdx|V44$E23F|n=UQl+xs?2GKHg7(-WK|~dOn3E#qQ`|{L@0+KF;e`oh_DtU8d?S!@w$g zFpZ}$Su^KwC2vOYp)@t`P2I_;9-H}LfnN{nYd9FC9xQqZK?q53CR-Q=vv`|Ma8f}b zd*K{UY1w>{>>lAU1nXk>nz^sK7koDdsypLDq6s*&qF>`PPeq6>)L`?DXBR|QKjUR8 z=m7(d!I4~9w3^@J-%)y_hcnY* zR2G6+vb_nZJ3}FTFE7uZ4qS6yoe)N{>774_IZ}*eY@~2Y#!-Lmy*e%_$sAUHAp?LH zMIRgrE^U7X&FR_1GHcpbcAQ+`JsaE=Nc-V7H^0>adq-X{+Nyt!18{DgV-RZh zxa(-KmB=P9(sBC?dHHr91aGuo$8(NL*qpl=E-a?jSB7u!9tkCkwoyN`a< z{a(B(Scet-8HYzoGcXMYWru~ZyUgQxGjJ(NUATd-{$() zR(o&!+wFz?qYT+UU#&j*sPgUM>`d%UN3e|X7|+f^!79UkuSJ>;M3=#JbMfVL(UQLW z{9m?M(*8_3B7^bztLdlVMWh&>D4_~3*wBqLBiwJV+{&wYJ^pH;|A`Fcd+)?c$-X>l zvj@+3i)M`7GUr9p`oZJm{K2a))aQ7x8VSvwU~HaTVQ{37d;W8@wA z(tG+7uI+^$=LtC%p77c1A57k@+w)7t^X^X=tdP>iFXPvIFkZ*x2T|4k)n6UYrs+dU zeVLa}z^MmvPhSJ@{P>G&x=~$IIU%^bPM)nn;!+r?F8ZU=&Eyjhp7ZuP{fcD1_s(yb<9X?~^-BYcs3QH-IV_ppdQ)>AKg@N7-Ie+8wldJ#e+h1RO z>sMcI@9LS=y^lUx9h4RF=uWFgDWQ8;F0b}(H1JFY9U0LEu8xeTw@pY6(S`I~o9G=e z0Q$*vM3E1ndyXQ=({uP)t1X0agu#p4%T_;~^+GW3mBycex4VZ}5gIesmr-&EUQ7&s zLP|^RytA<@xudSyi=2aQ&kDx(= zcsONd&UA`YyMzUsaVnr?F@Ac+nT#d`^{UUG(9(L_Ue=B>c&hU->*FKIW}1xP3|~6B z0B&XRycW-%e=_5xHXo%}*|YXRG+?;%BtCnwzQ-#M>!ZD;v+psu&xC{hCVh%Kr7ETw zdXGYg2f&p4;(a-jN7q=C0LJ1#6;4R1#|R1@$Fog-@Nv)tB~vQTSsXkGZzQ2%oO~|y zx&B`$obqgmW-Nw0E*mMubuT(r6 z{t^=LQl1{B&M2Hi>05+xBnIR7PB>JTAs-PBZ9tO0^L*{Q#>m!fSwe-6 zx(0+fLZI)G?KrRTVd&W-i{^gx=pnG)>S&N_mm1^Y>$Adx9*^eTJxymrgTz73T zhV_rW>39iz=sqKZVe6hgOMnCCWBgX%a6SCF=~X#&(JpWIbiU{D&XS~RroS;b8I!`U zLBngu81)<@njAGg#v7pfc3>hl#{wVj!sX0!jXJ)T)wK52mKj|pIdIkczHkbRaIzvJ7Dm*G1j8!?Z zb>I#c3;mWcwp6nGuL^q$gSyYC(6fVw`Vfky&l;LJj9jfB4sN%Pba*NFNy({a{>LB9 zebqG~p!!_>#tP=q24n@^yk?Ix1;gBx*0A82tXb~kRr_9--wUtJ(+k3#39)AUgad}nh>hd~1)n@NpmxpcvRmsPg=tyrh&uSh z0Iy%8oCUVMi+E>2Z#RNr7A=G8n1RtVqH`d8qEGxbWQ?2PQtEv;eR7Eta>KwtLqkC&3mK#;WMw4*yN@7 z-vROJ@Q;5OyM~jta7gn%Mt^!xD}S{aKc!>v@Qe<{^AgQQx56_S^Rris>|x+CZlYyO zJG?!M7Wb;>vlyl0G{%D(Pwju>jf{zSTDU2Ln&&UwY%RgdcYY@W_DA95oz?N1KVBU_ z)tp?$)lHc*W3A|r3}pN~ZjWd9-*$Az(52)&!j>h6Ic}fdLc0g6y_bKr{f4hL!L^^T zaL|a}zY@dU`$arZxNP2jNnqAjU&|QJsM*ipZ;#;cx&3At>9glde=`aX(P{)w{LtLG zYH#Q!?_v{s25FweLP}ScUR>=z^FnkW3j&%$fkzcD^emYegT-qt8r7Fc@FLulM|BxU zqXUfLU1kq!ERrti{(7>HQpgmHUifjwQe)K-Zh7DsuDf{h*x7^RNBp+w)B#(FEG8Wl zmVErlhZ(}*^~TquZ~df~Ox^U>T1uau1WLE-&&Tmhbvg>fp3gZhBcKNF@%ALYp&y^S z9&PGV3mE8xSAsZWnh}|98k}itmG62-uaFZnF6+w@(j7;h@Kr`kU{r?%50iTB;;Xqo z3m582E=^!+{OFnS4&mB8%_dCm=S|{r2azOgg?VAPl;v4(K9-(b1QgBu}pO@fWY| zGcmPK_)oczDCH`lBIT=d2hVZgUWhSDXM8UO{EPcvtZp{9{KK!`TK#tKTQ8ko-EY8t z&S*$M+*XGWpyNBO1Y~S&@)B;Ew6+<6>tFn0`myO8!*vS!Xx3K4Qxay6U|s^D5(Kc2 z8V2J5mo>vgC`)h(JJEj={`9Zkymt;ypVcQ5Qb>S*3_c!|29Sw=*Yn3IymO31lZna5 z_auGj2d^W8@F4uHB{U(R65a>(fl;j7WJF~whF9+X!#m*y{uu%W zBnGRGniRS=lV+EN;Xe8zJan6qOjc1EDPMrFmyJ@j*96CN>c|D2J|0kt_V7WI?Y4f& z5-Y5fa)vi02b~b%V6?yP$qc7+Ww1Lc)7YaXEgq{6GxnVgNMU~>dR=Wr`dUhlgf$QA z$D{7wjqmP9D+c40CI)+#7@!ByS)!UCo$$l64xEqHlxB(^?~^bjlQFu%E$fmX2&3_5 z6J32CeAhl23S;FtIM-svnZi*Z=0OwUFZ8=Qgl%3y`#vXRvUbipdcw+mkQ~&n34u&8 z6Si9QQ@=@8+roeYz3tI?tMDIM_tppV$`kR>{-o<{^@~!~Bsqz7D$5&4DRZtM0~t#n zJX*Yn3`RVUW@#Iz)-f-^Yr^a+0zo2k6qX#xk z)DPb*#!5O<_q)uY5eql&d+Voi1JK-yW?gTTk7tQ|BqMl1;nux=E@Qoi7E$0%6GDvQ zo`RvXv9uVPjga{>8W|lk9^(1gqo#OuVxBqddqMmRF;%I{S$dNgrZV%_r|>@r)t;yW zGJ#PuidENqPPlXRq1hsv+^9^yb)4sVIZ^@7FGk`hXAHughfOkZF*4QZ9iN9>i)QEm z9``47z4CrntotXpuC65^R|lh~#B_Uj8tuja40eWIHTN$$&@f@N&hs)xZ`v1&0=EDxdvfqFpC>0F8k)MR;umqJ=1FcelmBP2jT29H#%Z1 z?@hAL*ycsmJ}<E8u+}iUpse4~|>Rn>}moIUEI=+=~*R>^IJ?--96iQn=jR;Z{|Ap;MW+yM}0xK@D#36bQyidhJI5n z$6FIzc#>i~i?#6N(dM!B6X__cjDgR7P}_NBZv0XP!E@E+=z%{dyfVYYTw2)Nc$UCS zLiD^)Oh-Hj1>QXON=9sW{iM3`qKF{k-5VuYTOi_@0It1*9RVQS{r0(EUTvO#qlqAe zJ+I2TZ9GS}-wt2F&j{>2<0oZSDC4&CEsyhj?PSj6U9qR_?z_>kBr800=QB*>K_QOY zXa8#Lb?rFgQCOmVWTn?1C4Sw^bN{Dh&HTgF;g8FlXv%TC{rah!8RgfiGmqZgpT$dsV`dQA zcQ-<^W8T0%VYhf362j;tMB&J&y$QwSJ>-o}FBTRa5RIz_WWs7fy8A9e=wS;2GsD5L ziF@>NbdO4mcAoQ$+QYl=H6im-S4BL$wY93uqr7mt`mV0g zzx#{MkbELagiOc%Y~4I!K1KKafzPyU#pr=#qyP z>SppKpx`pPqC5>qLKKx+cq?8x<8=m(Nv$#jgua?!54iei65$_1O&C%J665nI!;Rv3 z=31_OXFQdukwH3p5(xjE-)k_>%6bOxeulEu#mDVQ+Xd&~wK^x^N*);pm+uRwU=UY+ zgrUwPsKAO&;BY*~)PIaOGYYNBxfszZV6s-Qy3{KR(s%+Z zJD0(P*BbChGzwfsOhsohweMu&$gAIq?kF2Vnc_^ao&^`J!uMgV2) z*43w0PnA&NFk$!T&i&>J=l|uE3hxXaUaPB3;5RcK_n(aJJ?kvRPcx)=6tCvRnkigIXg49x;W^elVx7+G*yZL=WwdHCcpJD;K_ zd+6f~;M*y7LNw9AemI6JrS$QHubLCvAJnlFCMlUm!38<93LYF|(031Ag`o-EgcBZ- zs?2zUL?BRhD^nZxwo(!w*Y7XmXJ;jT8O)MQMU~a1Chn^l*pI5?e&;!!;+gp%gXy{O zp&vYB+I_nIIPyUl=;yU>PoLkDd31qxjEeKofI-e%crTg=B_*@$`I}e#;Os-mW^n!e z@bApHnwc^TafT}+H5Da%1#j(WPhUwznLs7Q!EeS3F(+dw$u}8kgVAe};Ph$jXrAoT zSEw2u?$=`QI&uOE&zfk6!xRdA7#TD?61?!*HL!Upw}i?vyv#T7VQ^Gk?MyFwc8uQOLPr@r z!MotGg`IG*B!8*Dl?4yHRCHcb-@txi%ykt$8OM4MEA?Lb0=4)PZbD&m0$75LVp^RG z>@HbcS>~xpLg9A}PMd>@>KlC2PBPJ0W;l9=Vl>8YV;cUZi5epl?W@%HS+wkVs2*JS z43xo_uq41$XX#|(@6P(X_WWx9Qi^v<(9Dw)iBpl})M4HZXXdU8^E)c~W}-))x;Vz* zhB8?M&gS_SSG%`_*G8i-8gRS5Cnjy#QxRE%mWEMjC zCPcCXYYaSn8098V>s&qUi)$xubFWOFlv;^W<{)u%u)3$;m2WWOSL`*f@H`<{^tMs( z7MkD`S-2UsR%&D@H9lreGhb9yWb6vwtF&wV8}3B(!FzQxPJ?d>V=~t@-aIn{5f5OP z=4eI&nLXt_GeCBs`FFzzU_|Tp@MPtZu`|B)sRgW%6P|ReK11n#I?nd}+RPX@j$W6p z)lRyMgfY%nj*gT0GTgRmnr_=YVUg%DGzsUtv>9XTjC|g~$tns?$~d@3xK*B)rluY2 zo?F=fsLX}cnP2|xaKH;GWH)#p11S^(a54&c3p;>* zcjtpVL51g~@UAV~zVzJ;k=I(-zg0(*(8B33bfJ%vDfJ-F&8mgVo?B&P^2#0lY2NCO zyN-4xb8{?;WG+oVZ6oQTSA&PH=nv0~*OQEEuCl;B%762qEhcmXa|4{OizeIUAzbFd zWM%ZDpR8N>-SB!x?>Ukr7O;v55|bC7chpCr zxW{dw*?Zx&>PYA99$BFs`s?BqPWQ<$+%yh%pS<1C6Yo_geJDeSd@3AxbLsgIn2f*u zZsV-^O%_y(1j&$Dm`Bsb)yNk-iXT%##?HY1(Rz+GDVlFFtfMnyv4x4_t})(6a+^1L z9&FP1>>;$HojT)Y;gR5GZOjCe!o(;$V70Fhtfz#tOY>nAspWxem>L@fz``_)Id(y$D{_ zUcN=H#zF(5LMF-B;N)JvF^Bt$B%ZQ$1CPv$P+m&ZyuW3(8~FUEZY$7xb*ibcx2YU+ zM2OPY3I&z;<(nOd`yak`ef68)`=!;DTUS~n_AC}%ex=6Dpn|h!7zeBo59yA4lmeI_e`97S@CemI~6A_pS)yx zX2rrvP{N}~(AumI7ZZ>TR7`p#TNhzs!1TndVm3&2O&s`qjJK3j_!t*+*XMBb&sxO; zTMY9=6Yjb=c=hbYz)TRB*ec5_Hs>au(DbM_Cj(ZM&njv3!j$VKx&6|6J4bLf5xyu~<0-6=gXvA|LU+yW&}4 ze|m-z-{U86HMV*CgM;xUR8a^sI3L!&vk--k8vl~_;Eb0pUMM;#Z+rN@pF-+PLB<|| zoa1tgB*NPQkn;~OgiqeRgUZ~GF!$=Hu;UBioBRr#soy?DL)3mhdl+locm zdj1v2pL&>zMEoGK- zFY!-TdKP86yudLsoG}v&-J8V`ZB&DDvoD!J(qy;CaF{l_TLsEPqcOKkSk>J%uO*Ze z4x(YtRN0hQmgl=BX58XokC-crm!np)86U2VQVh^(OB;)EC)`$r<_=>OO)51nb(1^r zt69*DS5YpOXNtF>kLQ#cR`b@+{(|tTpGsZ-2+7v3E?8Z3h#23DI~AE|g!8N3n_+gR zof^RcW|f08*%$Hq-i7)z#x0_&I|F&$xsJ1kaIPhRDmLR)v%HYQuhlix)lQ4z>+>nV zXFkceNj+GD+xN}4X!^9#&=-V*1p8sZs?u)^dm+ZqI&A8aU z^c#8Ez7an2ew8>S1)+X?SmK$ok-pX0e{a2Ax#UHO+*VgIuAt&}{bpD;j(A(qX8ywO zg#B5N5cSjx$+{WYl#c__Cy#9ny4R;jnxeR(TG&-GA+G z)YtlUC-2moe;UjW3vImBe!&~zqlJz7ZXQ^7T*xjj9bI&L@ul_=-UL9|TmO7@^k@I1 z{yy8})x2yg)3e<#Bsa^u@ll4-r(X$}=7ZaXr@s5cCiV=DYp`^`pFpL3C`eeQ6kUc=3-vv45Hor!h7>FZ!czC6-i+4B`d(ViaBe)J{!k~ zRmig_GB}=kGng1NV-PwgFq$V^#%Pn2kTyAUNOF7@bY>BRbPlr&@#DOy#&pMHY$eH| zi!;>lVQ&i@l)*Mbaw zpM9VV)eDWOkBz7F{pyyDcEXMWQJ8cSU5IENice<0X=7&k&X6NdB%D!%flQa~{6ypG zIAh-e!gw(oxArThMAi;_CEkxr5J#66soM;yO5w|wt&FEl1Bs;|7OXm=F z4fkTsdDMT)&I~xOJ&6he(5hc=0|d(D$Aig=EV2 z+e>?htkY9JM3HR0ri5l72oJ?XLV0Ed5pc?k`;{T|#Oh)K?{D9Da`ijk`}XS9uRYg5 zOhL~Aeq4%cuJ#GVymv1-lY2f3crSsrDok>nhtPrNl<8Te6_#R@oCjHCfEj0AVpbu6<{?P3_lFc0FmR1J!}b=>@f%@{qH!Q0?4 z84&U&o>0N-I7wxAgu;QN7sNE%2>#e!z3$tSD5dvaUecj$M&VHkIx_KMIahFw#u(;U zjEJdx7^dGoqtC3gL_6L^nZS6Pf^cD^1i+l@6jRZ2+%u7b)4oE3)ei}x^f<`K)EDE(Id`Y!_Tr%ng{M57LGwjt7k&O&f~GQ+9)+G4>&cMo z9Ka{fb-Y8&f0)tZ5cK=e*q$_o;kAr4At(>p+HVbs8Fn=@*Cf|@B3bopG&tKtZ>Y+o>hO8@>$D)JgL^InfkTK6ZS-9=%U*ZocNXz)0pjVjLW_= ziWq-VD;C1kICqSas$WZMK|U$XZk390-T zfG6Ukh6GW9Q2IPsY42|@zUQG0;X=Tz^r=v=<|roHj#IMEE?dt68084^{JdT z^7*=gZZ*wkmq&MPUBx8C@*=C~qg%rPmi z+e;~wRvpZ7Wk;SY+hLzFI0w+%N7kD%x-FyMwj-Waw^9&4_}S{E6moUs=gamU-w1EZ+&QWtZ1h7)hk-0OaB`Dq8!SM7ucB8j=Jwk2kR&l&J3 z_p+lmainA5!amhmd*hKQieU^H*WIkldYf{2IlNuSTOfO4N;7Z7F5|;KsLhdf$%Eeg zqmb_&WH_cD9pBD~Oqu3UoGmj9^W=j*jE+Nx!c!Ua3E9O^6hRb?N0+$%Vylc98Xvr! z0{XSp*}w9;&661q@svL89%SH6_+_{^W~y1(=B7PaYx@gJkaE;sz_s%c84DSu3`iM7 zk0fBJlbc|hqeAFg@t;IBrNYje_)g=i1;D~0C*x)9@se!H$mqziUCBmxwsv{Gj^24Q zIT%HryV>}voIQT=xh$Xwk_ETC*~z<*mEIms8++p|jE=`C-9(6tqr1=YkhU#lR#`8E ztJ)=!H`miUW0m8(8Gz{=o1$ITjfwGy<$2xz_P<-b^tyY6j=tT#!1qH(^7Q)i>3Fxg zSGXewLm{HG_cViebKz#5#9QG#&ufRoAN=?q_egNHFY!3fuaMyFGcVVE*Fx61;}(pQh@!O=cLzJvkkdKo1FethT0gLm0tB^qi#WMF0x zmX(wNc9g-m!S7E!AD;R&-n<}&TuKk zNb_cIo+wnA%x823^MoI>X1?sa#JeA4tbf#Mf3Q^X;`vO5SRiZhUZ^K0ktnT6fS5d! zoM^&cN3fWQlf{WBV}@LTx9KNC?bPefTMu>_P8o#Nx0b_$d~C4|ekK$c2J}CiY`Z>Z zL-NSBAhJFPXSG%b!a)t18w+Wj`J|jHYa!KF%QCtk(lkMEEd;}`btxdKyibMT(Rbw~ z5;;|#=6-igrH1e6JMf8t`5l{JpRRZf>Soejel5f_2M-jry};D(lSk(F$wim6bT$T@ z5Rj9aj*kmp++A9|p1c1ayn1Q%*I#&Mb^bb|91S;k8psqIhNkn7ga)mffp>XaZTy~e^FftHG7Jb-?-~3)mu99O z{K{Y<;2M@wZps2gKj9{n9R>$3-4Ud49PEp->q{k?NZBImylnd&5<7;5y^c*-M;SEA zf@k)2RhLQB=6?#Cv-%h~yhsNb7Q)gfS@31|BWC-27*dA7iTNqgO zpGiy-+E&jui8#RiAR)?NJLd7KUuy95sq$njo8V`!&j{WwR4htB+z3vBdcuYwt~(8;3ch(!bDU5W-OrHl_nME4pPGGpOOei zNGfj(W58a#s?pUkg3f2KKN;*iTc4Nx?IC`zcM{t`%qYkwFhG}NFrQQEARWs34}V^Y zzb;gdrznYEhMR{el5{;r`(o4tr@DG(lmS&l5O6zlQYh&VqyO>AkWYPZ6OP6R1zhdT zp0d7;mv^qX-gCVfZC+qMlOlX3`J+AxsXJO>D0vA%1L4$?j8~tMTbtkr$bnHS%7aUC zsnhE|J*$hOc*XBdO#+{A?q#wLw)xEyyNq%72adjsF{Y2nvweobJl#h)IZWBGFaU_a z9wXQsx6FxM=sF0D@iEYR52nTN43FVxG06Jt`ssL|xwQV^Uta1_@I9wLRjV$%)KkNs zvz4KCja%SMnYx88)7yc=vr9XVDl|tRC<^duI~(rwak_)?^f{)Qq%Zv*d_@ejF{a6+ znWqMdq-u+;d*pa<-z#h2$I0-F!ph+3#&VG{ce-7XSk#)-Y*8FZ6GOvXeC z5)hr2TRoy?Ru_w0d8XuNDTqhE|If;v_|xXp6mc@E`B8RKvU+>5J%)uKHc=0*7)BJo z#psA%$foM1gv{AnZ3&TtW_LC38amY+*cjh^&LD~&au^KZ7=6)j3^RrpqZ`c_t<6&tArud-g<)ni&uWzw$Lcm8 z*X8M}1!MJDFgTW^F7$2ArVCtXkKmJx!QeT6BZK2l(@`=QN;opc8EmLTNQ|~6Yq0>r z>v6YCn2gX%DgNDFeHPvsGCrfGmMi5cSncX|0{ntBPN4H z2(bNS_Pn*#XZE7TnHJGk87)mDDc&Dsp#5^VZjqrd&q+p7DBmojrjs1L^MjHYeKI-@ zLwUC4v|HVty6xrHqGgMxpZ;<6-^mO1t=eee;=w1~dokY2IO7#6BoBFxKK@xe`u!B? z`c9^yCu2ALYS;cr(rVotvV?p_`}B~}N6Dm|5B5cl;m(7aLAd)xhU?uz5-)|5{?So3 z&*t4JoO*2`Kb?>&j~H`CqB7^xfp*@fStam5c@ZSG!Mt5^k!eBPAGw>ynzRI}T)% zv2yf&Jk=Q7yZmarr&A3o0N^Y0h`ES2IL5HY)q=|mjgif`C4L>l&}Vq8{5r#Q=V*%z z!kK6KJqA?u^FkVHvp`fclYlAj-n8X6BeZe5>Bxls(%-IruXV@^@*537dXeuMx=-Xp}Sq5 z@nViMUI~w-;C$#kp+AdZ;KNg@z@N#0k!=}$ypuAPni%QjYsZPOjci4eOi4wJ714kj znO5ruUQM%DS{qUX6Ql65C4R5|cm4F`;$Qylx@$|9$biLQG^f$M4GuW+jBah~oR#U& z->-%LBlT3Gyq7yOsQRqi|G)MWQ@aBizj`kAN`)!=0O7PZL-EIfd>TAV_|EGWL zTdUvtjh9xNRbgzT(#z+K97E07r4z5)|5?*Y7wa*-eszQACZvzfw)l@}Y@ zXJb6$Hs+gELqgnSgb58wbsDI>DIOCxiD|$+lSzaKVSB9#@2StgoYfkzV6coEtdu|# z;A5CQ ztG@1=FrC$?lG(J}Wc;|_=H#=yI9A`Pk3x1-ti0@%6fvv35`m0j7s}gXG?W-BAPhGuG z*3-@zY+>PHJSW+Q_Jkrt*k$D`F!=ZFR#$6b@!2W z+Q%2ZR~fHVkcBsR7737&S`Bz=QHcH@w(jIv@*_#?doJ(Qf-0a2RR9V=18ATJy`Y!r zA&1k$8FEM(sUay|WZH}}9weF3WYURu9rSL2s92*Wf8@qcN4K%v3 zF9lQ;s!;V_X6pO#-+P#$nX)QhX8wNhi|}yw@Nf_J@TfAsRoWkh3HJCb*BGzY)mGsd zOg*0dx9n-;*?_wn?KOP7zSQ&xfejpaSKn#l=(H7LliG2Kh{nrO-{DwO@WU{3#E9_? zkBkup4w#R#oVnDz=27HeMM`ers!z z%=Em41fEAcC9JeZD^p$d2~E^!FCUL@g_i4m8AGfBir5Ede5-rt(RcNr-6S~adsn6m zY|b-1%ez`Gq>+Eh&s%-9NB+@GmrSKS0q4CKCnIOORFQ$hbuwXOOy7;oF^J;#@%-s~ zfXQk(eB{194_x6SIN);(AIzkVaBMNfcvY@04uE}~?@Rp_PU2C01GAn$8bm~m<(UO1 z!%tPjxFlB@cE*?b(9Pn*gnxDgZW)~8C9HNYUPsTIrr3CCUq;~NS@le378q+-+n@ma zaB#OR7%jc4zRDZt$}DnYz73CiW`3P@cAg2@6TYfGb-~|K{gj1I*Ys&YSdjJGg59HJ zw8GjsU!=t+c$wJr!Yg=@Kr!xx)(*53ysi&^YkTQcypw@t{~Wx#X>sgd{s(+_a=)r&q?F$)K-gRll@BD#uk~oE>%8H%jRZYr94e1|Ms6O^K#0t z!?pJ*Wx_(izs;lL!0y5)Vn8eS@krsSlSoWQgMFD38#A>%ic^xJb6*;25;2pSPgfS#~u3mMmc7kbrHN*1qJHhkG7((mEU&%A}llm7-35LTL zA2&ubGKKhgs&R2h3E#=SSj5r6emLQxkJol*A+LpsX1Fw2F2*FqRHkwYJ{kx~%@bo= z3$M-Q$&3+u=kl%`z4WWA?JK|D^DWL3gDJjqQ1~d{F>uF5IJc5Pv48K6s#nsOZ!Mm| z47-CYn;x_v^~o<*tB>CewrDKjQ40}zJ+$gbh0QZB&AhyO^LMHzB|oKncfUk9EoAe4 z2}hoNlkm#r>NpMK0)g^I3jY)Ox|g^wLu?WswKZkQBHJ?z8GV;v3Bk-?hIb^7KXl)&em6oL|< zJoB~s9*%Yy@<0@S8NeIHMf902N<`vZyZ8TN zM)S{C$FCGx`{c{>%%KdV&VOXQtuEil1N+sUOHa1Ir#!I-q{9J8^Z{B(BS8o5& z>lxh{BG+F|_YN0zTlfjS9)_Q>9Ifcl;0k}{i|JG4=)t4QP5Ca9HNs|-325%@LVG3W z2#Dm`GKRz72+{O%JbcQVxXAS?7+#n$Y7AL)%3C&}#vRrku<>YoUHPe_@fiSlJ;UA2 zm%E1kpCmuR16mvN)!Ct}8OM1FlY1j8cme6|y+_VAhG)Msc*z5@C*Bx@q%Y1aQXgjl z#vEq+($&pR@dJjD5f*%h3^zy0SZtU&tX$z=I*Iz@TXbdQ<8ON?4|ntYtIy(5^DbwW z(0Z^h3sOB>+4c3b_{cDmKYeJIskY^_AAjaGjOsUJX%(+@QD(cN72${-3YUoz(CBn8zzh?htLU6Mj21n z-bUZNYujg@9;0Z&B}^^|#weuVV)}cn7>pnZu-aHQg;plR$tvF7pcE_q(MK^%g0xPJ zSIWR9Pf(h{=dy$s-`#P689{?^^+La65*hxKQ>OqP&6z zw`&W`4PwlWob|&*WdQJiPWILMGZT`2*XG8g9=-I{WH_9P4|?}V*MloS^>^S7FH;XC z!9bv-X4HO>(bTWzOa@8<$0{5&MhjU%^=k>SLaW|qZQx1@DDRa+G zziR^&z?4U`{?A75E=hU=PW#ei_+(7!&%JPKAD+<1$KtJ9CBZqSbg?%2Z^d)dDk{93 zw2wm4ra9}9hZ=qpOq1}U!WK6yL`-s)?x8IO7&sDpXxDz#UE^GM_UGY=XN{p{KVc}C z{fw6@$0$^3*BzJ9%5*p6rHr$cA$_V~2H2xQ2CI_?^8 zVbIU-ibtEH$q;ML9sZCtma&h<_Cmt*{rJcNgZm6DpUZ1q*k}s?vHutkUHsDcn)VhW zChl5zE?6WrR5vdmIQ(PuoFH;9u;WjC9cJ%i#Kx4Qx(NtUrjxZd?k9~pV|$~#_|I=WL8z0|tk8}lv3-GUc}hdNAn7Fia9(6wc7sok$JY`}g7 z3*&L$3h|8l+FT~iO5(A~EZ)Js%y>;+*Urdq;PlcrN&uV)*~Tk=kCznzd&x4rvk2Dr zF~H(EKeQQkrVM!cKlS?@!`|--k*|1c{`DNG5Twx2xBA?*@$PEC!}GCFZ{dmX4T1gV z-Gis)$tgH(84uIvI^ZrjIeo1Scvg=$`hjT-$jS|!JW!uqCmTjKfeJ<+vb1@~C z+`HFYal1vm>&<)L{H52DJx_$EWdHRPK8u&hC9CTZvbl|NChDfu`}$#ZeOr`(y0>Lg zTtEL}3Q6a4z4<4r-5>tj)gg}|V^kQMP+$r%`YZ>~7Z!E>=Fn#{7BgyLKtAju@GJ zfXQ6O*?4m^AON+=xLLQC@NoMV84EA1j=%Fa=!dv$0jb_8-+B z8`04);Vo)UcKk!fOs!kYoqD?ZK4$Vx93g2dxX0yb_LE(AaI9MA$jS>7f@`^V$ui^Uf3{5>To;vf< zUbNj$|7AG-+Ukg*o^dDi@sL4if2lFDx&F#{AU(rFxWD~Ye9#zImfURIY-@ktUeA4= zvQ0;WSO}Q$sPEWVU*W={kC4ZH#<;!voNE=BeRtt^+60^)BT=*!R}sH2Q+tmIeQJF-S0Pmm)BANQoZ~ogglpcsL_ztcS^Yz9#|%> z?qQ0aSZeTnxi?>iYnD69B!^k*M9&=O8a~SHdlWI{CVLRj&$U7KfBfF7tH1ZRf3UjS zzxy%bIxog17ym9H=ViactU#OzVr}n}_!9=&Af5>~0$TmRywmrPw>N=sueZWQKp#DO zt1yGy=@_)|6DtZ6FCS}34*8U`U7v4LFRFpga^da(KJUPF9*4KqfVY6+AOlOsBC^qH$O$dijtKJ3*&uJ+W12J*LE0bX{hA2i$fF8@N1cwaS zo?X0!%VY<~VR%9{?a%Qd#80e>Wtdv2Tny04g+FH&p6`{ML7DXc06+jqL_t)TBN*~( z2|gO*tY-tMF=*c!PD~$b*L>>G=s~L)743_9WDw+C-;WIRl4@PM?QY&IU_e zn(((gL8H_(z-LmYB+WptK>r{1`;Z67Q)BpLpvXd+H86CwqAY|ItsN^d=aiudAruT& z`cLW`Wi}j)yAWGv573qukPoq zn|*!VyBkp_Y_2KKO|m?s_5m_TJ;O*+j$y`t9s|1yZZle|+u4I?hS$}ve~%}aZ+3(QWu1`? zXB8cCR^`0(n(@x3tOf=j*xV1p;|07DY~GAlFbm~l0CuTy+4+O|HaMvtXK-K}O7OkL zzGz#p>%-FQ0$*G=@BloZ1bV=;C>qJdy)(o!GXnV8-8-Te#X>3omw{ZlXG2s2+4?WL@Hp3pOV z#%S~QsQT13&-Q)(4W8t_u6v?3#O@O_3CGnSwui zoGf-y((Kc+C#`u;GLcP&r7^gErgZtumlU|&AN+0}rWQjxJNJ;+OgeZAJmk%B9tOu2 z$TGUlL%3;wAq73A4f*H}7kH-6lq>^dvTw#qGndpZ%91tXNsG3M&ZL=Aw{iY&Fv>i= zC~FH3&O8<#LPkgkQ4A5duD*#D3btv#_6CRHd7^8UrYhf;+6tKZ*mrGe7|!D@^WWf> z@nG@T{HtG$n@MC*!RcBL;y2Gv*e7Ld24}iM^-W*QrODKuSPYT&W@>xx#s3p_*CHt# z@u&=C!QfpZydvwz8K;F-UTkq#w#h>}N<6SHq08)7)V{h3IfJK(6#Df2@xG0>P^evD z!MrKp8bv>tCM?jnju%Fmr$<=*ax{i)utUq_zjG6>v^^(}ql3zizxmtk`OC1SG*f&X z>^_QlbbwY0d>)TOnKbw9iyOGEeWho+$#chmn1nR%XL$XraL@Wyf7j_d^r!~X(00RM zdhWaN=418s7rj56=Z0R;o*ZTrPxz*}Q~hAdpq=yG7=}Xe;`jYW%l@%LN{n{9SdkJ9P{JlJadEsw;b8sZYl~J_0njx4+-af(&k6{M%qaXdF;C-uWh0!_^ zAwBW1uU{5fo_L{adDqD%^lIGh-pLDj=l1HjY^|%#fDHM;o;UV>23|&d17g@w*>Wn=-q z89oYDp`OOJ%_7ykJfBWZua-&nB%JM%DaNn1j%&BY0K*fkwl6UZWx-`+O~OP*Rx#px z;g$Me%vEN*ag0r8_hlsSMI;vL%=5WwVXS50+S7KtzR~X_&%^kMzDzE5?1z1uLcC|5 ztDVEW3~F+V!LD!3Yv#dhvHH`PHkP~tVdPElEPHvopnmc${EW@ONX@8cD1xsai(H`7 zB@@N~SJ*-ePkK0+1r9a>7)IX3XTnY4QWH0takTAK5$Kr7bKvQ_1*PB^_}l~QJm`CG zuMtf18SrzZKhBJW|MaOTGKxmu2sEYUZxvWg)T#;lQp7pxhzVIn zA7;=UC(yoqq2WEOeaIz6My2%=PZg;plD#<0u|6h*gYJhGd9^ zuac<^bD;s(@Z67SF_x@t$A#8_RfxxgtzyJ*L7|{wrQPcJ$>mrk0fKj>h(-?`qs0UPJ5I94^X_SVH6pY{4T{Dt~O%c zFj9jQC&)@`Vx30R;VQv>##K96+{!_g%?r~^mpER ziJsM^7W<^GhC_SUZfDqCidU{?6kd{{D(~^b_QWt!7!y5KZ*{5j^d8IPGFjEBUE$02 zti4}<8A2~TRXXn`72$S|S`e8mvKdYE6d{msCo|@y3_4y|bRwbxcBZCJ{k|I>uT4oguBHcsgGTS%gtoIt*wq}QP+5Y(QOc- z8L-uSurhcUU*KZEc;QWZ@+Ne&J}?44ug{NC7C(f)R3Un^Xju}4Mxs4>D* zs0p=2x}h153}gMt4CyE9kBQ~8>O9FPHO%x!yOWS4zLmtrbhHmqSX6sZ7A3~W=7E%G zrsl_Jgf9t7zytrhhLl>rXVI+ZWInxHyPwt%=w=L5WT8R#aW_QBm2u8%kE%zA_GL$ucoGdg9zoS*E8n^mFR|Qt)E7cYL+nsH;b3dZ#Uo~9%m35gPv*3jUiWA zVaBR9w){D1QSX7hS_?GOUaby3@sqZMH;>^|8FLB)$~aU7Lr-#v zPBD67b>+#YCxrdbJbP4V+V3w7Y?yFy|;`pNd zXQzMoA0`9kA!U8vaZbF7C-&@<%Ne5EB4k9OP4)Hj2GrbyAl?cqshLf`Vj#4Z^- z?$J)|(>mVVw`n0t@(f&jM>_?uxo`}JlzVbkp9g03Ro5uP+Sae&0rq&h z&cX*8b6pA*%|IDN9$!{$=JLklERvXO`#xd87@+p-4_%dEbaSx<^9$jky_Sa9e7cI|-L_zy^eiWWltSO=`k_-23^}F)HZ!VenJlG*A7-w*H zi(#|Lz{hKg2QJ>6@WK@19+B6(YQBNxRLGQzV1%_;MD-%F<{^z>%s zQ_QtLMw@Wf&XhaNa6OcKMR@9_aN4!KuKGMM^?9RhKTp3ByvY@wwma_xSN+L@HhjWB zpf`oPD$nba!HKVuwd*{Nn;Xxi|J{lwQuIG9kZU+c{1GLdEs%ji3v!VEcQ>hZAd-fYkApZu$g?)Wc*aa#hBy}g6!!<#}! z*Np47Tk$sW>~c)(-~Nwd&}^T2b&R<=7qIZ!{l~QtKODXI=c7Z$GdT0+%DXW*s%x`| zQW<-8_xC@{6D#*b#%N=M7C({|X23Cg((yfGOr(TQdxu9EX*_I&%UZm&zp#(Wr;9WA z)Oo*Tku7wM49TOqx%t&un3iR9FX0O#D~HP*>2O+GmEGM7PiU#`{!YjyFCvc}Zz+S7 zUY;I9(9a_4jPr0}9F68giu61F5z)d6xL%al%G6#*x47Xd*2TrA(L3YFvI3=U+C~r6J5*SSIhOKV~^@cPem_ru6lM z;%~qF?CQVyi{CBtSsudgK+Oy2a0QiVk~HEVta#PRtXU(O>cw&VNH;w zq@NoGHt_Cw8-*#v*heLr*>)ZikJ0{vcUN00U_wIb@EqLABWHtq17`PeMx#kOVLF4M z4c@2KC!6Wg&)|V5t3*7G+HaDXP#N$Od`rO|hq&;n3uziVo|lM4NX>p4Xf*H|JUn}+ z2~utCoikHx|E029Nxf}#ciiIDCya1wb*hQp-XMgwigm~XBpgB83{uLO{a`#Q7gD${ z_Ldz~QjzTtv`KaZY7AN(+q7JaID7pXq%#qQ2jkj6poE&xhW6+XiWr`}lCI6(#>&li z=y9!fws3+s-~nuuk_AN!x*k8vOnMT`_TG)cv!Fd;QvbulG2zqysu{jg7f%Fl2~Y4$rYYGnG%{{^8NKbL zywbu(6v$BSsE4lIH<1M2<@&=5#+bU?=Y@D{HsGfe$Tr9OnI5nxua&`DyYS@PC#(&> zJ{ygLv+>*yT`~%*Z_ZY1Y=T)biU+~Qr~-q-VshBGGGbj-`6 zu0ISwGIl|$0`YyneN)R)Uo}^+T3n0#U1&@MW0!mR%hT8xAcr8j7anAcjZzAcy^PE; ztPE&%%J+!Vu{Ue`e zji&D-Q~Iomr5-Z0@{DtfK#P~wFi&Qqe{GP56DAZL&hYc?+bxUA(g4{iLlGDv@wxJ7IJb==OYl<7;`8 z3Q2t9M=7#zb_n{jkeoqDQ3=01O?CCS1y;``ocobd;{fQqdXnL+o9D)u8)I-05X03J zD>A&jU6!}WqWG=%H<+V!m7O;?0D&nR~;-%$0-4p@BZFDOExhC-Fv=x=lv) zZy1Pi6aE>}X{{LojEd%HbhHWy&gM!uok$Q0Tw$y8YJT(>fM$*`F03$;lW>XMf*oyU z@isW=FkW*lexJQn!s43GYoHs|6)uet^J$QcoU|ZKf7z!EFo8h)Dcn@9& z{t)j1f-@A-$X&tzdkA9Uu`U_XqBr^V=(F`-7DI(+S{|itNqSa+`RUK63D!^7~_qx z&9mRk+y0e8F@Lc-eed^2|J&Srb;3vY@BT2mCy!-D;g&(jTbNgL*I9%ozyA+2T3ZCL z7ZJ@(5DdaRw2bl1&6oQf?pjn^*$?=jL?q#JWL3wa~VHjH+h7QW~S%mHSzO&C7A4)+qcMM>~84H zV*nXHMqsioews|Y6p1O{LIRKTS-7s@wXY8I5q{&%o2ZD4q~&;t_$FG;nS@{h89pO> z8jI$JWgIuA^E&QJ%rcId=(6n`*6lMd2VXL&qczsiY2Y^Q!~*khXFQJ=HV@65BN!YL zR?5&NFFGDC>m`_yMR?eKA+KWaN6$w4IT{PCtWFS8*$870*7BejPN14X?B(wWt@#aM=dbQW0F$*B zwR}NmKhEl~%2_ib*N9L*97b+%g|2y`pVQ?&me+X`Rl5vAf0gQY#9=thB-c|Ha?w%> z9|gmOLRkLxty`=A>U&>Z{pt_Cw)*hh2vNe9&EpNqguoU-4APK6!ETv8Ia4FebkhRi zOo&o`19TTr>?`EyTY6EcJTmt7>57%yl{BtpD0Kkox^q^xU-@c6>CS4)z#@D**Kq61 zI*Dcoc0z$MTKO?ps%wn7ygQDIn1kCfg|hH~DYz6^_27 zIn$5&Yv9f*NVu{3s5%K$e0h|2b5|zI<5saQKi$e-AuI&)4xHVG10i{`!pX`C4l4_i zn3$0CgRHl&QbtR0h}yhds^m+&Zs=4)V-PY5bDyW>Hn%m=1g9`T!oWF)BVaRFhKt;r zNshoM6E~;1GW6oG2@yR#YaO%B0z|W7I7*cXq4EC(333c~S6& zhT(D&bEHg6+T;3oa)-xu@idW_ltwGz%Vg9oo5LG*i*cl~-od8sV`CX$V{XbR42t=4WjC+b0m+&`=@!rgFfLP@Xc zn|IY#cCNS-Bvce_2HLde)1+C0b8ld+?NM&Jj{e$my^&Ermiof@$UQy4Pb1HJZeBez z#>L#}$2`57vRPCcC^A6rF90J-elZ(J450agq1&uryf$CgJ+C@KJ{5WaNq@v!-@3&Ase?a}~LJLfzBZuA{i zU=;W7gx4iw>}Ja4mAnKOp1GO)>8#ZE-^~m1{<05{f%wF=6y6rAtd8@Fl(~6b=%)7Myi z*ru}^9UJ91sA-zAyZ=Rf|C74%;dqAD7Mn}f;`jna$b|N`NAU2$JGB>VCI8u^1WPEh z``~pg)a{UVJENg%qdd2`imyCti^o1$FnJ2lhi3|J`fi~BjoT9_>CY^BWVCE=zE)of zMGg;R5PtaM`kn#w_)`mR>vzIA`epDiLQ*Il39!1@BBNXkd7|`#muP?coz5LBq?60k zTt@$hr_t(A0uV;m(f9s(i<9X+8HBTEt^UlSJKl(lgDeqcqbr`#%3L8F79Z57&9kqp zE`0Crlx(nle(kY)@K68u)#2a&QOBt?rpg}PBsjQWs9SiSjP=c(=&&|Xg^mV(x*%GG zKMT|rLhOg_+B$>g&>`tZul!2$V|2OmUJE3*R_kZK6F$=wKl@Rz7lvJU;?WC#As)#g z@bT->wez(f&sotC5cc+QhU|X+&)d8E&vIBao}%+XSRp}%*$RU^e*VwZug_MeC6w8A zuAu}oGbSuLSdd|;kxRFEBL8Eds^4ha)QjnO8SsqA!XZcU7&CaUg&KSA_8sG4P^_PL ze$geGE0@fhm7!l|bkewHUmzYgCJZ8cFNsR;8FP)F$&{K$YeGNixjb#W#Kr=Hk|D;k zM^6+g=ct8Qtjd8?=xm*+Y~zK|2d2jBGVbw~@e?n12R}2EW?ogd^6B?$!F$ zh2u49Yxl{|;+>3Z*;lK`v|eVaw1EHDy|ROInwq>lrv zcE=#>@)>eq0-BaLnEVi`gt)7uCG3NJ3@%nZN}M( zjStd2flOczP^m!GV|AJ`G#jz|J%WS4!We!x=ndj^gqXo;Wi0_VscjRolWsPzpw+aa z1m^K8uNFcXao#Chfs&p=zGNx2I>ES%Nm9&DBbt?7lgcQRO=1$bFjyN7$sgDXJ}@*H znXXL$`-BVRP>gmBmf2eotaC7MgY{7p^JMy}%tEm~8Z;>4T);^V6WolRM@_7R^`%=0 z0uwHyFGfGK3d>m8*4JT}u8)VvWWsAnEAEaxJzwOx5|%jUq;*Xi|BDITG5W&&oCPCn zvwNc;20sI0jE{sJgOhE{^zc zejcMmyT=l~NE#4Krx{-{>M{{m_pC&99lVsvN%T`c9z-)oD5!%$Vn3Imz+k1nnA9ID zow_|vUwr&&^Krr-MdK0dz+gSjIAV-CEc-%qW@Ns>t6QDVmBH*xOHp&6k^$t7@us4=l9>W+1|pK zRH>e^SMOpxXC?NF!c{&m!=RANIUqh>IXAioibXKVZc{pz7K5r-Ia=s z$MRFSt3vddg7cAK(nFp@jv+~(=Y6|eVa6%=0xH9Ik#jCs?c`p1~{at+Rsu8_+*Ki8C>d)3PTI!e)#EQ*muzPN^OJUgqYDOWtp z<8=%U*WkxdC=+%XG9-7IajA`PecFV6?i~~^Jnhx4g(`~%OH!%&LB^3|cyyG1SOYz9 z8;knXeI8_WfJ12Y$b*WS#V7~vp(Q2A9vHG1ebqLl$Yrnaa5TzG^er;s(b>X6k1x20 zHe?sMYw^TWBZaDHjLd#7_8(ff*5AQ>@XeJOaot%A%>X*vt7#Z6CpzqGpXweKWTQnU)MJd|4fkRi9CIOjDy zYVq@^liF$B*9Z`fqP3+F=Xwy(Zg--;;tN#2W}{Vco{YD!*|>KOeQ zlACDksEF0I8{w`#h1c=WWyoxg@&q-8McD}BTIjXV6`CZN;klczK0HcRS-g!`HrhFx z18Xd$n$lExbW48E8Ec{(8XpaVK^XoWwIm~SUtMFcL`%w}{20*H~>%L%{|A2L?efj{+NB0zM<5XMJyOp3h(y?%=&t zSF-P5KI~HnsUw({#qIP9_rn`Lbv(;>sp6YybNBPc*c;u;5WkvIJ3Lgm^qAe-e^h;W zFFKp<^!=aYiF!Z23C0`G1$rT7_e$JSJv?fwPu|UF%n;DW=9tM?iI#P57HGr>d|x za1$Ks+252g5+53KyjX_}l+Cr5Ghm*pe1-`Az8#DYK8g>Pe(a;&)|ij40=(+%{i>l0 zox{kx=Lm^M8BqQ;2Od6ttB}sOV#{E)IN_KKcqf~l|5^s<^GgDxPu|M#3ct=8iLQ)7 zaw36Qea-hZN0A=m&fJeVk}tEspB}a@LTvl(zqGpe-MMw9K7&C zc729V;kespz8T&MjpRkVax;Ex|66z+4-?sxY#-ex!)L-qn>RNvd_7t<_L^4@!dJt~ z>=m`Rk-@*s>$rQbao^D%n;S33A9y4k+5SC77JgQV8T&O206a@W zGVch{6<$lmjM2?dPB!A-^Z5%rjoT#wRpny8_02|9pYy{`s&IU(KlbUw-}Dt8ct`ef6mgt_`T;6vds@%R5arC}I_jAU5D@&VE1$4@V&r(jow1 z8p0^XR_7=I2JpmwGYY%lY$nFpMmS%Sh4jPwPd?7m{#k~4o`|pgQUfC52&J)7Eu2H= zFna?C;Ru|4p1Nq4AdGl5mo`!T{q8Nf3}bJZn8H{}^B6*m(Qt(_GeCmbBmtM5BOA^m zZXG&laLV3SsTetC2_Mqri&wTfPnmp3A-^N}O(BY{7+rqq#!OuHfXpgc&mL2jDo^2B zR{jAO!-c?fi^g4E$ug%sOyKg|GQ6CB<#>lny(xn{V&`sl@L(E74#m!7O*xoQt8f*R z^)DLLM|`HI4qRs_OlTQe>6QP}xnS@k9E<_qFZi2R0|CsZXfV%rk5U${M&aweI)o`& zWH_qK>=}GEJcL7MN**$1Cy|U+;*sNow$#atN5(TlG&1$6-JWl3JA9O4w`17lm0e2* znKCe5yxIh>uu-efvmzM2PFwwbm;yn87jnxh6Hk5i}^z`P`FVE-(-+^-IX`jZ)jk7e)*KYj2~LLVN2k#aRhhy=4_IznV; z!!_Qje?056Xu}F>&*eHe_bF22E$mqf8qWG-Ok4~GivFW`>cf)c*w02r488hzB6>WT zx9(DKZmzd_8r>ciM(vzN3eqeH)Gyf$)u(Rf+J&@2Eh*fQQgxLfwJ4zn;`A4k`R+N-WP(xNdRr%kA(wr*xzJ49aM7$Kf`-Rn{~ zq8!2Y;3;Lk8&W$X<@)X(Y_(EQDldXM@4Cu=i6s9k5=8Vkh2#Cw^Jbg;0RN>9W z*TUKHeqZs+cojVyGUK-Jy3qb&_l>#nSauz6GivcP{Cfn9{jVPjUMAD24po-nw}dgr z-T||meGH13SjY`8i*pNIm%`OD?OL2LsU2JW*JfkfYh-=!IOk6d+U)W3hK7B#mWYP@jbda7=x*GPoFQGCUVRgxI5*KA`n1K2#q=e3X6ARR^ylJX>rVKx@o16y`W> z`ZN16wN{t(TO;T44`$dY7g9PzsZbhkz4n(^mpZ$5eY5bv#^vh64|~5K_{}}7PCHnB z!^2Rh;I27tUt)@bjN0DtoU*rV?mV)R9X{8c?YsW^tE<&pKU^JN|8WX>NkKYiaJ&l1 zF$=W~R_a&EY{sDN7UYt?nrC^0?6HdG`%l_(Q7h)cM&6?M)PY81^<{*FXE4ls?pbpm z`c|LMNz(E$FGjEC;U?Bu%q0USp@+fPYZOFWGXgz6wm^wEDG5RWl4;I8nAD%oAH{j8ZAv=ZuSn~!BaLKS?9Li!ep1pu3hj`8ineZ}3 z5(BdFHes0c*CHr~*zC8;kangqgK$Pw%A)y<&M^ah{dTrL8HxJnbz2@#=r&dyV~cZu{%XQd>fS#SqQoIAfy>vb#cC_n-VE zIKCD<8T;|-EaLGx(#ON|ehfB7i-m^h7;lepo;UcwsMDL6`;fW78*#86`?OoP1KfMe;F_jotb+#vxh?H%(sdTVNWSCN>@Ky8W@*N_Nc{Wc;o& z68pJ1$|zSZ!`c`=6q;-iY|h*+s=~1o`}k>_F+Ik!{lsLyNILcfK5724uhcPjD|;@r z6F%4*%izRkcq{ofe3s#A0)hjIh&hyzYOYdOJTr#1xt1)bI_H0fkio_9HG3mN-#9aG zj_nccMRL%40xW)myXbQBe5rC!ZXIY*lw$etaVD(Hid_d6Wc4vC_29Od98ENIU6V;mYxl#GPtt_h1`bMcp6jXz`9CLb$^gfcvM@mSBwViVZT zWXk{w9;>l4@W9M?3|_0JjLrZX<#;A?3{+hP8>WDCA+FoXOg*(>(vlU`^Yg0Q4&%5- zVd#rrCx!Ms%J8v=al&=le0@P^hY1NTs$7=9Z3e}Jf=(a0j^GLO*t+nMk1{gKVx{b~ z5D$dg3r$E8&N#Es{zl%wE#(hGhd;*Jco6y|P$dAEIB%0yHCq*#5KnCy!1@xez}F0} z2DrUM!eM6M4ACmmr0GpTwAyM4oej#fdeZ%>vywZjxxV+V(na}&!zQp}Lekkn_-2j} zIa2~^>nP*nP=?aOz4}2pNT~5X3d!9Wh{yx&6otISn{c@+!zrP=VK5oQbwfxjMZ>w1 z4=H21*0tFqa|WNxu@q0rp?!YGg^wOJxjy{lvy|WJ4JW8%%!Z7`Gga8`1$z(*A>PHW zKfhCwjg*eZ60k4c$^)9hb$a(f5ziTg;0#{g$3V|_qHzr;USt&S<2JgW1^hj1yfWmVU5F<|Sk~NYJh*k|(+t{s zjQHweP)p9jm?6LL=5fCra8Fld_^FGL7x^by3!FR%aIj4HU%w@r88U<)#v$F}RtEIr zS4w(S2rrmO8PZdo`l5_ya-1g97^Q`nb`Q?1==1g&Q%RrM`{)@kcWK)7Nw!`JFgT!q zo{#OQ*k16)di5EP6CN9!;odiPMT!E-Qbhwzztx~F;9Hh4K1cJ-NW zub%sj-)iiGIXr%lg7d-qRnYuUmcYrd=kWLXyf4|+s{MbvG7s|bO?K=mvu|2r7)s8O zLy%v3d36x}_QT(8K5U;__&dlPS_beF;f7PL&@$N)^JGx!%&8MfNXcP9HP`IzH)($& zqsMVMv$q~`>P2L#kIBLe*jYG5Q*$a~BbiW#E7w;Gtvq)NTKb-csd;1u`h-?hE~Kb- z44-(|ctY>ZC}MPpp6>;B<_ZPCGiT=3hY=#J5*{q@>MMGU@u||W#(J{vDe~yXFu-^_TT>(JKl=8QGh z;rHE)rynN_f07~_EiKYL{c;A`^YuU2?3d~}3$X;<=ncHHExI`KZJoDeLe+Ro(|rc7 z`W1i0JcHxm$M|yk6fGI(hR+!01WSvR*KcK{Wc)SnmAo@_X8;ubx_|G@`Vt(4FPc-< zd79UG?d-*KT*Bf6$crbW?mW9`be_;xcn3!`VrUvKJV(aigeBLnN#a31v`3cL?f6^2 zwc5V+x9VAQ!R!Be_2}RH!`0!F7FE#qTE@ahA7;#CbTv1`R-r5&M)$mDJZI+BRSUP9 z=S%+bl~-miTxUR#gX_FelYz8MtG1yWf9(ee!VII5GmX~>-!Q&2lIBqMU|*NrbCbb+ z7;kg3=x6`3GZFtdp%s1Y>0}HLk|htCbF$z0;cEN!Uu!PDIUaJy7fc_|=({dLuK}Na z@nJ^f3yW^exQQ3`a9*2ZY{Y|eOh$aVd;3S}L$#GLKMO3{n=w~^dC{UXLv;4Jk%2OP zR?m3R@>tU87)=KmPRoM2zWz+#!*?=$!aK=7ycb=z9i6ed`jvV7P?peT?_6`CkoXL^ zIkJY)*;twVd&Wj`Mr6tcKjV4WMi+yQK_z=Bp1RNi7Y}!a?<{TTZr>45YaO^XLc^M=#`1^t;Q`^~}rRFKND6ZYN`mdbVF!{8#d>;k0>yR-; z`V(8VCn@E6+eEUv*Xr(LtB0*#oTmK!^;<8l{>#7o{ncOm)fd9~oz)lZAFTJIFpBAC zjDZ>A4=D^Z&~e|h%<9~@ySpag$*dSKhJ+kpz!18`=!RIzSc>FnMu0;x2hIlACZop$ zYeGD2#dO!ose~WfXJ2gpMH8cJM+kYwTq9%>BKwSvb%S`HGCUbMQ&wkHfdQBRmU(HC z;DiPH?ZyKKZ!y>?41Hfv7%gJrqm0Pe!(jELdsaKp?CyegxM#ct)^RP zKjC!>MrYhzdaAu6>M!h|kML4`Npehi)I=tv$KbHybyD`$llE&$dIBJZ1=^BJ%0DK~ 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 z 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 Wa<%o&sYP+p865u|Od7Lf{O%61Vv za4U1j@j0 zr`-hKVh`sQc*e*WzP}j&69|io1-CX1G5P-!^>076pLd?$w`x`GO{sOFNQx9Gij>q+ z_ej&N?m5Kh4hHCW32RSFQ5<_4)0sRPEZeYOUYz`906~e0shQp<#~%8ore2eAIqa z4%$ja8>(D)ut=!(*kxOL1y&q8#>*}1p2@8VFor)N)Vvte_c_r!7i+>i9QVw%CT<>%|5&LmfvxN_+_N!e1P6aK zaOq%X>rv``*V=cmcw@JU9*8GOWa9VN5zWiVxYF1v>=<1gg9NcgV|z=`Qtq;93?H<|$B9pDX~ z!D(k0MuW!FMN-M(1H77H1}329{_#)O5dHn??tZ{NL9Q$F)@~lX?+eUsascfo{V;y# z5bu3-|krp zEJyMt1I6bYTFr(8lpF^Ew=z#kY#*0BmdQqA9QTIZ7rDB>4tIol)$X6LP0`7E( zuPbHR#!3Gx$vw#=_c@xK4FJ$Rivu+p2#)vK^FPJgDhbH>Xv($G)^zW1)*DK@g29Zf z=#~=!Z(!zzIYmB(zMd%qvl3OZso~byy!DZv2ke7)_?a97ofa9HC^%&K(9z@beSxY<_swpTTH*k=RDTK!A~B$^jz-B9*@S&x0p&95O{@wW(^bN*LDT4lLj(=%t#;oG13LiF`)>nPa(jvYU7 zG+U7v2p-|{$fz`SG`q6ag4Mc-F0-e(OwCl3T7uJ>%YfO_xd?#9f7?nh13b9SVDJ5B z3ud;p;qs=j!e2pZrJ8IH4R5Yrcy)C0_)q`A>H3w|n_s%}2j5Oc#0$@s%`|_`tv!TK z4l+OXO#bxri~r;Q>2&`5v!{oD@V93}XmlgPD$8|MIWBp>4w%i4gG85Z{~PBi2;Y~v zb&j*9Hg|9Q$?4`Rf2;S|^1&a!SK`UhKc{OaH#pq(^P!b&9Qx?0%%?rN%Sx48ISUdY zF;xv;`~B9Qp8W^^c{co;C3qUAqyT=o64YN-F+Pl$Ipo)6H61%~YRk{c+N~x0E;CtE znVa@8UJ871!iI~oda`-T&|v|`G$gy1rO#QC0Yk$9e%GC!i3SG8XqEh3K%(9d(K?=5 ze*{}$==PudMeE8TJVz^Zfl^ye7h5tM-7A-u9c14UsPUg`?wwtDolPgeKsQiW@%6Iz zfd%_5=$Dh&tAn@r4)Ft=+EZ)3@@^jS)`hTDCsW@2fSF z#mC;t-XU+3^D7;vUoZ=~`t{HJcH{RL5#k)e%WXt)dFJ#7zw@QjzxFTv^|r2^Yl_sl zBn-_6_&UUEnXl8LcGgN+`j??_ThyGfL;%HPJz|beX%G>+9g53oBDlNLMmrI6earx7OSIQu%Rj+jI0>;|+%VNA+grF$y=U;!VGK-I%-u(~$Z>OJq?~T)||K`74C*|f@R;ms&4VqG; zWD77cf_@62sm((*+E27|t=wJ*S|L zID}^z7S5^YVq<7ruuZFQ?+4z}%u4yT;hS&^ekX^+PuX~G?}5n^9N)>>yaNk6u*Bor$ zB1R2sf8qxPDIS%*oc`{S*E#slR2sAM;i9uCV}aX8Rp(b|JHP`V_eTx0{0-=VvHTx z&RUBHiZoPj=XetfQoV9XKFS?g7j@RuS?9aoQEZ|^|Cb_Y4 z)2@DCUqgEsZ_Cm;pK_hsVvn1T5!?@gUvw2MJuLY1u=kX{>SlS%QK4`fV|)La2M4T2 z95CpaTT?VPz6<`tvq)N)ozVs^UB8mX41<+*M?2O+xh@D0UgvO)PJ$sJ+au=0HI7nM zbPg8evr_a%I?{UiKG@28hX+D%Hr;t1ctFG=<;{=!dbyi7=Q$bf2|kQ>a({EP4rRR2)ePSPCd(eRdjD$n^4ovDtberC8_joF$!HIs zUI_?~4#Ib9lYzX`ZSt)@&nf)#?oEeRIiVyHeDrBp#=3qKlZyrO&dia95ooe|uvS(B2o zPS?+WAy}k8Pd^W*(O<7+yOt$vxksao;9{*xLhUzekFQMBy>kbxOIFQ6>6(uS#%KHW zVsO0gNP%-@$ya24GaL_v!v)`*5orJ7x4xac3&sWZ&jp|1|NQ*t)9VGp!S_%8@N}vp zr)q%9dpX%5_S$g^!RD%L-%1^$X_ZVjy?0-x?3e%k|M_%&<%QGD-~7GdPD$>9=guu` zoY6X-Ap_7g+H9F@ilo`*x$dZ%z2s!vy!6%dMD}U+`}TvDaRiI&Fa4G5tJcj{Tregq z#NQW3LI}7_k7Y-3-m|$zKB(H~a1rqk!gf@yM=y*GdABQGAj5;{kBk6SzW^NVj!c2vVUIWSwABRv3;k-;-M zm2Exz9=2C=S{APb#;@pe{M#`oZfn4v;W@pG-}ao18BM~C>?UQHT!phGj2u_d^@DA` zhoIor4%SW6en4`1d=aBBIOUDTm(5jWcb82~o+zWeECbnR>KoH0*0b?W|oFBnpu3b?8h^V4Tg#pSrEqaI-$5Su>{G^83d;Y z24UHxEE?O22Z`feimvy|{*BpV2>eU&j!=2VE#%UEwPzl7?Ms}(zJ8XmYw04UG0auQ z_1%w}U*)5s*}81q#|P$f`cV$;+ZmgcJD#7-K>w}ZXl?hWAO8pcaUg$i`sBaycPBK? z@4el#i;#Y#84wmVPSMasrzsw_l0j+smFi4^^xW3Xp;+teo+T~lgmxJ>v_EY`-EX^h_ zWB{&oLMAc6dY_TL4x>s)vf7UBNd$k_Qkw8WfR6z(CL&JJSBH{1&*&%_Lpa1-v!mQ{ z_Bi~PpFc5#MV=bYeH5^$i?T&izJ2Eh;UOH91$r#H7F?9T-XsvOUQIZ>`uZVozx(Y5 zXsvagVl2%NYq+SiOi_mHTa5z`83j`S1tmcr46aHWA9Tnq2k=ql#+1s#oMg^7 z$HGw{9w9sJ7U^Uh= zt@}DUI__6u*|YnZ0k`XdS-&}`9yA*3_tSDB2H+a2m{)N4u*hF`1m^@7qpdY`S13!a zpo>1^+_~m3)Xg#Y_jA10*wLnQGXdpNbdhsJPH2R({d2$_%`oD%V^^*$svcNY&I?vu zG5D`*Y_e4*ZC~VeUyV2zsT>gu+@9msz)|ksVbnxhlN5t}Bhn9hO02r^3Zjr{f*B&B z(;+#*&A%12p4Qc54wxN|%j9X#LHA~|J(FF7{=2fZf=dtN95mjtrhT&GAYAYL?u8TI z99GNafDSffVB_4jFEpl^Y;~71O#-u`F=Mi(|o z+3|CR>Gsx%{8n*uE{JpcgSX-xP1;^cM`d(Ii$2?arq;1wkTs@@7+E_*G9uQX3XF6- zM$fDC0C&L{Mr*Hc7=sLo_y&yToRZCCO>>>@o^NEVo`p`8G4=cD5i(G*FPWiu4Zmqz zvGe>m&5ch^fazhpH-^1pJ^#u!3t!;w^Y~-NB>mca_BDCfn9&7sqWa}NM`@Xp=xYv3 z4wU__aUE_0Pr+i;o>HZc}>~l0LfH{Lyq@FE7P6z@psKdn^ zRzdORxKcZVdB0!dEk-LCVXl4_Fv`9;WMp%Rj~Z#$N0x;QtDb@zks6!6cvDu6&QUh8TZ?OdGk_mlUsS!DUTz92Z~YrGrYR5jpp zbPDG&SMcn2^a4g#l~O846%a=cJH}v#z`xpDUg*B~)7B^W06oTd^o^b_vOh`(vpvb# ztB*FPU~>6kb1mpRK%+ZZDMwiJoCWU$@aePQGnj`Lbk8YV7yq`(aKta~y|F5*bvWAymynp)TfAsHH z=K0#`=5PEh%Sn#>Fj$AnezsRv9k;Xn%n9E^u^_u}DI49`#oo`oF(AbU3AwNB6 zzVCduYtzdep>h5CuOCfx#>cY1A$BzSj?l=ZKE$DFnL3n_ZsxDTd zo`ZO8?;Ti0pW8#qc8We6(C&DWQ%!ngrj2cHtCC$X8w2+=kF}QjU*>GuT9&UcM=`r2 ziXQ#DXn~UGX?8<=DNyb>yOqR0b{`NWfADO~Lx19{tFn~zdqkc&*xZ$e&H==$!HGT! zj&nfC<+|dYD{}@{*EwEp$)*o~7%j&i;Sa2^uDLhxUfjb)aGR~jKOi?_(6k_*_nGY3DsIeo5!u>a-X`{L>AuUDV@OXX52Z4ORG!w5S9QtEb{5|_z%kkP6E zL|__2U#{X>T=->QG zsr&Dpe(|6DC#Un*{_5%DfAepiu2aTm#KIxW0K3Ydh3vD85=I{GLUabhjJ^?c(Cd9n zi+D8~a6G`Gy4#Nzz$rhUJym?leMGoqdVH0E)vQL@*$56?D4k%j{VeUp6K$BXjj%j# z0xiOuLbBFCurd%wZgAGnb!%Aku}-bdWV(9e+c|MLW1> z!Qw0{{e1BHmpYH=^~UaS&+mV4Mn3`8U}Fluz|m%DhSr27Bc$i-OiWG$!$c&6vX_}H zvwOeNQNk5Sf+q%N0K<`p@AC=R>)vyH^I0hhBf|BR2FJpll%A#gs750i=G;aMjnH*n zIN?CFWvmAuLieh&sO@9u+H+YL4K!q_Hj5cHIc`M>KYX(`&%tB0-{3~UHQvJn*~9pY z>}C{PM3gYKy$$Fo9C4gD3mguP`Avcr!j!tMJao87kPrX~v88XK$)KUb`*@0QvKP%B zLrp4fgWbxUj9HL|BERI^-P*SpFI*QKkhPOxy|qVVLL6lK#wP?U5=nV$7W0^}N$|*? zQZzCkvidg^VRW}zfw?@tMk9R>BMB(e54EDWGw!1iWz{XEfZVH0|ZQ zQ6`>I;J(LYiD8BTJQ@buVD&TzMGzz9l}dTdXbAQkI(rP!FlUOwd_=?N9Q%?+@`@@7qt>?aBN{Z52`i zc^HA5q}^{!wBGZN;L}kWi|00W#y@$>b$rP27~M4$^w9V|L5t@U%$oi%q8jr7CFQwY z}0?`%H#e4n^hitC)$dwsm1^x7Hrjm}H3~SQ1&yQ&z(B;SG$c@pWvrkbq)IPb0<#Uj@Jx+0elT9$N06Yrn}dSa<|& z_Z&Pn2Q?ePSLR-WHmVvN1BUInx@asX2*Ux2 z_raB8YFyn`XE?!k^8yye(e_<03($O&S&>h{P*+F+S(yj>?0uoI8A-`!RS*sIghsnw z_JYyGc<*N=uLys)T3Pn zXwF3NIq0f2Gio_tjemqi3~5|Q>6fqgcd&*i&B&VXn!m}ccGm(U!4ysJYedvDcYSN| zd(MBKn_D_TC!h&?2tS$=S|b^b06N;9!RZ9>Yl`g&ynOhhY%>mF_E`AWKjK_= zlYMh}=NqG$IgaV0?UjshIv8Dr)a9+eY~JzcZ8XZB4R3GQ!%@mnxiFs|P;n_y0Y zqx;Enyx1){g!phuxA8f__mA@rasVdp+RwRe<^I|;)6dCxW3zQMuefuDVxO%q3L=58 z=706OFa1tyD)Z6-^v|4s?ew>Q=cUu{f3-+O40eiuz;Bz+W5(@s2R`!La;kWwag zoe`)F`!aD9J3-2@ixF;Qhk77iXv)f(5}G2(4A}`e0&W70TM}4TTAVjW}P_8xQxi{H;ll|>)d&SJ8<@Ul_Av9xW$|$B2u=W zrF-JR<{cb*HeqTLzYAK$LD&hCldK)3m!q{tFq9r44KWm_xkog21Qr5fTJ7 zfzf;pr;Z_$&^4EwrS09Im=Fws{``y8YZv9p;6K%!@v>6Yu1h#gnT%1GOe6W2G9pDp zF`G1VPY(ydoY0Ozw%XPPPun|%xCjL6O2Dj1O;edLN*IbFo<5zB7rlAEXp8-TT_=;V z^Xqc39m0O|#jk{u*H%7yDVs=Xu3UvP+S)Wh5e1yn+C8#GGa{x;f@4CH10a=t`f0-S z7YXscXEqYLT_@NelX_+}wS?0P36`9jWgDU;MtItGw7IjdWNE5>AG3D3Gx{D!51OQi z1VJdMjn=>^xG8PWv5V370F%RM0(IpR(TB{sEG0B^Aa08+-ZD_a^WDlX%sIsv4S%cv z$TJy$%X%?jD2m35*n&xg$|9>N2PKa(={!g?0;3tk6mdTs-j%5Y$I+usS%i+cMI$0i z+vgKrM83zjjLhaE$n(4wlE+gwbX& zf20Bx4dtB3NEKSKw37Wq#&=t7&-L-InZkKUNCJ2VD`9`11e3Os; zYn%p{L){g&^eLZx$CH&`<#D$^Clj<1fcp*_Ec zqSMi8&&02$1&=H9nj;l_Tle7rx4uAfIN|2hPq&Sp`?c#hV&r^yGw#Z3qs2M0!IJ^0 z%o}|VhW0bb5;jjpaKzDl4N8W=85s>Y!D{-du}yM%w>cYkfp2q$i^k|SzUB2;8a!zs{!;S2PJz26u8j9%pc=^l! zzRy4CxPzRb&fr}3u>JmvT4&jTz3QWfK=qUFx1Q`04NO!yMMK;B#_r*ux#8WM;^a7z z;C!8x&vFXcR0Vl87;-ejDz?DC;NQ0Ld?IJ93W0OiT^uT({BfMYf)LTfwPQKTh@El> zuj;V5j;z-7(K2x9@<;!#|FA%Rd+T2Na%-Z0gK={h4cW&jc~Sym_Ea=**Rcw^`P(iw zN8A=6PDwVJ{g%!a*2Vg+a?bnrbB3O+x#TNfY{1}@eLQJAe3l>qCytnIoMkK5iClG9 z)kG&%JMVq(bpMxsUIsK+c8taX55XHdFELQFK{kbXkN!XPxg6B&)xM4ZNf&ye{Rqvy z&}n$hIo55I94bqD`SBa!r9gN*GCe>qrAJj|gy4-$c1EoIm@vNUeKg*)u0Q#D@9!yl zR{urA2k(%lYh1&oo}7BZ8{}XxBg<472rQ}G>y7Siux5JTvFmf{z-O6gv^4_hiZZ73 zIlY$#+0T)!W>Yoy8L2%tnYp!Ba>~8}L&>Ub_dqA5<<5c__ByV#w6WsV`3r2&&`c@q zxe`+5(_M%>Nc7YHf2}=)_qQ1ak3V|)^;+})%fJ8H>E${x{^b1#wn-~zn!$rs_WJ!3=?*>eyG#i zrIwwcS83h#S6*+d>(kHw-hb9}esTKvKlgi;o|QUB@Bwp~r_#CCjk)Yx$nS#~qR$wt z5dq;n#Sv^70gV2Y9}%(<3I)4pQHl*RMh9W%!iXkRtsUZ8#bb_%tRSaJlN?9sK8VBp6!Q>-Fy1FQ*u-f~s zF|`SraI(&YWqkd;R^1poUU=#d&fsW1oS^MFq>S-k*)+5|M^|YwVgloM44Xw!{nral zIQX>h=Qd|&e9`>RodM`x8>#o-!K+AJ56dZ#aB9s&Y__wo7ZvVM)$|-WY>7Q`yPi|9Y6;^{6bOVn(#CSxA!=W zGOcs^`WsJr9BJ1Rdp|t(<8XN}HvUQgo4WwV96K_Fun% z&$GPG;gRu5zU|yubeb$eJ3zcecfGk!ak{r3!!D2)T$f!!FCKz6$xhdRaX-d)Z|^px zCouJVbcJT!o5S)1I?X@2HAe4n=;vg1&EP)Ay)l}f&ZXACd0EHTDaZcqTK5Z7&Is?> zR?xXW$!}dB3zP;J?QX-ggj0I}!W!FGRmq8T65IL9q7dgCZ|2tjs;H4bG zBJ7tRrMt?IEQrRj1IOV4dV)v#;%EvH9fB9fu{BN(H_wP-MkF~50=m?i6Zl-WE_h%d zuME(5f?&yb9VNkX`|o#WufPQ57i22lOh$4H`*#0mYS;81B1e1VZ=dzB#%XQV%Z5;SBhxqi)5rFXKV`6|V-05J z6x_|rb2sd9Aw&CI@N1bm<2M1>X*9IVW4Eqk)%rXO9R|?B4?h{N>&Hx<**c!e&_Rxq z&iD-Opugi5re_N}cuI633q5*9H~6mr@r+plSg_clf&gqllfSjVxopKU7VzKooZ*If zqWk*1`}G$HLBIMrVAmMk&mmH^B^UsX(;xlbyu0VHWg4%wvAsNZ^M)8d>=XgFzVEV+ z@ElrB+BCkU!bgAq^4-(zcm94fSf-n-6(H6d;QexHlFWif{PSvO1OCqM$KPG^ zPELb8SL}_Plx3}Q=i{_Y!Cf=Z$=aG zP8mYoMK|~60$`WQPj6oN-T3e2N+Q3#wVt1OA^L6|WmoLS3o*eG-!%_s_6aEE;NSnE zVEQlKYV2$`0o-iH`wz2GlH2S<&GJq^%{dW_W@E$)gPF`|u;1|kt0T|#(c3gd;tXhWbT@J5mgxhcYkIg06e(u+IJjURI zg7FKT-E-jba0rth8BXE(~aE%Vm;?dv70uBslw&zS67 zC)jo1#fxli3+ZdJC;DW!$+Vt3nj)psJhBOX{QYo|UD?_We$D2mot0AbJl7pR;bb&z z4bf~e=<3s*Lh$J?_8jX8Z$8K4&4-?xerXTse47$NDUP1gxM+q`_N4maX{E~EXJ?wX z`A^Su?Rc}ll_a|tO`->O2HvreQ3as;(gpmU9hss0x@X+y3@X#No?YVE_POF8;o>ro zm-a_;4%hR8Zl0Z-oNKxq&fOSJ<}YMJc^{#X1Xo}Cd!K1`uGH*LZ-18keQ8^}T3HqB0{_Dl?IFHTF%*T{I8Anbt@ z7vY2f03!eye@-A~H`|C`^dFHj+?Q!c_}ujOb%IJnVFp=8Ra|xSKvzWw0Xc(nN;Czj z2@N1A!DtE*LJO{QV%V;EOv3EF2*)@%ir2sK#Wpwp;Pn1~{a@^ivycDgUpalONYk23 zAeN51xQ5)Emve9-IL(`)8dtE(c> zA?S4X-rGkr9@ilHlqRR2p)jY-{gz58F=`MU1=ja6XE}RW?}tDGWEnTa@1Ewe>?B5^ zz^xXQE8lfYK)kRHWIwV=yS-te*+rz3Y~H;5N?F1$CjcY-;If7>tJ{y3Gj4Fp_CQFv z7!wS0Ft%23%Q#l*$eH34Ug|`-&Yw>W3QSHhhL1&ix_8Q$LkPy!%@KiT05*RDp!Hvh z;_lqD;AuapuAYx_l6G!cIHh>krkKKuMr6)))VtvbgFuMzdBV6{ry=!rAYd+TJ*P`KYh^|}Tu~)SDbr0D$1sLBvR+Z42 z;1jGkW`wzH3kQpQQ*yZS*4BZioY5!43D0mk<12&ak@fd|(|u1fg6{Rh7+$y2CcHg? z48UZ|aW-mWCP(aBu?|Mw!`8j=kzTOe7;uCRJbSdztQ&7<6BMHR<`3?D>yII-cJbPnF=4=q|ZF(^yw12VnA z4w^@22sm*A?}HJT!U-CR&wqu(?rBz|!3ezP1=pOFr`fGJA;$yv9BU$lmhB_!wx+`o zf=e_(CW8f~zJQUZb**f_K+WdEQ0|(w+}}LWclQcH!F5Kw=gc8&Ty#9=r$xb~JuPzp zWP{RoWWnwGKUy`xIpg)nJfv5P&|4Roc9dha43DnTU7nA| zS`(T9Uq3Udn>YNKziUI$Z<62)9FB^(}O}>H8 z_2*wXo&U<$!bR8p^sVfHGH(UoH55`(ef62oZytBw|I3`lY!*0t^|ktYJU>}`ul!P$ zz0Tc&lvgjjm~+sx98o44)pc_azy*%tz3Z3%>W+E1>KFzYKP7w17S);ZVy_qli2uzU zFw##umr!GwAANUxs$tUQ!*rfZq3-6cWc#s4Y}ttaRyD^N1e@$QW!l3T-8cKKIoSfz zy$-3re(?*<_Y0@TZ~T*NngT^=7f(mCs(_A?(bibzPO}vIAH6zVgeQ(H#0K4UEeAqM`fi z<}{fU9_W&2E{!wNo1+2FIw^Qx>nu>NDI(4j)yv-(Cdd0_roF;4=M$9mYAalD6N|idF*Fu0TWn7 zuSFgcwhwYJ7`0<90?g+z$g$DCNra$dV|9q)fPzwjmH-EA|DnBW+I$8Spn5xiw&(F$ zsvE*MBt7$73Vs=znDS71#~3<%J33+eu-a?5{c%C)s?6y1YpG4ouhYJh$+7U5VyNd-a&({)a^kZ7A>gGK6-&63r)^sH0a>?MDLrc+= zF=QNGIkU28=a`^|IGk0Di6|Qm`^qdlr19|czQWa_IQ@bC(3~>PIkPbxnxk{JXU;v% z3k`3-k9kv`W6Y4BY_|6z@1D7#1RrjVl%PCJ8bcxar%D9*t%mOxYZy?*Yqi?H4~*D}Fw4`UN< zEh!TLke+!L|BkOkubLP6vc^-bHUzh?`vhF@Ogot#MlCZ)PE0HW}WH}r5#$u(Y- z6#SFT!JUkK9Bwjw4`(qRd$3G?_}`?S;17>8@7YJP{Uyy?S6>F~Xg;O$ zNM@Ol5ga*kU@xk^<`})t2ys*hXVFnT+Xs$QqMHRT=#=hq{7|zSZ0AhJ!@p|AL%ydk z7#Bwdx$(@kdo{1YuOsB1v3SrE=A^G6X#vT`PFiifV7bOI1t>Y}Q?SjmNkZfis6f+w zFF0deJ)1E%qZutFN9`M&AV3h^3zXspbG*`zJB}cp)_jZ+qvU^vuxni07ae!=q-1P? zn65$pnls(BUuyfNDDLKNZ}XZ|kheXP%(6cE>;b$7=QXBbP=`bN(9oTBhngtEek=nhs(1v zC(fn6jnO}N2ZiG~!J9MGv=~h@Y6z9t4ZUeTmfOsX&frvAH9*&yQBXm zL+LuON`{AsUEgebD?JfjbSGVaEWV2qhoc!y$=lr*{zLd^egnf@u;qwHn!RNmjSr^b zVii3m>%H+8ShPO!g>Ev(=!5RpZJE&~KzjEKT(qF~$|gnE_BEah`fX2Bv^s-P`Dk;F z@EhKonn!qFb2sbRdq-f4tQAnQX7FLJp*z7lf%iGHWQo8eK6o-;HWVPyIaaZC>{oBX zNgpBsU&BdqcIB$!RTa=^&2`~p_8Q)%YdXOF?)(2ReZ$c0^NjRM&ey$jh^yYRCF#Cx zNB1@ExlZ1mfBS1?k3JVIR58Sv<0xlen(LXZ@Tr#y?7n%rdhG`fIrc<%P6tMFi-IAjhD2Xm zgJ1)Cl1c72xH@Lx`ZHh2X8C4oXulmVkUv);F?g zb8egWaE1@iA3KcwNq1z&E)bheTv=yRl4)Gvk3Hu(WeDf!HLttx{dt+$Z}eWys`Ddf z=Ox?Y6XonH^H$Q>qf{D^9Zv&T>wsUQn!9iQ zBesL!`!jrNasyosdw1Egbfz^P zl7*$qz+^mPs$dcy*_RpYub+FhaofMy-pZA1x^Lx~@hsT^7nLs`__fyN72b};2S{2+ z#@KtoeO)|zZ;zzc;xT(-r{e)E*@^#T1uq)UIJUxqIjG~Q_``82AAO+!Ndb@WxHAn^ z4ons|hxmmLa%q0&w){oB(PMlj(;hD9kY%rHx-(zFeA=>bdD=A0K2H-whkalD!E?WV z|HYR-efk?;eev|luT^>#gSvoX*V5DM43f9PB*8oUCOrQVe(sAT_2q zcT9vmN!w7|Gc|{`45*jWd;jU* zJ3ac&cTS)9oxgE<_J2|NXdrm}-a8RqLPQ6)h}V7+1i0}i-;hmMc6&6@oH!I+fTtRNR1PWe@$cvUx7T}K$x%e-cEP)?i= zaA@DEXp)mPw}6mD^FE6Mi`v!FUa5azr#EajxZ2 ziW$u?{1Z%&H=MLKtg*;*^fqA;ER{B`6?kjLr&ElW2OJnSy&=;2ID^`LFO5f(eJ+~b zzzlcGlx13`sr9p?)P!s3aTEPv)36e3!bjJFv-1z<5Oy;M;Xxlf^WqB$u1Z9r1Il8; zG`y|zrV&1#Lx{d}e4~=^OF_3j&u(pKY=;e_DH*unbd#frp77TM2!#R=t;x76vx_f# zqw5ZbU`~Q4WAJyh!Rf^mwjjm3DRYJ$r1Z=gip_sC*mQ5hvBo_1Lr`3InmphU22n!W zo?(0=+pqwM`QlpwHMs5Qgo05kjZG2XF)W(f!#dKcNO)A4F+mTm51xO1M&f-9naq9T z8=k-puM8N!(Iq1he+yzAcn_!XlpqE{iPwk2{=?2IY29ZnSB8dg?*j(lO-fg^T#3%( zN?YTE$oU9d!TTISYl=4T_aduUWzJW!sLxhL9c&S#>I?KB%c_~z%5j^A?9d3-f8p49 zMGQd=hIG0_8=TiU%w&gUOg{8nG9r565R%o)zBS(mMX6Vs+r`f0bltj?2D3-~P07Ih zlx)v6e{+p+x}x!b6vWVQ{~aZ(ecXF19SdfHij<}-;dMssb)MB4H6`QVS@|s(aVkek z!PWIW)yNGDhtZV3jM03y@2}@AxVWo!6Ip|tW^G#J6JMIP!M1~nh=#0S$H__sP6=rQ& zc$=pPrp@ zKHJ3`oTqs3ICrMc?O|`*3Ajvm7W}c0{T+>rKinn?+nfc%Jk#w^0#5vUQ_?$}b;dlB<_sJ^* zbSbzSuh*-S3yMIdPx5i|!z)&*gep^AZH44N|Z-3BQKiQanfnk>Jsgum?s@s~U?h?6IZOuk3ln0MWnCBaZMI{-1rh(#6kJ zM*huUmVWM;+tPve1v7L4{k7*CCtEv5?wsSp)=8-+OWt1Tq-|DHQpRokW#I0+rtGfD zE}cb}>B?SN&|)22(RugDAmiqvM>b2p5744yQlA@LD(xgg>hcH;3>xhwwV5`J6*|x3c9vw8rt`6Z({i%<*Hy zo_{Snm@{5iRe=LX7fEuVk?90BS^m(D(9sN7un-Sh!*?wtOuw0e~JC^%*0id_=xm**bg zzYvnc2nW%bT2t~SE`z5$u=Sq4_k)yi2>DcklFip>B zfO4gb!k#Dw->q8{W;Q-T0b7PY2MPmeuK6`-rYz zd9B*@≪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%0ANQ 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

59NuxZAN1bR^i+ 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 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 324e72cdd7480cb983fa1bcc7ce686e51ef87fe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7718 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 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index 9bec2e623103ac9713b00cad8502a057c1efda61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10056 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 ek+^GN3bv-?^>(QkVinb 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 - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml deleted file mode 100644 index 1670889..0000000 --- a/app/src/main/res/values-v21/styles.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/attri.xml b/app/src/main/res/values/attri.xml deleted file mode 100644 index af1dabd..0000000 --- a/app/src/main/res/values/attri.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml deleted file mode 100644 index 4c1a797..0000000 --- a/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - #1e82d2 - #FF4081 - - - #1e82d2 - - #D8D8D8 - - #dddddd - - diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml deleted file mode 100644 index cdf4aea..0000000 --- a/app/src/main/res/values/dimens.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - 44dp - - - 17dp - - - 15dp - - - 15dp - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml deleted file mode 100644 index d9200f7..0000000 --- a/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - ikvStockChart - diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml deleted file mode 100644 index 0398eb5..0000000 --- a/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - diff --git a/app/src/main/res/values/warning.xml b/app/src/main/res/values/warning.xml deleted file mode 100644 index 6fca90f..0000000 --- a/app/src/main/res/values/warning.xml +++ /dev/null @@ -1,5 +0,0 @@ - - 程序发生了错误 - 当前网络不给力,请检查您的网络设置 - 当前网络不给力,请稍后重试 - \ No newline at end of file diff --git a/app/src/test/java/com/wordplat/quickstart/ExampleUnitTest.java b/app/src/test/java/com/wordplat/quickstart/ExampleUnitTest.java deleted file mode 100644 index 3514ac6..0000000 --- a/app/src/test/java/com/wordplat/quickstart/ExampleUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.wordplat.quickstart; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see Testing documentation - */ -public class ExampleUnitTest { - @Test - public void addition_isCorrect() throws Exception { - assertEquals(4, 2 + 2); - } -} \ No newline at end of file diff --git a/build.gradle b/build.gradle index ca197d0..e463f14 100644 --- a/build.gradle +++ b/build.gradle @@ -1,32 +1,37 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. +apply plugin: 'com.huawei.ohos.app' + +ohos { + compileSdkVersion 5 + defaultConfig { + compatibleSdkVersion 5 + } +} buildscript { repositories { + maven { + url 'https://repo.huaweicloud.com/repository/maven/' + } + maven { + url 'https://developer.huawei.com/repo/' + } jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.0' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files + classpath 'com.huawei.ohos:hap:2.4.2.7' + classpath 'com.huawei.ohos:decctest:1.0.0.6' } } allprojects { repositories { - jcenter() - maven { url "https://jitpack.io" } - mavenCentral() - } - tasks.withType(Javadoc) { - options { - encoding "UTF-8" - charSet 'UTF-8' - links "http://docs.oracle.com/javase/7/docs/api" + maven { + url 'https://repo.huaweicloud.com/repository/maven/' + } + maven { + url 'https://developer.huawei.com/repo/' } + jcenter() } } - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/app/.gitignore b/entry/.gitignore similarity index 100% rename from app/.gitignore rename to entry/.gitignore diff --git a/entry/build.gradle b/entry/build.gradle new file mode 100644 index 0000000..a8ad05e --- /dev/null +++ b/entry/build.gradle @@ -0,0 +1,30 @@ +apply plugin: 'com.huawei.ohos.hap' +apply plugin: 'com.huawei.ohos.decctest' +ohos { + + compileSdkVersion 5 + defaultConfig { + compatibleSdkVersion 5 + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + testImplementation 'junit:junit:4.13' + ohosTestImplementation 'com.huawei.ohos.testkit:runner:1.0.0.100' + implementation 'io.reactivex:rxjava:1.1.9' + implementation 'com.alibaba:fastjson:1.2.55' + implementation project(path: ":ikvstockchart") +} +decc { + supportType = ['html', 'xml'] +} diff --git a/entry/proguard-rules.pro b/entry/proguard-rules.pro new file mode 100644 index 0000000..f7666e4 --- /dev/null +++ b/entry/proguard-rules.pro @@ -0,0 +1 @@ +# config module specific ProGuard rules here. \ No newline at end of file diff --git a/entry/src/main/config.json b/entry/src/main/config.json new file mode 100644 index 0000000..3d7ffe9 --- /dev/null +++ b/entry/src/main/config.json @@ -0,0 +1,164 @@ +{ + "app": { + "bundleName": "com.wordplat.quickstart", + "vendor": "wordplat", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 5, + "target": 5 + } + }, + "deviceConfig": {}, + "module": { + "package": "com.wordplat.quickstart", + "name": "com.wordplat.quickstart.base.MyApplication", + "deviceType": [ + "phone" + ], + "reqPermissions": [ + { + "name": "ohos.permission.INTERNET" + }, + { + "name": "ohos.permission.WRITE_MEDIA" + }, + { + "name": "ohos.permission.GET_WIFI_INFO" + }, + { + "name": "ohos.permission.GET_NETWORK_INFO" + } + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "entry", + "moduleType": "entry" + }, + "abilities": [ + { + "metaData": { + "customizeData": [ + { + "name": "hwc-theme", + "value": "androidhwext:style/Theme.Emui.NoTitleBar" + } + ] + }, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "orientation": "unspecified", + "name": "com.wordplat.quickstart.ability.MainAbility", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:app_name", + "type": "page", + "launchType": "singleton" + }, + { + "metaData": { + "customizeData": [ + { + "name": "hwc-theme", + "value": "androidhwext:style/Theme.Emui.NoTitleBar" + } + ] + }, + "orientation": "unspecified", + "name": "com.wordplat.quickstart.ability.Enable_Left_And_Right_Refresh_Ability", + "icon": "$media:icon", + "label": "$string:app_name", + "type": "page", + "launchType": "standard" + }, + { + "metaData": { + "customizeData": [ + { + "name": "hwc-theme", + "value": "androidhwext:style/Theme.Emui.NoTitleBar" + } + ] + }, + "orientation": "unspecified", + "name": "com.wordplat.quickstart.ability.Disable_Left_And_Right_Refresh_Ability", + "icon": "$media:icon", + "label": "$string:app_name", + "type": "page", + "launchType": "standard" + }, + { + "metaData": { + "customizeData": [ + { + "name": "hwc-theme", + "value": "androidhwext:style/Theme.Emui.NoTitleBar" + } + ] + }, + "orientation": "unspecified", + "name": "com.wordplat.quickstart.ability.MACD_RSI_KDJ_Show_Together_Ability", + "icon": "$media:icon", + "label": "$string:app_name", + "type": "page", + "launchType": "standard" + },{ + "metaData": { + "customizeData": [ + { + "name": "hwc-theme", + "value": "androidhwext:style/Theme.Emui.NoTitleBar" + } + ] + }, + "orientation": "unspecified", + "name": "com.wordplat.quickstart.ability.Simple_TimeLine_Example_Ability", + "icon": "$media:icon", + "label": "$string:app_name", + "type": "page", + "launchType": "standard" + },{ + "metaData": { + "customizeData": [ + { + "name": "hwc-theme", + "value": "androidhwext:style/Theme.Emui.NoTitleBar" + } + ] + }, + "orientation": "unspecified", + "name": "com.wordplat.quickstart.ability.With_Pull_To_Refresh_Example_Ability", + "icon": "$media:icon", + "label": "$string:app_name", + "type": "page", + "launchType": "standard" + },{ + "metaData": { + "customizeData": [ + { + "name": "hwc-theme", + "value": "androidhwext:style/Theme.Emui.NoTitleBar" + } + ] + }, + "orientation": "unspecified", + "name": "com.wordplat.quickstart.ability.With_Fragment_And_TabLayout_Switcher_Example_Ability", + "icon": "$media:icon", + "label": "$string:app_name", + "type": "page", + "launchType": "standard" + } + + ] + } +} \ No newline at end of file diff --git a/entry/src/main/java/com/wordplat/quickstart/ability/Disable_Left_And_Right_Refresh_Ability.java b/entry/src/main/java/com/wordplat/quickstart/ability/Disable_Left_And_Right_Refresh_Ability.java new file mode 100644 index 0000000..9cbacf1 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/ability/Disable_Left_And_Right_Refresh_Ability.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.ability; + +import com.wordplat.quickstart.slice.Disable_Left_And_Right_Refresh_Slice; + +import ohos.aafwk.content.Intent; + +/** + * Disable_Left_And_Right_Refresh_Ability + * + * @since 2021-04-22 + */ +public class Disable_Left_And_Right_Refresh_Ability extends Enable_Left_And_Right_Refresh_Ability { + @Override + public void onStart(Intent intent) { + super.onStart(intent); + super.setMainRoute(Disable_Left_And_Right_Refresh_Slice.class.getName()); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/ability/Enable_Left_And_Right_Refresh_Ability.java b/entry/src/main/java/com/wordplat/quickstart/ability/Enable_Left_And_Right_Refresh_Ability.java new file mode 100644 index 0000000..2d48fe8 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/ability/Enable_Left_And_Right_Refresh_Ability.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.ability; + +import com.wordplat.quickstart.base.BaseAbility; +import com.wordplat.quickstart.slice.Enable_Left_And_Right_Refresh_Slice; + +import ohos.aafwk.content.Intent; + +/** + * Enable_Left_And_Right_Refresh_Ability + * + * @since 2021-04-22 + */ +public class Enable_Left_And_Right_Refresh_Ability extends BaseAbility { + @Override + public void onStart(Intent intent) { + super.onStart(intent); + super.setMainRoute(Enable_Left_And_Right_Refresh_Slice.class.getName()); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/ability/MACD_RSI_KDJ_Show_Together_Ability.java b/entry/src/main/java/com/wordplat/quickstart/ability/MACD_RSI_KDJ_Show_Together_Ability.java new file mode 100644 index 0000000..793dd81 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/ability/MACD_RSI_KDJ_Show_Together_Ability.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.ability; + +import com.wordplat.quickstart.base.BaseAbility; +import com.wordplat.quickstart.slice.MACD_RSI_KDJ_Show_Together_Slice; + +import ohos.aafwk.content.Intent; + +/** + * MACD_RSI_KDJ_Show_Together_Ability + * + * @since 2021-04-22 + */ +public class MACD_RSI_KDJ_Show_Together_Ability extends BaseAbility { + @Override + public void onStart(Intent intent) { + super.onStart(intent); + super.setMainRoute(MACD_RSI_KDJ_Show_Together_Slice.class.getName()); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/ability/MainAbility.java b/entry/src/main/java/com/wordplat/quickstart/ability/MainAbility.java new file mode 100644 index 0000000..0b2b9f0 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/ability/MainAbility.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.ability; + +import com.wordplat.quickstart.base.BaseAbility; +import com.wordplat.quickstart.slice.MainSlice; + +import ohos.aafwk.content.Intent; + +/** + * MainAbility + * + * @since 2021-04-22 + */ +public class MainAbility extends BaseAbility { + @Override + public void onStart(Intent intent) { + super.onStart(intent); + super.setMainRoute(MainSlice.class.getName()); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/ability/Simple_TimeLine_Example_Ability.java b/entry/src/main/java/com/wordplat/quickstart/ability/Simple_TimeLine_Example_Ability.java new file mode 100644 index 0000000..c833cba --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/ability/Simple_TimeLine_Example_Ability.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.wordplat.quickstart.ability; + +import com.wordplat.quickstart.base.BaseAbility; +import com.wordplat.quickstart.slice.Simple_TimeLine_Example_Slice; + +import ohos.aafwk.content.Intent; + +/** + * Disable_Left_And_Right_Refresh_Ability + * + * @since 2021-04-22 + */ +public class Simple_TimeLine_Example_Ability extends BaseAbility { + @Override + public void onStart(Intent intent) { + super.onStart(intent); + super.setMainRoute(Simple_TimeLine_Example_Slice.class.getName()); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/ability/With_Fragment_And_TabLayout_Switcher_Example_Ability.java b/entry/src/main/java/com/wordplat/quickstart/ability/With_Fragment_And_TabLayout_Switcher_Example_Ability.java new file mode 100644 index 0000000..c32aa47 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/ability/With_Fragment_And_TabLayout_Switcher_Example_Ability.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.ability; + +import com.wordplat.quickstart.base.BaseAbility; +import com.wordplat.quickstart.slice.With_Fragment_And_TabLayout_Switcher_Example_Slice; + +import ohos.aafwk.content.Intent; + +/** + * MACD_RSI_KDJ_Show_Together_Ability + * + * @since 2021-04-22 + */ +public class With_Fragment_And_TabLayout_Switcher_Example_Ability extends BaseAbility { + @Override + public void onStart(Intent intent) { + super.onStart(intent); + super.setMainRoute(With_Fragment_And_TabLayout_Switcher_Example_Slice.class.getName()); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/ability/With_Pull_To_Refresh_Example_Ability.java b/entry/src/main/java/com/wordplat/quickstart/ability/With_Pull_To_Refresh_Example_Ability.java new file mode 100644 index 0000000..4ce35ff --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/ability/With_Pull_To_Refresh_Example_Ability.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.ability; + +import com.wordplat.quickstart.slice.With_Pull_To_Refresh_Example_Slice; + +import ohos.aafwk.content.Intent; + +/** + * With_Pull_To_Refresh_Example_Ability + * + * @since 2021-04-30 + */ +public class With_Pull_To_Refresh_Example_Ability extends Enable_Left_And_Right_Refresh_Ability { + @Override + public void onStart(Intent intent) { + super.onStart(intent); + super.setMainRoute(With_Pull_To_Refresh_Example_Slice.class.getName()); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/ability/With_RecyclerView_Example_Ability.java b/entry/src/main/java/com/wordplat/quickstart/ability/With_RecyclerView_Example_Ability.java new file mode 100644 index 0000000..bd4a183 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/ability/With_RecyclerView_Example_Ability.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.ability; + +import com.wordplat.quickstart.base.BaseAbility; +import com.wordplat.quickstart.slice.With_Pull_To_Refresh_Example_Slice; + +import ohos.aafwk.content.Intent; + +/** + * With_RecyclerView_Example_Ability + * + * @since 2021-04-30 + */ +public class With_RecyclerView_Example_Ability extends BaseAbility { + @Override + public void onStart(Intent intent) { + super.onStart(intent); + super.setMainRoute(With_Pull_To_Refresh_Example_Slice.class.getName()); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/adapter/TextAdapter.java b/entry/src/main/java/com/wordplat/quickstart/adapter/TextAdapter.java new file mode 100644 index 0000000..01ebca7 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/adapter/TextAdapter.java @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.adapter; + +import com.wordplat.quickstart.ResourceTable; +import com.wordplat.quickstart.ability.Disable_Left_And_Right_Refresh_Ability; +import com.wordplat.quickstart.ability.Enable_Left_And_Right_Refresh_Ability; +import com.wordplat.quickstart.ability.MACD_RSI_KDJ_Show_Together_Ability; +import com.wordplat.quickstart.ability.Simple_TimeLine_Example_Ability; +import com.wordplat.quickstart.ability.With_Fragment_And_TabLayout_Switcher_Example_Ability; +import com.wordplat.quickstart.ability.With_Pull_To_Refresh_Example_Ability; + +import ohos.aafwk.ability.AbilitySlice; +import ohos.aafwk.content.Intent; +import ohos.aafwk.content.Operation; +import ohos.agp.components.BaseItemProvider; +import ohos.agp.components.Component; +import ohos.agp.components.ComponentContainer; +import ohos.agp.components.LayoutScatter; +import ohos.agp.components.Text; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by afon on 2017/2/10. + * + * @since 2021-05-08 + */ +public class TextAdapter extends BaseItemProvider { + private static List textList = new ArrayList<>(); + private static final int NUM_0 = 0; + private static final int NUM_1 = 1; + private static final int NUM_2 = 2; + private static final int NUM_3 = 3; + private static final int NUM_4 = 4; + private static final int NUM_5 = 5; + + private final LayoutScatter inflater; + + + static { + textList.add("左滑右滑加载(Enable left and right refresh)"); + textList.add("禁用左滑右滑加载"); + textList.add("多个指标共同显示、联动(MACD, RSI, KDJ)"); + textList.add("在Fragment中使用"); + textList.add("带有下拉刷新的需求中使用"); + /** + * textList.add("动态改变颜色、尺寸配置"); // 还没有准备好 + * textList.add("在 RecyclerView 列表中使用"); // 还没有准备好 + */ + textList.add("简单分时图"); + } + + private AbilitySlice mAbilitySlice; + + /** + * TextAdapter + * + * @param slice + */ + public TextAdapter(AbilitySlice slice) { + mAbilitySlice = slice; + inflater = LayoutScatter.getInstance(slice); + } + + @Override + public int getCount() { + return textList.size(); + } + + @Override + public Object getItem(int i) { + return textList.get(i); + } + + /** + * getItemId + * + * @param itemId + * @return long number + */ + @Override + public long getItemId(int itemId) { + return itemId; + } + + @Override + public Component getComponent(int i, Component component, ComponentContainer componentContainer) { + component = inflater.parse(ResourceTable.Layout_item_text, componentContainer, false); + Component view = component.findComponentById(ResourceTable.Id_view); + Text text = (Text) component.findComponentById(ResourceTable.Id_text); + text.setText(textList.get(i)); + if (i == getCount() - 1) { + view.setVisibility(Component.HIDE); + } + text.setClickedListener(new Component.ClickedListener() { + @Override + public void onClick(Component component) { + switch (i) { + case NUM_0: + nextPage(Enable_Left_And_Right_Refresh_Ability.class); + break; + + case NUM_1: + nextPage(Disable_Left_And_Right_Refresh_Ability.class); + break; + + case NUM_2: + nextPage(MACD_RSI_KDJ_Show_Together_Ability.class); + break; + + case NUM_3: + nextPage(With_Fragment_And_TabLayout_Switcher_Example_Ability.class); + break; + case NUM_4: + nextPage(With_Pull_To_Refresh_Example_Ability.class); + break; + case NUM_5: + nextPage(Simple_TimeLine_Example_Ability.class); + break; + default: + break; + } + } + }); + return component; + } + + /** + * nextPage + * + * @param pageName + */ + public void nextPage(Class pageName) { + Intent secondIntent = new Intent(); + Operation operation = new Intent.OperationBuilder() + .withDeviceId("") + .withBundleName(mAbilitySlice.getBundleName()) + .withAbilityName(pageName.getName()) + .build(); + secondIntent.setOperation(operation); + mAbilitySlice.startAbility(secondIntent); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/app/AppRuntime.java b/entry/src/main/java/com/wordplat/quickstart/app/AppRuntime.java new file mode 100644 index 0000000..354f712 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/app/AppRuntime.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.app; + +import ohos.aafwk.ability.Ability; +import ohos.app.Context; + +import java.lang.ref.WeakReference; +import java.util.LinkedList; + +/** + * Created by afon on 2017/1/24. + */ +public class AppRuntime { + + /** + * 静态类型的 Context,你懂的 + */ + public static Context sContext; + /** + * 查找当前的 Activity 栈用的 + */ + public static LinkedList sActivities = new LinkedList<>(); + /** + * 快速查找位于栈顶的 Ability 用的 + */ + public static WeakReference sActivityStops = new WeakReference<>(null); + /** + * 与服务器通信接口版本号。本值会自动读取到 gradle.properties 文件中定义的,不需要手动修改 + */ + public static String serverVersion = "1.0"; + /** + * 本APP的版本号。本值会自动读取到文件中定义的,不需要手动修改 + */ + public static String appVersion = "1.0.0"; +} diff --git a/app/src/main/java/com/wordplat/quickstart/app/DeviceRuntime.java b/entry/src/main/java/com/wordplat/quickstart/app/DeviceRuntime.java similarity index 45% rename from app/src/main/java/com/wordplat/quickstart/app/DeviceRuntime.java rename to entry/src/main/java/com/wordplat/quickstart/app/DeviceRuntime.java index f26ed2d..b2bd23c 100644 --- a/app/src/main/java/com/wordplat/quickstart/app/DeviceRuntime.java +++ b/entry/src/main/java/com/wordplat/quickstart/app/DeviceRuntime.java @@ -3,10 +3,22 @@ package com.wordplat.quickstart.app; /** * Created by afon on 2017/2/4. */ - public class DeviceRuntime { - + /** + * IMEI + */ public static String IMEI = ""; - + /** + * DEVICE_ID + */ public static String DEVICE_ID = ""; + + /** + * PULL_START + */ + public static String PULL_START = "PULL_START"; + /** + * PULL_END + */ + public static String PULL_END = "PULL_END"; } diff --git a/entry/src/main/java/com/wordplat/quickstart/base/BaseAbility.java b/entry/src/main/java/com/wordplat/quickstart/base/BaseAbility.java new file mode 100644 index 0000000..845656c --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/base/BaseAbility.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.base; + +import com.wordplat.quickstart.xutils.x; + +import ohos.aafwk.ability.Ability; +import ohos.aafwk.content.Intent; +import ohos.agp.render.render3d.BuildConfig; + +/** + * author :Administrator + * date : 2021/4/28 9:55 + * package:BaseAbilitySlice + * description : + * + * @since 2021-04-22 + */ +public class BaseAbility extends Ability { + + @Override + protected void onStart(Intent intent) { + super.onStart(intent); + x.Ext.init(this); + x.Ext.setDebug(BuildConfig.DEBUG); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/base/BaseAbilitySlice.java b/entry/src/main/java/com/wordplat/quickstart/base/BaseAbilitySlice.java new file mode 100644 index 0000000..75ce7fe --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/base/BaseAbilitySlice.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.base; + +import com.wordplat.quickstart.ResourceTable; + +import ohos.aafwk.ability.AbilitySlice; +import ohos.aafwk.content.Intent; +import ohos.agp.utils.Color; +import ohos.agp.window.service.WindowManager; + +/** + * author :Administrator + * date : 2021/4/28 9:55 + * package:BaseAbilitySlice + * description : + * + * @since 2021-04-22 + */ +public class BaseAbilitySlice extends AbilitySlice { + @Override + protected void onStart(Intent intent) { + super.onStart(intent); + setStatusBarColor(ResourceTable.Color_colorPrimaryDark); + } + + /** + * setStatusBarColor + * + * @param colorResId + */ + protected void setStatusBarColor(int colorResId) { + WindowManager.getInstance().getTopWindow().get().setStatusBarColor(Color.rgb(30,130,210)); + + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/base/MyApplication.java b/entry/src/main/java/com/wordplat/quickstart/base/MyApplication.java new file mode 100644 index 0000000..00916b1 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/base/MyApplication.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.base; + +import com.wordplat.quickstart.app.AppRuntime; + +import ohos.aafwk.ability.AbilityPackage; + +/** + * MyApplication + * + * @since 2021-04-22 + */ +public class MyApplication extends AbilityPackage { + @Override + public void onInitialize() { + super.onInitialize(); + AppRuntime.sContext = this; + } +} diff --git a/app/src/main/java/com/wordplat/quickstart/bean/BtcBean.java b/entry/src/main/java/com/wordplat/quickstart/bean/BtcBean.java similarity index 97% rename from app/src/main/java/com/wordplat/quickstart/bean/BtcBean.java rename to entry/src/main/java/com/wordplat/quickstart/bean/BtcBean.java index 71bba5b..05d5919 100644 --- a/app/src/main/java/com/wordplat/quickstart/bean/BtcBean.java +++ b/entry/src/main/java/com/wordplat/quickstart/bean/BtcBean.java @@ -5,10 +5,9 @@ package com.wordplat.quickstart.bean; *

Date: 2017/4/16

* * @author afon + * @since 2017-04-16 */ - public class BtcBean { - private long date; private float price; diff --git a/app/src/main/java/com/wordplat/quickstart/bean/KLineBean.java b/entry/src/main/java/com/wordplat/quickstart/bean/KLineBean.java similarity index 98% rename from app/src/main/java/com/wordplat/quickstart/bean/KLineBean.java rename to entry/src/main/java/com/wordplat/quickstart/bean/KLineBean.java index 3bd7b0d..cd8596c 100644 --- a/app/src/main/java/com/wordplat/quickstart/bean/KLineBean.java +++ b/entry/src/main/java/com/wordplat/quickstart/bean/KLineBean.java @@ -5,10 +5,9 @@ package com.wordplat.quickstart.bean; *

Date: 2017/4/11

* * @author afon + * @since 2017-04-11 */ - public class KLineBean { - private float open; private float high; diff --git a/app/src/main/java/com/wordplat/quickstart/bean/ResultBean.java b/entry/src/main/java/com/wordplat/quickstart/bean/ResultBean.java similarity index 96% rename from app/src/main/java/com/wordplat/quickstart/bean/ResultBean.java rename to entry/src/main/java/com/wordplat/quickstart/bean/ResultBean.java index f4d0a2e..7699927 100644 --- a/app/src/main/java/com/wordplat/quickstart/bean/ResultBean.java +++ b/entry/src/main/java/com/wordplat/quickstart/bean/ResultBean.java @@ -5,10 +5,9 @@ package com.wordplat.quickstart.bean; *

Date: 2017/4/11

* * @author afon + * @since 2017-04-11 */ - public class ResultBean { - private int resultCode; private String resultMessage; diff --git a/app/src/main/java/com/wordplat/quickstart/bean/response/IResultResponse.java b/entry/src/main/java/com/wordplat/quickstart/bean/response/IResultResponse.java similarity index 79% rename from app/src/main/java/com/wordplat/quickstart/bean/response/IResultResponse.java rename to entry/src/main/java/com/wordplat/quickstart/bean/response/IResultResponse.java index c5245b2..52ff561 100644 --- a/app/src/main/java/com/wordplat/quickstart/bean/response/IResultResponse.java +++ b/entry/src/main/java/com/wordplat/quickstart/bean/response/IResultResponse.java @@ -5,17 +5,20 @@ package com.wordplat.quickstart.bean.response; *

Date: 2017/4/11

* * @author afon + * @since 2017-04-11 */ - public interface IResultResponse { - /** * 服务器返回的逻辑结果响应码 + * + * @return 响应码 */ int getResultCode(); /** * 服务器返回的逻辑结果错误信息 + * + * @return 错误信息 */ String getResultDescr(); } diff --git a/entry/src/main/java/com/wordplat/quickstart/json/JSON.java b/entry/src/main/java/com/wordplat/quickstart/json/JSON.java new file mode 100644 index 0000000..64e39f9 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/json/JSON.java @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.json; + +/** + * JSON + * + * @since 2021-05-08 + */ +class JSON { + private JSON() { + } + + static double checkDouble(double douNum) throws JSONException { + if (Double.isInfinite(douNum) || Double.isNaN(douNum)) { + throw new JSONException("Forbidden numeric value: " + douNum); + } + return douNum; + } + + static Boolean toBoolean(Object value) { + if (value instanceof Boolean) { + return (Boolean) value; + } else if (value instanceof String) { + String stringValue = (String) value; + if ("true".equalsIgnoreCase(stringValue)) { + return true; + } else if ("false".equalsIgnoreCase(stringValue)) { + return false; + } + } + return null; + } + + static Double toDouble(Object value) { + if (value instanceof Double) { + return (Double) value; + } else if (value instanceof Number) { + return ((Number) value).doubleValue(); + } else if (value instanceof String) { + try { + return Double.valueOf((String) value); + } catch (NumberFormatException ignored) { + } + } + return null; + } + + static Integer toInteger(Object value) { + if (value instanceof Integer) { + return (Integer) value; + } else if (value instanceof Number) { + return ((Number) value).intValue(); + } else if (value instanceof String) { + try { + return (int) Double.parseDouble((String) value); + } catch (NumberFormatException ignored) { + } + } + return null; + } + + static Long toLong(Object value) { + if (value instanceof Long) { + return (Long) value; + } else if (value instanceof Number) { + return ((Number) value).longValue(); + } else if (value instanceof String) { + try { + return (long) Double.parseDouble((String) value); + } catch (NumberFormatException ignored) { + } + } + return null; + } + + static String toString(Object value) { + if (value instanceof String) { + return (String) value; + } else if (value != null) { + return String.valueOf(value); + } + return null; + } + + public static JSONException typeMismatch(Object indexOrName, Object actual, + String requiredType) throws JSONException { + if (actual == null) { + throw new JSONException("Value at " + indexOrName + " is null."); + } else { + throw new JSONException("Value " + actual + " at " + indexOrName + + " of type " + actual.getClass().getName() + + " cannot be converted to " + requiredType); + } + } + + public static JSONException typeMismatch(Object actual, String requiredType) + throws JSONException { + if (actual == null) { + throw new JSONException("Value is null."); + } else { + throw new JSONException("Value " + actual + + " of type " + actual.getClass().getName() + + " cannot be converted to " + requiredType); + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/json/JSONArray.java b/entry/src/main/java/com/wordplat/quickstart/json/JSONArray.java new file mode 100644 index 0000000..c1f6a36 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/json/JSONArray.java @@ -0,0 +1,647 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.json; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +// Note: this class was written without inspecting the non-free org.json sourcecode. + +/** + * A dense indexed sequence of values. Values may be any mix of + * {@link JSONObject JSONObjects}, other {@link JSONArray JSONArrays}, Strings, + * Booleans, Integers, Longs, Doubles, {@code null} or {@link JSONObject#NULL}. + * Values may not be {@link Double#isNaN() NaNs}, {@link Double#isInfinite() + * infinities}, or of any type not listed here. + * + *

{@code JSONArray} has the same type coercion behavior and + * optional/mandatory accessors as {@link JSONObject}. See that class' + * documentation for details. + * + *

Warning: this class represents null in two incompatible + * ways: the standard Java {@code null} reference, and the sentinel value {@link + * JSONObject#NULL}. In particular, {@code get} fails if the requested index + * holds the null reference, but succeeds if it holds {@code JSONObject.NULL}. + * + *

Instances of this class are not thread safe. Although this class is + * nonfinal, it was not designed for inheritance and should not be subclassed. + * In particular, self-use by overridable methods is not specified. See + * Effective Java Item 17, "Design and Document or inheritance or else + * prohibit it" for further information. + */ +public class JSONArray { + private final List values; + + /** + * Creates a {@code JSONArray} with no values + */ + public JSONArray() { + values = new ArrayList(); + } + + /** + * Accept a raw type for API compatibility + * + * @param copyFrom + */ + public JSONArray(Collection copyFrom) { + this(); + if (copyFrom != null) { + for (Iterator it = copyFrom.iterator(); it.hasNext(); ) { + put(JSONObject.wrap(it.next())); + } + } + } + + /** + * JSONArray + * + * @param readFrom + * @throws JSONException + */ + public JSONArray(JSONTokener readFrom) throws JSONException { + /* + * Getting the parser to populate this could get tricky. Instead, just + * parse to temporary JSONArray and then steal the data from that. + */ + Object object = readFrom.nextValue(); + if (object instanceof JSONArray) { + values = ((JSONArray) object).values; + } else { + throw JSON.typeMismatch(object, "JSONArray"); + } + } + + /** + * JSONArray + * + * @param json + * @throws JSONException + */ + public JSONArray(String json) throws JSONException { + this(new JSONTokener(json)); + } + + /** + * JSONArray + * + * @param array + * @throws JSONException + */ + public JSONArray(Object array) throws JSONException { + if (!array.getClass().isArray()) { + throw new JSONException("Not a primitive array: " + array.getClass()); + } + final int length = Array.getLength(array); + values = new ArrayList(length); + for (int i = 0; i < length; ++i) { + put(JSONObject.wrap(Array.get(array, i))); + } + } + + /** + * length + * + * @return length + */ + public int length() { + return values.size(); + } + + /** + * JSONArray + * + * @param value + * @return JSONArray + */ + public JSONArray put(boolean value) { + values.add(value); + return this; + } + + /** + * JSONArray + * + * @param value + * @return JSONArray + * @throws JSONException + */ + public JSONArray put(double value) throws JSONException { + values.add(JSON.checkDouble(value)); + return this; + } + + /** + * JSONArray + * + * @param value + * @return JSONArray + */ + public JSONArray put(int value) { + values.add(value); + return this; + } + + /** + * JSONArray + * + * @param value + * @return JSONArray + */ + public JSONArray put(long value) { + values.add(value); + return this; + } + + /** + * JSONArray + * + * @param value + * @return JSONArray + */ + public JSONArray put(Object value) { + values.add(value); + return this; + } + + void checkedPut(Object value) throws JSONException { + if (value instanceof Number) { + JSON.checkDouble(((Number) value).doubleValue()); + } + + put(value); + } + + /** + * JSONArray + * + * @param index + * @param value + * @return JSONArray + * @throws JSONException + */ + public JSONArray put(int index, boolean value) throws JSONException { + return put(index, (Boolean) value); + } + + /** + * JSONArray + * + * @param index + * @param value + * @return JSONArray + * @throws JSONException + */ + public JSONArray put(int index, double value) throws JSONException { + return put(index, (Double) value); + } + + /** + * JSONArray + * + * @param index + * @param value + * @return JSONArray + * @throws JSONException + */ + public JSONArray put(int index, int value) throws JSONException { + return put(index, (Integer) value); + } + + /** + * put + * + * @param index + * @param value + * @return JSONArray + * @throws JSONException + */ + public JSONArray put(int index, long value) throws JSONException { + return put(index, (Long) value); + } + + /** + * put + * + * @param index + * @param value + * @return JSONArray + * @throws JSONException + */ + public JSONArray put(int index, Object value) throws JSONException { + if (value instanceof Number) { + // deviate from the original by checking all Numbers, not just floats & doubles + JSON.checkDouble(((Number) value).doubleValue()); + } + while (values.size() <= index) { + values.add(null); + } + values.set(index, value); + return this; + } + + /** + * isNull + * + * @param index + * @return boolean + */ + public boolean isNull(int index) { + Object value = opt(index); + return value == null || value == JSONObject.NULL; + } + + /** + * get + * + * @param index + * @return Object + * @throws JSONException + */ + public Object get(int index) throws JSONException { + try { + Object value = values.get(index); + if (value == null) { + throw new JSONException("Value at " + index + " is null."); + } + return value; + } catch (IndexOutOfBoundsException e) { + throw new JSONException("Index " + index + " out of range [0.." + values.size() + ")"); + } + } + + /** + * opt + * + * @param index + * @return Object + */ + public Object opt(int index) { + if (index < 0 || index >= values.size()) { + return null; + } + return values.get(index); + } + + /** + * remove + * + * @param index + * @return Object + */ + public Object remove(int index) { + if (index < 0 || index >= values.size()) { + return null; + } + return values.remove(index); + } + + /** + * getBoolean + * + * @param index + * @return boolean + * @throws JSONException + */ + public boolean getBoolean(int index) throws JSONException { + Object object = get(index); + Boolean result = JSON.toBoolean(object); + if (result == null) { + throw JSON.typeMismatch(index, object, "boolean"); + } + return result; + } + + /** + * optBoolean + * + * @param index + * @return boolean + */ + public boolean optBoolean(int index) { + return optBoolean(index, false); + } + + /** + * optBoolean + * + * @param index + * @param fallback + * @return boolean + */ + public boolean optBoolean(int index, boolean fallback) { + Object object = opt(index); + Boolean result = JSON.toBoolean(object); + return result != null ? result : fallback; + } + + /** + * getDouble + * + * @param index + * @return double + * @throws JSONException + */ + public double getDouble(int index) throws JSONException { + Object object = get(index); + Double result = JSON.toDouble(object); + if (result == null) { + throw JSON.typeMismatch(index, object, "double"); + } + return result; + } + + /** + * optDouble + * + * @param index + * @return double + */ + public double optDouble(int index) { + return optDouble(index, Double.NaN); + } + + /** + * optDouble + * + * @param index + * @param fallback + * @return double + */ + public double optDouble(int index, double fallback) { + Object object = opt(index); + Double result = JSON.toDouble(object); + return result != null ? result : fallback; + } + + /** + * getInt + * + * @param index + * @return int + * @throws JSONException + */ + public int getInt(int index) throws JSONException { + Object object = get(index); + Integer result = JSON.toInteger(object); + if (result == null) { + throw JSON.typeMismatch(index, object, "int"); + } + return result; + } + + /** + * optInt + * + * @param index + * @return int + */ + public int optInt(int index) { + return optInt(index, 0); + } + + /** + * optInt + * + * @param index + * @param fallback + * @return int + */ + public int optInt(int index, int fallback) { + Object object = opt(index); + Integer result = JSON.toInteger(object); + return result != null ? result : fallback; + } + + /** + * getLong + * + * @param index + * @return long + * @throws JSONException + */ + public long getLong(int index) throws JSONException { + Object object = get(index); + Long result = JSON.toLong(object); + if (result == null) { + throw JSON.typeMismatch(index, object, "long"); + } + return result; + } + + /** + * optLong + * + * @param index + * @return long + */ + public long optLong(int index) { + return optLong(index, 0L); + } + + /** + * optLong + * + * @param index + * @param fallback + * @return long + */ + public long optLong(int index, long fallback) { + Object object = opt(index); + Long result = JSON.toLong(object); + return result != null ? result : fallback; + } + + /** + * getString + * + * @param index + * @return String + * @throws JSONException + */ + public String getString(int index) throws JSONException { + Object object = get(index); + String result = JSON.toString(object); + if (result == null) { + throw JSON.typeMismatch(index, object, "String"); + } + return result; + } + + /** + * optString + * + * @param index + * @return String + */ + public String optString(int index) { + return optString(index, ""); + } + + /** + * optString + * + * @param index + * @param fallback + * @return String + */ + public String optString(int index, String fallback) { + Object object = opt(index); + String result = JSON.toString(object); + return result != null ? result : fallback; + } + + /** + * getJSONArray + * + * @param index + * @return JSONArray + * @throws JSONException + */ + public JSONArray getJSONArray(int index) throws JSONException { + Object object = get(index); + if (object instanceof JSONArray) { + return (JSONArray) object; + } else { + throw JSON.typeMismatch(index, object, "JSONArray"); + } + } + + /** + * optJSONArray + * + * @param index + * @return JSONArray + */ + public JSONArray optJSONArray(int index) { + Object object = opt(index); + return object instanceof JSONArray ? (JSONArray) object : null; + } + + /** + * getJSONObject + * + * @param index + * @return JSONObject + * @throws JSONException + */ + public JSONObject getJSONObject(int index) throws JSONException { + Object object = get(index); + if (object instanceof JSONObject) { + return (JSONObject) object; + } else { + throw JSON.typeMismatch(index, object, "JSONObject"); + } + } + + /** + * optJSONObject + * + * @param index + * @return JSONObject + */ + public JSONObject optJSONObject(int index) { + Object object = opt(index); + return object instanceof JSONObject ? (JSONObject) object : null; + } + + /** + * toJSONObject + * + * @param names + * @return JSONObject + * @throws JSONException + */ + public JSONObject toJSONObject(JSONArray names) throws JSONException { + JSONObject result = new JSONObject(); + int length = Math.min(names.length(), values.size()); + if (length == 0) { + return null; + } + for (int i = 0; i < length; i++) { + String name = JSON.toString(names.opt(i)); + result.put(name, opt(i)); + } + return result; + } + + /** + * join + * + * @param separator + * @return String + * @throws JSONException + */ + public String join(String separator) throws JSONException { + JSONStringer stringer = new JSONStringer(); + stringer.open(JSONStringer.Scope.NULL, ""); + for (int i = 0, size = values.size(); i < size; i++) { + if (i > 0) { + stringer.out.append(separator); + } + stringer.value(values.get(i)); + } + stringer.close(JSONStringer.Scope.NULL, JSONStringer.Scope.NULL, ""); + return stringer.out.toString(); + } + + @Override + public String toString() { + try { + JSONStringer stringer = new JSONStringer(); + writeTo(stringer); + return stringer.toString(); + } catch (JSONException e) { + return null; + } + } + + /** + * toString + * + * @param indentSpaces + * @return String + * @throws JSONException + */ + public String toString(int indentSpaces) throws JSONException { + JSONStringer stringer = new JSONStringer(indentSpaces); + writeTo(stringer); + return stringer.toString(); + } + + void writeTo(JSONStringer stringer) throws JSONException { + stringer.array(); + for (Object value : values) { + stringer.value(value); + } + stringer.endArray(); + } + + @Override + public boolean equals(Object o) { + return o instanceof JSONArray && ((JSONArray) o).values.equals(values); + } + + @Override + public int hashCode() { + // diverge from the original, which doesn't implement hashCode + return values.hashCode(); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/json/JSONException.java b/entry/src/main/java/com/wordplat/quickstart/json/JSONException.java new file mode 100644 index 0000000..ebf4212 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/json/JSONException.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.json; + +// Note: this class was written without inspecting the non-free org.json sourcecode. + +/** + * Thrown to indicate a problem with the JSON API. Such problems include: + *
    + *
  • Attempts to parse or construct malformed documents + *
  • Use of null as a name + *
  • Use of numeric types not available to JSON, such as {@link + * Double#isNaN() NaNs} or {@link Double#isInfinite() infinities}. + *
  • Lookups using an out of range index or nonexistent name + *
  • Type mismatches on lookups + *
+ * + *

Although this is a checked exception, it is rarely recoverable. Most + * callers should simply wrap this exception in an unchecked exception and + * rethrow: + *

  public JSONArray toJSONObject() {
+ *     try {
+ *         JSONObject result = new JSONObject();
+ *         ...
+ *     } catch (JSONException e) {
+ *         throw new RuntimeException(e);
+ *     }
+ * }
+ */ +public class JSONException extends Exception { + /** + * JSONException + * + * @param s + */ + public JSONException(String s) { + super(s); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/json/JSONObject.java b/entry/src/main/java/com/wordplat/quickstart/json/JSONObject.java new file mode 100644 index 0000000..29040e3 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/json/JSONObject.java @@ -0,0 +1,824 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.json; + +import com.wordplat.quickstart.xutils.common.util.LogUtil; + +import java.util.*; + +/** + * A modifiable set of name/value mappings. Names are unique, non-null strings. + * Values may be any mix of {@link JSONObject JSONObjects}, {@link JSONArray + * JSONArrays}, Strings, Booleans, Integers, Longs, Doubles or {@link #NULL}. + * Values may not be {@code null}, {@link Double#isNaN() NaNs}, {@link + * Double#isInfinite() infinities}, or of any type not listed here. + * + *

This class can coerce values to another type when requested. + *

+ * + *

This class can look up both mandatory and optional values: + *

    + *
  • Use getType() to retrieve a mandatory value. This + * fails with a {@code JSONException} if the requested name has no value + * or if the value cannot be coerced to the requested type. + *
  • Use optType() to retrieve an optional value. This + * returns a system- or user-supplied default if the requested name has no + * value or if the value cannot be coerced to the requested type. + *
+ * + *

Warning: this class represents null in two incompatible + * ways: the standard Java {@code null} reference, and the sentinel value {@link + * JSONObject#NULL}. In particular, calling {@code put(name, null)} removes the + * named entry from the object but {@code put(name, JSONObject.NULL)} stores an + * entry whose value is {@code JSONObject.NULL}. + * + *

Instances of this class are not thread safe. Although this class is + * nonfinal, it was not designed for inheritance and should not be subclassed. + * In particular, self-use by overrideable methods is not specified. See + * Effective Java Item 17, "Design and Document or inheritance or else + * prohibit it" for further information. + */ +public class JSONObject { + private static final Double NEGATIVE_ZERO = -0d; + private final LinkedHashMap nameValuePairs; + + /** + * JSONObject + */ + public JSONObject() { + nameValuePairs = new LinkedHashMap(); + } + + /** + * Object + */ + public static final Object NULL = new Object() { + @Override + public boolean equals(Object o) { + return o == this || o == null; // API specifies this broken equals implementation + } + + @Override + public String toString() { + return "null"; + } + }; + + /** + * accept a raw type for API compatibility + * + * @param copyFrom + * @throws NullPointerException + */ + public JSONObject(Map copyFrom) { + this(); + Map contentsTyped = (Map) copyFrom; + for (Map.Entry entry : contentsTyped.entrySet()) { + /* + * Deviate from the original by checking that keys are non-null and + * of the proper type. (We still defer validating the values). + */ + String key = (String) entry.getKey(); + if (key == null) { + + throw new NullPointerException("key == null"); + } + nameValuePairs.put(key, wrap(entry.getValue())); + } + } + + /** + * JSONObject + * + * @param readFrom + * @throws JSONException + */ + public JSONObject(JSONTokener readFrom) throws JSONException { + /* + * Getting the parser to populate this could get tricky. Instead, just + * parse to temporary JSONObject and then steal the data from that. + */ + Object object = readFrom.nextValue(); + if (object instanceof JSONObject) { + this.nameValuePairs = ((JSONObject) object).nameValuePairs; + } else { + throw JSON.typeMismatch(object, "JSONObject"); + } + } + + /** + * JSONObject + * + * @param json + * @throws JSONException + */ + public JSONObject(String json) throws JSONException { + this(new JSONTokener(json)); + } + + /** + * JSONObject + * + * @param copyFrom + * @param names + * @throws JSONException + */ + public JSONObject(JSONObject copyFrom, String[] names) throws JSONException { + this(); + for (String name : names) { + Object value = copyFrom.opt(name); + if (value != null) { + nameValuePairs.put(name, value); + } + } + } + + /** + * length + * + * @return int + */ + public int length() { + return nameValuePairs.size(); + } + + /** + * JSONObject + * + * @param name + * @param value + * @return JSONObject + * @throws JSONException + */ + public JSONObject put(String name, boolean value) throws JSONException { + nameValuePairs.put(checkName(name), value); + return this; + } + + /** + * JSONObject + * + * @param name + * @param value + * @return JSONObject + * @throws JSONException + */ + public JSONObject put(String name, double value) throws JSONException { + nameValuePairs.put(checkName(name), JSON.checkDouble(value)); + return this; + } + + /** + * JSONObject + * + * @param name + * @param value + * @return JSONObject + * @throws JSONException + */ + public JSONObject put(String name, int value) throws JSONException { + nameValuePairs.put(checkName(name), value); + return this; + } + + /** + * JSONObject + * + * @param name + * @param value + * @return JSONObject + * @throws JSONException + */ + public JSONObject put(String name, long value) throws JSONException { + nameValuePairs.put(checkName(name), value); + return this; + } + + /** + * JSONObject + * + * @param name + * @param value + * @return JSONObject + * @throws JSONException + */ + public JSONObject put(String name, Object value) throws JSONException { + if (value == null) { + nameValuePairs.remove(name); + return this; + } + if (value instanceof Number) { + // deviate from the original by checking all Numbers, not just floats & doubles + JSON.checkDouble(((Number) value).doubleValue()); + } + nameValuePairs.put(checkName(name), value); + return this; + } + + /** + * JSONObject + * + * @param name + * @param value + * @return JSONObject + * @throws JSONException + */ + public JSONObject putOpt(String name, Object value) throws JSONException { + if (name == null || value == null) { + return this; + } + return put(name, value); + } + + /** + * accumulate + * + * @param name + * @param value + * @return JSONObject + * @throws JSONException + */ + public JSONObject accumulate(String name, Object value) throws JSONException { + Object current = nameValuePairs.get(checkName(name)); + if (current == null) { + return put(name, value); + } + + if (current instanceof JSONArray) { + JSONArray array = (JSONArray) current; + array.checkedPut(value); + } else { + JSONArray array = new JSONArray(); + array.checkedPut(current); + array.checkedPut(value); + nameValuePairs.put(name, array); + } + return this; + } + + /** + * append + * + * @param name + * @param value + * @return JSONObject + * @throws JSONException + */ + public JSONObject append(String name, Object value) throws JSONException { + Object current = nameValuePairs.get(checkName(name)); + + final JSONArray array; + if (current instanceof JSONArray) { + array = (JSONArray) current; + } else if (current == null) { + JSONArray newArray = new JSONArray(); + nameValuePairs.put(name, newArray); + array = newArray; + } else { + throw new JSONException("Key " + name + " is not a JSONArray"); + } + + array.checkedPut(value); + + return this; + } + + /** + * checkName + * + * @param name + * @return JSONObject + * @throws JSONException + */ + String checkName(String name) throws JSONException { + if (name == null) { + throw new JSONException("Names must be non-null"); + } + return name; + } + + /** + * remove + * + * @param name + * @return Object + */ + public Object remove(String name) { + return nameValuePairs.remove(name); + } + + /** + * isNull + * + * @param name + * @return boolean + */ + public boolean isNull(String name) { + Object value = nameValuePairs.get(name); + return value == null || value == NULL; + } + + /** + * has + * + * @param name + * @return boolean + */ + public boolean has(String name) { + return nameValuePairs.containsKey(name); + } + + /** + * get + * + * @param name + * @return Object + * @throws JSONException + */ + public Object get(String name) throws JSONException { + Object result = nameValuePairs.get(name); + if (result == null) { + throw new JSONException("No value for " + name); + } + return result; + } + + /** + * opt + * + * @param name + * @return Object + */ + public Object opt(String name) { + return nameValuePairs.get(name); + } + + /** + * getBoolean + * + * @param name + * @return boolean + * @throws JSONException + */ + public boolean getBoolean(String name) throws JSONException { + Object object = get(name); + Boolean result = JSON.toBoolean(object); + if (result == null) { + throw JSON.typeMismatch(name, object, "boolean"); + } + return result; + } + + /** + * optBoolean + * + * @param name + * @return boolean + */ + public boolean optBoolean(String name) { + return optBoolean(name, false); + } + + /** + * optBoolean + * + * @param name + * @param fallback + * @return boolean + */ + public boolean optBoolean(String name, boolean fallback) { + Object object = opt(name); + Boolean result = JSON.toBoolean(object); + return result != null ? result : fallback; + } + + /** + * getDouble + * + * @param name + * @return double + * @throws JSONException + */ + public double getDouble(String name) throws JSONException { + Object object = get(name); + Double result = JSON.toDouble(object); + if (result == null) { + throw JSON.typeMismatch(name, object, "double"); + } + return result; + } + + /** + * optDouble + * + * @param name + * @return double + */ + public double optDouble(String name) { + return optDouble(name, Double.NaN); + } + + /** + * optDouble + * + * @param name + * @param fallback + * @return double + */ + public double optDouble(String name, double fallback) { + Object object = opt(name); + Double result = JSON.toDouble(object); + return result != null ? result : fallback; + } + + /** + * getInt + * + * @param name + * @return int + * @throws JSONException + */ + public int getInt(String name) throws JSONException { + Object object = get(name); + Integer result = JSON.toInteger(object); + if (result == null) { + throw JSON.typeMismatch(name, object, "int"); + } + return result; + } + + /** + * optInt + * + * @param name + * @return int + */ + public int optInt(String name) { + return optInt(name, 0); + } + + /** + * optInt + * + * @param name + * @param fallback + * @return int + */ + public int optInt(String name, int fallback) { + Object object = opt(name); + Integer result = JSON.toInteger(object); + return result != null ? result : fallback; + } + + /** + * getLong + * + * @param name + * @return long + * @throws JSONException + */ + public long getLong(String name) throws JSONException { + Object object = get(name); + Long result = JSON.toLong(object); + if (result == null) { + throw JSON.typeMismatch(name, object, "long"); + } + return result; + } + + /** + * optLong + * + * @param name + * @return long + */ + public long optLong(String name) { + return optLong(name, 0L); + } + + /** + * optLong + * + * @param name + * @param fallback + * @return long + */ + public long optLong(String name, long fallback) { + Object object = opt(name); + Long result = JSON.toLong(object); + return result != null ? result : fallback; + } + + /** + * getString + * + * @param name + * @return String + * @throws JSONException + */ + public String getString(String name) throws JSONException { + Object object = get(name); + String result = JSON.toString(object); + if (result == null) { + throw JSON.typeMismatch(name, object, "String"); + } + return result; + } + + /** + * optString + * + * @param name + * @return String + */ + public String optString(String name) { + return optString(name, ""); + } + + /** + * optString + * + * @param name + * @param fallback + * @return String + */ + public String optString(String name, String fallback) { + Object object = opt(name); + String result = JSON.toString(object); + return result != null ? result : fallback; + } + + /** + * getJSONArray + * + * @param name + * @return JSONArray + * @throws JSONException + */ + public JSONArray getJSONArray(String name) throws JSONException { + Object object = get(name); + if (object instanceof JSONArray) { + return (JSONArray) object; + } else { + throw JSON.typeMismatch(name, object, "JSONArray"); + } + } + + /** + * optJSONArray + * + * @param name + * @return JSONArray + */ + public JSONArray optJSONArray(String name) { + Object object = opt(name); + return object instanceof JSONArray ? (JSONArray) object : null; + } + + /** + * getJSONObject + * + * @param name + * @return JSONObject + * @throws JSONException + */ + public JSONObject getJSONObject(String name) throws JSONException { + Object object = get(name); + if (object instanceof JSONObject) { + return (JSONObject) object; + } else { + throw JSON.typeMismatch(name, object, "JSONObject"); + } + } + + /** + * optJSONObject + * + * @param name + * @return JSONObject + */ + public JSONObject optJSONObject(String name) { + Object object = opt(name); + return object instanceof JSONObject ? (JSONObject) object : null; + } + + /** + * toJSONArray + * + * @param names + * @return JSONArray + * @throws JSONException + */ + public JSONArray toJSONArray(JSONArray names) throws JSONException { + JSONArray result = new JSONArray(); + if (names == null) { + return null; + } + int length = names.length(); + if (length == 0) { + return null; + } + for (int i = 0; i < length; i++) { + String name = JSON.toString(names.opt(i)); + result.put(opt(name)); + } + return result; + } + + /** + * keys + * + * @return Iterator + */ + public Iterator keys() { + return nameValuePairs.keySet().iterator(); + } + + /** + * keySet + * + * @return Set + */ + public Set keySet() { + return nameValuePairs.keySet(); + } + + /** + * names + * + * @return JSONArray + */ + public JSONArray names() { + return nameValuePairs.isEmpty() + ? null + : new JSONArray(new ArrayList(nameValuePairs.keySet())); + } + + + @Override + public String toString() { + try { + JSONStringer stringer = new JSONStringer(); + writeTo(stringer); + return stringer.toString(); + } catch (JSONException e) { + return null; + } + } + + /** + * toString + * + * @param indentSpaces + * @return String + * @throws JSONException + */ + public String toString(int indentSpaces) throws JSONException { + JSONStringer stringer = new JSONStringer(indentSpaces); + writeTo(stringer); + return stringer.toString(); + } + + /** + * writeTo + * + * @param stringer + * @throws JSONException + */ + void writeTo(JSONStringer stringer) throws JSONException { + stringer.object(); + for (Map.Entry entry : nameValuePairs.entrySet()) { + stringer.key(entry.getKey()).value(entry.getValue()); + } + stringer.endObject(); + } + + /** + * numberToString + * + * @param number + * @return String + * @throws JSONException + */ + public static String numberToString(Number number) throws JSONException { + if (number == null) { + throw new JSONException("Number must be non-null"); + } + + double doubleValue = number.doubleValue(); + JSON.checkDouble(doubleValue); + + // the original returns "-0" instead of "-0.0" for negative zero + if (number.equals(NEGATIVE_ZERO)) { + return "-0"; + } + + long longValue = number.longValue(); + if (doubleValue == (double) longValue) { + return Long.toString(longValue); + } + + return number.toString(); + } + + /** + * quote + * + * @param data + * @return String + * @throws AssertionError + */ + public static String quote(String data) { + if (data == null) { + return "\"\""; + } + try { + JSONStringer stringer = new JSONStringer(); + stringer.open(JSONStringer.Scope.NULL, ""); + stringer.value(data); + stringer.close(JSONStringer.Scope.NULL, JSONStringer.Scope.NULL, ""); + return stringer.toString(); + } catch (JSONException e) { + throw new AssertionError(); + } + } + + /** + * wrap + * + * @param o + * @return Object + */ + public static Object wrap(Object o) { + if (o == null) { + return NULL; + } + if (o instanceof JSONArray || o instanceof JSONObject) { + return o; + } + if (o.equals(NULL)) { + return o; + } + try { + if (o instanceof Collection) { + return new JSONArray((Collection) o); + } else if (o.getClass().isArray()) { + return new JSONArray(o); + } + if (o instanceof Map) { + return new JSONObject((Map) o); + } + if (o instanceof Boolean || + o instanceof Byte || + o instanceof Character || + o instanceof Double || + o instanceof Float || + o instanceof Integer || + o instanceof Long || + o instanceof Short || + o instanceof String) { + return o; + } + if (o.getClass().getPackage().getName().startsWith("java.")) { + return o.toString(); + } + } catch (Exception ignored) { + LogUtil.e("error:" + ignored); + } + return null; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/json/JSONStringer.java b/entry/src/main/java/com/wordplat/quickstart/json/JSONStringer.java new file mode 100644 index 0000000..ab3247c --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/json/JSONStringer.java @@ -0,0 +1,419 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.json; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +// Note: this class was written without inspecting the non-free org.json sourcecode. + +/** + * Implements {@link JSONObject#toString} and {@link JSONArray#toString}. Most + * application developers should use those methods directly and disregard this + * API. For example:

+ * JSONObject object = ...
+ * String json = object.toString();
+ * + *

Stringers only encode well-formed JSON strings. In particular: + *

    + *
  • The stringer must have exactly one top-level array or object. + *
  • Lexical scopes must be balanced: every call to {@link #array} must + * have a matching call to {@link #endArray} and every call to {@link + * #object} must have a matching call to {@link #endObject}. + *
  • Arrays may not contain keys (property names). + *
  • Objects must alternate keys (property names) and values. + *
  • Values are inserted with either literal {@link #value(Object) value} + * calls, or by nesting arrays or objects. + *
+ * Calls that would result in a malformed JSON string will fail with a + * {@link JSONException}. + * + *

This class provides no facility for pretty-printing (ie. indenting) + * output. To encode indented output, use {@link JSONObject#toString(int)} or + * {@link JSONArray#toString(int)}. + * + *

Some implementations of the API support at most 20 levels of nesting. + * Attempts to create more than 20 levels of nesting may fail with a {@link + * JSONException}. + * + *

Each stringer may be used to encode a single top level value. Instances of + * this class are not thread safe. Although this class is nonfinal, it was not + * designed for inheritance and should not be subclassed. In particular, + * self-use by overrideable methods is not specified. See Effective Java + * Item 17, "Design and Document or inheritance or else prohibit it" for further + * information. + */ +public class JSONStringer { + + /** + * The output data, containing at most one top-level array or object. + */ + final StringBuilder out = new StringBuilder(); + + /** + * Lexical scoping elements within this stringer, necessary to insert the + * appropriate separator characters (ie. commas and colons) and to detect + * nesting errors. + */ + enum Scope { + + /** + * An array with no elements requires no separators or newlines before + * it is closed. + */ + EMPTY_ARRAY, + + /** + * A array with at least one value requires a comma and newline before + * the next element. + */ + NONEMPTY_ARRAY, + + /** + * An object with no keys or values requires no separators or newlines + * before it is closed. + */ + EMPTY_OBJECT, + + /** + * An object whose most recent element is a key. The next element must + * be a value. + */ + DANGLING_KEY, + + /** + * An object with at least one name/value pair requires a comma and + * newline before the next element. + */ + NONEMPTY_OBJECT, + + /** + * A special bracketless array needed by JSONStringer.join() and + * JSONObject.quote() only. Not used for JSON encoding. + */ + NULL, + } + + /** + * Unlike the original implementation, this stack isn't limited to 20 + * levels of nesting. + */ + private final List stack = new ArrayList(); + + /** + * A string containing a full set of spaces for a single level of + * indentation, or null for no pretty printing. + */ + private final String indent; + + /** + * JSONStringer + */ + public JSONStringer() { + indent = null; + } + + /** + * JSONStringer + * + * @param indentSpaces + */ + JSONStringer(int indentSpaces) { + char[] indentChars = new char[indentSpaces]; + Arrays.fill(indentChars, ' '); + indent = new String(indentChars); + } + + /** + * array + * + * @return JSONStringer + * @throws JSONException + */ + public JSONStringer array() throws JSONException { + return open(Scope.EMPTY_ARRAY, "["); + } + + /** + * endArray + * + * @return JSONStringer + * @throws JSONException + */ + public JSONStringer endArray() throws JSONException { + return close(Scope.EMPTY_ARRAY, Scope.NONEMPTY_ARRAY, "]"); + } + + /** + * object + * + * @return JSONStringer + * @throws JSONException + */ + public JSONStringer object() throws JSONException { + return open(Scope.EMPTY_OBJECT, "{"); + } + + /** + * endObject + * + * @return JSONStringer + * @throws JSONException + */ + public JSONStringer endObject() throws JSONException { + return close(Scope.EMPTY_OBJECT, Scope.NONEMPTY_OBJECT, "}"); + } + + + JSONStringer open(Scope empty, String openBracket) throws JSONException { + if (stack.isEmpty() && out.length() > 0) { + throw new JSONException("Nesting problem: multiple top-level roots"); + } + beforeValue(); + stack.add(empty); + out.append(openBracket); + return this; + } + + + JSONStringer close(Scope empty, Scope nonempty, String closeBracket) throws JSONException { + Scope context = peek(); + if (context != nonempty && context != empty) { + throw new JSONException("Nesting problem"); + } + + stack.remove(stack.size() - 1); + if (context == nonempty) { + newline(); + } + out.append(closeBracket); + return this; + } + + + private Scope peek() throws JSONException { + if (stack.isEmpty()) { + throw new JSONException("Nesting problem"); + } + return stack.get(stack.size() - 1); + } + + private void replaceTop(Scope topOfStack) { + stack.set(stack.size() - 1, topOfStack); + } + + /** + * value + * + * @param value + * @return JSONStringer + * @throws JSONException + */ + public JSONStringer value(Object value) throws JSONException { + if (stack.isEmpty()) { + throw new JSONException("Nesting problem"); + } + + if (value instanceof JSONArray) { + ((JSONArray) value).writeTo(this); + return this; + + } else if (value instanceof JSONObject) { + ((JSONObject) value).writeTo(this); + return this; + } + + beforeValue(); + + if (value == null + || value instanceof Boolean + || value == JSONObject.NULL) { + out.append(value); + + } else if (value instanceof Number) { + out.append(JSONObject.numberToString((Number) value)); + + } else { + string(value.toString()); + } + + return this; + } + + /** + * value + * + * @param value + * @return JSONStringer + * @throws JSONException + */ + public JSONStringer value(boolean value) throws JSONException { + if (stack.isEmpty()) { + throw new JSONException("Nesting problem"); + } + beforeValue(); + out.append(value); + return this; + } + + /** + * value + * + * @param value + * @return JSONStringer + * @throws JSONException + */ + public JSONStringer value(double value) throws JSONException { + if (stack.isEmpty()) { + throw new JSONException("Nesting problem"); + } + beforeValue(); + out.append(JSONObject.numberToString(value)); + return this; + } + + /** + * value + * + * @param value + * @return JSONStringer + * @throws JSONException + */ + public JSONStringer value(long value) throws JSONException { + if (stack.isEmpty()) { + throw new JSONException("Nesting problem"); + } + beforeValue(); + out.append(value); + return this; + } + + private void string(String value) { + out.append("\""); + for (int i = 0, length = value.length(); i < length; i++) { + char c = value.charAt(i); + + /* + * From RFC 4627, "All Unicode characters may be placed within the + * quotation marks except for the characters that must be escaped: + * quotation mark, reverse solidus, and the control characters + * (U+0000 through U+001F)." + */ + switch (c) { + case '"': + case '\\': + case '/': + out.append('\\').append(c); + break; + + case '\t': + out.append("\\t"); + break; + + case '\b': + out.append("\\b"); + break; + + case '\n': + out.append("\\n"); + break; + + case '\r': + out.append("\\r"); + break; + + case '\f': + out.append("\\f"); + break; + + default: + if (c <= 0x1F) { + out.append(String.format("\\u%04x", (int) c)); + } else { + out.append(c); + } + break; + } + + } + out.append("\""); + } + + private void newline() { + if (indent == null) { + return; + } + + out.append("\n"); + for (int i = 0; i < stack.size(); i++) { + out.append(indent); + } + } + + /** + * key + * + * @param name + * @return JSONStringer + * @throws JSONException + */ + public JSONStringer key(String name) throws JSONException { + if (name == null) { + throw new JSONException("Names must be non-null"); + } + beforeKey(); + string(name); + return this; + } + + private void beforeKey() throws JSONException { + Scope context = peek(); + if (context == Scope.NONEMPTY_OBJECT) { // first in object + out.append(','); + } else if (context != Scope.EMPTY_OBJECT) { // not in an object! + throw new JSONException("Nesting problem"); + } + newline(); + replaceTop(Scope.DANGLING_KEY); + } + + private void beforeValue() throws JSONException { + if (stack.isEmpty()) { + return; + } + + Scope context = peek(); + if (context == Scope.EMPTY_ARRAY) { // first in array + replaceTop(Scope.NONEMPTY_ARRAY); + newline(); + } else if (context == Scope.NONEMPTY_ARRAY) { // another in array + out.append(','); + newline(); + } else if (context == Scope.DANGLING_KEY) { // value for key + out.append(indent == null ? ":" : ": "); + replaceTop(Scope.NONEMPTY_OBJECT); + } else if (context != Scope.NULL) { + throw new JSONException("Nesting problem"); + } + } + + @Override + public String toString() { + return out.length() == 0 ? null : out.toString(); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/json/JSONTokener.java b/entry/src/main/java/com/wordplat/quickstart/json/JSONTokener.java new file mode 100644 index 0000000..5070b95 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/json/JSONTokener.java @@ -0,0 +1,560 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.json; + +// Note: this class was written without inspecting the non-free org.json sourcecode. + + +import com.wordplat.quickstart.xutils.common.util.LogUtil; + +/** + * Parses a JSON (RFC 4627) + * encoded string into the corresponding object. Most clients of + * this class will use only need the {@link #JSONTokener(String) constructor} + * and {@link #nextValue} method. Example usage:

+ * String json = "{"
+ *         + "  \"query\": \"Pizza\", "
+ *         + "  \"locations\": [ 94043, 90210 ] "
+ *         + "}";
+ *
+ * JSONObject object = (JSONObject) new JSONTokener(json).nextValue();
+ * String query = object.getString("query");
+ * JSONArray locations = object.getJSONArray("locations");
+ * + *

For best interoperability and performance use JSON that complies with + * RFC 4627, such as that generated by {@link JSONStringer}. For legacy reasons + * this parser is lenient, so a successful parse does not indicate that the + * input string was valid JSON. All of the following syntax errors will be + * ignored: + *

    + *
  • End of line comments starting with {@code //} or {@code #} and ending + * with a newline character. + *
  • C-style comments starting with {@code /*} and ending with + * {@code *}{@code /}. Such comments may not be nested. + *
  • Strings that are unquoted or {@code 'single quoted'}. + *
  • Hexadecimal integers prefixed with {@code 0x} or {@code 0X}. + *
  • Octal integers prefixed with {@code 0}. + *
  • Array elements separated by {@code ;}. + *
  • Unnecessary array separators. These are interpreted as if null was the + * omitted value. + *
  • Key-value pairs separated by {@code =} or {@code =>}. + *
  • Key-value pairs separated by {@code ;}. + *
+ * + *

Each tokener may be used to parse a single JSON string. Instances of this + * class are not thread safe. Although this class is nonfinal, it was not + * designed for inheritance and should not be subclassed. In particular, + * self-use by overrideable methods is not specified. See Effective Java + * Item 17, "Design and Document or inheritance or else prohibit it" for further + * information. + */ +public class JSONTokener { + + private final String in; + + private int pos; + + /** + * JSONTokener + * + * @param in + */ + public JSONTokener(String in) { + // consume an optional byte order mark (BOM) if it exists + if (in != null && in.startsWith("\ufeff")) { + in = in.substring(1); + } + this.in = in; + } + + /** + * nextValue + * + * @return Object + * @throws JSONException + */ + public Object nextValue() throws JSONException { + int c = nextCleanInternal(); + switch (c) { + case -1: + throw syntaxError("End of input"); + + case '{': + return readObject(); + + case '[': + return readArray(); + + case '\'': + case '"': + return nextString((char) c); + + default: + pos--; + return readLiteral(); + } + } + + private int nextCleanInternal() throws JSONException { + while (pos < in.length()) { + int c = in.charAt(pos++); + switch (c) { + case '\t': + case ' ': + case '\n': + case '\r': + continue; + + case '/': + if (pos == in.length()) { + return c; + } + + char peek = in.charAt(pos); + switch (peek) { + case '*': + // skip a /* c-style comment */ + pos++; + int commentEnd = in.indexOf("*/", pos); + if (commentEnd == -1) { + throw syntaxError("Unterminated comment"); + } + pos = commentEnd + 2; + continue; + + case '/': + // skip a // end-of-line comment + pos++; + skipToEndOfLine(); + continue; + + default: + return c; + } + + case '#': + /* + * Skip a # hash end-of-line comment. The JSON RFC doesn't + * specify this behavior, but it's required to parse + * existing documents. See http://b/2571423. + */ + skipToEndOfLine(); + continue; + + default: + return c; + } + } + + return -1; + } + + private void skipToEndOfLine() { + for (; pos < in.length(); pos++) { + char c = in.charAt(pos); + if (c == '\r' || c == '\n') { + pos++; + break; + } + } + } + + /** + * nextString + * + * @param quote + * @return String + * @throws JSONException + */ + public String nextString(char quote) throws JSONException { + /* + * For strings that are free of escape sequences, we can just extract + * the result as a substring of the input. But if we encounter an escape + * sequence, we need to use a StringBuilder to compose the result. + */ + StringBuilder builder = null; + + /* the index of the first character not yet appended to the builder. */ + int start = pos; + + while (pos < in.length()) { + int c = in.charAt(pos++); + if (c == quote) { + if (builder == null) { + // a new string avoids leaking memory + return new String(in.substring(start, pos - 1)); + } else { + builder.append(in, start, pos - 1); + return builder.toString(); + } + } + + if (c == '\\') { + if (pos == in.length()) { + throw syntaxError("Unterminated escape sequence"); + } + if (builder == null) { + builder = new StringBuilder(); + } + builder.append(in, start, pos - 1); + builder.append(readEscapeCharacter()); + start = pos; + } + } + + throw syntaxError("Unterminated string"); + } + + private char readEscapeCharacter() throws JSONException { + char escaped = in.charAt(pos++); + switch (escaped) { + case 'u': + if (pos + 4 > in.length()) { + throw syntaxError("Unterminated escape sequence"); + } + String hex = in.substring(pos, pos + 4); + pos += 4; + return (char) Integer.parseInt(hex, 16); + + case 't': + return '\t'; + + case 'b': + return '\b'; + + case 'n': + return '\n'; + + case 'r': + return '\r'; + + case 'f': + return '\f'; + + case '\'': + case '"': + case '\\': + default: + return escaped; + } + } + + private Object readLiteral() throws JSONException { + String literal = nextToInternal("{}[]/\\:,=;# \t\f"); + + if (literal.length() == 0) { + throw syntaxError("Expected literal value"); + } else if ("null".equalsIgnoreCase(literal)) { + return JSONObject.NULL; + } else if ("true".equalsIgnoreCase(literal)) { + return Boolean.TRUE; + } else if ("false".equalsIgnoreCase(literal)) { + return Boolean.FALSE; + } + + /* try to parse as an integral type... */ + if (literal.indexOf('.') == -1) { + int base = 10; + String number = literal; + if (number.startsWith("0x") || number.startsWith("0X")) { + number = number.substring(2); + base = 16; + } else if (number.startsWith("0") && number.length() > 1) { + number = number.substring(1); + base = 8; + } + try { + long longValue = Long.parseLong(number, base); + if (longValue <= Integer.MAX_VALUE && longValue >= Integer.MIN_VALUE) { + return (int) longValue; + } else { + return longValue; + } + } catch (NumberFormatException e) { + /* + * This only happens for integral numbers greater than + * Long.MAX_VALUE, numbers in exponential form (5e-10) and + * unquoted strings. Fall through to try floating point. + */ + LogUtil.e("error:" + e); + } + } + + /* ...next try to parse as a floating point... */ + try { + return Double.valueOf(literal); + } catch (NumberFormatException ignored) { + LogUtil.e("error:" + ignored); + } + + /* ... finally give up. We have an unquoted string */ + return new String(literal); // a new string avoids leaking memory + } + + private String nextToInternal(String excluded) { + int start = pos; + for (; pos < in.length(); pos++) { + char c = in.charAt(pos); + if (c == '\r' || c == '\n' || excluded.indexOf(c) != -1) { + return in.substring(start, pos); + } + } + return in.substring(start); + } + + private JSONObject readObject() throws JSONException { + JSONObject result = new JSONObject(); + + /* Peek to see if this is the empty object. */ + int first = nextCleanInternal(); + if (first == '}') { + return result; + } else if (first != -1) { + pos--; + } + + while (true) { + Object name = nextValue(); + if (!(name instanceof String)) { + if (name == null) { + throw syntaxError("Names cannot be null"); + } else { + throw syntaxError("Names must be strings, but " + name + + " is of type " + name.getClass().getName()); + } + } + + /* + * Expect the name/value separator to be either a colon ':', an + * equals sign '=', or an arrow "=>". The last two are bogus but we + * include them because that's what the original implementation did. + */ + int separator = nextCleanInternal(); + if (separator != ':' && separator != '=') { + throw syntaxError("Expected ':' after " + name); + } + if (pos < in.length() && in.charAt(pos) == '>') { + pos++; + } + + result.put((String) name, nextValue()); + + switch (nextCleanInternal()) { + case '}': + return result; + case ';': + case ',': + continue; + default: + throw syntaxError("Unterminated object"); + } + } + } + + private JSONArray readArray() throws JSONException { + JSONArray result = new JSONArray(); + + /* to cover input that ends with ",]". */ + boolean hasTrailingSeparator = false; + + while (true) { + switch (nextCleanInternal()) { + case -1: + throw syntaxError("Unterminated array"); + case ']': + if (hasTrailingSeparator) { + result.put(null); + } + return result; + case ',': + case ';': + /* A separator without a value first means "null". */ + result.put(null); + hasTrailingSeparator = true; + continue; + default: + pos--; + } + + result.put(nextValue()); + + switch (nextCleanInternal()) { + case ']': + return result; + case ',': + case ';': + hasTrailingSeparator = true; + continue; + default: + throw syntaxError("Unterminated array"); + } + } + } + + /** + * syntaxError + * + * @param message + * @return JSONException + */ + public JSONException syntaxError(String message) { + return new JSONException(message + this); + } + + @Override + public String toString() { + // consistent with the original implementation + return " at character " + pos + " of " + in; + } + + /** + * more + * + * @return boolean + */ + public boolean more() { + return pos < in.length(); + } + + /** + * next + * + * @return char + */ + public char next() { + return pos < in.length() ? in.charAt(pos++) : '\0'; + } + + /** + * next + * + * @param c + * @return char + * @throws JSONException + */ + public char next(char c) throws JSONException { + char result = next(); + if (result != c) { + throw syntaxError("Expected " + c + " but was " + result); + } + return result; + } + + /** + * nextClean + * + * @return char + * @throws JSONException + */ + public char nextClean() throws JSONException { + int nextCleanInt = nextCleanInternal(); + return nextCleanInt == -1 ? '\0' : (char) nextCleanInt; + } + + /** + * next + * + * @param length + * @return String + * @throws JSONException + */ + public String next(int length) throws JSONException { + if (pos + length > in.length()) { + throw syntaxError(length + " is out of bounds"); + } + String result = in.substring(pos, pos + length); + pos += length; + return result; + } + + /** + * nextTo + * + * @param excluded + * @return String + * @throws NullPointerException + */ + public String nextTo(String excluded) { + if (excluded == null) { + throw new NullPointerException("excluded == null"); + } + return nextToInternal(excluded).trim(); + } + + /** + * nextTo + * + * @param excluded + * @return String + */ + public String nextTo(char excluded) { + return nextToInternal(String.valueOf(excluded)).trim(); + } + + /** + * skipPast + * + * @param thru + */ + public void skipPast(String thru) { + int thruStart = in.indexOf(thru, pos); + pos = thruStart == -1 ? in.length() : (thruStart + thru.length()); + } + + /** + * skipTo + * + * @param to + * @return char + */ + public char skipTo(char to) { + int index = in.indexOf(to, pos); + if (index != -1) { + pos = index; + return to; + } else { + return '\0'; + } + } + + /** + * back + */ + public void back() { + if (--pos == -1) { + pos = 0; + } + } + + /** + * dehexchar + * + * @param hex + * @return int + */ + public static int dehexchar(char hex) { + if (hex >= '0' && hex <= '9') { + return hex - '0'; + } else if (hex >= 'A' && hex <= 'F') { + return hex - 'A' + 10; + } else if (hex >= 'a' && hex <= 'f') { + return hex - 'a' + 10; + } else { + return -1; + } + } +} diff --git a/app/src/main/java/com/wordplat/quickstart/mvp/BasePresenter.java b/entry/src/main/java/com/wordplat/quickstart/mvp/BasePresenter.java similarity index 61% rename from app/src/main/java/com/wordplat/quickstart/mvp/BasePresenter.java rename to entry/src/main/java/com/wordplat/quickstart/mvp/BasePresenter.java index b120cb6..f1f8103 100644 --- a/app/src/main/java/com/wordplat/quickstart/mvp/BasePresenter.java +++ b/entry/src/main/java/com/wordplat/quickstart/mvp/BasePresenter.java @@ -1,18 +1,12 @@ package com.wordplat.quickstart.mvp; -import android.text.TextUtils; -import android.util.Log; -import android.widget.EditText; import com.wordplat.quickstart.BuildConfig; -import com.wordplat.quickstart.R; import com.wordplat.quickstart.app.AppRuntime; -import com.wordplat.quickstart.mvp.exception.NetworkTimeOutException; -import com.wordplat.quickstart.mvp.exception.NoNetworkException; -import com.wordplat.quickstart.mvp.exception.ResultEmptyException; -import com.wordplat.quickstart.mvp.exception.ResultFailedException; -import com.wordplat.quickstart.mvp.exception.ResultParseException; +import com.wordplat.quickstart.mvp.exception.*; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import ohos.agp.components.TextField; import rx.Subscription; import rx.subscriptions.CompositeSubscription; @@ -21,8 +15,9 @@ import rx.subscriptions.CompositeSubscription; *

Date: 2017/4/11

* * @author afon + * @param + * @since 2017-04-11 */ - public abstract class BasePresenter { protected T baseView; @@ -37,7 +32,7 @@ public abstract class BasePresenter { public void attachView(T baseView) { this.baseView = baseView; - if(compositeSubscription == null) { + if (compositeSubscription == null) { compositeSubscription = new CompositeSubscription(); initSubscription(); } @@ -47,16 +42,26 @@ public abstract class BasePresenter { * 通常在 onPause 时调用此方法 */ public void detachView() { - if(compositeSubscription != null) { + if (compositeSubscription != null) { compositeSubscription.unsubscribe(); compositeSubscription = null; } } - protected void initSubscription() {} + /** + * initSubscription + * + */ + protected void initSubscription() { + } + /** + * addSubscription + * + * @param subscription + */ protected void addSubscription(Subscription subscription) { - if(compositeSubscription == null) { + if (compositeSubscription == null) { subscription.unsubscribe(); } else { compositeSubscription.add(subscription); @@ -67,49 +72,67 @@ public abstract class BasePresenter { * 取消所有订阅 */ public void cancel() { - if(compositeSubscription != null) { + if (compositeSubscription != null) { compositeSubscription.unsubscribe(); compositeSubscription = new CompositeSubscription(); } } - public boolean isEmpty(EditText editText) { - if(editText == null || editText.getText() == null || TextUtils.isEmpty(editText.getText().toString())) { + /** + * isEmpty + * + * @param editText + * @return boolean + */ + public boolean isEmpty(TextField editText) { + if (editText == null || editText.getText() == null || TextUtils.isEmpty(editText.getText().toString())) { return true; } return false; } + /** + * getString + * + * @param stringResId + * @return String + */ public String getString(int stringResId) { if (stringResId != 0) { if (AppRuntime.sContext != null) { - return AppRuntime.sContext.getResources().getString(stringResId); + return AppRuntime.sContext.getString(stringResId); } } return ""; } + /** + * handleError + * + * @param requestCode + * @param throwable + */ protected void handleError(int requestCode, Throwable throwable) { final String errMessage; - if(throwable instanceof NoNetworkException) { // 没有网络 + if (throwable instanceof NoNetworkException) { // 没有网络 errMessage = "onNoNetworkError --> " + requestCode; baseView.onNoNetworkError(requestCode); - } else if(throwable instanceof NetworkTimeOutException) { // 网络超时 + } else if (throwable instanceof NetworkTimeOutException) { // 网络超时 errMessage = "onNetworkTimeOutError --> " + requestCode; baseView.onNetworkTimeOutError(requestCode); - } else if(throwable instanceof ResultParseException) { // 服务器返回的 JSON 数据解析错误 + } else if (throwable instanceof ResultParseException) { // 服务器返回的 JSON 数据解析错误 errMessage = "onResultParseError --> " + requestCode; baseView.onResultParseError(requestCode); - } else if(throwable instanceof ResultEmptyException) { // 服务器返回结果为空 + } else if (throwable instanceof ResultEmptyException) { // 服务器返回结果为空 errMessage = "onResultEmpty --> " + requestCode; baseView.onResultEmpty(requestCode); - } else if(throwable instanceof ResultFailedException) { // 服务器返回错误码 + } else if (throwable instanceof ResultFailedException) { // 服务器返回错误码 errMessage = "onResultFailed --> " + requestCode; baseView.onResultFailed(requestCode, ((ResultFailedException) throwable).getErrCode(), @@ -117,12 +140,7 @@ public abstract class BasePresenter { } else { // 其它不知道的错误,除非在设置UI时发生了错误,否则不会走到这里 errMessage = "Warning_Unknow -->" + requestCode; - baseView.onShowWarning(requestCode, R.string.Warning_Unknow); - } - - if(BuildConfig.DEBUG) { - Log.e("BasePresenter", "##d handleError: " + errMessage); - throwable.printStackTrace(); + baseView.onResultEmpty(requestCode); } } } diff --git a/app/src/main/java/com/wordplat/quickstart/mvp/BaseRequest.java b/entry/src/main/java/com/wordplat/quickstart/mvp/BaseRequest.java similarity index 85% rename from app/src/main/java/com/wordplat/quickstart/mvp/BaseRequest.java rename to entry/src/main/java/com/wordplat/quickstart/mvp/BaseRequest.java index 0cf4932..ec9f127 100644 --- a/app/src/main/java/com/wordplat/quickstart/mvp/BaseRequest.java +++ b/entry/src/main/java/com/wordplat/quickstart/mvp/BaseRequest.java @@ -1,36 +1,40 @@ package com.wordplat.quickstart.mvp; -import android.text.TextUtils; -import android.util.Log; import com.alibaba.fastjson.JSON; import com.wordplat.quickstart.BuildConfig; -import com.wordplat.quickstart.app.AppRuntime; import com.wordplat.quickstart.bean.response.IResultResponse; import com.wordplat.quickstart.mvp.exception.NetworkTimeOutException; -import com.wordplat.quickstart.mvp.exception.NoNetworkException; import com.wordplat.quickstart.mvp.exception.ResultEmptyException; import com.wordplat.quickstart.mvp.exception.ResultFailedException; -import com.wordplat.quickstart.utils.AppUtils; - -import org.xutils.http.HttpMethod; -import org.xutils.http.RequestParams; -import org.xutils.x; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.http.HttpMethod; +import com.wordplat.quickstart.xutils.http.RequestParams; +import com.wordplat.quickstart.xutils.x; import java.net.SocketTimeoutException; import java.util.List; + +import ohos.hiviewdfx.HiLog; +import ohos.hiviewdfx.HiLogLabel; import rx.Subscriber; + /** *

BaseRequest

*

Date: 2017/4/11

* * @author afon + * @since 2017-04-11 */ - public class BaseRequest { + static final HiLogLabel LABEL = new HiLogLabel(HiLog.LOG_APP, 0x00201, "BaseRequest"); private static final String TAG = "BaseRequest"; + private static final int NUM_1001 = 1001; + + private BaseRequest() { + } /** * 网络请求 返回数据是一个 ServerResponse 对象 @@ -38,6 +42,7 @@ public class BaseRequest { * @param subscriber subscriber * @param requestParams 请求参数 * @param responseObject 返回数据的 Class 类型 + * @param */ protected static void requestServer(Subscriber subscriber, RequestParams requestParams, @@ -45,6 +50,15 @@ public class BaseRequest { requestServer(subscriber, requestParams, responseObject, HttpMethod.POST); } + /** + * requestServer + * + * @param subscriber + * @param requestParams + * @param responseObject + * @param httpMethod + * @param + */ protected static void requestServer(Subscriber subscriber, RequestParams requestParams, Class responseObject, @@ -62,6 +76,7 @@ public class BaseRequest { * @param subscriber subscriber * @param requestParams 请求参数 * @param responseObject 返回数据的 Class 类型 + * @param */ protected static void requestObject(Subscriber subscriber, RequestParams requestParams, @@ -69,6 +84,15 @@ public class BaseRequest { requestObject(subscriber, requestParams, responseObject, HttpMethod.POST); } + /** + * requestObject + * + * @param subscriber + * @param requestParams + * @param responseObject + * @param httpMethod + * @param + */ protected static void requestObject(Subscriber subscriber, RequestParams requestParams, Class responseObject, @@ -86,6 +110,7 @@ public class BaseRequest { * @param subscriber subscriber * @param requestParams 请求参数 * @param responseObject 返回数据的 Class 类型 + * @param */ protected static void requestArray(Subscriber> subscriber, RequestParams requestParams, @@ -93,6 +118,15 @@ public class BaseRequest { requestArray(subscriber, requestParams, responseObject, HttpMethod.POST); } + /** + * requestArray + * + * @param subscriber + * @param requestParams + * @param responseObject + * @param httpMethod + * @param + */ protected static void requestArray(Subscriber> subscriber, RequestParams requestParams, Class responseObject, @@ -116,10 +150,6 @@ public class BaseRequest { RequestParams requestParams, Class responseObject, HttpMethod httpMethod) { - if (!AppUtils.isConnected(AppRuntime.sContext)) { - subscriber.onError(new NoNetworkException()); - return null; - } try { R result = x.http().requestSync(httpMethod, requestParams, responseObject); @@ -127,7 +157,7 @@ public class BaseRequest { subscriber.onError(new ResultEmptyException()); } else if (result.getResultCode() != 0) { - if (result.getResultCode() == 1001) { // 单独抽出服务器返回为空数据时的错误码 + if (result.getResultCode() == NUM_1001) { // 单独抽出服务器返回为空数据时的错误码 subscriber.onError(new ResultEmptyException()); } else { @@ -147,14 +177,10 @@ public class BaseRequest { RequestParams requestParams, Class responseObject, HttpMethod httpMethod) { - if (!AppUtils.isConnected(AppRuntime.sContext)) { - subscriber.onError(new NoNetworkException()); - return null; - } try { String result = x.http().requestSync(httpMethod, requestParams, String.class); if (BuildConfig.DEBUG) { - Log.i(TAG, "##d 服务器返回数据: " + result); + HiLog.info(LABEL, "##d 服务器返回数据: " + result); } if (responseObject == String.class) { @@ -184,14 +210,10 @@ public class BaseRequest { RequestParams requestParams, Class responseObject, HttpMethod httpMethod) { - if (!AppUtils.isConnected(AppRuntime.sContext)) { - subscriber.onError(new NoNetworkException()); - return null; - } try { String result = x.http().requestSync(httpMethod, requestParams, String.class); if (BuildConfig.DEBUG) { - Log.i(TAG, "##d 服务器返回数据: " + result); + HiLog.info(LABEL, "##d 服务器返回数据: " + result); } if (TextUtils.isEmpty(result)) { diff --git a/app/src/main/java/com/wordplat/quickstart/mvp/BaseView.java b/entry/src/main/java/com/wordplat/quickstart/mvp/BaseView.java similarity index 73% rename from app/src/main/java/com/wordplat/quickstart/mvp/BaseView.java rename to entry/src/main/java/com/wordplat/quickstart/mvp/BaseView.java index d5c8960..a4cf4b6 100644 --- a/app/src/main/java/com/wordplat/quickstart/mvp/BaseView.java +++ b/entry/src/main/java/com/wordplat/quickstart/mvp/BaseView.java @@ -3,15 +3,15 @@ package com.wordplat.quickstart.mvp; /** *

* requestCode 请求编码 的意思是: - * 对每一次 presenter 的调用指定一个唯一编码。 - * 比如,一个 Activity 中使用了两个以上的 presenter 方法,在 Activity 中 implement 了本接口, - * 那么此时如果返回结果,就需根据请求编码来作对应的UI呈现。 + * 对每一次 presenter 的调用指定一个唯一编码。 + * 比如,一个 Activity 中使用了两个以上的 presenter 方法,在 Activity 中 implement 了本接口, + * 那么此时如果返回结果,就需根据请求编码来作对应的UI呈现。 *

*

Date: 2017/4/11

* * @author afon + * @since 2017-04-11 */ - public interface BaseView { /** @@ -46,8 +46,8 @@ public interface BaseView { * 服务器返回失败、返回错误 * * @param requestCode 请求编码 - * @param errCode 服务器返回的错误编码 - * @param errMessage 服务器返回的错误信息 + * @param errCode 服务器返回的错误编码 + * @param errMessage 服务器返回的错误信息 */ void onResultFailed(int requestCode, int errCode, String errMessage); @@ -61,7 +61,7 @@ public interface BaseView { /** * 显示一个警告信息 * - * @param requestCode 请求编码 + * @param requestCode 请求编码 * @param errMessageResId 要显示的错误 String 的资源ID */ void onShowWarning(int requestCode, int errMessageResId); diff --git a/app/src/main/java/com/wordplat/quickstart/mvp/BaseViewListener.java b/entry/src/main/java/com/wordplat/quickstart/mvp/BaseViewListener.java similarity index 53% rename from app/src/main/java/com/wordplat/quickstart/mvp/BaseViewListener.java rename to entry/src/main/java/com/wordplat/quickstart/mvp/BaseViewListener.java index 585e7ca..65174a6 100644 --- a/app/src/main/java/com/wordplat/quickstart/mvp/BaseViewListener.java +++ b/entry/src/main/java/com/wordplat/quickstart/mvp/BaseViewListener.java @@ -1,31 +1,28 @@ package com.wordplat.quickstart.mvp; -import android.text.TextUtils; -import android.widget.Toast; - -import com.wordplat.quickstart.R; +import com.wordplat.quickstart.ResourceTable; import com.wordplat.quickstart.app.AppRuntime; +import com.wordplat.quickstart.utils.ToastViewDialog; +import com.wordplat.quickstart.xutils.common.util.TextUtils; /** *

BaseViewListener

*

Date: 2017/5/15

* * @author afon + * @since 2017-04-11 */ - public class BaseViewListener implements BaseView { @Override public void onNoNetworkError(int requestCode) { - Toast.makeText(AppRuntime.sContext, - AppRuntime.sContext.getResources().getString(R.string.Warning_No_Network), - Toast.LENGTH_SHORT).show(); + ToastViewDialog.toast(AppRuntime.sContext, AppRuntime.sContext.getString( + ResourceTable.String_Warning_No_Network)); } @Override public void onNetworkTimeOutError(int requestCode) { - Toast.makeText(AppRuntime.sContext, - AppRuntime.sContext.getResources().getString(R.string.Warning_Network_Timeout), - Toast.LENGTH_SHORT).show(); + ToastViewDialog.toast(AppRuntime.sContext, AppRuntime.sContext.getString( + ResourceTable.String_Warning_Network_Timeout)); } @Override @@ -41,7 +38,7 @@ public class BaseViewListener implements BaseView { @Override public void onResultFailed(int requestCode, int errCode, String errMessage) { if (!TextUtils.isEmpty(errMessage)) { - Toast.makeText(AppRuntime.sContext, errMessage, Toast.LENGTH_SHORT).show(); + ToastViewDialog.toast(AppRuntime.sContext, errMessage); } } @@ -52,8 +49,6 @@ public class BaseViewListener implements BaseView { @Override public void onShowWarning(int requestCode, int errMessageResId) { - Toast.makeText(AppRuntime.sContext, - AppRuntime.sContext.getResources().getString(errMessageResId), - Toast.LENGTH_SHORT).show(); + ToastViewDialog.toast(AppRuntime.sContext, AppRuntime.sContext.getString(errMessageResId)); } } diff --git a/entry/src/main/java/com/wordplat/quickstart/mvp/BtcChinaPresenter.java b/entry/src/main/java/com/wordplat/quickstart/mvp/BtcChinaPresenter.java new file mode 100644 index 0000000..58a1114 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/mvp/BtcChinaPresenter.java @@ -0,0 +1,31 @@ +package com.wordplat.quickstart.mvp; + +import com.wordplat.quickstart.bean.BtcBean; + +import java.util.List; + + +/** + *

BtcChinaPresenter

+ *

Date: 2017/4/16

+ * + * @author afon + * @since 2017-04-11 + */ +public class BtcChinaPresenter extends BasePresenter { + + private List btcList; + + /** + * getSimple + * + * @param requestCode + */ + public void getSimple(final int requestCode) { + handleError(requestCode, new Throwable("服务器错误")); + } + + public List getBtcList() { + return btcList; + } +} diff --git a/app/src/main/java/com/wordplat/quickstart/mvp/LoadingView.java b/entry/src/main/java/com/wordplat/quickstart/mvp/LoadingView.java similarity index 54% rename from app/src/main/java/com/wordplat/quickstart/mvp/LoadingView.java rename to entry/src/main/java/com/wordplat/quickstart/mvp/LoadingView.java index 35ac18f..359bc00 100644 --- a/app/src/main/java/com/wordplat/quickstart/mvp/LoadingView.java +++ b/entry/src/main/java/com/wordplat/quickstart/mvp/LoadingView.java @@ -5,13 +5,27 @@ package com.wordplat.quickstart.mvp; *

Date: 2017/5/15

* * @author afon + * @since 2017-04-11 */ - public interface LoadingView extends BaseView { - + /** + * onStartRequest + * + * @param requestCode + */ void onStartRequest(int requestCode); + /** + * onFinishRequest + * + * @param requestCode + */ void onFinishRequest(int requestCode); + /** + * onSuccess + * + * @param requestCode 请求编码 + */ void onSuccess(int requestCode); } diff --git a/app/src/main/java/com/wordplat/quickstart/mvp/LoadingViewListener.java b/entry/src/main/java/com/wordplat/quickstart/mvp/LoadingViewListener.java similarity index 94% rename from app/src/main/java/com/wordplat/quickstart/mvp/LoadingViewListener.java rename to entry/src/main/java/com/wordplat/quickstart/mvp/LoadingViewListener.java index 74f554d..8f57b78 100644 --- a/app/src/main/java/com/wordplat/quickstart/mvp/LoadingViewListener.java +++ b/entry/src/main/java/com/wordplat/quickstart/mvp/LoadingViewListener.java @@ -5,8 +5,8 @@ package com.wordplat.quickstart.mvp; *

Date: 2017/5/22

* * @author afon + * @since 2017-05-22 */ - public class LoadingViewListener extends BaseViewListener implements LoadingView { @Override diff --git a/app/src/main/java/com/wordplat/quickstart/mvp/StockPresenter.java b/entry/src/main/java/com/wordplat/quickstart/mvp/StockPresenter.java similarity index 44% rename from app/src/main/java/com/wordplat/quickstart/mvp/StockPresenter.java rename to entry/src/main/java/com/wordplat/quickstart/mvp/StockPresenter.java index 378f9c6..5f8b3cb 100644 --- a/app/src/main/java/com/wordplat/quickstart/mvp/StockPresenter.java +++ b/entry/src/main/java/com/wordplat/quickstart/mvp/StockPresenter.java @@ -1,39 +1,61 @@ package com.wordplat.quickstart.mvp; +import com.wordplat.ikvstockchart.entry.Entry; import com.wordplat.quickstart.bean.KLineBean; +import com.wordplat.quickstart.utils.ToastViewDialog; +import ohos.agp.animation.AnimatorProperty; +import ohos.agp.components.Component; +import ohos.app.dispatcher.TaskDispatcher; import java.util.Calendar; import java.util.Date; import java.util.List; -import rx.Subscription; -import rx.android.schedulers.AndroidSchedulers; -import rx.functions.Action1; - /** *

StockPresenter

*

Date: 2017/4/11

* * @author afon + * @since 2017-04-11 */ - public class StockPresenter extends BasePresenter { - private static final int LOAD_BETWEEN_DAYS = 100; // 日 K 一次加载多少天 - private static final int LOAD_BETWEEN_WEEK = 50; // 周 K 一次加载多少周 - private static final int LOAD_BETWEEN_MONTH = 50; // 月 K 一次加载多少个月 + /** + * 日 K 一次加载多少天 + */ + private static final int LOAD_BETWEEN_DAYS = 100; + /** + * 周 K 一次加载多少周 + */ + private static final int LOAD_BETWEEN_WEEK = 50; + /** + * 月 K 一次加载多少个月 + */ + private static final int LOAD_BETWEEN_MONTH = 50; private final Calendar currentBeginTime = Calendar.getInstance(); private final Calendar currentEndTime = Calendar.getInstance(); private List kLineList; + /** + * KLineType + * + */ public enum KLineType { - DAY, - WEEK, - MONTH + /** + * DAY ,WEEK ,MONTH + */ + DAY, WEEK, MONTH } + /** + * loadFirst + * + * @param reqeustCode + * @param stockCode + * @param kLineType + */ public void loadFirst(int reqeustCode, String stockCode, KLineType kLineType) { currentEndTime.setTime(new Date()); currentBeginTime.setTime(currentEndTime.getTime()); @@ -41,6 +63,13 @@ public class StockPresenter extends BasePresenter { loadPrev(reqeustCode, stockCode, kLineType); } + /** + * loadPrev + * + * @param requestCode + * @param stockCode + * @param kLineType + */ public void loadPrev(final int requestCode, String stockCode, final KLineType kLineType) { baseView.onStartRequest(requestCode); @@ -48,36 +77,17 @@ public class StockPresenter extends BasePresenter { calendar.setTime(currentBeginTime.getTime()); computeNextTime(calendar, kLineType, true); - Subscription subscription = StockApiRequest.getKLine(stockCode, - calendar.getTime(), - currentBeginTime.getTime(), - getKLineType(kLineType)) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Action1>() { - @Override - public void call(List response) { - baseView.onFinishRequest(requestCode); - - if (response == null || response.size() == 0) { - baseView.onResultEmpty(requestCode); - } else { - computeNextTime(currentBeginTime, kLineType, true); - - kLineList = response; - baseView.onSuccess(requestCode); - } - } - }, new Action1() { - @Override - public void call(Throwable throwable) { - baseView.onFinishRequest(requestCode); - handleError(requestCode, throwable); - } - }); - - addSubscription(subscription); + baseView.onFinishRequest(requestCode); + handleError(requestCode, new Throwable("服务器出错")); } + /** + * loadNext + * + * @param requestCode + * @param stockCode + * @param kLineType + */ public void loadNext(final int requestCode, String stockCode, final KLineType kLineType) { baseView.onStartRequest(requestCode); @@ -85,40 +95,25 @@ public class StockPresenter extends BasePresenter { calendar.setTime(currentEndTime.getTime()); computeNextTime(calendar, kLineType, false); - Subscription subscription = StockApiRequest.getKLine(stockCode, - currentEndTime.getTime(), - calendar.getTime(), - getKLineType(kLineType)) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Action1>() { - @Override - public void call(List response) { - baseView.onFinishRequest(requestCode); - - if (response == null || response.size() == 0) { - baseView.onResultEmpty(requestCode); - } else { - computeNextTime(currentEndTime, kLineType, false); - - kLineList = response; - baseView.onSuccess(requestCode); - } - } - }, new Action1() { - @Override - public void call(Throwable throwable) { - baseView.onFinishRequest(requestCode); - handleError(requestCode, throwable); - } - }); - - addSubscription(subscription); + baseView.onFinishRequest(requestCode); + handleError(requestCode, new Throwable("服务器出错")); } + /** + * getkLineList + * + * @return KLineBean + */ public List getkLineList() { return kLineList; } + /** + * getKLineType + * + * @param kLineType + * @return + */ private String getKLineType(KLineType kLineType) { String type = "d"; switch (kLineType) { @@ -133,13 +128,14 @@ public class StockPresenter extends BasePresenter { case MONTH: type = "M"; break; + default:break; } return type; } - private void computeNextTime(Calendar calendar, KLineType kLineType, boolean reverse) { - switch (kLineType) { + private void computeNextTime(Calendar calendar, KLineType KlineType, boolean reverse) { + switch (KlineType) { case DAY: calendar.add(Calendar.DAY_OF_MONTH, reverse ? -LOAD_BETWEEN_DAYS : LOAD_BETWEEN_DAYS); break; @@ -151,6 +147,8 @@ public class StockPresenter extends BasePresenter { case MONTH: calendar.add(Calendar.MONTH, reverse ? -LOAD_BETWEEN_MONTH : LOAD_BETWEEN_MONTH); break; + default: + break; } } } diff --git a/app/src/main/java/com/wordplat/quickstart/mvp/exception/NetworkTimeOutException.java b/entry/src/main/java/com/wordplat/quickstart/mvp/exception/NetworkTimeOutException.java similarity index 90% rename from app/src/main/java/com/wordplat/quickstart/mvp/exception/NetworkTimeOutException.java rename to entry/src/main/java/com/wordplat/quickstart/mvp/exception/NetworkTimeOutException.java index 59f4e64..8d9f506 100644 --- a/app/src/main/java/com/wordplat/quickstart/mvp/exception/NetworkTimeOutException.java +++ b/entry/src/main/java/com/wordplat/quickstart/mvp/exception/NetworkTimeOutException.java @@ -5,7 +5,7 @@ package com.wordplat.quickstart.mvp.exception; *

Date: 2017/4/11

* * @author afon + * @since 2017-04-11 */ - public class NetworkTimeOutException extends Exception { } diff --git a/app/src/main/java/com/wordplat/quickstart/mvp/exception/NoNetworkException.java b/entry/src/main/java/com/wordplat/quickstart/mvp/exception/NoNetworkException.java similarity index 89% rename from app/src/main/java/com/wordplat/quickstart/mvp/exception/NoNetworkException.java rename to entry/src/main/java/com/wordplat/quickstart/mvp/exception/NoNetworkException.java index f46bca3..3254020 100644 --- a/app/src/main/java/com/wordplat/quickstart/mvp/exception/NoNetworkException.java +++ b/entry/src/main/java/com/wordplat/quickstart/mvp/exception/NoNetworkException.java @@ -5,7 +5,7 @@ package com.wordplat.quickstart.mvp.exception; *

Date: 2017/4/11

* * @author afon + * @since 2017-04-11 */ - public class NoNetworkException extends Exception { } diff --git a/app/src/main/java/com/wordplat/quickstart/mvp/exception/ResultEmptyException.java b/entry/src/main/java/com/wordplat/quickstart/mvp/exception/ResultEmptyException.java similarity index 90% rename from app/src/main/java/com/wordplat/quickstart/mvp/exception/ResultEmptyException.java rename to entry/src/main/java/com/wordplat/quickstart/mvp/exception/ResultEmptyException.java index 50bee4f..15b39d6 100644 --- a/app/src/main/java/com/wordplat/quickstart/mvp/exception/ResultEmptyException.java +++ b/entry/src/main/java/com/wordplat/quickstart/mvp/exception/ResultEmptyException.java @@ -5,7 +5,7 @@ package com.wordplat.quickstart.mvp.exception; *

Date: 2017/4/11

* * @author afon + * @since 2017-04-11 */ - public class ResultEmptyException extends Exception { } diff --git a/app/src/main/java/com/wordplat/quickstart/mvp/exception/ResultFailedException.java b/entry/src/main/java/com/wordplat/quickstart/mvp/exception/ResultFailedException.java similarity index 81% rename from app/src/main/java/com/wordplat/quickstart/mvp/exception/ResultFailedException.java rename to entry/src/main/java/com/wordplat/quickstart/mvp/exception/ResultFailedException.java index b2a64ee..55684d2 100644 --- a/app/src/main/java/com/wordplat/quickstart/mvp/exception/ResultFailedException.java +++ b/entry/src/main/java/com/wordplat/quickstart/mvp/exception/ResultFailedException.java @@ -5,14 +5,20 @@ package com.wordplat.quickstart.mvp.exception; *

Date: 2017/4/11

* * @author afon + * @since 2017-04-11 */ - public class ResultFailedException extends Exception { private int errCode; private String errMessage; + /** + * ResultFailedException + * + * @param errCode + * @param errMessage + */ public ResultFailedException(int errCode, String errMessage) { this.errCode = errCode; this.errMessage = errMessage; diff --git a/app/src/main/java/com/wordplat/quickstart/mvp/exception/ResultParseException.java b/entry/src/main/java/com/wordplat/quickstart/mvp/exception/ResultParseException.java similarity index 90% rename from app/src/main/java/com/wordplat/quickstart/mvp/exception/ResultParseException.java rename to entry/src/main/java/com/wordplat/quickstart/mvp/exception/ResultParseException.java index a49c320..ccfd250 100644 --- a/app/src/main/java/com/wordplat/quickstart/mvp/exception/ResultParseException.java +++ b/entry/src/main/java/com/wordplat/quickstart/mvp/exception/ResultParseException.java @@ -5,7 +5,7 @@ package com.wordplat.quickstart.mvp.exception; *

Date: 2017/4/11

* * @author afon + * @since 2017-04-11 */ - public class ResultParseException extends Exception { } \ No newline at end of file diff --git a/entry/src/main/java/com/wordplat/quickstart/slice/Disable_Left_And_Right_Refresh_Slice.java b/entry/src/main/java/com/wordplat/quickstart/slice/Disable_Left_And_Right_Refresh_Slice.java new file mode 100644 index 0000000..affe80f --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/slice/Disable_Left_And_Right_Refresh_Slice.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package com.wordplat.quickstart.slice; + +import ohos.aafwk.content.Intent; + +/** + * Disable_Left_And_Right_Refresh_Slice + * + * @since 2021-04-30 + */ +public class Disable_Left_And_Right_Refresh_Slice extends Enable_Left_And_Right_Refresh_Slice { + + @Override + public void onStart(Intent intent) { + super.onStart(intent); + kLineLayout.getKLineView().setEnableLeftRefresh(false); + kLineLayout.getKLineView().setEnableRightRefresh(false); + } +} diff --git a/app/src/main/java/com/wordplat/quickstart/activity/Enable_Left_And_Right_Refresh_Activity.java b/entry/src/main/java/com/wordplat/quickstart/slice/Enable_Left_And_Right_Refresh_Slice.java similarity index 40% rename from app/src/main/java/com/wordplat/quickstart/activity/Enable_Left_And_Right_Refresh_Activity.java rename to entry/src/main/java/com/wordplat/quickstart/slice/Enable_Left_And_Right_Refresh_Slice.java index 2dd4e4c..99c6a3f 100644 --- a/app/src/main/java/com/wordplat/quickstart/activity/Enable_Left_And_Right_Refresh_Activity.java +++ b/entry/src/main/java/com/wordplat/quickstart/slice/Enable_Left_And_Right_Refresh_Slice.java @@ -1,19 +1,20 @@ -package com.wordplat.quickstart.activity; - -import android.content.Context; -import android.content.Intent; -import android.graphics.drawable.Animatable; -import android.os.AsyncTask; -import android.os.Bundle; -import android.text.SpannableString; -import android.text.style.ForegroundColorSpan; -import android.view.MotionEvent; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - -import com.wordplat.quickstart.R; +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.slice; + import com.wordplat.ikvstockchart.InteractiveKLineLayout; import com.wordplat.ikvstockchart.KLineHandler; import com.wordplat.ikvstockchart.compat.PerformenceAnalyser; @@ -22,165 +23,157 @@ import com.wordplat.ikvstockchart.entry.EntrySet; import com.wordplat.ikvstockchart.entry.SizeColor; import com.wordplat.ikvstockchart.entry.StockDataTest; import com.wordplat.ikvstockchart.render.KLineRender; - -import org.xutils.view.annotation.ContentView; -import org.xutils.view.annotation.ViewInject; - -import java.io.InputStream; +import com.wordplat.quickstart.ResourceTable; +import com.wordplat.quickstart.base.BaseAbilitySlice; +import com.wordplat.quickstart.utils.ToastViewDialog; + +import ohos.aafwk.content.Intent; +import ohos.agp.animation.AnimatorProperty; +import ohos.agp.components.*; +import ohos.agp.utils.RectFloat; +import ohos.app.dispatcher.TaskDispatcher; +import ohos.global.resource.RawFileEntry; +import ohos.global.resource.Resource; +import ohos.global.resource.ResourceManager; +import ohos.multimodalinput.event.TouchEvent; + +import java.io.IOException; import java.util.ArrayList; import java.util.List; /** - *

Enable_Left_And_Right_Refresh_Activity

- *

Date: 2017/3/10

+ * Enable_Left_And_Right_Refresh_Slice * - * @author afon + * @since 2021-04-22 */ - -@ContentView(R.layout.activity_left_and_right_refresh) -public class Enable_Left_And_Right_Refresh_Activity extends BaseActivity { - private static final String TAG = "Activity"; - - @ViewInject(R.id.kLineLayout) InteractiveKLineLayout kLineLayout = null; - @ViewInject(R.id.MA_Text) private TextView MA_Text = null; - @ViewInject(R.id.StockIndex_Text) private TextView StockIndex_Text = null; - @ViewInject(R.id.Volume_Text) private TextView Volume_Text = null; - @ViewInject(R.id.Left_Loading_Image) private ImageView Left_Loading_Image = null; - @ViewInject(R.id.Right_Loading_Image) private ImageView Right_Loading_Image = null; +public class Enable_Left_And_Right_Refresh_Slice extends BaseAbilitySlice { + + InteractiveKLineLayout kLineLayout; + private Text MA_Text; + private Text StockIndex_Text; + private Text Volume_Text; + private Image Left_Loading_Image; + private Image Right_Loading_Image; + private RadioContainer But_Group; + private RadioButton MACD_But; + private RadioButton RSI_But; + private RadioButton KDJ_But; + private RadioButton BOLL_But; private EntrySet entrySet; private int loadStartPos = 5500; private int loadEndPos = 6000; private int loadCount = 100; + /** + * 动画效果 mAnimator + */ + private AnimatorProperty mAnimator; + @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public void onStart(Intent intent) { + super.onStart(intent); + super.setUIContent(ResourceTable.Layout_slice_left_and_right_refresh); + initViews(); initUI(); loadKLineData(); } + /** + * 初始化view + */ + private void initViews() { + kLineLayout = (InteractiveKLineLayout) findComponentById(ResourceTable.Id_kLineLayout); + MA_Text = (Text) findComponentById(ResourceTable.Id_MA_Text); + StockIndex_Text = (Text) findComponentById(ResourceTable.Id_StockIndex_Text); + Volume_Text = (Text) findComponentById(ResourceTable.Id_Volume_Text); + Left_Loading_Image = (Image) findComponentById(ResourceTable.Id_Left_Loading_Image); + Right_Loading_Image = (Image) findComponentById(ResourceTable.Id_Right_Loading_Image); + + But_Group = (RadioContainer) findComponentById(ResourceTable.Id_But_Group); + MACD_But = (RadioButton) findComponentById(ResourceTable.Id_MACD_But); + RSI_But = (RadioButton) findComponentById(ResourceTable.Id_RSI_But); + KDJ_But = (RadioButton) findComponentById(ResourceTable.Id_KDJ_But); + BOLL_But = (RadioButton) findComponentById(ResourceTable.Id_BOLL_But); + } + private void initUI() { + kLineLayout.setClick(But_Group, MACD_But, RSI_But, KDJ_But, BOLL_But); kLineLayout.setKLineHandler(new KLineHandler() { @Override public void onHighlight(Entry entry, int entryIndex, float x, float y) { final SizeColor sizeColor = kLineLayout.getKLineView().getRender().getSizeColor(); - - String maString = String.format(getResources().getString(R.string.ma_highlight), + String maString = null; + String volumeString = null; + String str = null; + maString = String.format(getString(ResourceTable.String_ma_highlight), entry.getMa5(), entry.getMa10(), entry.getMa20()); - - MA_Text.setText(getSpannableString(maString, - sizeColor.getMa5Color(), - sizeColor.getMa10Color(), - sizeColor.getMa20Color())); - - String volumeString = String.format(getResources().getString(R.string.volume_highlight), + volumeString = String.format(getString(ResourceTable.String_volume_highlight), entry.getVolumeMa5(), entry.getVolumeMa10()); - Volume_Text.setText(getSpannableString(volumeString, - sizeColor.getMa5Color(), - sizeColor.getMa10Color(), - 0)); - - SpannableString spanString = new SpannableString(""); if (kLineLayout.isShownMACD()) { - String str = String.format(getResources().getString(R.string.macd_highlight), + str = String.format(getString(ResourceTable.String_macd_highlight), entry.getDiff(), entry.getDea(), entry.getMacd()); - - spanString = getSpannableString(str, - sizeColor.getDiffLineColor(), - sizeColor.getDeaLineColor(), - sizeColor.getMacdHighlightTextColor()); - } else if (kLineLayout.isShownKDJ()) { - String str = String.format(getResources().getString(R.string.kdj_highlight), + str = String.format(getString(ResourceTable.String_kdj_highlight), entry.getK(), entry.getD(), entry.getJ()); - - spanString = getSpannableString(str, - sizeColor.getKdjKLineColor(), - sizeColor.getKdjDLineColor(), - sizeColor.getKdjJLineColor()); - } else if (kLineLayout.isShownRSI()) { - String str = String.format(getResources().getString(R.string.rsi_highlight), + + str = String.format(getString(ResourceTable.String_rsi_highlight), entry.getRsi1(), entry.getRsi2(), entry.getRsi3()); - - spanString = getSpannableString(str, - sizeColor.getRsi1LineColor(), - sizeColor.getRsi2LineColor(), - sizeColor.getRsi3LineColor()); - } else if (kLineLayout.isShownBOLL()) { - String str = String.format(getResources().getString(R.string.boll_highlight), + str = String.format(getString(ResourceTable.String_boll_highlight), entry.getMb(), entry.getUp(), entry.getDn()); - - spanString = getSpannableString(str, - sizeColor.getBollMidLineColor(), - sizeColor.getBollUpperLineColor(), - sizeColor.getBollLowerLineColor()); } - StockIndex_Text.setText(spanString); + + + MA_Text.setText(maString); + Volume_Text.setText(volumeString); + StockIndex_Text.setText(str); } @Override public void onCancelHighlight() { - String maString = getResources().getString(R.string.ma_normal); + String maString = getString(ResourceTable.String_ma_normal); MA_Text.setText(maString); Volume_Text.setText(""); String stockIndexString = ""; if (kLineLayout.isShownMACD()) { - stockIndexString = getResources().getString(R.string.macd_normal); + stockIndexString = getString(ResourceTable.String_macd_normal); } else if (kLineLayout.isShownKDJ()) { - stockIndexString = getResources().getString(R.string.kdj_normal); + stockIndexString = getString(ResourceTable.String_kdj_normal); } else if (kLineLayout.isShownRSI()) { - stockIndexString = getResources().getString(R.string.rsi_normal); + stockIndexString = getString(ResourceTable.String_rsi_normal); } else if (kLineLayout.isShownBOLL()) { - stockIndexString = getResources().getString(R.string.boll_normal); + stockIndexString = getString(ResourceTable.String_boll_normal); } StockIndex_Text.setText(stockIndexString); } - @Override - public void onSingleTap(MotionEvent e, float x, float y) { - final KLineRender kLineRender = (KLineRender) kLineLayout.getKLineView().getRender(); - - if (kLineRender.getKLineRect().contains(x, y)) { - Toast.makeText(mActivity, "single tab [" + x + ", " + y + "]", Toast.LENGTH_SHORT).show(); - } - } - - @Override - public void onDoubleTap(MotionEvent e, float x, float y) { - final KLineRender kLineRender = (KLineRender) kLineLayout.getKLineView().getRender(); - - if (kLineRender.getKLineRect().contains(x, y)) { - kLineRender.zoomIn(x, y); - } - } - @Override public void onLeftRefresh() { - Left_Loading_Image.setVisibility(View.VISIBLE); - ((Animatable) Left_Loading_Image.getDrawable()).start(); - // 模拟耗时 - kLineLayout.postDelayed(new Runnable() { + Left_Loading_Image.setVisibility(Component.VISIBLE); + mAnimator = Left_Loading_Image.createAnimatorProperty(); + mAnimator.setDuration(1500).rotate(360).setLoopedCount(AnimatorProperty.INFINITE) + .setTarget(Left_Loading_Image).start(); + TaskDispatcher globalTaskDispatcher = getMainTaskDispatcher(); + Runnable runnable = new Runnable() { @Override public void run() { - Left_Loading_Image.setVisibility(View.GONE); - ((Animatable) Left_Loading_Image.getDrawable()).stop(); + Left_Loading_Image.setVisibility(Component.HIDE); List entries = insertEntries(); @@ -189,22 +182,24 @@ public class Enable_Left_And_Right_Refresh_Activity extends BaseActivity { kLineLayout.getKLineView().refreshComplete(entries.size() > 0); if (entries.size() == 0) { - Toast.makeText(mActivity, "已经到达最左边了", Toast.LENGTH_SHORT).show(); + ToastViewDialog.toast(getContext(), "已经到达最左边了"); } } - }, 1000); + }; + globalTaskDispatcher.asyncDispatch(runnable); } @Override public void onRightRefresh() { - Right_Loading_Image.setVisibility(View.VISIBLE); - ((Animatable) Right_Loading_Image.getDrawable()).start(); - // 模拟耗时 - kLineLayout.postDelayed(new Runnable() { + Right_Loading_Image.setVisibility(Component.VISIBLE); + mAnimator = Left_Loading_Image.createAnimatorProperty(); + mAnimator.setDuration(1500).rotate(360).setLoopedCount(AnimatorProperty.INFINITE) + .setTarget(Right_Loading_Image).start(); + TaskDispatcher globalTaskDispatcher = getMainTaskDispatcher(); + Runnable runnable = new Runnable() { @Override public void run() { - Right_Loading_Image.setVisibility(View.GONE); - ((Animatable) Right_Loading_Image.getDrawable()).start(); + Right_Loading_Image.setVisibility(Component.HIDE); List entries = addEntries(); @@ -213,89 +208,65 @@ public class Enable_Left_And_Right_Refresh_Activity extends BaseActivity { kLineLayout.getKLineView().refreshComplete(entries.size() > 0); if (entries.size() == 0) { - Toast.makeText(mActivity, "已经到达最右边了", Toast.LENGTH_SHORT).show(); + ToastViewDialog.toast(getContext(), "已经到达最右边了"); } } - }, 1000); + }; + globalTaskDispatcher.asyncDispatch(runnable); } - }); - } - - private SpannableString getSpannableString(String str, int partColor0, int partColor1, int partColor2) { - String[] splitString = str.split("[●]"); - SpannableString spanString = new SpannableString(str); - - int pos0 = splitString[0].length(); - int pos1 = pos0 + splitString[1].length() + 1; - int end = str.length(); - - spanString.setSpan(new ForegroundColorSpan(partColor0), - pos0, pos1, SpannableString.SPAN_EXCLUSIVE_INCLUSIVE); - - if (splitString.length > 2) { - int pos2 = pos1 + splitString[2].length() + 1; - - spanString.setSpan(new ForegroundColorSpan(partColor1), - pos1, pos2, SpannableString.SPAN_EXCLUSIVE_INCLUSIVE); - spanString.setSpan(new ForegroundColorSpan(partColor2), - pos2, end, SpannableString.SPAN_EXCLUSIVE_INCLUSIVE); - } else { - spanString.setSpan(new ForegroundColorSpan(partColor1), - pos1, end, SpannableString.SPAN_EXCLUSIVE_INCLUSIVE); - } + @Override + public void onSingleTap(TouchEvent e, float x, float y) { + final KLineRender kLineRender = (KLineRender) kLineLayout.getKLineView().getRender(); + if (contains(kLineRender.getKLineRect(), x, y)) { + ToastViewDialog.toast(getContext(), "single tab [" + x + ", " + y + "]"); + } + } - return spanString; + @Override + public void onDoubleTap(TouchEvent e, float x, float y) { + final KLineRender kLineRender = (KLineRender) kLineLayout.getKLineView().getRender(); + if (contains(kLineRender.getKLineRect(), x, y)) { + kLineRender.zoomIn(x, y); + } + } + }); } private void loadKLineData() { - new AsyncTask() { + TaskDispatcher globalTaskDispatcher = getMainTaskDispatcher(); + Runnable runnable = new Runnable() { @Override - protected Void doInBackground(Void... params) { - + public void run() { PerformenceAnalyser.getInstance().addWatcher(); String kLineData = ""; + ResourceManager resourceManager = getContext().getResourceManager(); + RawFileEntry rawFileEntry = resourceManager.getRawFileEntry("resources/rawfile/kline1.txt"); + Resource resource = null; try { - InputStream in = getResources().getAssets().open("kline1.txt"); - int length = in.available(); - byte[] buffer = new byte[length]; - in.read(buffer); + resource = rawFileEntry.openRawFile(); + byte[] buffer = new byte[resource.available()]; + resource.read(buffer); kLineData = new String(buffer, "UTF-8"); - } catch (Exception e) { - e.printStackTrace(); + } catch (IOException e) { + String ee = e.toString(); } - PerformenceAnalyser.getInstance().addWatcher(); - entrySet = StockDataTest.parseKLineData(kLineData); - - PerformenceAnalyser.getInstance().addWatcher(); - entrySet.computeStockIndex(); - - PerformenceAnalyser.getInstance().addWatcher(); - - return null; - } - - @Override - protected void onPostExecute(Void aVoid) { kLineLayout.getKLineView().setEntrySet(loadFirst()); - - PerformenceAnalyser.getInstance().addWatcher(); - kLineLayout.getKLineView().notifyDataSetChanged(); - - PerformenceAnalyser.getInstance().addWatcher(); } - }.execute(); + }; + globalTaskDispatcher.asyncDispatch(runnable); } + private EntrySet loadFirst() { EntrySet set = new EntrySet(); - for (int i = loadStartPos ; i < loadEndPos ; i++) { + for (int i = loadStartPos; i < loadEndPos; i++) { set.addEntry(entrySet.getEntryList().get(i)); } return set; @@ -305,7 +276,7 @@ public class Enable_Left_And_Right_Refresh_Activity extends BaseActivity { List entries = new ArrayList<>(); int addCount = 0; - for (int i = loadEndPos ; i < loadEndPos + loadCount && i < entrySet.getEntryList().size() ; i++) { + for (int i = loadEndPos; i < loadEndPos + loadCount && i < entrySet.getEntryList().size(); i++) { addCount++; entries.add(entrySet.getEntryList().get(i)); @@ -319,7 +290,7 @@ public class Enable_Left_And_Right_Refresh_Activity extends BaseActivity { List entries = new ArrayList<>(); int insertCount = 0; - for (int i = loadStartPos ; i > loadStartPos - loadCount && i > -1 ; i--) { + for (int i = loadStartPos; i > loadStartPos - loadCount && i > -1; i--) { insertCount++; entries.add(entrySet.getEntryList().get(i)); @@ -329,8 +300,18 @@ public class Enable_Left_And_Right_Refresh_Activity extends BaseActivity { return entries; } - public static Intent createIntent(Context context) { - Intent intent = new Intent(context, Enable_Left_And_Right_Refresh_Activity.class); - return intent; + private boolean contains(RectFloat rectFloat, float x, float y) { + return rectFloat.left < rectFloat.right && rectFloat.top < rectFloat.bottom + && x >= rectFloat.left && x < rectFloat.right && y >= rectFloat.top && y < rectFloat.bottom; + } + + @Override + public void onActive() { + super.onActive(); + } + + @Override + public void onForeground(Intent intent) { + super.onForeground(intent); } } diff --git a/app/src/main/java/com/wordplat/quickstart/activity/MACD_RSI_KDJ_Show_Together_Activity.java b/entry/src/main/java/com/wordplat/quickstart/slice/MACD_RSI_KDJ_Show_Together_Slice.java similarity index 49% rename from app/src/main/java/com/wordplat/quickstart/activity/MACD_RSI_KDJ_Show_Together_Activity.java rename to entry/src/main/java/com/wordplat/quickstart/slice/MACD_RSI_KDJ_Show_Together_Slice.java index 0204153..e54ae46 100644 --- a/app/src/main/java/com/wordplat/quickstart/activity/MACD_RSI_KDJ_Show_Together_Activity.java +++ b/entry/src/main/java/com/wordplat/quickstart/slice/MACD_RSI_KDJ_Show_Together_Slice.java @@ -1,64 +1,63 @@ -package com.wordplat.quickstart.activity; +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ -import android.content.Context; -import android.content.Intent; -import android.os.AsyncTask; -import android.os.Bundle; +package com.wordplat.quickstart.slice; -import com.wordplat.quickstart.R; -import com.wordplat.quickstart.utils.AppUtils; import com.wordplat.ikvstockchart.InteractiveKLineView; import com.wordplat.ikvstockchart.compat.PerformenceAnalyser; -import com.wordplat.ikvstockchart.drawing.HighlightDrawing; -import com.wordplat.ikvstockchart.drawing.KDJDrawing; -import com.wordplat.ikvstockchart.drawing.MACDDrawing; -import com.wordplat.ikvstockchart.drawing.RSIDrawing; -import com.wordplat.ikvstockchart.drawing.StockIndexYLabelDrawing; -import com.wordplat.ikvstockchart.entry.EntrySet; -import com.wordplat.ikvstockchart.entry.StockDataTest; -import com.wordplat.ikvstockchart.entry.StockKDJIndex; -import com.wordplat.ikvstockchart.entry.StockMACDIndex; -import com.wordplat.ikvstockchart.entry.StockRSIIndex; +import com.wordplat.ikvstockchart.compat.ViewUtils; +import com.wordplat.ikvstockchart.drawing.*; +import com.wordplat.ikvstockchart.entry.*; import com.wordplat.ikvstockchart.marker.XAxisTextMarkerView; import com.wordplat.ikvstockchart.marker.YAxisTextMarkerView; import com.wordplat.ikvstockchart.render.KLineRender; +import com.wordplat.quickstart.ResourceTable; +import com.wordplat.quickstart.base.BaseAbilitySlice; +import ohos.aafwk.content.Intent; +import ohos.app.dispatcher.TaskDispatcher; +import ohos.global.resource.RawFileEntry; +import ohos.global.resource.Resource; +import ohos.global.resource.ResourceManager; -import org.xutils.view.annotation.ContentView; -import org.xutils.view.annotation.ViewInject; +import java.io.IOException; -import java.io.InputStream; - -/** - *

MACD_RSI_KDJ_Show_Together_Activity

- *

Date: 2017/3/31

- * - * @author afon - */ - -@ContentView(R.layout.activity_macd_rsi_kdj_show_together) -public class MACD_RSI_KDJ_Show_Together_Activity extends BaseActivity { - - @ViewInject(R.id.kLineView) private InteractiveKLineView kLineView = null; +public class MACD_RSI_KDJ_Show_Together_Slice extends BaseAbilitySlice { + private InteractiveKLineView kLineView; private KLineRender kLineRender; @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - initUI(); + public void onStart(Intent intent) { + super.onStart(intent); + setUIContent(ResourceTable.Layout_slice_macd_rsi_kdj_show_together); + initViews(); loadKLineData(); } - private void initUI() { - kLineView.setEnableLeftRefresh(false); + private void initViews() { + kLineView = (InteractiveKLineView) findComponentById(ResourceTable.Id_kLineView_macd_rsi_kdj_show); + kLineView.setEnableLeftRefresh(false); kLineRender = (KLineRender) kLineView.getRender(); - final int paddingTop = AppUtils.dpTopx(mActivity, 10); - final int stockMarkerViewHeight = AppUtils.dpTopx(mActivity, 15); + final int paddingTop = ViewUtils.vpToPx(this, 10); + final int stockMarkerViewHeight = ViewUtils.vpToPx(this, 15); - // MACD + /** + * MACD + */ HighlightDrawing macdHighlightDrawing = new HighlightDrawing(); macdHighlightDrawing.addMarkerView(new YAxisTextMarkerView(stockMarkerViewHeight)); @@ -69,7 +68,9 @@ public class MACD_RSI_KDJ_Show_Together_Activity extends BaseActivity { macdIndex.setPaddingTop(paddingTop); kLineRender.addStockIndex(macdIndex); - // RSI + /** + * RSI + */ HighlightDrawing rsiHighlightDrawing = new HighlightDrawing(); rsiHighlightDrawing.addMarkerView(new YAxisTextMarkerView(stockMarkerViewHeight)); @@ -80,7 +81,9 @@ public class MACD_RSI_KDJ_Show_Together_Activity extends BaseActivity { rsiIndex.setPaddingTop(paddingTop); kLineRender.addStockIndex(rsiIndex); - // KDJ + /** + * KDJ + */ HighlightDrawing kdjHighlightDrawing = new HighlightDrawing(); kdjHighlightDrawing.addMarkerView(new YAxisTextMarkerView(stockMarkerViewHeight)); @@ -96,54 +99,31 @@ public class MACD_RSI_KDJ_Show_Together_Activity extends BaseActivity { } private void loadKLineData() { - new AsyncTask() { - - private EntrySet entrySet; - + TaskDispatcher globalTaskDispatcher = getMainTaskDispatcher(); + Runnable runnable = new Runnable() { @Override - protected Void doInBackground(Void... params) { - + public void run() { + EntrySet entrySet; PerformenceAnalyser.getInstance().addWatcher(); - String kLineData = ""; + ResourceManager resourceManager = getContext().getResourceManager(); + RawFileEntry rawFileEntry = resourceManager.getRawFileEntry("resources/rawfile/kline1.txt"); + Resource resource = null; try { - InputStream in = getResources().getAssets().open("kline1.txt"); - int length = in.available(); - byte[] buffer = new byte[length]; - in.read(buffer); + resource = rawFileEntry.openRawFile(); + byte[] buffer = new byte[resource.available()]; + resource.read(buffer); kLineData = new String(buffer, "UTF-8"); - } catch (Exception e) { - e.printStackTrace(); + } catch (IOException e) { + String ss = e.toString(); } - PerformenceAnalyser.getInstance().addWatcher(); - entrySet = StockDataTest.parseKLineData(kLineData); - - PerformenceAnalyser.getInstance().addWatcher(); - entrySet.computeStockIndex(); - - PerformenceAnalyser.getInstance().addWatcher(); - - return null; - } - - @Override - protected void onPostExecute(Void aVoid) { kLineView.setEntrySet(entrySet); - - PerformenceAnalyser.getInstance().addWatcher(); - kLineView.notifyDataSetChanged(); - - PerformenceAnalyser.getInstance().addWatcher(); } - }.execute(); - } - - public static Intent createIntent(Context context) { - Intent intent = new Intent(context, MACD_RSI_KDJ_Show_Together_Activity.class); - return intent; + }; + globalTaskDispatcher.delayDispatch(runnable,1000); } } diff --git a/entry/src/main/java/com/wordplat/quickstart/slice/MainSlice.java b/entry/src/main/java/com/wordplat/quickstart/slice/MainSlice.java new file mode 100644 index 0000000..b0e74bb --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/slice/MainSlice.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package com.wordplat.quickstart.slice; + +import com.wordplat.quickstart.ResourceTable; +import com.wordplat.quickstart.adapter.TextAdapter; +import com.wordplat.quickstart.base.BaseAbilitySlice; +import com.wordplat.quickstart.utils.ToastViewDialog; + +import ohos.aafwk.content.Intent; +import ohos.agp.components.ListContainer; +import ohos.hiviewdfx.HiLog; +import ohos.hiviewdfx.HiLogLabel; +import ohos.multimodalinput.event.KeyEvent; + +/** + * MainSlice + * + * @since 2021-05-08 + */ +public class MainSlice extends BaseAbilitySlice { + /** + * HiLogLabel + */ + static final HiLogLabel LABEL = new HiLogLabel(HiLog.LOG_APP, 0x00201, "MainAbilitySlice"); + private static final int NUM_16 = 16; + private static final int NUM_255 = 255; + private static final int NUM_12 = 12; + private static final int NUM_0 = 0; + private static final int NUM_2000 = 2000; + private ListContainer textList = null; + private TextAdapter textAdapter; + /** + * 点击两次退出 + */ + private long exitTime = 0L; + + @Override + public void onStart(Intent intent) { + super.onStart(intent); + super.setUIContent(ResourceTable.Layout_slice_main); + + initViews(); + } + + /** + * 初始化view + */ + private void initViews() { + textList = (ListContainer) findComponentById(ResourceTable.Id_textList); + + textAdapter = new TextAdapter(this); + textList.setItemProvider(textAdapter); + + for (int resultI = NUM_0; resultI < NUM_16; resultI++) { + String result = Integer.toHexString(NUM_255 - resultI * NUM_12); + HiLog.info(LABEL, "##d onCreate: " + result); + } + } + + @Override + public void onActive() { + super.onActive(); + } + + @Override + public void onForeground(Intent intent) { + super.onForeground(intent); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEY_BACK) { + exit(); + return false; + } + return super.onKeyDown(keyCode, event); + } + + private void exit() { + if ((System.currentTimeMillis() - exitTime) > NUM_2000) { + ToastViewDialog.toast(getApplicationContext(), "再按一次退出程序"); + exitTime = System.currentTimeMillis(); + } else { + this.exit(); + System.exit(0); + } + } +} diff --git a/app/src/main/java/com/wordplat/quickstart/activity/Simple_TimeLine_Example_Activity.java b/entry/src/main/java/com/wordplat/quickstart/slice/Simple_TimeLine_Example_Slice.java similarity index 56% rename from app/src/main/java/com/wordplat/quickstart/activity/Simple_TimeLine_Example_Activity.java rename to entry/src/main/java/com/wordplat/quickstart/slice/Simple_TimeLine_Example_Slice.java index 0b73bab..3d15af1 100644 --- a/app/src/main/java/com/wordplat/quickstart/activity/Simple_TimeLine_Example_Activity.java +++ b/entry/src/main/java/com/wordplat/quickstart/slice/Simple_TimeLine_Example_Slice.java @@ -1,86 +1,52 @@ -package com.wordplat.quickstart.activity; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; +package com.wordplat.quickstart.slice; import com.wordplat.ikvstockchart.InteractiveKLineView; import com.wordplat.ikvstockchart.entry.Entry; import com.wordplat.ikvstockchart.entry.EntrySet; import com.wordplat.ikvstockchart.render.TimeLineRender; -import com.wordplat.quickstart.R; +import com.wordplat.quickstart.ResourceTable; +import com.wordplat.quickstart.base.BaseAbilitySlice; import com.wordplat.quickstart.bean.BtcBean; import com.wordplat.quickstart.mvp.BtcChinaPresenter; import com.wordplat.quickstart.mvp.LoadingViewListener; -import org.xutils.view.annotation.ContentView; -import org.xutils.view.annotation.ViewInject; +import ohos.aafwk.content.Intent; +import ohos.hiviewdfx.HiLog; +import ohos.hiviewdfx.HiLogLabel; /** - *

Simple_TimeLine_Example_Activity

- *

Date: 2017/4/16

+ * Simple_TimeLine_Example_Slice * - * @author afon + * @since 2021-04-30 */ - -@ContentView(R.layout.activity_simple_timeline) -public class Simple_TimeLine_Example_Activity extends BaseActivity { - - @ViewInject(R.id.timeLineView) private InteractiveKLineView timeLineView = null; - +public class Simple_TimeLine_Example_Slice extends BaseAbilitySlice { private static final int REQUEST_BTC_DATA = 1; - - private final EntrySet entrySet = new EntrySet(); - - private final BtcChinaPresenter presenter = new BtcChinaPresenter(); - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - initUI(); - } - - @Override - protected void onResume() { - super.onResume(); - - presenter.attachView(btcChinaListener); - presenter.getSimple(REQUEST_BTC_DATA); - } - - @Override - protected void onPause() { - super.onPause(); - - presenter.detachView(); - } - - private void initUI() { - timeLineView.setEntrySet(entrySet); - timeLineView.setRender(new TimeLineRender()); - } - + private static final int NUM_0 = 0; + private static final int NUM_2 = 2; + private static final int NUM_4 = 4; + private HiLogLabel label = new HiLogLabel(0, 0, "Simple_TimeLine_Example_Slice"); + private InteractiveKLineView timeLineView = null; private LoadingViewListener btcChinaListener = new LoadingViewListener() { @Override public void onStartRequest(int requestCode) { - + debug("onStartRequest"); } @Override public void onFinishRequest(int requestCode) { - + debug("onFinishRequest"); } @Override public void onSuccess(int requestCode) { + debug("onSuccess"); for (BtcBean btcBean : presenter.getBtcList()) { Entry entry = new Entry(btcBean.getPrice(), (int) btcBean.getAmount(), ""); entrySet.addEntry(entry); } - entrySet.getEntryList().get(0).setXLabel("09:30"); - entrySet.getEntryList().get(2).setXLabel("11:30/13:00"); - entrySet.getEntryList().get(4).setXLabel("15:00"); + entrySet.getEntryList().get(NUM_0).setXLabel("09:30"); + entrySet.getEntryList().get(NUM_2).setXLabel("11:30/13:00"); + entrySet.getEntryList().get(NUM_4).setXLabel("15:00"); timeLineView.notifyDataSetChanged(); } @@ -94,18 +60,52 @@ public class Simple_TimeLine_Example_Activity extends BaseActivity { @Override public void onNoNetworkError(int requestCode) { super.onNoNetworkError(requestCode); + debug("onNoNetworkError"); onResultEmpty(requestCode); } @Override public void onNetworkTimeOutError(int requestCode) { super.onNetworkTimeOutError(requestCode); + debug("onNetworkTimeOutError"); onResultEmpty(requestCode); } }; - public static Intent createIntent(Context context) { - Intent intent = new Intent(context, Simple_TimeLine_Example_Activity.class); - return intent; + private final EntrySet entrySet = new EntrySet(); + + private final BtcChinaPresenter presenter = new BtcChinaPresenter(); + + @Override + public void onStart(Intent intent) { + super.onStart(intent); + super.setUIContent(ResourceTable.Layout_slice_simple_timeline); + initViews(); + } + + /** + * 初始化View + */ + private void initViews() { + timeLineView = (InteractiveKLineView) findComponentById(ResourceTable.Id_timeLineView); + timeLineView.setEntrySet(entrySet); + timeLineView.setRender(new TimeLineRender()); + } + + @Override + protected void onActive() { + super.onActive(); + presenter.attachView(btcChinaListener); + presenter.getSimple(REQUEST_BTC_DATA); + } + + @Override + protected void onBackground() { + super.onBackground(); + presenter.detachView(); + } + + private void debug(String msg) { + HiLog.error(label, msg); } } diff --git a/entry/src/main/java/com/wordplat/quickstart/slice/With_Fragment_And_TabLayout_Switcher_Example_Slice.java b/entry/src/main/java/com/wordplat/quickstart/slice/With_Fragment_And_TabLayout_Switcher_Example_Slice.java new file mode 100644 index 0000000..fcf2e27 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/slice/With_Fragment_And_TabLayout_Switcher_Example_Slice.java @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package com.wordplat.quickstart.slice; + +import com.wordplat.quickstart.ResourceTable; +import com.wordplat.quickstart.base.BaseAbilitySlice; +import com.wordplat.quickstart.mvp.StockPresenter; +import com.wordplat.quickstart.slider.PagerProvider; +import com.wordplat.quickstart.wight.PullLayout.pulllistview.RefreshComponent; +import com.wordplat.quickstart.wight.navigation.BottomNavigation; +import com.wordplat.quickstart.wight.navigation.BottomNavigationItem; +import ohos.aafwk.content.Intent; +import ohos.agp.components.PageSlider; + +import java.util.ArrayList; + +/** + * With_Fragment_And_TabLayout_Switcher_Example_Slice + * + * @since 2021-04-22 + */ +public class With_Fragment_And_TabLayout_Switcher_Example_Slice extends BaseAbilitySlice { + private BottomNavigation mTabLayout; + private RefreshComponent refreshComponent; + private ArrayList bottomNavigationItems = new ArrayList<>(); + private PageSlider mkLineContent; + private PagerProvider dayKLinePager; + private PagerProvider weekKLinePager; + private PagerProvider monthKLinePager; + + @Override + public void onStart(Intent intent) { + super.onStart(intent); + setUIContent(ResourceTable.Layout_slice_with_fragment_and_tablayout_switcher); + initViews(); + refresh(); + } + + private void initViews() { + mTabLayout = (BottomNavigation) findComponentById(ResourceTable.Id_tabLayout); + mkLineContent = (PageSlider) findComponentById(ResourceTable.Id_kLineContent); + refreshComponent = (RefreshComponent) findComponentById(ResourceTable.Id_fragmentRefreshComponent); + + dayKLinePager = PagerProvider.newInstance(this, StockPresenter.KLineType.DAY, refreshComponent); + weekKLinePager = PagerProvider.newInstance(this, StockPresenter.KLineType.WEEK, refreshComponent); + monthKLinePager = PagerProvider.newInstance(this, StockPresenter.KLineType.MONTH, refreshComponent); + mkLineContent.setProvider(dayKLinePager); + mkLineContent.setProvider(weekKLinePager); + mkLineContent.setProvider(monthKLinePager); + mkLineContent.setCurrentPage(0); + mkLineContent.setSlidingPossible(false); + + dayKLinePager = new PagerProvider(this, StockPresenter.KLineType.DAY); + + mkLineContent.addPageChangedListener(new PageSlider.PageChangedListener() { + @Override + public void onPageSliding(int i, float v, int i1) { + } + + @Override + public void onPageSlideStateChanged(int i) { + } + + @Override + public void onPageChosen(int i) { + } + }); + } + + /** + * refresh + */ + public void refresh() { + mTabLayout.removeAllItems(); + mTabLayout.setColored(false); + mTabLayout.setSelectedBackgroundVisible(false); + bottomNavigationItems.clear(); + + BottomNavigationItem item1 = + new BottomNavigationItem( + "日K", getContext()); + BottomNavigationItem item2 = + new BottomNavigationItem( + "周K", getContext()); + BottomNavigationItem item3 = + new BottomNavigationItem( + "月K", getContext()); + + bottomNavigationItems.add(item1); + bottomNavigationItems.add(item2); + bottomNavigationItems.add(item3); + mTabLayout.setSelectHideNotification(false); + mTabLayout.addItems(bottomNavigationItems); + + setListener(); + } + + private void setListener() { + mTabLayout.setOnTabSelectedListener( + new BottomNavigation.OnTabSelectedListener() { + @Override + public boolean onTabSelected(int position, boolean wasSelected) { + mkLineContent.setCurrentPage(position); + switch (position) { + case 0: + dayKLinePager.loadData(); + break; + case 1: + weekKLinePager.loadData(); + break; + case 2: + monthKLinePager.loadData(); + break; + default: + break; + } + return true; + } + }); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/slice/With_Pull_To_Refresh_Example_Slice.java b/entry/src/main/java/com/wordplat/quickstart/slice/With_Pull_To_Refresh_Example_Slice.java new file mode 100644 index 0000000..73ed01f --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/slice/With_Pull_To_Refresh_Example_Slice.java @@ -0,0 +1,352 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.slice; + +import com.wordplat.ikvstockchart.InteractiveKLineLayout; +import com.wordplat.ikvstockchart.InteractiveKLineView; +import com.wordplat.ikvstockchart.KLineHandler; +import com.wordplat.ikvstockchart.compat.PerformenceAnalyser; +import com.wordplat.ikvstockchart.entry.Entry; +import com.wordplat.ikvstockchart.entry.EntrySet; +import com.wordplat.ikvstockchart.entry.SizeColor; +import com.wordplat.ikvstockchart.entry.StockDataTest; +import com.wordplat.ikvstockchart.render.KLineRender; +import com.wordplat.quickstart.ResourceTable; +import com.wordplat.quickstart.base.BaseAbilitySlice; +import com.wordplat.quickstart.utils.ToastViewDialog; +import com.wordplat.quickstart.wight.PullLayout.pulllistview.HeadDefaultComponent; +import com.wordplat.quickstart.wight.PullLayout.pulllistview.IRefresh; +import com.wordplat.quickstart.wight.PullLayout.pulllistview.OnRefreshComponent; +import com.wordplat.quickstart.wight.PullLayout.pulllistview.RefreshComponent; + +import ohos.aafwk.content.Intent; +import ohos.agp.animation.AnimatorProperty; +import ohos.agp.components.*; +import ohos.agp.utils.RectFloat; +import ohos.app.dispatcher.TaskDispatcher; +import ohos.global.resource.RawFileEntry; +import ohos.global.resource.Resource; +import ohos.global.resource.ResourceManager; +import ohos.multimodalinput.event.TouchEvent; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * With_Pull_To_Refresh_Example_Slice + * + * @since 2021-04-30 + */ +public class With_Pull_To_Refresh_Example_Slice extends BaseAbilitySlice { + private RefreshComponent refreshComponent; + private InteractiveKLineLayout kLineLayout; + private Text MA_Text; + private Text StockIndex_Text; + private Text Volume_Text; + private Image Left_Loading_Image; + private Image Right_Loading_Image; + private RadioContainer But_Group; + private RadioButton MACD_But; + private RadioButton RSI_But; + private RadioButton KDJ_But; + private RadioButton BOLL_But; + + private EntrySet entrySet; + private int loadStartPos = 5500; + private int loadEndPos = 6000; + private int loadCount = 100; + + /** + * 动画效果 mAnimator + */ + private AnimatorProperty mAnimator; + /** + * viewOnTouchInterface + */ + public InteractiveKLineView.ViewOnTouchInterface viewOnTouchInterface; + + /** + * 定义回调方法 + * + * @param onRefreshComponent + */ + private OnRefreshComponent onRefreshComponent; + + public void setOnRefresh(OnRefreshComponent onRefreshComponent) { + this.onRefreshComponent = onRefreshComponent; + } + + @Override + public void onStart(Intent intent) { + super.onStart(intent); + setUIContent(ResourceTable.Layout_slice_with_pull_to_refresh); + initViews(); + loadKLineData(); + } + + private void initViews() { + refreshComponent = (RefreshComponent) findComponentById(ResourceTable.Id_pullRefreshComponent); + kLineLayout = (InteractiveKLineLayout) findComponentById(ResourceTable.Id_kLineLayout); + MA_Text = (Text) findComponentById(ResourceTable.Id_MA_Text); + StockIndex_Text = (Text) findComponentById(ResourceTable.Id_StockIndex_Text); + Volume_Text = (Text) findComponentById(ResourceTable.Id_Volume_Text); + Left_Loading_Image = (Image) findComponentById(ResourceTable.Id_Left_Loading_Image); + Right_Loading_Image = (Image) findComponentById(ResourceTable.Id_Right_Loading_Image); + + But_Group = (RadioContainer) findComponentById(ResourceTable.Id_But_Group); + MACD_But = (RadioButton) findComponentById(ResourceTable.Id_MACD_But); + RSI_But = (RadioButton) findComponentById(ResourceTable.Id_RSI_But); + KDJ_But = (RadioButton) findComponentById(ResourceTable.Id_KDJ_But); + BOLL_But = (RadioButton) findComponentById(ResourceTable.Id_BOLL_But); + + refreshComponent.setKLineView(kLineLayout.getKLineView()); + /** + * 设置头部刷新样式,可自定义样式 + */ + HeadDefaultComponent headDefaultComponent = new HeadDefaultComponent(this); + /** + * 添加样式到头部 + */ + refreshComponent.setHeadComponent(headDefaultComponent); + + /** + * 设置刷新回调 + */ + refreshComponent.setRefreshListener(new IRefresh.RefreshListener() { + @Override + public void onRefresh() { + TaskDispatcher globalTaskDispatcher = getMainTaskDispatcher(); + Runnable runnable = new Runnable() { + @Override + public void run() { + // 数据更新完 结束掉刷新 + refreshComponent.refreshFinish(); + } + }; + globalTaskDispatcher.delayDispatch(runnable,2000); + } + + @Override + public boolean enableRefresh() { + return false; + } + }); + kLineLayout.setClick(But_Group, MACD_But, RSI_But, KDJ_But, BOLL_But); + kLineLayout.setKLineHandler(new KLineHandler() { + @Override + public void onHighlight(Entry entry, int entryIndex, float x, float y) { + final SizeColor sizeColor = kLineLayout.getKLineView().getRender().getSizeColor(); + String maString = null; + String volumeString = null; + String str = null; + maString = String.format(getString(ResourceTable.String_ma_highlight), + entry.getMa5(), + entry.getMa10(), + entry.getMa20()); + volumeString = String.format(getString(ResourceTable.String_volume_highlight), + entry.getVolumeMa5(), + entry.getVolumeMa10()); + + if (kLineLayout.isShownMACD()) { + str = String.format(getString(ResourceTable.String_macd_highlight), + entry.getDiff(), + entry.getDea(), + entry.getMacd()); + } else if (kLineLayout.isShownKDJ()) { + str = String.format(getString(ResourceTable.String_kdj_highlight), + entry.getK(), + entry.getD(), + entry.getJ()); + } else if (kLineLayout.isShownRSI()) { + + str = String.format(getString(ResourceTable.String_rsi_highlight), + entry.getRsi1(), + entry.getRsi2(), + entry.getRsi3()); + } else if (kLineLayout.isShownBOLL()) { + str = String.format(getString(ResourceTable.String_boll_highlight), + entry.getMb(), + entry.getUp(), + entry.getDn()); + } + + + MA_Text.setText(maString); + Volume_Text.setText(volumeString); + StockIndex_Text.setText(str); + } + + @Override + public void onCancelHighlight() { + String maString = getString(ResourceTable.String_ma_normal); + MA_Text.setText(maString); + Volume_Text.setText(""); + + String stockIndexString = ""; + if (kLineLayout.isShownMACD()) { + stockIndexString = getString(ResourceTable.String_macd_normal); + } else if (kLineLayout.isShownKDJ()) { + stockIndexString = getString(ResourceTable.String_kdj_normal); + } else if (kLineLayout.isShownRSI()) { + stockIndexString = getString(ResourceTable.String_rsi_normal); + } else if (kLineLayout.isShownBOLL()) { + stockIndexString = getString(ResourceTable.String_boll_normal); + } + StockIndex_Text.setText(stockIndexString); + } + + @Override + public void onLeftRefresh() { + Left_Loading_Image.setVisibility(Component.VISIBLE); + mAnimator = Left_Loading_Image.createAnimatorProperty(); + mAnimator.setDuration(1500).rotate(360).setLoopedCount(AnimatorProperty.INFINITE) + .setTarget(Left_Loading_Image).start(); + TaskDispatcher globalTaskDispatcher = getMainTaskDispatcher(); + Runnable runnable = new Runnable() { + @Override + public void run() { + Left_Loading_Image.setVisibility(Component.HIDE); + + List entries = insertEntries(); + + kLineLayout.getKLineView().getRender().getEntrySet().insertFirst(entries); + kLineLayout.getKLineView().notifyDataSetChanged(); + kLineLayout.getKLineView().refreshComplete(entries.size() > 0); + + if (entries.size() == 0) { + ToastViewDialog.toast(getContext(), "已经到达最左边了"); + } + } + }; + globalTaskDispatcher.delayDispatch(runnable, 1000); + } + + @Override + public void onRightRefresh() { + Right_Loading_Image.setVisibility(Component.VISIBLE); + mAnimator = Left_Loading_Image.createAnimatorProperty(); + mAnimator.setDuration(1500).rotate(360).setLoopedCount(AnimatorProperty.INFINITE) + .setTarget(Left_Loading_Image).start(); + TaskDispatcher globalTaskDispatcher = getMainTaskDispatcher(); + Runnable runnable = new Runnable() { + @Override + public void run() { + Right_Loading_Image.setVisibility(Component.HIDE); + + List entries = addEntries(); + + kLineLayout.getKLineView().getRender().getEntrySet().addEntries(entries); + kLineLayout.getKLineView().notifyDataSetChanged(); + kLineLayout.getKLineView().refreshComplete(entries.size() > 0); + + if (entries.size() == 0) { + ToastViewDialog.toast(getContext(), "已经到达最右边了"); + } + } + }; + globalTaskDispatcher.delayDispatch(runnable, 1000); + } + + @Override + public void onSingleTap(TouchEvent e, float x, float y) { + final KLineRender kLineRender = (KLineRender) kLineLayout.getKLineView().getRender(); + if (contains(kLineRender.getKLineRect(), x, y)) { + ToastViewDialog.toast(getContext(), "single tab [" + x + ", " + y + "]"); + } + } + + @Override + public void onDoubleTap(TouchEvent e, float x, float y) { + final KLineRender kLineRender = (KLineRender) kLineLayout.getKLineView().getRender(); + if (contains(kLineRender.getKLineRect(), x, y)) { + kLineRender.zoomIn(x, y); + } + } + }); + } + + private void loadKLineData() { + TaskDispatcher globalTaskDispatcher = getMainTaskDispatcher(); + Runnable runnable = new Runnable() { + @Override + public void run() { + PerformenceAnalyser.getInstance().addWatcher(); + + String kLineData = ""; + ResourceManager resourceManager = getContext().getResourceManager(); + RawFileEntry rawFileEntry = resourceManager.getRawFileEntry("resources/rawfile/kline1.txt"); + Resource resource = null; + try { + resource = rawFileEntry.openRawFile(); + byte[] buffer = new byte[resource.available()]; + resource.read(buffer); + kLineData = new String(buffer, "UTF-8"); + } catch (IOException e) { + e.printStackTrace(); + } + + entrySet = StockDataTest.parseKLineData(kLineData); + entrySet.computeStockIndex(); + kLineLayout.getKLineView().setEntrySet(loadFirst()); + kLineLayout.getKLineView().notifyDataSetChanged(); + } + }; + globalTaskDispatcher.asyncDispatch(runnable); + } + + private EntrySet loadFirst() { + EntrySet set = new EntrySet(); + + for (int i = loadStartPos; i < loadEndPos; i++) { + set.addEntry(entrySet.getEntryList().get(i)); + } + return set; + } + + private List addEntries() { + List entries = new ArrayList<>(); + + int addCount = 0; + for (int i = loadEndPos; i < loadEndPos + loadCount && i < entrySet.getEntryList().size(); i++) { + addCount++; + + entries.add(entrySet.getEntryList().get(i)); + } + loadEndPos += addCount; + + return entries; + } + + private List insertEntries() { + List entries = new ArrayList<>(); + + int insertCount = 0; + for (int i = loadStartPos; i > loadStartPos - loadCount && i > -1; i--) { + insertCount++; + + entries.add(entrySet.getEntryList().get(i)); + } + loadStartPos -= insertCount; + + return entries; + } + + private boolean contains(RectFloat rectFloat, float x, float y) { + return rectFloat.left < rectFloat.right && rectFloat.top < rectFloat.bottom + && x >= rectFloat.left && x < rectFloat.right && y >= rectFloat.top && y < rectFloat.bottom; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/slice/With_RecyclerView_Example_Slice.java b/entry/src/main/java/com/wordplat/quickstart/slice/With_RecyclerView_Example_Slice.java new file mode 100644 index 0000000..bf8bebc --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/slice/With_RecyclerView_Example_Slice.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.slice; + +import com.wordplat.quickstart.ResourceTable; +import com.wordplat.quickstart.base.BaseAbilitySlice; + +import ohos.aafwk.content.Intent; + +/** + * With_Pull_To_Refresh_Example_Slice + * + * @since 2021-04-30 + */ +public class With_RecyclerView_Example_Slice extends BaseAbilitySlice { + @Override + public void onStart(Intent intent) { + super.onStart(intent); + setUIContent(ResourceTable.Layout_slice_with_pull_to_refresh); + initViews(); + } + + private void initViews() { + } +} diff --git a/app/src/main/java/com/wordplat/quickstart/fragment/KLineFragment.java b/entry/src/main/java/com/wordplat/quickstart/slider/PagerProvider.java similarity index 38% rename from app/src/main/java/com/wordplat/quickstart/fragment/KLineFragment.java rename to entry/src/main/java/com/wordplat/quickstart/slider/PagerProvider.java index 1d768fd..dafaacd 100644 --- a/app/src/main/java/com/wordplat/quickstart/fragment/KLineFragment.java +++ b/entry/src/main/java/com/wordplat/quickstart/slider/PagerProvider.java @@ -1,246 +1,103 @@ -package com.wordplat.quickstart.fragment; - -import android.graphics.drawable.Animatable; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.text.SpannableString; -import android.text.style.ForegroundColorSpan; -import android.view.MotionEvent; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - -import com.wordplat.quickstart.R; -import com.wordplat.quickstart.bean.KLineBean; -import com.wordplat.quickstart.mvp.LoadingViewListener; -import com.wordplat.quickstart.mvp.StockPresenter; +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.slider; + import com.wordplat.ikvstockchart.InteractiveKLineLayout; import com.wordplat.ikvstockchart.KLineHandler; import com.wordplat.ikvstockchart.entry.Entry; import com.wordplat.ikvstockchart.entry.EntrySet; import com.wordplat.ikvstockchart.entry.SizeColor; import com.wordplat.ikvstockchart.render.KLineRender; - -import org.xutils.view.annotation.ContentView; -import org.xutils.view.annotation.ViewInject; +import com.wordplat.quickstart.ResourceTable; +import com.wordplat.quickstart.bean.KLineBean; +import com.wordplat.quickstart.mvp.LoadingViewListener; +import com.wordplat.quickstart.mvp.StockPresenter; +import com.wordplat.quickstart.utils.ToastViewDialog; +import com.wordplat.quickstart.wight.PullLayout.pulllistview.HeadDefaultComponent; +import com.wordplat.quickstart.wight.PullLayout.pulllistview.IRefresh; +import com.wordplat.quickstart.wight.PullLayout.pulllistview.RefreshComponent; + +import ohos.agp.animation.AnimatorProperty; +import ohos.agp.components.*; +import ohos.agp.utils.RectFloat; +import ohos.app.Context; +import ohos.app.dispatcher.TaskDispatcher; +import ohos.eventhandler.EventHandler; +import ohos.eventhandler.EventRunner; +import ohos.multimodalinput.event.TouchEvent; import java.util.List; +import static ohos.agp.components.Component.VISIBLE; + /** - *

KLineFragment

- *

Date: 2017/4/5

+ * PagerProvider * - * @author afon + * @since 2021-04-22 */ - -@ContentView(R.layout.fragment_kline) -public class KLineFragment extends BaseFragment { - private static final String TAG = "KLineFragment"; - - @ViewInject(R.id.kLineLayout) private InteractiveKLineLayout kLineLayout = null; - @ViewInject(R.id.MA_Text) private TextView MA_Text = null; - @ViewInject(R.id.StockIndex_Text) private TextView StockIndex_Text = null; - @ViewInject(R.id.Volume_Text) private TextView Volume_Text = null; - @ViewInject(R.id.Left_Loading_Image) private ImageView Left_Loading_Image = null; - @ViewInject(R.id.Right_Loading_Image) private ImageView Right_Loading_Image = null; - - private static final String STOCK_CODE = "600030"; // 中信证券 +public class PagerProvider extends PageSliderProvider { + /** + * 中信证券 + */ + private static final String STOCK_CODE = "600030"; private static final int REQUEST_STOCK_FIRST = 1; private static final int REQUEST_STOCK_PREV = 2; private static final int REQUEST_STOCK_NEXT = 3; + private static RefreshComponent refreshComponent; + + private final Context mContext; + private InteractiveKLineLayout kLineLayout = null; + private Text MA_Text = null; + private Text StockIndex_Text = null; + private Text Volume_Text = null; + private Image Left_Loading_Image; + private Image Right_Loading_Image; + + private RadioContainer But_Group; + private RadioButton MACD_But; + private RadioButton RSI_But; + private RadioButton KDJ_But; + private RadioButton BOLL_But; + + private int loadStartPos = 5500; + private int loadEndPos = 6000; + private int loadCount = 100; private StockPresenter.KLineType kLineType; - - private final EntrySet entrySet = new EntrySet(); - + private EntrySet entrySet = new EntrySet(); private final StockPresenter presenter = new StockPresenter(); - @Override - public void onActivityCreated(@Nullable Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - - initUI(); - } - - @Override - public void onResume() { - super.onResume(); - - presenter.attachView(viewListener); - presenter.loadFirst(REQUEST_STOCK_FIRST, STOCK_CODE, kLineType); - } - - @Override - public void onPause() { - super.onPause(); - - presenter.detachView(); - } - - private void initUI() { - kLineType = (StockPresenter.KLineType) getArguments().getSerializable(A); - - kLineLayout.setKLineHandler(new KLineHandler() { - @Override - public void onHighlight(Entry entry, int entryIndex, float x, float y) { - final SizeColor sizeColor = kLineLayout.getKLineView().getRender().getSizeColor(); - - String maString = String.format(getResources().getString(R.string.ma_highlight), - entry.getMa5(), - entry.getMa10(), - entry.getMa20()); - - MA_Text.setText(getSpannableString(maString, - sizeColor.getMa5Color(), - sizeColor.getMa10Color(), - sizeColor.getMa20Color())); - - String volumeString = String.format(getResources().getString(R.string.volume_highlight), - entry.getVolumeMa5(), - entry.getVolumeMa10()); - - Volume_Text.setText(getSpannableString(volumeString, - sizeColor.getMa5Color(), - sizeColor.getMa10Color(), - 0)); - - SpannableString spanString = new SpannableString(""); - if (kLineLayout.isShownMACD()) { - String str = String.format(getResources().getString(R.string.macd_highlight), - entry.getDiff(), - entry.getDea(), - entry.getMacd()); - - spanString = getSpannableString(str, - sizeColor.getDiffLineColor(), - sizeColor.getDeaLineColor(), - sizeColor.getMacdHighlightTextColor()); - - } else if (kLineLayout.isShownKDJ()) { - String str = String.format(getResources().getString(R.string.kdj_highlight), - entry.getK(), - entry.getD(), - entry.getJ()); - - spanString = getSpannableString(str, - sizeColor.getKdjKLineColor(), - sizeColor.getKdjDLineColor(), - sizeColor.getKdjJLineColor()); - - } else if (kLineLayout.isShownRSI()) { - String str = String.format(getResources().getString(R.string.rsi_highlight), - entry.getRsi1(), - entry.getRsi2(), - entry.getRsi3()); - - spanString = getSpannableString(str, - sizeColor.getRsi1LineColor(), - sizeColor.getRsi2LineColor(), - sizeColor.getRsi3LineColor()); - - } else if (kLineLayout.isShownBOLL()) { - String str = String.format(getResources().getString(R.string.boll_highlight), - entry.getMb(), - entry.getUp(), - entry.getDn()); - - spanString = getSpannableString(str, - sizeColor.getBollMidLineColor(), - sizeColor.getBollUpperLineColor(), - sizeColor.getBollLowerLineColor()); - } - StockIndex_Text.setText(spanString); - } - - @Override - public void onCancelHighlight() { - String maString = getResources().getString(R.string.ma_normal); - MA_Text.setText(maString); - Volume_Text.setText(""); - - String stockIndexString = ""; - if (kLineLayout.isShownMACD()) { - stockIndexString = getResources().getString(R.string.macd_normal); - } else if (kLineLayout.isShownKDJ()) { - stockIndexString = getResources().getString(R.string.kdj_normal); - } else if (kLineLayout.isShownRSI()) { - stockIndexString = getResources().getString(R.string.rsi_normal); - } else if (kLineLayout.isShownBOLL()) { - stockIndexString = getResources().getString(R.string.boll_normal); - } - StockIndex_Text.setText(stockIndexString); - } - - @Override - public void onSingleTap(MotionEvent e, float x, float y) { - final KLineRender kLineRender = (KLineRender) kLineLayout.getKLineView().getRender(); - - if (kLineRender.getKLineRect().contains(x, y)) { - Toast.makeText(mActivity, "single tab [" + x + ", " + y + "]", Toast.LENGTH_SHORT).show(); - } - } - - @Override - public void onDoubleTap(MotionEvent e, float x, float y) { - final KLineRender kLineRender = (KLineRender) kLineLayout.getKLineView().getRender(); - - if (kLineRender.getKLineRect().contains(x, y)) { - kLineRender.zoomIn(x, y); - } - } - - @Override - public void onLeftRefresh() { - presenter.loadPrev(REQUEST_STOCK_PREV, STOCK_CODE, kLineType); - } - - @Override - public void onRightRefresh() { - presenter.loadNext(REQUEST_STOCK_NEXT, STOCK_CODE, kLineType); - } - }); - } - - private SpannableString getSpannableString(String str, int partColor0, int partColor1, int partColor2) { - String[] splitString = str.split("[●]"); - SpannableString spanString = new SpannableString(str); - - int pos0 = splitString[0].length(); - int pos1 = pos0 + splitString[1].length() + 1; - int end = str.length(); - - spanString.setSpan(new ForegroundColorSpan(partColor0), - pos0, pos1, SpannableString.SPAN_EXCLUSIVE_INCLUSIVE); - - if (splitString.length > 2) { - int pos2 = pos1 + splitString[2].length() + 1; - - spanString.setSpan(new ForegroundColorSpan(partColor1), - pos1, pos2, SpannableString.SPAN_EXCLUSIVE_INCLUSIVE); - - spanString.setSpan(new ForegroundColorSpan(partColor2), - pos2, end, SpannableString.SPAN_EXCLUSIVE_INCLUSIVE); - } else { - spanString.setSpan(new ForegroundColorSpan(partColor1), - pos1, end, SpannableString.SPAN_EXCLUSIVE_INCLUSIVE); - } - - return spanString; - } + private AnimatorProperty mAnimator; private LoadingViewListener viewListener = new LoadingViewListener() { @Override public void onStartRequest(int requestCode) { switch (requestCode) { case REQUEST_STOCK_PREV: - Left_Loading_Image.setVisibility(View.VISIBLE); - ((Animatable) Left_Loading_Image.getDrawable()).start(); + Left_Loading_Image.setVisibility(VISIBLE); + mAnimator = Left_Loading_Image.createAnimatorProperty(); + mAnimator.setDuration(1500).rotate(360).setLoopedCount(AnimatorProperty.INFINITE) + .setTarget(Left_Loading_Image).start(); break; case REQUEST_STOCK_NEXT: - Right_Loading_Image.setVisibility(View.VISIBLE); - ((Animatable) Right_Loading_Image.getDrawable()).start(); + Right_Loading_Image.setVisibility(VISIBLE); + mAnimator = Right_Loading_Image.createAnimatorProperty(); + mAnimator.setDuration(1500).rotate(360).setLoopedCount(AnimatorProperty.INFINITE) + .setTarget(Right_Loading_Image).start(); break; } } @@ -249,13 +106,26 @@ public class KLineFragment extends BaseFragment { public void onFinishRequest(int requestCode) { switch (requestCode) { case REQUEST_STOCK_PREV: - Left_Loading_Image.setVisibility(View.GONE); - ((Animatable) Left_Loading_Image.getDrawable()).stop(); + TaskDispatcher globalTaskDispatcher = mContext.getMainTaskDispatcher(); + Runnable runnable = new Runnable() { + @Override + public void run() { + Left_Loading_Image.setVisibility(Component.HIDE); + ToastViewDialog.toast(mContext, "已经到达最左边了"); + } + }; + globalTaskDispatcher.delayDispatch(runnable, 1500); break; - case REQUEST_STOCK_NEXT: - Right_Loading_Image.setVisibility(View.GONE); - ((Animatable) Right_Loading_Image.getDrawable()).start(); + TaskDispatcher globalTaskDispatcher2 = mContext.getMainTaskDispatcher(); + Runnable runnable2 = new Runnable() { + @Override + public void run() { + Right_Loading_Image.setVisibility(Component.HIDE); + ToastViewDialog.toast(mContext, "已经到达最右边了"); + } + }; + globalTaskDispatcher2.delayDispatch(runnable2, 1500); break; } } @@ -276,11 +146,10 @@ public class KLineFragment extends BaseFragment { } entrySet.computeStockIndex(); kLineLayout.getKLineView().setEntrySet(entrySet); - kLineLayout.getKLineView().notifyDataSetChanged(); break; case REQUEST_STOCK_PREV: - for (int i = response.size() - 1 ; i >= 0 ; i--) { + for (int i = response.size() - 1; i >= 0; i--) { KLineBean kLineBean = response.get(i); entrySet.insertFirst(new Entry(kLineBean.getOpen(), kLineBean.getHigh(), @@ -290,7 +159,6 @@ public class KLineFragment extends BaseFragment { kLineBean.getDate())); } entrySet.computeStockIndex(); - kLineLayout.getKLineView().notifyDataSetChanged(); kLineLayout.getKLineView().refreshComplete(response.size() > 0); break; @@ -304,7 +172,6 @@ public class KLineFragment extends BaseFragment { kLineBean.getDate())); } entrySet.computeStockIndex(); - kLineLayout.getKLineView().notifyDataSetChanged(); kLineLayout.getKLineView().refreshComplete(response.size() > 0); break; } @@ -314,18 +181,16 @@ public class KLineFragment extends BaseFragment { public void onResultEmpty(int requestCode) { switch (requestCode) { case REQUEST_STOCK_FIRST: - entrySet.setLoadingStatus(false); - kLineLayout.getKLineView().notifyDataSetChanged(); break; case REQUEST_STOCK_PREV: kLineLayout.getKLineView().refreshComplete(false); - Toast.makeText(mActivity, "已经到达最左边了", Toast.LENGTH_SHORT).show(); + break; case REQUEST_STOCK_NEXT: kLineLayout.getKLineView().refreshComplete(false); - Toast.makeText(mActivity, "已经到达最右边了", Toast.LENGTH_SHORT).show(); + break; } } @@ -337,7 +202,6 @@ public class KLineFragment extends BaseFragment { switch (requestCode) { case REQUEST_STOCK_FIRST: entrySet.setLoadingStatus(false); - kLineLayout.getKLineView().notifyDataSetChanged(); break; } } @@ -349,20 +213,236 @@ public class KLineFragment extends BaseFragment { switch (requestCode) { case REQUEST_STOCK_FIRST: entrySet.setLoadingStatus(false); - kLineLayout.getKLineView().notifyDataSetChanged(); break; } } }; - private static final String A = "a"; + /** + * PagerProvider + * + * @param context + * @param type + */ + public PagerProvider(Context context, StockPresenter.KLineType type) { + this.mContext = context; + this.kLineType = type; + } + + @Override + public int getCount() { + return 1; + } + + @Override + public Object createPageInContainer(ComponentContainer componentContainer, int i) { + DirectionalLayout layout = (DirectionalLayout) LayoutScatter.getInstance(mContext).parse( + ResourceTable.Layout_slider_kline, null, false); + initViews(layout); + initUI(); + componentContainer.addComponent(layout); + setRefresh(); + presenter.attachView(viewListener); + presenter.loadFirst(REQUEST_STOCK_FIRST, STOCK_CODE, kLineType); + return layout; + } + + private void setRefresh() { + refreshComponent.setKLineView(kLineLayout.getKLineView()); + /** + * 设置头部刷新样式,可自定义样式 + */ + HeadDefaultComponent headDefaultComponent = new HeadDefaultComponent(refreshComponent.getContext()); + /** + * 添加样式到头部 + */ + refreshComponent.setHeadComponent(headDefaultComponent); + /** + * 设置刷新回调 + */ + refreshComponent.setRefreshListener(new IRefresh.RefreshListener() { + @Override + public void onRefresh() { + new EventHandler(EventRunner.getMainEventRunner()).postTask(new Runnable() { + @Override + public void run() { + /** + * 数据更新完 结束掉刷新 + */ + refreshComponent.refreshFinish(); + } + }, 2000); + } + + @Override + public boolean enableRefresh() { + return false; + } + }); + } + + private void initUI() { + kLineLayout.setClick(But_Group, MACD_But, RSI_But, KDJ_But, BOLL_But); + kLineLayout.getKLineView().isEmpty(true); + kLineLayout.setKLineHandler(new KLineHandler() { + @Override + public void onHighlight(Entry entry, int entryIndex, float x, float y) { + final SizeColor sizeColor = kLineLayout.getKLineView().getRender().getSizeColor(); + String maString = null; + String volumeString = null; + String str = null; + maString = String.format(String.valueOf(mContext.getString(ResourceTable.String_ma_highlight)), + entry.getMa5(), + entry.getMa10(), + entry.getMa20()); + volumeString = String.format(String.valueOf(mContext.getString(ResourceTable.String_volume_highlight)), + entry.getVolumeMa5(), + entry.getVolumeMa10()); + if (kLineLayout.isShownMACD()) { + str = String.format(String.valueOf(mContext.getString(ResourceTable.String_macd_highlight)), + entry.getDiff(), + entry.getDea(), + entry.getMacd()); + } else if (kLineLayout.isShownKDJ()) { + str = String.format(String.valueOf(mContext.getString(ResourceTable.String_kdj_highlight)), + entry.getK(), + entry.getD(), + entry.getJ()); + } else if (kLineLayout.isShownRSI()) { + str = String.format(String.valueOf(mContext.getString(ResourceTable.String_rsi_highlight)), + entry.getRsi1(), + entry.getRsi2(), + entry.getRsi3()); + } else if (kLineLayout.isShownBOLL()) { + str = String.format(String.valueOf(mContext.getString(ResourceTable.String_boll_highlight)), + entry.getMb(), + entry.getUp(), + entry.getDn()); + } + + MA_Text.setText(maString); + Volume_Text.setText(volumeString); + StockIndex_Text.setText(str); + } + + @Override + public void onCancelHighlight() { + String maString = null; + String stockIndexString = ""; + maString = String.valueOf(mContext.getString(ResourceTable.String_ma_normal)); + if (kLineLayout.isShownMACD()) { + stockIndexString = String.valueOf(mContext.getString(ResourceTable.String_macd_normal)); + } else if (kLineLayout.isShownKDJ()) { + stockIndexString = String.valueOf(mContext.getString(ResourceTable.String_kdj_normal)); + } else if (kLineLayout.isShownRSI()) { + stockIndexString = String.valueOf(mContext.getString(ResourceTable.String_rsi_normal)); + } else if (kLineLayout.isShownBOLL()) { + stockIndexString = String.valueOf(mContext.getString(ResourceTable.String_boll_normal)); + } + + MA_Text.setText(maString); + Volume_Text.setText(""); + StockIndex_Text.setText(stockIndexString); + } + + @Override + public void onLeftRefresh() { + Left_Loading_Image.setVisibility(VISIBLE); + mAnimator = Left_Loading_Image.createAnimatorProperty(); + mAnimator.setDuration(1500).rotate(360).setLoopedCount(AnimatorProperty.INFINITE) + .setTarget(Left_Loading_Image).start(); + TaskDispatcher globalTaskDispatcher = mContext.getMainTaskDispatcher(); + Runnable runnable = new Runnable() { + @Override + + public void run() { + Left_Loading_Image.setVisibility(Component.HIDE); + ToastViewDialog.toast(mContext, "已经到达最左边了"); + } + }; + globalTaskDispatcher.delayDispatch(runnable, 1000); + } - public static KLineFragment newInstance(StockPresenter.KLineType kLineType) { - Bundle args = new Bundle(); - args.putSerializable(A, kLineType); + @Override + public void onRightRefresh() { + Right_Loading_Image.setVisibility(VISIBLE); + mAnimator = Right_Loading_Image.createAnimatorProperty(); + mAnimator.setDuration(1500).rotate(360).setLoopedCount(AnimatorProperty.INFINITE) + .setTarget(Right_Loading_Image).start(); + TaskDispatcher globalTaskDispatcher = mContext.getMainTaskDispatcher(); + Runnable runnable = new Runnable() { + @Override + public void run() { + Right_Loading_Image.setVisibility(Component.HIDE); + ToastViewDialog.toast(mContext, "已经到达最右边了"); + } + }; + globalTaskDispatcher.delayDispatch(runnable, 1000); + } + + @Override + public void onSingleTap(TouchEvent e, float x, float y) { + ToastViewDialog.toast(mContext, "single tab [" + x + ", " + y + "]"); + } + + @Override + public void onDoubleTap(TouchEvent e, float x, float y) { + final KLineRender kLineRender = (KLineRender) kLineLayout.getKLineView().getRender(); + if (contains(kLineRender.getKLineRect(), x, y)) { + kLineRender.zoomIn(x, y); + } + } + }); + } + + private void initViews(DirectionalLayout layout) { + kLineLayout = (InteractiveKLineLayout) layout.findComponentById(ResourceTable.Id_kLineLayout); + MA_Text = (Text) layout.findComponentById(ResourceTable.Id_MA_Text); + StockIndex_Text = (Text) layout.findComponentById(ResourceTable.Id_StockIndex_Text); + Volume_Text = (Text) layout.findComponentById(ResourceTable.Id_Volume_Text); + Left_Loading_Image = (Image) layout.findComponentById(ResourceTable.Id_Left_Loading_Image); + Right_Loading_Image = (Image) layout.findComponentById(ResourceTable.Id_Right_Loading_Image); + + But_Group = (RadioContainer) layout.findComponentById(ResourceTable.Id_But_Group); + MACD_But = (RadioButton) layout.findComponentById(ResourceTable.Id_MACD_But); + RSI_But = (RadioButton) layout.findComponentById(ResourceTable.Id_RSI_But); + KDJ_But = (RadioButton) layout.findComponentById(ResourceTable.Id_KDJ_But); + BOLL_But = (RadioButton) layout.findComponentById(ResourceTable.Id_BOLL_But); + } + + /** + * loadData + */ + public void loadData() { + + } + + @Override + public void destroyPageFromContainer(ComponentContainer componentContainer, int i, Object o) { + componentContainer.removeComponent((Component) o); + } + + @Override + public boolean isPageMatchToObject(Component component, Object o) { + return true; + } + + private boolean contains(RectFloat rectFloat, float x, float y) { + return rectFloat.left < rectFloat.right && rectFloat.top < rectFloat.bottom + && x >= rectFloat.left && x < rectFloat.right && y >= rectFloat.top && y < rectFloat.bottom; + } - KLineFragment fragment = new KLineFragment(); - fragment.setArguments(args); + /** + * newInstance + * + * @param mContext + * @param kLineType + * @param rc + * @return PagerProvider + */ + public static PagerProvider newInstance(Context mContext, StockPresenter.KLineType kLineType, RefreshComponent rc) { + PagerProvider fragment = new PagerProvider(mContext, kLineType); + refreshComponent = rc; return fragment; } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/wordplat/quickstart/utils/SSLHelper.java b/entry/src/main/java/com/wordplat/quickstart/utils/SSLHelper.java similarity index 66% rename from app/src/main/java/com/wordplat/quickstart/utils/SSLHelper.java rename to entry/src/main/java/com/wordplat/quickstart/utils/SSLHelper.java index 8555950..ab6dd36 100644 --- a/app/src/main/java/com/wordplat/quickstart/utils/SSLHelper.java +++ b/entry/src/main/java/com/wordplat/quickstart/utils/SSLHelper.java @@ -1,9 +1,11 @@ package com.wordplat.quickstart.utils; -import android.content.Context; -import android.util.Log; -import com.wordplat.quickstart.R; +import com.wordplat.quickstart.ResourceTable; + +import ohos.app.Context; +import ohos.hiviewdfx.HiLog; +import ohos.hiviewdfx.HiLogLabel; import java.io.InputStream; import java.security.KeyStore; @@ -18,18 +20,22 @@ import javax.net.ssl.TrustManagerFactory; *

Date: 2017/5/29

* * @author afon + * @since 2017-05-29 */ - public class SSLHelper { + private static final HiLogLabel LABEL = new HiLogLabel(0, 0, "SSLHelper"); private static final String KEY_STORE_TYPE_BKS = "bks"; // 证书类型 固定值 private static final String KEY_STORE_TYPE_P12 = "PKCS12"; // 证书类型 固定值 - private static final int KEY_STORE_CLIENT_PATH = R.raw.client; // 客户端要给服务器端认证的证书 + private static final int KEY_STORE_CLIENT_PATH = ResourceTable.Profile_client; // 客户端要给服务器端认证的证书 private static final String KEY_STORE_PASSWORD = "123456"; // 证书密码 - private static final int KEY_STORE_TRUST_PATH = R.raw.mytruststore; // 客户端验证服务器端的证书库 + private static final int KEY_STORE_TRUST_PATH = ResourceTable.Profile_mytruststore; // 客户端验证服务器端的证书库 private static final String KEY_STORE_TRUST_PASSWORD = "123456"; // 证书库密码 + private SSLHelper() { + } + /** * 获取SSLContext * @@ -38,26 +44,32 @@ public class SSLHelper { */ public static SSLSocketFactory getSSLSocketFactory(Context context) { try { - // 服务器端需要验证的客户端证书 + /** + * 服务器端需要验证的客户端证书 + */ KeyStore keyStore = KeyStore.getInstance(KEY_STORE_TYPE_P12); - // 客户端信任的服务器端证书 + /** + * 客户端信任的服务器端证书 + */ KeyStore trustStore = KeyStore.getInstance(KEY_STORE_TYPE_BKS); - InputStream ksIn = context.getResources().openRawResource(KEY_STORE_CLIENT_PATH); - InputStream tsIn = context.getResources().openRawResource(KEY_STORE_TRUST_PATH); + InputStream ksIn = context.getResourceManager().getResource(KEY_STORE_CLIENT_PATH); + InputStream tsIn = context.getResourceManager().getResource(KEY_STORE_TRUST_PATH); try { keyStore.load(ksIn, KEY_STORE_PASSWORD.toCharArray()); trustStore.load(tsIn, KEY_STORE_TRUST_PASSWORD.toCharArray()); } catch (Exception e) { - e.printStackTrace(); + String ee = e.toString(); } finally { try { ksIn.close(); } catch (Exception ignore) { + String ee = ignore.toString(); } try { tsIn.close(); } catch (Exception ignore) { + String ee = ignore.toString(); } } @@ -70,9 +82,8 @@ public class SSLHelper { sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null); return sslContext.getSocketFactory(); - } catch (Exception e) { - Log.e("SSLHelper", e.getMessage(), e); + HiLog.error(LABEL, e.getMessage()); } return null; } diff --git a/entry/src/main/java/com/wordplat/quickstart/utils/ToastUtil.java b/entry/src/main/java/com/wordplat/quickstart/utils/ToastUtil.java new file mode 100644 index 0000000..00d6818 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/utils/ToastUtil.java @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.utils; + +import com.wordplat.quickstart.ResourceTable; + +import ohos.agp.components.*; +import ohos.agp.utils.LayoutAlignment; +import ohos.agp.window.dialog.ToastDialog; +import ohos.app.Context; + +/** + * ToastUtil + * + * @since 2021-03-29 + */ +public class ToastUtil { + private static final int NUM_5000 = 5000; + private static final int RADIOUS = 58; + private static final int NUM_50 = 50; + Context context; + + /** + * ToastUtil + * + * @param context + */ + public ToastUtil(Context context) { + this.context = context; + } + + /** + * toastCtx + * + * @param ctx + * @param text + */ + public static void toastCtx(Context ctx, String text) { + new ToastDialog(ctx) + .setText(text) + .setSize(ComponentContainer.LayoutConfig.MATCH_PARENT, ComponentContainer.LayoutConfig.MATCH_CONTENT) + .setAutoClosable(true) + .setDuration(NUM_5000) + .setCornerRadius(RADIOUS) + .show(); + } + + /** + * toastCtx + * + * @param ctx + * @param layout + */ + public static void toastCtx(Context ctx, Component layout) { + Component customToastLayout = (Component) LayoutScatter.getInstance(ctx).parse(layout.getId(), null, false); + ToastDialog toastDialog = new ToastDialog(ctx); + toastDialog.setComponent(customToastLayout); + toastDialog.setCornerRadius(RADIOUS); + toastDialog.setSize(DirectionalLayout.LayoutConfig.MATCH_CONTENT, DirectionalLayout.LayoutConfig.MATCH_CONTENT); + toastDialog.setAlignment(LayoutAlignment.CENTER); + toastDialog.show(); + } + + /** + * toast + * + * @param text + */ + public void toast(String text) { + new ToastDialog(context) + .setText(text) + .setSize(ComponentContainer.LayoutConfig.MATCH_PARENT, ComponentContainer.LayoutConfig.MATCH_CONTENT) + .setAutoClosable(true) + .setDuration(NUM_5000) + .setCornerRadius(RADIOUS) + .show(); + } + + /** + * toast + * + * @param text + * @param duration + */ + public void toast(String text, int duration) { + new ToastDialog(context) + .setText(text) + .setSize(ComponentContainer.LayoutConfig.MATCH_PARENT, ComponentContainer.LayoutConfig.MATCH_CONTENT) + .setDuration(duration) + .setCornerRadius(RADIOUS) + .show(); + } + + /** + * toast + * + * @param text + * @param duration + * @param offsetX + * @param offsetY + * @param gravity + */ + public void toast(String text, int duration, int offsetX, int offsetY, int gravity) { + new ToastDialog(context) + .setText(text) + .setSize(ComponentContainer.LayoutConfig.MATCH_PARENT, ComponentContainer.LayoutConfig.MATCH_CONTENT) + .setAlignment(gravity) + .setDuration(duration) + .setCornerRadius(RADIOUS) + .setOffset(offsetX, offsetY) + .show(); + } + + /** + * toast + * + * @param context + * @param text + */ + public static void toast(Context context, String text) { + ComponentContainer customToastLayout = (ComponentContainer) LayoutScatter.getInstance(context) + .parse(ResourceTable.Layout_toast_dialog_layout, null, false); + + Text textView = (Text) customToastLayout.findComponentById(ResourceTable.Id_toast_text); + + textView.setText(text); + + DirectionalLayout.LayoutConfig layoutConfig = new DirectionalLayout.LayoutConfig( + DirectionalLayout.LayoutConfig.MATCH_CONTENT, DirectionalLayout.LayoutConfig.MATCH_CONTENT); + layoutConfig.setMarginBottom(NUM_50); + customToastLayout.setLayoutConfig(layoutConfig); + + ToastDialog toastDialog = new ToastDialog(context); + toastDialog.setComponent(customToastLayout); + toastDialog.setCornerRadius(RADIOUS); + toastDialog.setDuration(NUM_5000); + toastDialog.setSize(ComponentContainer.LayoutConfig.MATCH_CONTENT, + DirectionalLayout.LayoutConfig.MATCH_CONTENT); + toastDialog.setAlignment(LayoutAlignment.BOTTOM | LayoutAlignment.HORIZONTAL_CENTER); + toastDialog.show(); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/utils/ToastViewDialog.java b/entry/src/main/java/com/wordplat/quickstart/utils/ToastViewDialog.java new file mode 100644 index 0000000..4eeede1 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/utils/ToastViewDialog.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.utils; + +import ohos.agp.components.Component; +import ohos.agp.components.DirectionalLayout; +import ohos.agp.components.LayoutScatter; +import ohos.agp.utils.LayoutAlignment; +import ohos.agp.window.dialog.ToastDialog; +import ohos.app.Context; + +/** + * ToastViewDialog + * + * @since 2021-03-29 + */ +public class ToastViewDialog { + /** + * toast + * + * @param context + */ + public static void toast(Context context) { + new ToastDialog(context) + .setText("这是一个简单的弹窗") + .setAlignment(LayoutAlignment.CENTER) + .show(); + } + + /** + * toast + * + * @param context + * @param text + */ + public static void toast(Context context, String text) { + ToastUtil.toast(context, "" + text); + } + + /** + * toast + * + * @param context + * @param layout + */ + public static void toast(Context context, Component layout) { + Component customToastLayout = (Component) LayoutScatter.getInstance(context).parse(layout.getId(), null, false); + ToastDialog toastDialog = new ToastDialog(context); + toastDialog.setComponent(customToastLayout); + toastDialog.setSize(DirectionalLayout.LayoutConfig.MATCH_CONTENT, DirectionalLayout.LayoutConfig.MATCH_CONTENT); + toastDialog.setAlignment(LayoutAlignment.CENTER); + toastDialog.show(); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/HeadBaseComponent.java b/entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/HeadBaseComponent.java new file mode 100644 index 0000000..c4d0691 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/HeadBaseComponent.java @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.wight.PullLayout.pulllistview; + +import ohos.agp.components.AttrSet; +import ohos.agp.components.ComponentContainer; +import ohos.app.Context; + +/** + * HeadBaseComponent + * + * @since 2021-04-22 + */ +public abstract class HeadBaseComponent extends ComponentContainer { + /** + * 触发下拉刷新时的最小高度,当刚好下拉到这个距离,那就直接刷新, + * 如果下拉的距离超过了这个距离,那就先滚动到这个距离,然后才开始刷新 + */ + public int mPullRefreshHeight; + /** + * 最小阻尼,用户越往下拉,越不跟手 + */ + public float minDamp = 1.6f; + /** + * 最大阻尼 + */ + public float maxDamp = 2.2f; + /** + * RefreshState + * + * @since 2021-04-22 + */ + public enum RefreshState { + /** + * 初始状态 + */ + STATE_INIT, + /** + * 下拉刷新的头部可见 + */ + STATE_VISIBLE, + /** + * 正在刷新的状态 + */ + STATE_REFRESH, + /** + * 超出可刷新距离的状态 + */ + STATE_OVER, + /** + * 超出刷新位置松开手后的状态 + */ + STATE_OVER_RELEASE + } + /** + * 默认状态为 初始化状态 + */ + protected RefreshState mState = RefreshState.STATE_INIT; + + /** + * HeadBaseComponent + * + * @param context + */ + public HeadBaseComponent(Context context) { + this(context, null); + } + + /** + * HeadBaseComponent + * + * @param context + * @param attrSet + */ + public HeadBaseComponent(Context context, AttrSet attrSet) { + this(context, attrSet, ""); + } + + /** + * HeadBaseComponent + * + * @param context + * @param attrSet + * @param styleName + */ + public HeadBaseComponent(Context context, AttrSet attrSet, String styleName) { + super(context, attrSet, styleName); + init(); + } + + /** + * init + */ + public abstract void init(); + + /** + * onHeadVisible + */ + public abstract void onHeadVisible(); + + /** + * onHeadOver + */ + public abstract void onHeadOver(); + + /** + * onRefresh + */ + public abstract void onRefresh(); + + /** + * onFinish + */ + public abstract void onFinish(); + + /** + * setState + * + * @param state + */ + public void setState(RefreshState state) { + this.mState = state; + } + + /** + * getState + * + * @return RefreshState + */ + public RefreshState getState() { + return mState; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/HeadDefaultComponent.java b/entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/HeadDefaultComponent.java new file mode 100644 index 0000000..f716a22 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/HeadDefaultComponent.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.wight.PullLayout.pulllistview; + +import com.wordplat.quickstart.ResourceTable; + +import ohos.agp.animation.AnimatorProperty; +import ohos.agp.components.*; +import ohos.app.Context; + +/** + * HeadDefaultComponent + * + * @since 2021-04-22 + */ +public class HeadDefaultComponent extends HeadBaseComponent { + private DirectionalLayout directionalLayout; + private Image mImage; + private Text mTextTitle; + private Text mTextTime; + private AnimatorProperty mAnimator; + + /** + * HeadDefaultComponent + * + * @param context + */ + public HeadDefaultComponent(Context context) { + this(context, null); + } + + /** + * HeadDefaultComponent + * + * @param context + * @param attrSet + */ + public HeadDefaultComponent(Context context, AttrSet attrSet) { + this(context, attrSet, ""); + } + + /** + * HeadDefaultComponent + * + * @param context + * @param attrSet + * @param styleName + */ + public HeadDefaultComponent(Context context, AttrSet attrSet, String styleName) { + super(context, attrSet, styleName); + } + + @Override + public void init() { + LayoutScatter.getInstance(getContext()).parse(ResourceTable.Layout_head_default_layout, this, true); + directionalLayout = (DirectionalLayout) findComponentById(ResourceTable.Id_dl_default_all); + mTextTitle = (Text) findComponentById(ResourceTable.Id_text_head_title); + mImage = (Image) findComponentById(ResourceTable.Id_img_head_default); + mTextTime = (Text) findComponentById(ResourceTable.Id_text_default_value); + } + + @Override + public void onHeadVisible() { + } + + @Override + public void onHeadOver() { + } + + @Override + public void onRefresh() { + mAnimator = mImage.createAnimatorProperty(); + mAnimator.setDuration(2000).rotate(360).setLoopedCount(AnimatorProperty.INFINITE).setTarget(mImage).start(); + } + + @Override + public void onFinish() { + mAnimator.cancel(); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/IRefresh.java b/entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/IRefresh.java new file mode 100644 index 0000000..6903d9f --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/IRefresh.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.wight.PullLayout.pulllistview; + +/** + * IRefresh + * + * @since 2021-04-22 + */ +public interface IRefresh { + /** + * refreshFinish + */ + void refreshFinish(); + + /** + * setRefreshListener + * + * @param listener + */ + void setRefreshListener(RefreshListener listener); + + /** + * setHeadComponent + * + * @param headComponent + */ + void setHeadComponent(HeadBaseComponent headComponent); + + /** + * RefreshListener + * + * @since 2021-04-22 + */ + interface RefreshListener { + /** + * 告诉调用者,此时正在刷新 + */ + void onRefresh(); + + /** + * 是否允许刷新 + * + * @return + */ + boolean enableRefresh(); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/OnRefreshComponent.java b/entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/OnRefreshComponent.java new file mode 100644 index 0000000..284e5a1 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/OnRefreshComponent.java @@ -0,0 +1,6 @@ +package com.wordplat.quickstart.wight.PullLayout.pulllistview; + +public interface OnRefreshComponent { + void refresh(boolean isRefresh); +} + diff --git a/entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/RefreshComponent.java b/entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/RefreshComponent.java new file mode 100644 index 0000000..386d6f0 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/wight/PullLayout/pulllistview/RefreshComponent.java @@ -0,0 +1,312 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.wight.PullLayout.pulllistview; + +import com.wordplat.ikvstockchart.InteractiveKLineView; +import com.wordplat.quickstart.ResourceTable; +import com.wordplat.quickstart.app.DeviceRuntime; +import ohos.agp.components.AttrSet; +import ohos.agp.components.Component; +import ohos.agp.components.ComponentContainer; +import ohos.agp.components.Text; +import ohos.app.Context; +import ohos.data.DatabaseHelper; +import ohos.data.preferences.Preferences; +import ohos.multimodalinput.event.TouchEvent; + +/** + * RefreshComponent + * + * @since 2021-04-22 + */ +public class RefreshComponent extends ComponentContainer implements Component.LayoutRefreshedListener, IRefresh, OnRefreshComponent { + protected HeadBaseComponent headBaseComponent; + + RefreshListener refreshListener; + private InteractiveKLineView interactiveKLineView; + private float startDownY; + private int mLastY; + private HeadBaseComponent.RefreshState mState; + private long startTime = 0; + private long endTime = 0; + private Preferences preferences; + private Boolean isPull = true; + + /** + * RefreshComponent + * + * @param context + */ + public RefreshComponent(Context context) { + super(context); + } + + /** + * RefreshComponent + * + * @param context + * @param attrSet + */ + public RefreshComponent(Context context, AttrSet attrSet) { + super(context, attrSet); + TimePreferences(); + setLayoutRefreshedListener(this); + } + + /** + * setKLineView + * + * @param kLineView + */ + public void setKLineView(InteractiveKLineView kLineView) { + interactiveKLineView = kLineView; + interactiveKLineView.setOnTouchInterface(new InteractiveKLineView.ViewOnTouchInterface() { + @Override + public boolean touch(int getAction, float endUpY) { + Component head = getComponentAt(0); + Component content = getComponentAt(1); + Text mTextTitle = (Text) head.findComponentById(ResourceTable.Id_text_head_title); + Text mTextTime = (Text) findComponentById(ResourceTable.Id_text_default_value); + switch (getAction) { + case TouchEvent.CANCEL: + break; + case TouchEvent.PRIMARY_POINT_UP: + /** + * 手指抬起之后, 如果状态不是刷新,判断下拉的高度是否大于头部高度 如果是则回弹,开始刷新,如果没有则回到初始状态,隐藏头部 + */ + if (mState != HeadBaseComponent.RefreshState.STATE_REFRESH) { + /** + * 如果状态不是刷新,判断下拉的高度是否大于头部高度 如果是则回弹, 开始刷新,如果没有则回到初始状态,隐藏头部 + */ + if (refreshListener != null && head.getBottom() > headBaseComponent.mPullRefreshHeight) { + head.setComponentPosition(head.getLeft(), 0, head.getRight(), head.getHeight()); + content.setComponentPosition(content.getLeft(), head.getHeight(), + content.getRight(), content.getBottom()); + headBaseComponent.onRefresh(); + refreshListener.onRefresh(); + mState = HeadBaseComponent.RefreshState.STATE_REFRESH; + } else { + head.setComponentPosition(head.getLeft(), -head.getHeight(), + head.getRight(), content.getTop()); + content.setComponentPosition(content.getLeft(), 0, + content.getRight(), content.getBottom()); + mState = HeadBaseComponent.RefreshState.STATE_INIT; + content.setEnabled(true); + } + } + isPull = true; + preferences.putLong(DeviceRuntime.PULL_START, System.currentTimeMillis()); + break; + case TouchEvent.OTHER_POINT_DOWN: + /** + * 表示当一个或多个手指已经触摸屏幕时,另一根手指触摸了屏幕。 + */ + startDownY = endUpY; + break; + case TouchEvent.OTHER_POINT_UP: + /** + * 表示有些手指从屏幕上抬起,而另一些手指则留在屏幕上。 + */ + startDownY = endUpY; + break; + case TouchEvent.PRIMARY_POINT_DOWN: + /** + * 表示第一根手指触摸屏幕。 + */ + startDownY = endUpY; + break; + case TouchEvent.POINT_MOVE: + /** + * 指示手指在屏幕上移动。 + * 1.正在刷新 2.未刷新 + */ + final float scrollY = endUpY - startDownY; + if (scrollY > 0) { + if (content.getScrollValue(AXIS_Y) > 0) { + content.setEnabled(true); + break; + } + content.setEnabled(false); + float offsetY; + + if (head.getTop() < headBaseComponent.mPullRefreshHeight) { + /** + * 没到可刷新的距离,减少阻尼 + */ + offsetY = (int) (mLastY / 2f); + } else { + /** + * 达到可刷新的距离,加大阻尼 + */ + offsetY = (int) (mLastY / 3.2f); + } + + startDownY = endUpY; + mLastY = (int) scrollY; + + if (mState != HeadBaseComponent.RefreshState.STATE_REFRESH) { + /** + * 未刷新时 1.头部正在下拉,并未完全显示, 2.头部已经下拉并且超出自身高度 + */ + if (head.getBottom() > 0 && head.getBottom() < headBaseComponent.mPullRefreshHeight) { + /** + * 1.头部正在下拉,并未完全显示, + */ + mTextTitle.setText("下拉"); + headBaseComponent.onHeadVisible(); + } else if (head.getBottom() > headBaseComponent.mPullRefreshHeight) { + /** + * 2.头部已经下拉并且超出自身高度 + */ + mTextTitle.setText("刷新释放"); + startTime = preferences.getLong(DeviceRuntime.PULL_START, 0); + endTime = System.currentTimeMillis(); + if (startTime != 0 && isPull) { + long cutTime = endTime - startTime; + mTextTime.setVisibility(VISIBLE); + mTextTime.setText("最后更新:" + cutStringTime(cutTime/1000) + "之前"); + isPull = false; + } + headBaseComponent.onHeadOver(); + } + } + content.setTop((int) (content.getTop() + offsetY)); + head.setComponentPosition(0, content.getTop() - head.getHeight(), + head.getRight(), content.getTop()); + content.setComponentPosition(0, content.getTop(), content.getRight(), + content.getBottom()); + break; + } else if (scrollY < 0) { + if (content.getTop() > 0 && content.getScrollValue(AXIS_Y) == 0) { + content.setEnabled(false); + float offsetY; + if (head.getTop() < headBaseComponent.mPullRefreshHeight) { + /** + * 没到可刷新的距离,减少阻尼 + */ + mTextTitle.setText("下拉"); + offsetY = (int) (mLastY / 2f); + } else { + /** + * 达到可刷新的距离,加大阻尼 + */ + mTextTitle.setText("刷新释放"); + offsetY = (int) (mLastY / 3.2f); + } + startDownY = endUpY; + mLastY = (int) scrollY; + content.setTop((int) (content.getTop() + offsetY)); + content.setComponentPosition(content.getLeft(), content.getTop(), + content.getRight(), content.getBottom()); + break; + } else { + head.setComponentPosition(head.getLeft(), -head.getHeight(), head.getRight(), 0); + content.setComponentPosition(content.getLeft(), 0, content.getRight(), + content.getBottom()); + content.setEnabled(true); + break; + } + } + break; + default: + break; + } + return false; + } + }); + } + + @Override + public void onRefreshed(Component component) { + Component head = getComponentAt(0); + headBaseComponent.mPullRefreshHeight = head.getHeight(); + Component content = getComponentAt(1); + head.setComponentPosition(0, content.getTop() - head.getHeight(), head.getRight(), content.getTop()); + content.setComponentPosition(0, content.getTop(), content.getRight(), content.getBottom()); + } + + @Override + public void refreshFinish() { + headBaseComponent.onFinish(); + headBaseComponent.setState(HeadBaseComponent.RefreshState.STATE_INIT); + Component head = getComponentAt(0); + Component content = getComponentAt(1); + content.setEnabled(true); + if (head.getBottom() > 0) { + head.setComponentPosition(head.getLeft(), -head.getHeight(), head.getRight(), 0); + content.setComponentPosition(content.getLeft(), 0, content.getRight(), content.getHeight()); + } + mState = HeadBaseComponent.RefreshState.STATE_INIT; + } + + @Override + public void setRefreshListener(RefreshListener listener) { + refreshListener = listener; + } + + @Override + public void setHeadComponent(HeadBaseComponent headComponent) { + if (headBaseComponent != null) { + removeComponent(headBaseComponent); + } + headBaseComponent = headComponent; + LayoutConfig config = new LayoutConfig(LayoutConfig.MATCH_PARENT, LayoutConfig.MATCH_CONTENT); + addComponent(headBaseComponent, 0, config); + } + + /** + * 刷新时间存储 + */ + private void TimePreferences() { + DatabaseHelper databaseHelper = new DatabaseHelper(getContext()); // context入参类型为ohos.app.Context。 + String fileName = "PULL_TIME"; // fileName表示文件名,其取值不能为空,也不能包含路径,默认存储目录可以通过context.getPreferencesDir()获取。 + preferences = databaseHelper.getPreferences(fileName); + preferences.putLong(DeviceRuntime.PULL_START, 0); + } + + private String cutStringTime(long mss) { + String DateTimes = null; + long days = mss / (60 * 60 * 24); + long hours = (mss % (60 * 60 * 24)) / (60 * 60); + long minutes = (mss % (60 * 60)) / 60; + long seconds = mss % 60; + if (days > 0) { + DateTimes = days + "天" + hours + "小时" + minutes + "分钟" + + seconds + "秒"; + } else if (hours > 0) { + DateTimes = hours + "小时" + minutes + "分钟" + + seconds + "秒"; + } else if (minutes > 0) { + DateTimes = minutes + "分钟" + + seconds + "秒"; + } else { + DateTimes = seconds + "秒"; + } + + return DateTimes; + } + + @Override + public void refresh(boolean isRefresh) { + Component head = getComponentAt(0); + Component content = getComponentAt(1); + head.setComponentPosition(head.getLeft(), 0, head.getRight(), head.getHeight()); + content.setComponentPosition(content.getLeft(), head.getHeight(), + content.getRight(), content.getBottom()); + headBaseComponent.onRefresh(); + refreshListener.onRefresh(); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/wight/navigation/AttrUtils.java b/entry/src/main/java/com/wordplat/quickstart/wight/navigation/AttrUtils.java new file mode 100644 index 0000000..dc3c000 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/wight/navigation/AttrUtils.java @@ -0,0 +1,189 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.wight.navigation; + +import ohos.agp.components.AttrSet; +import ohos.agp.components.element.Element; + +/** + * get attr value class + * + * @since 2021-05-08 + */ +public class AttrUtils { + private AttrUtils() { + } + + /** + * get the int value from AttrSet + * + * @param attrs the attrSet + * @param name the attrName + * @param defaultValue the defaultValue + * @return int value + */ + public static int getIntFromAttr(AttrSet attrs, String name, int defaultValue) { + int value = defaultValue; + try { + if (attrs.getAttr(name).isPresent() && attrs.getAttr(name).get() != null) { + value = attrs.getAttr(name).get().getIntegerValue(); + } + } catch (Exception e) { + return value; + } + return value; + } + + /** + * get the float value from AttrSet + * + * @param attrs the attrSet + * @param name the attrName + * @param defaultValue the defaultValue + * @return float value + */ + public static float getFloatFromAttr(AttrSet attrs, String name, float defaultValue) { + float value = defaultValue; + try { + if (attrs.getAttr(name).isPresent() && attrs.getAttr(name).get() != null) { + value = attrs.getAttr(name).get().getFloatValue(); + } + } catch (Exception e) { + return value; + } + return value; + } + + /** + * get the boolean value from AttrSet + * + * @param attrs the attrSet + * @param name the attrName + * @param defaultValue the defaultValue + * @return boolean value + */ + public static boolean getBooleanFromAttr(AttrSet attrs, String name, boolean defaultValue) { + boolean value = defaultValue; + try { + if (attrs.getAttr(name).isPresent() && attrs.getAttr(name).get() != null) { + value = attrs.getAttr(name).get().getBoolValue(); + } + } catch (Exception e) { + return value; + } + return value; + } + + /** + * get the long value from AttrSet + * + * @param attrs the attrSet + * @param name the attrName + * @param defaultValue the defaultValue + * @return long value + */ + public static long getLongFromAttr(AttrSet attrs, String name, long defaultValue) { + long value = defaultValue; + try { + if (attrs.getAttr(name).isPresent() && attrs.getAttr(name).get() != null) { + value = attrs.getAttr(name).get().getLongValue(); + } + } catch (Exception e) { + return value; + } + return value; + } + + /** + * get the color value from AttrSet + * + * @param attrs the attrSet + * @param name the attrName + * @param defaultValue the defaultValue + * @return int colorValue + */ + public static int getColorFromAttr(AttrSet attrs, String name, int defaultValue) { + int value = defaultValue; + try { + if (attrs.getAttr(name).isPresent() && attrs.getAttr(name).get() != null) { + value = attrs.getAttr(name).get().getColorValue().getValue(); + } + } catch (Exception e) { + return value; + } + return value; + } + + /** + * get the dimensionValue value from AttrSet + * + * @param attrs the attrSet + * @param name the attrName + * @param defaultValue the defaultValue + * @return int dimensionValue + */ + public static int getDimensionFromAttr(AttrSet attrs, String name, int defaultValue) { + int value = defaultValue; + try { + if (attrs.getAttr(name).isPresent() && attrs.getAttr(name).get() != null) { + value = attrs.getAttr(name).get().getDimensionValue(); + } + } catch (Exception e) { + return value; + } + return value; + } + + /** + * get the String value from AttrSet + * + * @param attrs the attrSet + * @param name the attrName + * @param defaultValue the defaultValue + * @return String value + */ + public static String getStringFromAttr(AttrSet attrs, String name, String defaultValue) { + String value = defaultValue; + try { + if (attrs.getAttr(name).isPresent() && attrs.getAttr(name).get() != null) { + value = attrs.getAttr(name).get().getStringValue(); + } + } catch (Exception e) { + return value; + } + return value; + } + + /** + * get the Element value from AttrSet + * + * @param attrs the attrSet + * @param name the attrName + * @param defaultValue the defaultValue + * @return Element value + */ + public static Element getElementFromAttr(AttrSet attrs, String name, Element defaultValue) { + Element value = defaultValue; + try { + if (attrs.getAttr(name).isPresent() && attrs.getAttr(name).get() != null) { + value = attrs.getAttr(name).get().getElement(); + } + } catch (Exception e) { + return value; + } + return value; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/wight/navigation/BottomNavigation.java b/entry/src/main/java/com/wordplat/quickstart/wight/navigation/BottomNavigation.java new file mode 100644 index 0000000..1a51474 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/wight/navigation/BottomNavigation.java @@ -0,0 +1,1339 @@ +package com.wordplat.quickstart.wight.navigation; + +import ohos.agp.animation.Animator; +import ohos.agp.animation.AnimatorValue; +import ohos.agp.components.AttrSet; +import ohos.agp.components.Component; +import ohos.agp.components.ComponentContainer; +import ohos.agp.render.*; +import ohos.agp.utils.Color; +import ohos.agp.utils.Point; +import ohos.agp.utils.RectFloat; +import ohos.app.Context; +import ohos.media.image.PixelMap; +import ohos.multimodalinput.event.TouchEvent; + +import java.util.ArrayList; +import java.util.List; + +public class BottomNavigation extends Component implements Component.DrawTask, Component.TouchEventListener { + private static final int MIN_ITEMS = 3; + private static final int MAX_ITEMS = 5; + + public enum TitleState { + /** + * SHOW_WHEN_ACTIVE + */ + SHOW_WHEN_ACTIVE, + /** + * SHOW_WHEN_ACTIVE_FORCE + */ + SHOW_WHEN_ACTIVE_FORCE, + /** + * ALWAYS_SHOW + */ + ALWAYS_SHOW, + /** + * ALWAYS_HIDE + */ + ALWAYS_HIDE + } + + private static final int DEFAULT_ANIMATION_DURATION = 200; + + private OnTabSelectedListener tabSelectedListener; + private OnNavigationPositionListener navigationPositionListener; + + private ArrayList items = new ArrayList<>(); + + private int defaultBackgroundColor = Color.WHITE.getValue(); + + private int itemActiveColor; + private int itemInactiveColor; + private int titleColorActive; + private int itemDisableColor; + private int titleColorInactive; + private int coloredTitleColorActive; + private int coloredTitleColorInactive; + private int bottomNavigationHeight; + private float selectedItemWidth; + private float notSelectedItemWidth; + private float offsetX; + private boolean forceTint = true; + private TitleState titleState = TitleState.SHOW_WHEN_ACTIVE; + + private Boolean[] itemsEnabledStates = {true, true, true, true, true}; + + private boolean colored = false; + + private boolean selectedBackgroundVisible = false; + + private List notifications = Notification.generateEmptyList(MAX_ITEMS); + + private int notificationMarginLeft; + private int notificationMarginTop; + + private int notificationTextColor = Color.WHITE.getValue(); + private int notificationBackgroundColor = 0xffff5454; + + private int mElevation; + + private boolean isFirst = true; + private boolean needInit = true; + private boolean mIsHidden = false; + + private boolean selectHideNotification = false; + + private Paint mPaint = new Paint(); + private Paint elevationPaint = new Paint(); + private Paint selectBackgroundPaint = new Paint(); + private Paint mOverPaint = new Paint(); + private Paint mTextPaint = new Paint(); + private Paint notificationBackgroundPaint = new Paint(); + private Paint notificationTextPaint = new Paint(); + + private int lastPosition; + private int mPosition; + private int downPosition; + + private AnimatorValue changeAnimatorValue; + private AnimatorValue overAnimatorValue; + private float changePose = 1; + private float overPose = 1; + + private int mAnimationDuration = DEFAULT_ANIMATION_DURATION; + private int mRippleAnimationDuration = (int) (DEFAULT_ANIMATION_DURATION * 2.5); + + private AnimatorValue showAnimatorValue; + private int showBottom = 0; + private long showDurationTime = 300; + + private int iconSize = dp2px(24); + + private int alwaysHideTop = dp2px(16); + private int alwaysShowTopActive = dp2px(6); + private int alwaysShowTopInactive = dp2px(8); + private int showWhenActiveForceTopActive = dp2px(6); + private int showWhenActiveForceTopInactive = dp2px(16); + + private int titleActiveTextSize = 0; + private int titleInactiveTextSize = 0; + + private int defaultTitleActiveTextSize = dp2px(14); + private int defaultTitleInactiveTextSize = dp2px(12); + private int defaultTitleActiveSmallTextSize = dp2px(11); + private int defaultTitleInactiveSmallTextSize = dp2px(10); + + private int textCenterY = dp2px(20); + + private boolean touchEffect; + + /** + * BottomNavigation + * + * @param context + */ + public BottomNavigation(Context context) { + this(context, null, null); + } + + /** + * BottomNavigation + * + * @param context + * @param attrSet + */ + public BottomNavigation(Context context, AttrSet attrSet) { + this(context, attrSet, null); + } + + /** + * BottomNavigation + * + * @param context + * @param attrSet + * @param styleName + */ + public BottomNavigation(Context context, AttrSet attrSet, String styleName) { + super(context, attrSet, styleName); + init(context, attrSet); + } + + private void init(Context context, AttrSet attrSet) { + selectedBackgroundVisible = AttrUtils.getBooleanFromAttr(attrSet, "selectedBackgroundVisible", false); + + titleColorActive = AttrUtils.getColorFromAttr(attrSet, "accentColor", Color.rgb(47, 140, 213)); + titleColorInactive = AttrUtils.getColorFromAttr(attrSet, "inactiveColor", 0xff747474); + itemDisableColor = AttrUtils.getColorFromAttr(attrSet, "disableColor", 0x3A000000); + + coloredTitleColorActive = AttrUtils.getColorFromAttr(attrSet, "coloredActive", Color.rgb(47, 140, 213)); + coloredTitleColorInactive = AttrUtils.getColorFromAttr(attrSet, "coloredInactive", 0x50FFFFFF); + + colored = AttrUtils.getBooleanFromAttr(attrSet, "colored", false); + + mElevation = AttrUtils.getDimensionFromAttr(attrSet, "elevation", dp2px(0)); + + notificationTextColor = Color.WHITE.getValue(); + bottomNavigationHeight = dp2px(40); + + itemActiveColor = titleColorActive; + itemInactiveColor = titleColorInactive; + + notificationMarginLeft = dp2px(16); + notificationMarginTop = 0; + + mPaint.setAntiAlias(true); + elevationPaint.setAntiAlias(true); + mOverPaint.setAntiAlias(true); + mTextPaint.setAntiAlias(true); + selectBackgroundPaint.setAntiAlias(true); + notificationBackgroundPaint.setAntiAlias(true); + notificationTextPaint.setAntiAlias(true); + + setTouchEventListener(this); + addDrawTask(this); + } + + @Override + public void onDraw(Component component, Canvas canvas) { + if (isFirst) { + isFirst = false; + ComponentContainer.LayoutConfig layoutConfig = getLayoutConfig(); + layoutConfig.setMarginBottom(0); + layoutConfig.height = bottomNavigationHeight + mElevation; + setLayoutConfig(layoutConfig); + } + if (items != null && items.size() > 0) { + if (needInit) { + needInit = false; + getMeasurements(); + } + drawBackground(canvas); + drawItems(canvas); + } + } + + private void drawItems(Canvas canvas) { + canvas.save(); + canvas.translate(offsetX, mElevation); + if (selectedBackgroundVisible && (!colored || overPose == 1)) { + selectBackgroundPaint.setColor(new Color(0x17000000)); + canvas.drawRect( + new RectFloat( + getCurrentCenterX(mPosition, mPosition) - selectedItemWidth / 2, + 0, + getCurrentCenterX(mPosition, mPosition) + selectedItemWidth / 2, + bottomNavigationHeight), + selectBackgroundPaint); + } + for (int i = 0; i < items.size(); i++) { + BottomNavigationItem bottomNavigationItem = items.get(i); + float topOff = 0; + if (titleState == TitleState.ALWAYS_HIDE) { + topOff = alwaysHideTop; + } else if (titleState == TitleState.ALWAYS_SHOW + || titleState == TitleState.SHOW_WHEN_ACTIVE && items.size() <= MIN_ITEMS) { + if (i != lastPosition && i != mPosition) { + topOff = alwaysShowTopInactive; + } else if (i == mPosition) { + topOff = + alwaysShowTopInactive + + (alwaysShowTopActive - alwaysShowTopInactive) * changePose; + } else if (i == lastPosition) { + topOff = + alwaysShowTopActive + + (alwaysShowTopInactive - alwaysShowTopActive) * changePose; + } + } else { + if (i != lastPosition && i != mPosition) { + topOff = showWhenActiveForceTopInactive; + } else if (i == mPosition) { + topOff = + showWhenActiveForceTopInactive + + (showWhenActiveForceTopActive - showWhenActiveForceTopInactive) + * changePose; + } else if (i == lastPosition) { + topOff = + showWhenActiveForceTopActive + + (showWhenActiveForceTopInactive - showWhenActiveForceTopActive) + * changePose; + } + } + PixelMap pixelMap = bottomNavigationItem.getOrgPixelMap(); + float centerX = + getCurrentCenterX(i, lastPosition) + + (getCurrentCenterX(i, mPosition) - getCurrentCenterX(i, lastPosition)) + * changePose; + if (touchEffect && i == downPosition) { + mPaint.setColor(new Color(0x20000000)); + canvas.drawCircle( + centerX, bottomNavigationHeight / 2, notSelectedItemWidth * 0.6f, mPaint); + } + + if (forceTint) { + if (colored) { + if (i == mPosition) { + mTextPaint.setColor(new Color(coloredTitleColorActive)); + pixelMap = bottomNavigationItem.getColoredActivePixelMap(); + } else if (!itemsEnabledStates[i]) { + mTextPaint.setColor(new Color(itemDisableColor)); + pixelMap = bottomNavigationItem.getDisablePixelMap(); + } else { + mTextPaint.setColor(new Color(coloredTitleColorInactive)); + pixelMap = bottomNavigationItem.getColoredInActivePixelMap(); + } + } else { + if (i == mPosition) { + mTextPaint.setColor(new Color(titleColorActive)); + pixelMap = bottomNavigationItem.getActivePixelMap(); + } else if (!itemsEnabledStates[i]) { + mTextPaint.setColor(new Color(itemDisableColor)); + pixelMap = bottomNavigationItem.getDisablePixelMap(); + } else { + mTextPaint.setColor(new Color(titleColorInactive)); + pixelMap = bottomNavigationItem.getInActivePixelMap(); + } + } + } + + if (pixelMap != null) { + RectFloat rectFloat = new RectFloat(); + rectFloat.left = + getCurrentCenterX(i, lastPosition) + + (getCurrentCenterX(i, mPosition) - getCurrentCenterX(i, lastPosition)) + * changePose + - iconSize / 2; + rectFloat.right = + getCurrentCenterX(i, lastPosition) + + (getCurrentCenterX(i, mPosition) - getCurrentCenterX(i, lastPosition)) + * changePose + + iconSize / 2; + + rectFloat.top = topOff; + rectFloat.bottom = topOff + iconSize; + mPaint.setColor(new Color(0xffffffff)); + canvas.drawPixelMapHolderRect( + new PixelMapHolder(pixelMap), + new RectFloat( + 0, + 0, + pixelMap.getImageInfo().size.width, + pixelMap.getImageInfo().size.height), + rectFloat, + mPaint); + } + + if (titleState != TitleState.ALWAYS_HIDE) { + float textSize = 0; + float alpha = mTextPaint.getAlpha(); + int activeSize = titleActiveTextSize; + int inactiveSize = titleInactiveTextSize; + if (activeSize == 0 || inactiveSize == 0) { + if (titleState == TitleState.ALWAYS_SHOW && items.size() > MIN_ITEMS) { + activeSize = defaultTitleActiveSmallTextSize; + inactiveSize = defaultTitleInactiveSmallTextSize; + } else { + activeSize = defaultTitleActiveTextSize; + inactiveSize = defaultTitleInactiveTextSize; + } + } + if (titleState == TitleState.ALWAYS_SHOW + || titleState == TitleState.SHOW_WHEN_ACTIVE && items.size() <= MIN_ITEMS) { + if (i != lastPosition && i != mPosition) { + textSize = inactiveSize; + } else if (i == mPosition) { + textSize = inactiveSize + (activeSize - inactiveSize) * changePose; + } else if (i == lastPosition) { + textSize = activeSize + (inactiveSize - activeSize) * changePose; + } + } else { + textSize = activeSize; + if (i != lastPosition && i != mPosition) { + alpha = 0; + } else if (i == mPosition) { + alpha = changePose * alpha; + } else if (i == lastPosition) { + alpha = (1 - changePose) * alpha; + } + } + if (alpha != 0) { + mTextPaint.setAlpha(alpha); + mTextPaint.setTextSize((int) textSize); + float textWidth = mTextPaint.measureText(bottomNavigationItem.getTitle()); + float textHeight = mTextPaint.descent() - mTextPaint.ascent(); + canvas.drawText( + mTextPaint, + bottomNavigationItem.getTitle(), + centerX - textWidth / 2, + textCenterY + textHeight / 4); + } + } + + if (notifications != null && i < notifications.size()) { + Notification notification = notifications.get(i); + notificationBackgroundPaint.setColor( + new Color( + notification.getBackgroundColor() == 0 + ? notificationBackgroundColor + : notification.getBackgroundColor())); + notificationTextPaint.setColor( + new Color( + notification.getTextColor() == 0 + ? notificationTextColor + : notification.getTextColor())); + notificationTextPaint.setTextSize(dp2px(9)); + + if (!notification.isEmpty()) { + float textWidth = notificationTextPaint.measureText(notification.getText()); + float textHeight = notificationTextPaint.descent() - notificationTextPaint.ascent(); + float notificationCenterX = centerX; + float marginTop = topOff + notificationMarginTop; + notificationCenterX = centerX + notificationMarginLeft; + RectFloat rectFloat = new RectFloat(); + if (textWidth > textHeight) { + rectFloat.left = notificationCenterX - textWidth / 2 - dp2px(1); + rectFloat.right = notificationCenterX + textWidth / 2 + dp2px(1); + } else { + rectFloat.left = notificationCenterX - textHeight / 2 - dp2px(1); + rectFloat.right = notificationCenterX + textHeight / 2 + dp2px(1); + } + rectFloat.top = marginTop - dp2px(1); + rectFloat.bottom = marginTop + textHeight + dp2px(1); + canvas.drawRoundRect(rectFloat, dp2px(8), dp2px(8), notificationBackgroundPaint); + canvas.drawText( + notificationTextPaint, + notification.getText(), + notificationCenterX - textWidth / 2, + marginTop + textHeight * 3 / 4); + } + } + } + canvas.restore(); + } + + @Override + public boolean onTouchEvent(Component component, TouchEvent touchEvent) { + if (touchEvent.getAction() == TouchEvent.PRIMARY_POINT_DOWN) { + float touchX = getTouchX(touchEvent, 0); + float touchY = getTouchY(touchEvent, 0); + if (items != null && items.size() > 0) { + int position = getPostionFromX(touchX); + if (position < itemsEnabledStates.length && itemsEnabledStates[position]) { + downPosition = position; + if (touchEffect) { + if (overAnimatorValue == null || !overAnimatorValue.isRunning()) { + invalidate(); + } + } + } + } + } else if (touchEvent.getAction() == TouchEvent.PRIMARY_POINT_UP) { + if (downPosition != -1) { + float touchX = getTouchX(touchEvent, 0); + float touchY = getTouchY(touchEvent, 0); + if (getPostionFromX(touchX) == downPosition + && touchY >= 0 + && touchY <= bottomNavigationHeight) { + if (items != null && items.size() > downPosition) { + choose(downPosition, true); + downPosition = -1; + if (touchEffect) { + if (overAnimatorValue == null || !overAnimatorValue.isRunning()) { + invalidate(); + } + } + } + } + } + } else if (touchEvent.getAction() == TouchEvent.POINT_MOVE) { + if (downPosition != -1) { + float touchX = getTouchX(touchEvent, 0); + float touchY = getTouchY(touchEvent, 0); + if (getPostionFromX(touchX) != downPosition + || touchY < 0 + || touchY > bottomNavigationHeight) { + downPosition = -1; + if (items != null && items.size() > 0) { + if (touchEffect) { + if (overAnimatorValue == null || !overAnimatorValue.isRunning()) { + invalidate(); + } + } + } + } + } + } + return true; + } + + private void drawBackground(Canvas canvas) { + LinearShader gradient = + new LinearShader( + new Point[]{new Point(0, 0), new Point(0, mElevation)}, + new float[]{0f, 0.3f, 1f}, + new Color[]{new Color(0x00000000), new Color(0x00000000), new Color(0x10000000)}, + Shader.TileMode.CLAMP_TILEMODE); + + elevationPaint.setShader(gradient, Paint.ShaderType.LINEAR_SHADER); + if (mElevation > 0) { + canvas.drawRect(new RectFloat(0, 0, getWidth(), mElevation), elevationPaint); + } + + if (colored) { + if (mPosition >= 0 && mPosition < items.size()) { + if (overPose == 1) { + mPaint.setColor(new Color(items.get(mPosition).getColor())); + } else if (lastPosition >= 0 && lastPosition < items.size()) { + mOverPaint.setColor(new Color(items.get(mPosition).getColor())); + mPaint.setColor(new Color(items.get(lastPosition).getColor())); + } + } else { + mPaint.setColor(new Color(titleColorActive)); + } + } else { + mPaint.setColor(new Color(defaultBackgroundColor)); + } + + canvas.drawRect( + new RectFloat(0, mElevation, getWidth(), mElevation + bottomNavigationHeight), mPaint); + + if (colored && overPose != 1) { + canvas.saveLayer( + new RectFloat(0, mElevation, getWidth(), bottomNavigationHeight + mElevation), + mOverPaint); + canvas.drawCircle( + getCurrentCenterX(mPosition, mPosition), + bottomNavigationHeight / 2, + getWidth() * overPose, + mOverPaint); + canvas.restore(); + } + } + + private void choose(int targetPosition, boolean useCallback) { + if (targetPosition == mPosition || items == null || targetPosition >= items.size()) { + return; + } + if (changeAnimatorValue != null && changeAnimatorValue.isRunning()) { + return; + } + if (overAnimatorValue != null && overAnimatorValue.isRunning()) { + overAnimatorValue.stop(); + } + if (useCallback && tabSelectedListener != null) { + tabSelectedListener.onTabSelected(downPosition, true); + } + lastPosition = mPosition; + mPosition = targetPosition; + changePose = 0; + overPose = 0; + + if (selectHideNotification) { + setNotification((Notification) null, targetPosition); + } + + if (changeAnimatorValue == null) { + changeAnimatorValue = new AnimatorValue(); + changeAnimatorValue.setDuration(mAnimationDuration); + changeAnimatorValue.setCurveType(Animator.CurveType.LINEAR); + changeAnimatorValue.setValueUpdateListener( + new AnimatorValue.ValueUpdateListener() { + @Override + public void onUpdate(AnimatorValue animatorValue, float v) { + changePose = v; + } + }); + } + if (overAnimatorValue == null) { + overAnimatorValue = new AnimatorValue(); + overAnimatorValue.setDuration(mRippleAnimationDuration); + overAnimatorValue.setCurveType(Animator.CurveType.LINEAR); + overAnimatorValue.setValueUpdateListener( + new AnimatorValue.ValueUpdateListener() { + @Override + public void onUpdate(AnimatorValue animatorValue, float v) { + overPose = v; + getContext() + .getUITaskDispatcher() + .asyncDispatch( + new Runnable() { + @Override + public void run() { + invalidate(); + } + }); + } + }); + } + + changeAnimatorValue.start(); + overAnimatorValue.start(); + } + + private boolean isClassic() { + return titleState != TitleState.ALWAYS_HIDE + && titleState != TitleState.SHOW_WHEN_ACTIVE_FORCE + && (items.size() == MIN_ITEMS || titleState == TitleState.ALWAYS_SHOW); + } + + /** + * addItemAtIndex + * + * @param index + * @param item + */ + public void addItemAtIndex(int index, BottomNavigationItem item) { + if (this.items.size() > MAX_ITEMS) { + return; + } + if (index < items.size()) { + item.setupPixelMap(this, iconSize); + this.items.add(index, item); + } + needInit = true; + invalidate(); + } + + /** + * addItem + * + * @param item + */ + public void addItem(BottomNavigationItem item) { + if (this.items.size() > MAX_ITEMS) { + return; + } + item.setupPixelMap(this, iconSize); + items.add(item); + needInit = true; + invalidate(); + } + + /** + * addItems + * + * @param items + */ + public void addItems(List items) { + if (items.size() > MAX_ITEMS || (this.items.size() + items.size()) > MAX_ITEMS) { + return; + } + for (BottomNavigationItem item : items) { + item.setupPixelMap(this, iconSize); + } + this.items.addAll(items); + needInit = true; + invalidate(); + } + + /** + * removeItemAtIndex + * + * @param index + */ + public void removeItemAtIndex(int index) { + if (index < items.size()) { + this.items.remove(index); + needInit = true; + invalidate(); + } + } + + /** + * removeAllItems + */ + public void removeAllItems() { + this.items.clear(); + needInit = true; + invalidate(); + } + + /** + * refresh + */ + public void refresh() { + needInit = true; + invalidate(); + } + + /** + * enableItemAtPosition + * + * @param position + */ + public void enableItemAtPosition(int position) { + if (position < 0 || position > items.size() - 1) { + return; + } + itemsEnabledStates[position] = true; + refresh(); + } + + /** + * disableItemAtPosition + * + * @param position + */ + public void disableItemAtPosition(int position) { + if (position < 0 || position > items.size() - 1) { + return; + } + itemsEnabledStates[position] = false; + refresh(); + } + + /** + * setItemDisableColor + * + * @param itemDisableColor + */ + public void setItemDisableColor(int itemDisableColor) { + this.itemDisableColor = itemDisableColor; + setupItemsPixelMaps(); + refresh(); + } + + /** + * getItemsCount + * + * @return int + */ + public int getItemsCount() { + return items.size(); + } + + /** + * isColored + * + * @return boolean + */ + public boolean isColored() { + return colored; + } + + /** + * setColored + * + * @param colored + */ + public void setColored(boolean colored) { + this.colored = colored; + this.itemActiveColor = colored ? coloredTitleColorActive : titleColorActive; + this.itemInactiveColor = colored ? coloredTitleColorInactive : titleColorInactive; + needInit = true; + refresh(); + } + + /** + * getDefaultBackgroundColor + * + * @return int + */ + public int getDefaultBackgroundColor() { + return defaultBackgroundColor; + } + + /** + * setDefaultBackgroundColor + * + * @param defaultBackgroundColor + */ + public void setDefaultBackgroundColor(int defaultBackgroundColor) { + this.defaultBackgroundColor = defaultBackgroundColor; + invalidate(); + } + + /** + * getAccentColor + * + * @return int + */ + public int getAccentColor() { + return itemActiveColor; + } + + /** + * getAccentColor + * + * @param accentColor + */ + public void setAccentColor(int accentColor) { + this.titleColorActive = accentColor; + this.itemActiveColor = accentColor; + setupItemsPixelMaps(); + invalidate(); + } + + /** + * getInactiveColor + * + * @return int + */ + public int getInactiveColor() { + return itemInactiveColor; + } + + /** + * setInactiveColor + * + * @param inactiveColor + */ + public void setInactiveColor(int inactiveColor) { + this.titleColorInactive = inactiveColor; + this.itemInactiveColor = inactiveColor; + setupItemsPixelMaps(); + invalidate(); + } + + /** + * setColoredModeColors + * + * @param colorActive + * @param colorInactive + */ + public void setColoredModeColors(int colorActive, int colorInactive) { + this.coloredTitleColorActive = colorActive; + this.coloredTitleColorInactive = colorInactive; + setupItemsPixelMaps(); + invalidate(); + } + + /** + * setSelectedBackgroundVisible + * + * @param visible + */ + public void setSelectedBackgroundVisible(boolean visible) { + this.selectedBackgroundVisible = visible; + invalidate(); + } + + /** + * setTitleTextSize + * + * @param activeSize + * @param inactiveSize + */ + public void setTitleTextSize(int activeSize, int inactiveSize) { + this.titleActiveTextSize = activeSize; + this.titleInactiveTextSize = inactiveSize; + invalidate(); + } + + /** + * getItem + * + * @param position + * @return BottomNavigationItem + */ + public BottomNavigationItem getItem(int position) { + if (position < 0 || position > items.size() - 1) { + return null; + } + return items.get(position); + } + + /** + * getCurrentItem + * + * @return int + */ + public int getCurrentItem() { + return mPosition; + } + + /** + * setCurrentItem + * + * @param position + */ + public void setCurrentItem(int position) { + setCurrentItem(position, true); + } + + /** + * setCurrentItem + * + * @param position + * @param useCallback + */ + public void setCurrentItem(int position, boolean useCallback) { + if (position >= items.size()) { + return; + } + choose(position, useCallback); + } + + /** + * hideBottomNavigation + */ + public void hideBottomNavigation() { + hideBottomNavigation(true); + } + + /** + * hideBottomNavigation + * + * @param withAnimation + */ + public void hideBottomNavigation(boolean withAnimation) { + if (mIsHidden) { + return; + } + mIsHidden = true; + if (showAnimatorValue == null) { + showAnimatorValue = new AnimatorValue(); + } else if (showAnimatorValue.isRunning()) { + showAnimatorValue.stop(); + } + if (withAnimation) { + int start = showBottom; + int end = bottomNavigationHeight + mElevation; + showAnimatorValue.setDuration(showDurationTime * (end - start) / (bottomNavigationHeight + mElevation)); + showAnimatorValue.setValueUpdateListener( + new AnimatorValue.ValueUpdateListener() { + @Override + public void onUpdate(AnimatorValue animatorValue, float v) { + showBottom = (int) (start + (end - start) * v); + ComponentContainer.LayoutConfig layoutConfig = getLayoutConfig(); + layoutConfig.setMarginBottom((int) (-showBottom)); + setLayoutConfig(layoutConfig); + if (navigationPositionListener != null) { + navigationPositionListener.onPositionChange(showBottom); + } + } + }); + showAnimatorValue.start(); + } else { + ComponentContainer.LayoutConfig layoutConfig = getLayoutConfig(); + layoutConfig.setMarginBottom(-bottomNavigationHeight); + setLayoutConfig(layoutConfig); + } + } + + /** + * restoreBottomNavigation + */ + public void restoreBottomNavigation() { + restoreBottomNavigation(true); + } + + /** + * restoreBottomNavigation + * + * @param withAnimation + */ + public void restoreBottomNavigation(boolean withAnimation) { + if (!mIsHidden) { + return; + } + mIsHidden = false; + if (showAnimatorValue == null) { + showAnimatorValue = new AnimatorValue(); + } else if (showAnimatorValue.isRunning()) { + showAnimatorValue.stop(); + } + if (withAnimation) { + int start = showBottom; + int end = 0; + showAnimatorValue.setDuration(showDurationTime * (start - end) / (bottomNavigationHeight + mElevation)); + showAnimatorValue.setValueUpdateListener( + new AnimatorValue.ValueUpdateListener() { + @Override + public void onUpdate(AnimatorValue animatorValue, float v) { + showBottom = (int) (start + (end - start) * v); + ComponentContainer.LayoutConfig layoutConfig = getLayoutConfig(); + layoutConfig.setMarginBottom(-showBottom); + setLayoutConfig(layoutConfig); + if (navigationPositionListener != null) { + navigationPositionListener.onPositionChange(showBottom); + } + } + }); + showAnimatorValue.start(); + } else { + ComponentContainer.LayoutConfig layoutConfig = getLayoutConfig(); + layoutConfig.setMarginBottom(0); + setLayoutConfig(layoutConfig); + } + } + + /** + * isForceTint + * + * @return boolean + */ + public boolean isForceTint() { + return forceTint; + } + + /** + * setForceTint + * + * @param forceTint + */ + public void setForceTint(boolean forceTint) { + this.forceTint = forceTint; + invalidate(); + } + + /** + * getTitleState + * + * @return TitleState + */ + public TitleState getTitleState() { + return titleState; + } + + /** + * setTitleState + * + * @param titleState + */ + public void setTitleState(TitleState titleState) { + this.titleState = titleState; + needInit = true; + invalidate(); + } + + /** + * setOnTabSelectedListener + * + * @param tabSelectedListener + */ + public void setOnTabSelectedListener(OnTabSelectedListener tabSelectedListener) { + this.tabSelectedListener = tabSelectedListener; + } + + /** + * removeOnTabSelectedListener + */ + public void removeOnTabSelectedListener() { + this.tabSelectedListener = null; + } + + /** + * setOnNavigationPositionListener + * + * @param navigationPositionListener + */ + public void setOnNavigationPositionListener(OnNavigationPositionListener navigationPositionListener) { + this.navigationPositionListener = navigationPositionListener; + } + + /** + * removeOnNavigationPositionListener + */ + public void removeOnNavigationPositionListener() { + this.navigationPositionListener = null; + } + + /** + * setNotification + * + * @param nbNotification + * @param itemPosition + */ + public void setNotification(int nbNotification, int itemPosition) { + if (itemPosition < 0 || itemPosition > items.size() - 1) { + return; + } + final String title = nbNotification == 0 ? "" : String.valueOf(nbNotification); + notifications.set(itemPosition, Notification.justText(title)); + invalidate(); + } + + /** + * setNotification + * + * @param notification + * @param itemPosition + */ + public void setNotification(Notification notification, int itemPosition) { + if (itemPosition < 0 || itemPosition > items.size() - 1) { + return; + } + if (notification == null) { + notification = new Notification(); // instead of null, use empty notification + } + notifications.set(itemPosition, notification); + invalidate(); + } + + /** + * setNotificationTextColor + * + * @param textColor + */ + public void setNotificationTextColor(int textColor) { + this.notificationTextColor = textColor; + invalidate(); + } + + /** + * setNotificationBackgroundColor + * + * @param color + */ + public void setNotificationBackgroundColor(int color) { + this.notificationBackgroundColor = color; + invalidate(); + } + + /** + * setNotificationMargin + * + * @param marginLeft + * @param marginTop + */ + public void setNotificationMargin(int marginLeft, int marginTop) { + this.notificationMarginLeft = marginLeft; + this.notificationMarginTop = marginTop; + invalidate(); + } + + /** + * setUseElevation + * + * @param useElevation + */ + public void setUseElevation(boolean useElevation) { + mElevation = useElevation ? dp2px(8) : 0; + invalidate(); + } + + /** + * setUseElevation + * + * @param useElevation + * @param elevation + */ + public void setUseElevation(boolean useElevation, int elevation) { + mElevation = useElevation ? elevation : 0; + invalidate(); + } + + /** + * isHidden + * + * @return boolean + */ + public boolean isHidden() { + return mIsHidden; + } + + /** + * setSelectHideNotification + * + * @param selectHideNotification + */ + public void setSelectHideNotification(boolean selectHideNotification) { + this.selectHideNotification = selectHideNotification; + } + + /** + * getSelectHideNotification + * + * @return boolean + */ + public boolean getSelectHideNotification() { + return selectHideNotification; + } + + /** + * getTitleColorActive + * + * @return + */ + public int getTitleColorActive() { + return titleColorActive; + } + + public int getTitleColorInactive() { + return titleColorInactive; + } + + public int getColoredTitleColorActive() { + return coloredTitleColorActive; + } + + public int getColoredTitleColorInactive() { + return coloredTitleColorInactive; + } + + public int getItemDisableColor() { + return itemDisableColor; + } + + public void setTouchEffect(boolean touchEffect) { + this.touchEffect = touchEffect; + } + + public boolean getTouchEffect() { + return touchEffect; + } + + private void setupItemsPixelMaps() { + if (items != null && items.size() > 0) { + for (BottomNavigationItem bottomNavigationItem : items) { + bottomNavigationItem.setupPixelMap(this, iconSize); + } + } + } + + private void getMeasurements() { + if (isClassic()) { + float minWidth = dp2px(104); + float maxWidth = dp2px(169); + + if (titleState == TitleState.ALWAYS_SHOW && items.size() > MIN_ITEMS) { + minWidth = dp2px(64); + maxWidth = dp2px(96); + } + + int layoutWidth = getWidth() - getPaddingLeft() - getPaddingRight(); + if (layoutWidth == 0 || items.size() == 0) { + return; + } + + float itemWidth = layoutWidth / items.size(); + if (itemWidth < minWidth) { + itemWidth = minWidth; + } else if (itemWidth > maxWidth) { + itemWidth = maxWidth; + } + selectedItemWidth = itemWidth; + notSelectedItemWidth = itemWidth; + } else { + float minWidth = dp2px(64); + float maxWidth = dp2px(96); + + int layoutWidth = getWidth() - getPaddingLeft() - getPaddingRight(); + if (layoutWidth == 0 || items.size() == 0) { + return; + } + + float itemWidth = layoutWidth / items.size(); + + if (itemWidth < minWidth) { + itemWidth = minWidth; + } else if (itemWidth > maxWidth) { + itemWidth = maxWidth; + } + + float difference = dp2px(10); + selectedItemWidth = itemWidth + items.size() * difference; + itemWidth -= difference; + notSelectedItemWidth = itemWidth; + + if (titleState == TitleState.ALWAYS_HIDE) { + selectedItemWidth = itemWidth * 1.16f; + notSelectedItemWidth = itemWidth * 1.16f; + } + } + + offsetX = (getWidth() - (selectedItemWidth + notSelectedItemWidth * (items.size() - 1))) / 2; + } + + private int getCurrentCenterX(int index, int selectIndex) { + int x = 0; + if (items != null && items.size() > 0) { + for (int i = 0; i < items.size() && i <= index; i++) { + if (index == i) { + if (selectIndex == i) { + x += selectedItemWidth / 2; + } else { + x += notSelectedItemWidth / 2; + } + } else { + if (selectIndex == i) { + x += selectedItemWidth; + } else { + x += notSelectedItemWidth; + } + } + } + } + return x; + } + + /** + * OnTabSelectedListener + */ + public interface OnTabSelectedListener { + /** + * onTabSelected + * + * @param position + * @param wasSelected + * @return boolean + */ + boolean onTabSelected(int position, boolean wasSelected); + } + + /** + * OnNavigationPositionListener + */ + public interface OnNavigationPositionListener { + /** + * onPositionChange + * + * @param y + */ + void onPositionChange(int y); + } + + private int getPostionFromX(float touchX) { + float x = offsetX; + if (items != null && items.size() > 0) { + for (int i = 0; i < items.size(); i++) { + if (mPosition == i) { + x += selectedItemWidth; + } else { + x += notSelectedItemWidth; + } + if (x >= touchX) { + return i; + } + } + } + return -1; + } + + private float getTouchX(TouchEvent touchEvent, int index) { + float x = 0; + if (touchEvent.getPointerCount() > index) { + int[] xy = getLocationOnScreen(); + if (xy != null && xy.length == 2) { + x = touchEvent.getPointerScreenPosition(index).getX() - xy[0]; + } else { + x = touchEvent.getPointerPosition(index).getX(); + } + } + return x; + } + + private float getTouchY(TouchEvent touchEvent, int index) { + float y = 0; + if (touchEvent.getPointerCount() > index) { + int[] xy = getLocationOnScreen(); + if (xy != null && xy.length == 2) { + y = touchEvent.getPointerScreenPosition(index).getY() - xy[1]; + } else { + y = touchEvent.getPointerPosition(index).getY(); + } + } + return y; + } + + /** + * dp2px + * + * @param dp + * @return + */ + protected int dp2px(float dp) { + return (int) (getResourceManager().getDeviceCapability().screenDensity / 160 * dp); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/wight/navigation/BottomNavigationItem.java b/entry/src/main/java/com/wordplat/quickstart/wight/navigation/BottomNavigationItem.java new file mode 100644 index 0000000..a4c6082 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/wight/navigation/BottomNavigationItem.java @@ -0,0 +1,200 @@ +package com.wordplat.quickstart.wight.navigation; + +import ohos.agp.render.Canvas; +import ohos.agp.render.Texture; +import ohos.agp.utils.Color; +import ohos.app.Context; +import ohos.media.image.PixelMap; +import ohos.media.image.common.AlphaType; +import ohos.media.image.common.PixelFormat; +import ohos.media.image.common.Size; + +import java.util.Optional; + +/** + * BottomNavigationItem + * + * @since 2021-05-08 + */ +public class BottomNavigationItem { + private String title = ""; + private int color = Color.GRAY.getValue(); + + private PixelMap orgPixelMap; + + private PixelMap activePixelMap; + private PixelMap inActivePixelMap; + private PixelMap disablePixelMap; + private PixelMap coloredInActivePixelMap; + private PixelMap coloredActivePixelMap; + private int iconSize; + + private int drawableRes; + + private BottomNavigation bottomNavigation; + + /** + * BottomNavigationItem + * + * @param title + * @param resource + * @param context + */ + public BottomNavigationItem(String title, int resource, Context context) { + this.title = title; + this.drawableRes = resource; + Optional optional = ResUtil.getPixelMap(context, drawableRes); + orgPixelMap = optional.isPresent() ? optional.get() : null; + } + + /** + * BottomNavigationItem + * + * @param title + * @param context + */ + public BottomNavigationItem(String title, Context context) { + this.title = title; + } + + /** + * BottomNavigationItem + * + * @param title + * @param resource + * @param color + * @param context + */ + public BottomNavigationItem(String title, int resource, int color, Context context) { + this.title = title; + this.drawableRes = resource; + this.color = color; + Optional optional = ResUtil.getPixelMap(context, drawableRes); + orgPixelMap = optional.isPresent() ? optional.get() : null; + } + + /** + * BottomNavigationItem + * + * @param title + * @param pixelMap + */ + public BottomNavigationItem(String title, PixelMap pixelMap) { + this.title = title; + this.orgPixelMap = pixelMap; + } + + /** + * BottomNavigationItem + * + * @param title + * @param pixelMap + * @param color + */ + public BottomNavigationItem(String title, PixelMap pixelMap, int color) { + this.title = title; + this.orgPixelMap = pixelMap; + this.color = color; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public int getColor() { + return color; + } + + public void setColor(int color) { + this.color = color; + } + + PixelMap getOrgPixelMap() { + return orgPixelMap; + } + + PixelMap getActivePixelMap() { + return activePixelMap; + } + + PixelMap getInActivePixelMap() { + return inActivePixelMap; + } + + PixelMap getDisablePixelMap() { + return disablePixelMap; + } + + PixelMap getColoredInActivePixelMap() { + return coloredInActivePixelMap; + } + + PixelMap getColoredActivePixelMap() { + return coloredActivePixelMap; + } + + void setupPixelMap(BottomNavigation navigation, int iconsize) { + this.bottomNavigation = navigation; + this.iconSize = iconsize; + if (orgPixelMap != null) { + generateIconBitmaps(navigation); + } + } + + private void generateIconBitmaps(BottomNavigation bottomnavigation) { + if (orgPixelMap == null) { + return; + } + orgPixelMap = scaleIcon(orgPixelMap); + PixelMap origin = orgPixelMap; + activePixelMap = copy(origin, origin.getImageInfo().size.width, origin.getImageInfo().size.height); + Canvas canvas = new Canvas(new Texture(activePixelMap)); + canvas.drawColor(bottomnavigation.getTitleColorActive(), Canvas.PorterDuffMode.SRC_IN); + inActivePixelMap = copy(origin, origin.getImageInfo().size.width, origin.getImageInfo().size.height); + canvas = new Canvas(new Texture(inActivePixelMap)); + canvas.drawColor(bottomnavigation.getTitleColorInactive(), Canvas.PorterDuffMode.SRC_IN); + coloredActivePixelMap = copy(origin, origin.getImageInfo().size.width, origin.getImageInfo().size.height); + canvas = new Canvas(new Texture(coloredActivePixelMap)); + canvas.drawColor(bottomnavigation.getColoredTitleColorActive(), Canvas.PorterDuffMode.SRC_IN); + coloredInActivePixelMap = copy(origin, origin.getImageInfo().size.width, origin.getImageInfo().size.height); + canvas = new Canvas(new Texture(coloredInActivePixelMap)); + canvas.drawColor(bottomnavigation.getColoredTitleColorInactive(), Canvas.PorterDuffMode.SRC_IN); + disablePixelMap = copy(origin, origin.getImageInfo().size.width, origin.getImageInfo().size.height); + canvas = new Canvas(new Texture(disablePixelMap)); + canvas.drawColor(bottomnavigation.getItemDisableColor(), Canvas.PorterDuffMode.SRC_IN); + } + + private PixelMap scaleIcon(PixelMap origin) { + int width = origin.getImageInfo().size.width; + int height = origin.getImageInfo().size.height; + int size = Math.max(width, height); + if (size == iconSize) { + return origin; + } else if (size > iconSize) { + int scaledWidth; + int scaledHeight; + if (width > iconSize) { + scaledWidth = iconSize; + scaledHeight = (int) (iconSize * ((float) height / width)); + } else { + scaledHeight = iconSize; + scaledWidth = (int) (iconSize * ((float) width / height)); + } + return copy(origin, scaledWidth, scaledHeight); + } else { + return origin; + } + } + + private PixelMap copy(PixelMap source, int width, int height) { + PixelMap.InitializationOptions initializationOptions = new PixelMap.InitializationOptions(); + initializationOptions.pixelFormat = PixelFormat.ARGB_8888; + initializationOptions.alphaType = AlphaType.PREMUL; + initializationOptions.size = new Size(width, height); + return PixelMap.create(source, initializationOptions); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/wight/navigation/Notification.java b/entry/src/main/java/com/wordplat/quickstart/wight/navigation/Notification.java new file mode 100644 index 0000000..db2d93e --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/wight/navigation/Notification.java @@ -0,0 +1,124 @@ +package com.wordplat.quickstart.wight.navigation; + +import java.util.ArrayList; +import java.util.List; + +/** + * Notification + * + * @since 2021-05-08 + */ +public class Notification { + private String text; + + private int textColor; + + private int backgroundColor; + + /** + * Notification + */ + public Notification() { + } + + /** + * isEmpty + * + * @return boolean + */ + public boolean isEmpty() { + if (text == null || text.length() == 0) { + return true; + } else { + return false; + } + } + + public String getText() { + return text; + } + + public int getTextColor() { + return textColor; + } + + public int getBackgroundColor() { + return backgroundColor; + } + + /** + * justText + * + * @param text + * @return Notification + */ + public static Notification justText(String text) { + return new Builder().setText(text).build(); + } + + /** + * generateEmptyList + * + * @param size + * @return List + */ + public static List generateEmptyList(int size) { + List notificationList = new ArrayList<>(); + for (int i = 0; i < size; i++) { + notificationList.add(new Notification()); + } + return notificationList; + } + + public static class Builder { + private String text; + private int textColor; + private int backgroundColor; + + /** + * setText + * + * @param text + * @return Builder + */ + public Builder setText(String text) { + this.text = text; + return this; + } + + /** + * setTextColor + * + * @param textColor + * @return Builder + */ + public Builder setTextColor(int textColor) { + this.textColor = textColor; + return this; + } + + /** + * setBackgroundColor + * + * @param backgroundColor + * @return Builder + */ + public Builder setBackgroundColor(int backgroundColor) { + this.backgroundColor = backgroundColor; + return this; + } + + /** + * build + * + * @return Notification + */ + public Notification build() { + Notification notification = new Notification(); + notification.text = text; + notification.textColor = textColor; + notification.backgroundColor = backgroundColor; + return notification; + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/wight/navigation/ResUtil.java b/entry/src/main/java/com/wordplat/quickstart/wight/navigation/ResUtil.java new file mode 100644 index 0000000..f6f4dd2 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/wight/navigation/ResUtil.java @@ -0,0 +1,591 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.wight.navigation; + +import ohos.agp.colors.RgbColor; +import ohos.agp.components.Component; +import ohos.agp.components.element.Element; +import ohos.agp.components.element.PixelMapElement; +import ohos.agp.components.element.ShapeElement; +import ohos.agp.components.element.VectorElement; +import ohos.agp.render.Arc; +import ohos.agp.utils.Color; +import ohos.agp.utils.Rect; +import ohos.app.Context; +import ohos.global.resource.NotExistException; +import ohos.global.resource.RawFileEntry; +import ohos.global.resource.Resource; +import ohos.global.resource.ResourceManager; +import ohos.global.resource.WrongTypeException; +import ohos.media.image.ImageSource; +import ohos.media.image.PixelMap; +import ohos.media.image.common.PixelFormat; +import ohos.media.image.common.Size; + +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.Optional; +import java.util.OptionalInt; + +/** + * get resource class + * + * @since 2021-05-11 + */ +public class ResUtil { + private static final String TAG = ResUtil.class.getSimpleName(); + + private static final String CITY_ID_ATTR = "cityId_"; + + private static final String STRING_ID_ATTR = "String_"; + + private ResUtil() { + } + + /** + * get the path from id + * + * @param context the context + * @param id the id + * @return the path from id + */ + public static String getPathById(Context context, int id) { + String path = ""; + if (context == null) { + return path; + } + ResourceManager manager = context.getResourceManager(); + if (manager == null) { + return path; + } + try { + path = manager.getMediaPath(id); + } catch (IOException | NotExistException | WrongTypeException e) { + path = ""; + } + return path; + } + + /** + * get the new color + * + * @param context the context + * @param id the id + * @return the color + */ + public static Color getNewColor(Context context, int id) { + return new Color(getColor(context, id)); + } + + /** + * get the color + * + * @param context the context + * @param id the id + * @return the color + */ + public static int getColor(Context context, int id) { + int result = 0; + if (context == null) { + return result; + } + ResourceManager manager = context.getResourceManager(); + if (manager == null) { + return result; + } + try { + result = manager.getElement(id).getColor(); + } catch (IOException | WrongTypeException | NotExistException e) { + result = 0; + } + return result; + } + + /** + * get the int + * + * @param context the context + * @param id the int array + * @return the int array + */ + public static int getInt(Context context, int id) { + int result = 0; + if (context == null) { + return result; + } + ResourceManager manager = context.getResourceManager(); + if (manager == null) { + return result; + } + try { + result = manager.getElement(id).getInteger(); + } catch (IOException e) { + result = 0; + } catch (NotExistException e) { + result = 0; + } catch (WrongTypeException e) { + result = 0; + } + return result; + } + + /** + * get the int array + * + * @param context the context + * @param id the int array + * @return the int array + */ + public static int[] getIntArray(Context context, int id) { + int[] result = null; + if (context == null) { + return result; + } + ResourceManager manager = context.getResourceManager(); + if (manager == null) { + return result; + } + try { + result = manager.getElement(id).getIntArray(); + } catch (IOException e) { + result = null; + } catch (NotExistException e) { + result = null; + } catch (WrongTypeException e) { + result = null; + } + return result; + } + + /** + * get the dimen value + * + * @param context the context + * @param id the id + * @return get the float dimen value + */ + public static float getDimen(Context context, int id) { + float result = 0; + if (context == null) { + return result; + } + ResourceManager manager = context.getResourceManager(); + if (manager == null) { + return result; + } + try { + result = manager.getElement(id).getFloat(); + } catch (IOException | NotExistException | WrongTypeException e) { + result = 0; + } + return result; + } + + /** + * get string + * + * @param context the context + * @param id the string id + * @return string of the given id + */ + public static String getString(Context context, int id) { + String result = ""; + if (context == null) { + return result; + } + ResourceManager manager = context.getResourceManager(); + if (manager == null) { + return result; + } + try { + result = manager.getElement(id).getString(); + } catch (IOException | NotExistException | WrongTypeException e) { + result = null; + } + return result; + } + + /** + * get boolean + * + * @param context the context + * @param id the boolean id + * @return boolean of the given id + */ + public static boolean getBoolean(Context context, int id) { + boolean result = false; + if (context == null) { + return result; + } + ResourceManager manager = context.getResourceManager(); + if (manager == null) { + return result; + } + try { + result = manager.getElement(id).getBoolean(); + } catch (IOException | NotExistException | WrongTypeException e) { + result = false; + } + return result; + } + + /** + * get the string array + * + * @param context the context + * @param id the string array id + * @return the string array + */ + public static String[] getStringArray(Context context, int id) { + String[] result = null; + if (context == null) { + return result; + } + ResourceManager manager = context.getResourceManager(); + if (manager == null) { + return result; + } + try { + result = manager.getElement(id).getStringArray(); + } catch (IOException | NotExistException | WrongTypeException e) { + result = null; + } + return result; + } + + /** + * get the vector drawable + * + * @param context the context + * @param id the drawable id + * @return the vector drawable + */ + public static VectorElement getVectorDrawable(Context context, int id) { + if (context == null) { + return null; + } + + return new VectorElement(context, id); + } + + /** + * get the pixel map + * + * @param context the context + * @param id the id + * @return the pixel map + */ + public static Optional getPixelMap(Context context, int id) { + String path = getPathById(context, id); + if (path == null || path.length() == 0) { + return Optional.empty(); + } + RawFileEntry assetManager = context.getResourceManager().getRawFileEntry(path); + ImageSource.SourceOptions options = new ImageSource.SourceOptions(); + options.formatHint = "image/png"; + ImageSource.DecodingOptions decodingOptions = new ImageSource.DecodingOptions(); + try { + Resource asset = assetManager.openRawFile(); + ImageSource source = ImageSource.create(asset, options); + return Optional.ofNullable(source.createPixelmap(decodingOptions)); + } catch (IOException e) { + Optional.empty(); + } + return Optional.empty(); + } + + /** + * get the pixel map + * + * @param context the context + * @param path the path + * @return the pixel map + */ + public static Optional getPixelMap(Context context, String path) { + RawFileEntry assetManager = context.getResourceManager().getRawFileEntry(path); + ImageSource.SourceOptions options = new ImageSource.SourceOptions(); + options.formatHint = "image/png"; + ImageSource.DecodingOptions decodingOptions = new ImageSource.DecodingOptions(); + try { + Resource asset = assetManager.openRawFile(); + ImageSource source = ImageSource.create(asset, options); + return Optional.ofNullable(source.createPixelmap(decodingOptions)); + } catch (IOException e) { + Optional.empty(); + } + return Optional.empty(); + } + + /** + * get the pixel map + * + * @param context the context + * @param asset the InputStream + * @return the pixel map + */ + public static Optional getPixelMap(Context context, InputStream asset) { + ImageSource.SourceOptions options = new ImageSource.SourceOptions(); + ImageSource.DecodingOptions decodingOptions = new ImageSource.DecodingOptions(); + ImageSource source = ImageSource.create(asset, options); + return Optional.ofNullable(source.createPixelmap(decodingOptions)); + } + + /** + * get the Pixel Map Element + * + * @param context the context + * @param resId the res id + * @return the Pixel Map Element + */ + public static PixelMapElement getPixelMapDrawable(Context context, int resId) { + Optional optional = getPixelMap(context, resId); + return optional.map(PixelMapElement::new).orElse(null); + } + + /** + * get the Element + * + * @param color the color + * @return the Element + */ + public static Element buildDrawableByColor(int color) { + ShapeElement drawable = new ShapeElement(); + drawable.setShape(ShapeElement.RECTANGLE); + drawable.setRgbColor(RgbColor.fromArgbInt(color)); + return drawable; + } + + /** + * get the Element By ColorRadius + * + * @param color the color + * @param radius the radius + * @return the Element By ColorRadius + */ + public static Element buildDrawableByColorRadius(int color, float radius) { + ShapeElement drawable = new ShapeElement(); + drawable.setShape(ShapeElement.RECTANGLE); + drawable.setRgbColor(RgbColor.fromArgbInt(color)); + drawable.setCornerRadius(radius); + return drawable; + } + + /** + * get the ShapeElement + * + * @param thickness the thickness + * @param inside the inside color + * @param border the border color + * @param startAngle the start angle + * @param sweepAngle the sweep angle + * @return the ShapeElement + */ + public static ShapeElement getCustomArcGradientDrawable( + int thickness, Color inside, Color border, float startAngle, float sweepAngle) { + ShapeElement drawable = new ShapeElement(); + drawable.setShape(ShapeElement.ARC); + drawable.setRgbColor(RgbColor.fromArgbInt(inside.getValue())); // keep it transparent for main(inner) part + drawable.setArc(new Arc(startAngle, sweepAngle, false)); + drawable.setStroke(thickness, RgbColor.fromArgbInt(border.getValue())); + return drawable; + } + + /** + * get the Element + * + * @param thickness the thickness + * @param inside the inside color + * @param border the border color + * @param rect the rect + * @return the Element + */ + public static Element getCustomCircleGradientDrawable(int thickness, Color inside, Color border, Rect rect) { + ShapeElement element = new ShapeElement(); + element.setShape(ShapeElement.OVAL); + element.setRgbColor(RgbColor.fromArgbInt(inside.getValue())); + element.setStroke(2, RgbColor.fromArgbInt(border.getValue())); + element.setBounds(rect); + return element; + } + + /** + * get the Element + * + * @param inside the inside color + * @param rect the rect + * @return the Element + */ + public static Element getCustomRectGradientDrawable(Color inside, Rect rect) { + ShapeElement element = new ShapeElement(); + element.setShape(ShapeElement.RECTANGLE); + element.setRgbColor(RgbColor.fromArgbInt(inside.getValue())); + element.setBounds(rect); + return element; + } + + /** + * get res id by reflect + * + * @param resClass res class + * @param resName res name + * @return res id + */ + public static OptionalInt getResIdByReflect(Class resClass, String resName) { + return null; + } + + /** + * get native city name + * + * @param context the context + * @param cityId cityId + * @return city name from cityId + */ + public static String getNativeCityName(Context context, String cityId) { + return null; + } + + /** + * find view by id + * + * @param view rootView + * @param id res id + * @param type + * @return view + */ + public static T findViewById(Component view, int id) { + if (view == null) { + return null; + } + return (T) view.findComponentById(id); + } + + /** + * get Element from Resource + * + * @param resource the resource + * @return Element + * @throws IOException IOException + * @throws NotExistException NotExistException + */ + public static PixelMapElement prepareElement(Resource resource) throws IOException, NotExistException { + return new PixelMapElement(preparePixelmap(resource)); + } + + /** + * get PixelMap from Resource + * + * @param resource the resource + * @return PixelMap + * @throws IOException IOException + * @throws NotExistException NotExistException + */ + public static PixelMap preparePixelmap(Resource resource) throws IOException, NotExistException { + ImageSource.SourceOptions srcOpts = new ImageSource.SourceOptions(); + ImageSource imageSource = null; + try { + imageSource = ImageSource.create(readResource(resource), srcOpts); + } finally { + close(resource); + } + if (imageSource == null) { + throw new FileNotFoundException(); + } + ImageSource.DecodingOptions decodingOpts = new ImageSource.DecodingOptions(); + decodingOpts.desiredSize = new Size(0, 0); + decodingOpts.desiredRegion = new ohos.media.image.common.Rect(0, 0, 0, 0); + decodingOpts.desiredPixelFormat = PixelFormat.ARGB_8888; + + PixelMap pixelmap = imageSource.createPixelmap(decodingOpts); + return pixelmap; + } + + /** + * close Resource + * + * @param resource the resource + */ + private static void close(Resource resource) { + if (resource != null) { + try { + resource.close(); + } catch (IOException e) { + return; + } + } + } + + /** + * get bytes from Resource + * + * @param resource the resource + * @return bytes + */ + private static byte[] readResource(Resource resource) { + final int bufferSize = 1024; + final int ioEnd = -1; + + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buffer = new byte[bufferSize]; + byte[] bytes = null; + try { + while (true) { + int readLen = resource.read(buffer, 0, bufferSize); + if (readLen == ioEnd) { + break; + } + output.write(buffer, 0, readLen); + } + } catch (IOException e) { + return null; + } finally { + bytes = output.toByteArray(); + try { + output.close(); + } catch (IOException e) { + bytes = null; + } + } + return bytes; + } + + /** + * get Element from ResourceId + * + * @param context the context + * @param resId the resourceId + * @return Element + */ + public static Element getDrawable(Context context, int resId) { + ResourceManager rsrc = context.getResourceManager(); + if (rsrc == null) { + return null; + } + + Element drawable = null; + if (resId != 0) { + try { + Resource resource = rsrc.getResource(resId); + drawable = (Element) prepareElement(resource); + } catch (Exception e) { + drawable = null; + } + } + return drawable; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/DbManager.java b/entry/src/main/java/com/wordplat/quickstart/xutils/DbManager.java new file mode 100644 index 0000000..2572b19 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/DbManager.java @@ -0,0 +1,481 @@ +package com.wordplat.quickstart.xutils; + +import com.wordplat.quickstart.xutils.common.util.KeyValue; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.db.Selector; +import com.wordplat.quickstart.xutils.db.sqlite.SqlInfo; +import com.wordplat.quickstart.xutils.db.sqlite.WhereBuilder; +import com.wordplat.quickstart.xutils.db.table.DbModel; +import com.wordplat.quickstart.xutils.db.table.TableEntity; +import com.wordplat.quickstart.xutils.ex.DbException; + +import ohos.data.rdb.RdbStore; +import ohos.data.resultset.ResultSet; + +import java.io.Closeable; +import java.io.File; +import java.io.IOException; +import java.util.List; + +/** + * 数据库访问接口 + * + * @since 2021-05-09 + */ +public interface DbManager extends Closeable { + /** + * getDaoConfig + * + * @return DaoConfig + */ + DaoConfig getDaoConfig(); + + /** + * getDatabase + * + * @return RdbStore + */ + RdbStore getDatabase(); + + /** + * saveBindingId + * + * @param entity + * @return boolean + * @throws DbException + */ + boolean saveBindingId(Object entity) throws DbException; + + /** + * saveOrUpdate + * + * @param entity + * @throws DbException + */ + void saveOrUpdate(Object entity) throws DbException; + + /** + * save + * + * @param entity + * @throws DbException + */ + void save(Object entity) throws DbException; + + /** + * replace + * + * @param entity + * @throws DbException + */ + void replace(Object entity) throws DbException; + + /** + * deleteById + * + * @param entityType + * @param idValue + * @throws DbException + */ + void deleteById(Class entityType, Object idValue) throws DbException; + + /** + * delete + * + * @param entity + * @throws DbException + */ + void delete(Object entity) throws DbException; + + /** + * delete + * + * @param entityType + * @throws DbException + */ + void delete(Class entityType) throws DbException; + + /** + * delete + * + * @param entityType + * @param whereBuilder + * @return int + * @throws DbException + */ + int delete(Class entityType, WhereBuilder whereBuilder) throws DbException; + + /** + * update + * + * @param entity + * @param updateColumnNames + * @throws DbException + */ + void update(Object entity, String... updateColumnNames) throws DbException; + + /** + * update + * + * @param entityType + * @param whereBuilder + * @param nameValuePairs + * @return update + * @throws DbException + */ + int update(Class entityType, WhereBuilder whereBuilder, KeyValue... nameValuePairs) throws DbException; + + /** + * findById + * + * @param entityType + * @param idValue + * @param + * @return T + * @throws DbException + */ + T findById(Class entityType, Object idValue) throws DbException; + + /** + * findFirst + * + * @param entityType + * @param + * @return T + * @throws DbException + */ + T findFirst(Class entityType) throws DbException; + + /** + * findAll + * + * @param entityType + * @param + * @return List + * @throws DbException + */ + List findAll(Class entityType) throws DbException; + + /** + * selector + * + * @param entityType + * @param + * @return Selector + * @throws DbException + */ + Selector selector(Class entityType) throws DbException; + + /** + * findDbModelFirst + * + * @param sqlInfo + * @return DbModel + * @throws DbException + */ + DbModel findDbModelFirst(SqlInfo sqlInfo) throws DbException; + + /** + * findDbModelAll + * + * @param sqlInfo + * @return List + * @throws DbException + */ + List findDbModelAll(SqlInfo sqlInfo) throws DbException; + + /** + * getTable + * + * @param entityType + * @param + * @return T + * @throws DbException + */ + TableEntity getTable(Class entityType) throws DbException; + + /** + * dropTable + * + * @param entityType + * @throws DbException + */ + void dropTable(Class entityType) throws DbException; + + /** + * addColumn + * + * @param entityType + * @param column + * @throws DbException + */ + void addColumn(Class entityType, String column) throws DbException; + /** + * dropDb + * + * @throws DbException + */ + void dropDb() throws DbException; + /** + * close + * + * @throws IOException + */ + void close() throws IOException; + + /** + * executeUpdateDelete + * + * @param sqlInfo + * @return int + * @throws DbException + */ + int executeUpdateDelete(SqlInfo sqlInfo) throws DbException; + + /** + * executeUpdateDelete + * + * @param sql + * @return int + * @throws DbException + */ + int executeUpdateDelete(String sql) throws DbException; + + /** + * execNonQuery + * + * @param sqlInfo + * @throws DbException + */ + void execNonQuery(SqlInfo sqlInfo) throws DbException; + + /** + * execNonQuery + * + * @param sql + * @throws DbException + */ + void execNonQuery(String sql) throws DbException; + + /** + * execQuery + * + * @param sqlInfo + * @return ResultSet + * @throws DbException + */ + ResultSet execQuery(SqlInfo sqlInfo) throws DbException; + + /** + * execQuery + * + * @param sql + * @return ResultSet + * @throws DbException + */ + ResultSet execQuery(String sql) throws DbException; + + /** + * DbOpenListener + * + * @since 2021-05-09 + */ + public interface DbOpenListener { + /** + * onDbOpened + * + * @param db + * @throws DbException + */ + void onDbOpened(DbManager db) throws DbException; + } + + /** + * DbUpgradeListener + * + * @since 2021-05-09 + */ + public interface DbUpgradeListener { + /** + * onUpgrade + * + * @param db + * @param oldVersion + * @param newVersion + * @throws DbException + */ + void onUpgrade(DbManager db, int oldVersion, int newVersion) throws DbException; + } + + /** + * TableCreateListener + * + * @since 2021-05-09 + */ + public interface TableCreateListener { + /** + * onTableCreated + * + * @param db + * @param table + */ + void onTableCreated(DbManager db, TableEntity table); + } + + /** + * DbOpenListener + * + * @since 2021-05-09 + */ + public static class DaoConfig { + private File dbDir; + private String dbName = "xUtils.db"; // default db name + private int dbVersion = 1; + private boolean allowTransaction = true; + private DbUpgradeListener dbUpgradeListener; + private TableCreateListener tableCreateListener; + private DbOpenListener dbOpenListener; + + /** + * DaoConfig + */ + public DaoConfig() { + } + + /*** + * DaoConfig + * + * @param dbDir + * @return DaoConfig + */ + public DaoConfig setDbDir(File dbDir) { + this.dbDir = dbDir; + return this; + } + + /** + * setDbName + * + * @param dbName + * @return DaoConfig + */ + public DaoConfig setDbName(String dbName) { + if (!TextUtils.isEmpty(dbName)) { + this.dbName = dbName; + } + return this; + } + + /** + * setDbVersion + * + * @param dbVersion + * @return DaoConfig + */ + public DaoConfig setDbVersion(int dbVersion) { + this.dbVersion = dbVersion; + return this; + } + + /** + * setAllowTransaction + * + * @param allowTransaction + * @return DaoConfig + */ + public DaoConfig setAllowTransaction(boolean allowTransaction) { + this.allowTransaction = allowTransaction; + return this; + } + + /** + * setDbOpenListener + * + * @param dbOpenListener + * @return DaoConfig + */ + public DaoConfig setDbOpenListener(DbOpenListener dbOpenListener) { + this.dbOpenListener = dbOpenListener; + return this; + } + + /** + * setDbUpgradeListener + * + * @param dbUpgradeListener + * @return DaoConfig + */ + public DaoConfig setDbUpgradeListener(DbUpgradeListener dbUpgradeListener) { + this.dbUpgradeListener = dbUpgradeListener; + return this; + } + + /** + * setTableCreateListener + * + * @param tableCreateListener + * @return DaoConfig + */ + public DaoConfig setTableCreateListener(TableCreateListener tableCreateListener) { + this.tableCreateListener = tableCreateListener; + return this; + } + + public File getDbDir() { + return dbDir; + } + + public String getDbName() { + return dbName; + } + + public int getDbVersion() { + return dbVersion; + } + + public boolean isAllowTransaction() { + return allowTransaction; + } + + public DbOpenListener getDbOpenListener() { + return dbOpenListener; + } + + public DbUpgradeListener getDbUpgradeListener() { + return dbUpgradeListener; + } + + public TableCreateListener getTableCreateListener() { + return tableCreateListener; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + DaoConfig daoConfig = (DaoConfig) o; + + if (!dbName.equals(daoConfig.dbName)) { + return false; + } + return dbDir == null ? daoConfig.dbDir == null : dbDir.equals(daoConfig.dbDir); + } + + @Override + public int hashCode() { + int result = dbName.hashCode(); + result = 31 * result + (dbDir != null ? dbDir.hashCode() : 0); + return result; + } + + @Override + public String toString() { + return String.valueOf(dbDir) + "/" + dbName; + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/HttpManager.java b/entry/src/main/java/com/wordplat/quickstart/xutils/HttpManager.java new file mode 100644 index 0000000..d2218fb --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/HttpManager.java @@ -0,0 +1,90 @@ +package com.wordplat.quickstart.xutils; + +import com.wordplat.quickstart.xutils.common.Callback; +import com.wordplat.quickstart.xutils.http.HttpMethod; +import com.wordplat.quickstart.xutils.http.RequestParams; + +/** + * Created by wyouflf on 15/6/17. + * http请求接口 + * + * @since 2021-05-09 + */ +public interface HttpManager { + /** + * Cancelable + * + * @param entity + * @param callback + * @param + * @return Cancelable + */ + Callback.Cancelable get(RequestParams entity, Callback.CommonCallback callback); + + /** + * post + * + * @param entity + * @param callback + * @param + * @return Cancelable + */ + Callback.Cancelable post(RequestParams entity, Callback.CommonCallback callback); + + /** + * Cancelable + * + * @param method + * @param entity + * @param callback + * @param + * @return request + */ + Callback.Cancelable request(HttpMethod method, RequestParams entity, Callback.CommonCallback callback); + + /** + * getSync + * + * @param entity + * @param resultType + * @param + * @return RequestParams + * @throws Throwable + */ + T getSync(RequestParams entity, Class resultType) throws Throwable; + + /** + * postSync + * + * @param entity + * @param resultType + * @param + * @return T + * @throws Throwable + */ + T postSync(RequestParams entity, Class resultType) throws Throwable; + + /** + * requestSync + * + * @param method + * @param entity + * @param resultType + * @param + * @return T + * @throws Throwable + */ + T requestSync(HttpMethod method, RequestParams entity, Class resultType) throws Throwable; + + /** + * requestSync + * + * @param method + * @param entity + * @param callback + * @param + * @return T + * @throws Throwable + */ + T requestSync(HttpMethod method, RequestParams entity, Callback.TypedCallback callback) throws Throwable; +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/ImageManager.java b/entry/src/main/java/com/wordplat/quickstart/xutils/ImageManager.java new file mode 100644 index 0000000..79ff00e --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/ImageManager.java @@ -0,0 +1,82 @@ +package com.wordplat.quickstart.xutils; + +import com.wordplat.quickstart.xutils.common.Callback; +import com.wordplat.quickstart.xutils.image.ImageOptions; +import ohos.agp.components.Image; +import ohos.media.image.PixelMap; + +import java.io.File; + +/** + * Created by wyouflf on 15/6/17. + * 图片绑定接口 + * + * @since 2021-05-09 + */ +public interface ImageManager { + /** + * bind + * + * @param view + * @param url + */ + void bind(Image view, String url); + + /** + * bind + * + * @param view + * @param url + * @param options + */ + void bind(Image view, String url, ImageOptions options); + + /** + * bind + * + * @param view + * @param url + * @param callback + */ + void bind(Image view, String url, Callback.CommonCallback callback); + + /** + * bind + * + * @param view + * @param url + * @param options + * @param callback + */ + void bind(Image view, String url, ImageOptions options, Callback.CommonCallback callback); + + /** + * loadDrawable + * + * @param url + * @param options + * @param callback + * @return Cancelable + */ + Callback.Cancelable loadDrawable(String url, ImageOptions options, Callback.CommonCallback callback); + + /** + * loadFile + * + * @param url + * @param options + * @param callback + * @return Cancelable + */ + Callback.Cancelable loadFile(String url, ImageOptions options, Callback.CacheCallback callback); + + /** + * clearMemCache + */ + void clearMemCache(); + + /** + * clearCacheFiles + */ + void clearCacheFiles(); +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/ViewInjector.java b/entry/src/main/java/com/wordplat/quickstart/xutils/ViewInjector.java new file mode 100644 index 0000000..9aafeba --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/ViewInjector.java @@ -0,0 +1,32 @@ +package com.wordplat.quickstart.xutils; + +import ohos.aafwk.ability.AbilitySlice; +import ohos.agp.components.Component; + +/** + * Created by wyouflf on 15/10/29. + * view注入接口 + * + * @since 2021-05-09 + */ +public interface ViewInjector { + /** + * inject + * + * @param view + */ + void inject(Component view); + /** + * inject + * + * @param activity + */ + void inject(AbilitySlice activity); + /** + * inject + * + * @param handler + * @param view + */ + void inject(Object handler, Component view); +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/cache/DiskCacheEntity.java b/entry/src/main/java/com/wordplat/quickstart/xutils/cache/DiskCacheEntity.java new file mode 100644 index 0000000..299824b --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/cache/DiskCacheEntity.java @@ -0,0 +1,143 @@ +package com.wordplat.quickstart.xutils.cache; + + +import com.wordplat.quickstart.xutils.db.annotation.Column; +import com.wordplat.quickstart.xutils.db.annotation.Table; + +import java.util.Date; + +/** + * Created by wyouflf on 15/8/2. + * 磁盘缓存对象 + * + * @since 2021-05-08 + */ +@Table(name = "disk_cache") +public final class DiskCacheEntity { + @Column(name = "id", isId = true) + private long id; + + @Column(name = "key", property = "UNIQUE") + private String key; + + @Column(name = "path") + private String path; + + @Column(name = "textContent") + private String textContent; + + @Column(name = "bytesContent") + private byte[] bytesContent; + + // from "max-age" (since http 1.1) + @Column(name = "expires") + private long expires = Long.MAX_VALUE; + + @Column(name = "etag") + private String etag; + + @Column(name = "hits") + private long hits; + + @Column(name = "lastModify") + private Date lastModify; + + @Column(name = "lastAccess") + private long lastAccess; + + /** + * DiskCacheEntity + */ + public DiskCacheEntity() { + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + /** + * package + * + * @return String + */ + String getPath() { + return path; + } + + /** + * setPath + * + * @param path + */ + void setPath(String path) { + this.path = path; + } + + public String getTextContent() { + return textContent; + } + + public void setTextContent(String textContent) { + this.textContent = textContent; + } + + public byte[] getBytesContent() { + return bytesContent; + } + + public void setBytesContent(byte[] bytesContent) { + this.bytesContent = bytesContent; + } + + public long getExpires() { + return expires; + } + + public void setExpires(long expires) { + this.expires = expires; + } + + public String getEtag() { + return etag; + } + + public void setEtag(String etag) { + this.etag = etag; + } + + public long getHits() { + return hits; + } + + public void setHits(long hits) { + this.hits = hits; + } + + public Date getLastModify() { + return lastModify; + } + + public void setLastModify(Date lastModify) { + this.lastModify = lastModify; + } + + public long getLastAccess() { + return lastAccess == 0 ? System.currentTimeMillis() : lastAccess; + } + + public void setLastAccess(long lastAccess) { + this.lastAccess = lastAccess; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/cache/DiskCacheFile.java b/entry/src/main/java/com/wordplat/quickstart/xutils/cache/DiskCacheFile.java new file mode 100644 index 0000000..c4637ba --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/cache/DiskCacheFile.java @@ -0,0 +1,66 @@ +package com.wordplat.quickstart.xutils.cache; + +import com.wordplat.quickstart.xutils.common.util.IOUtil; +import com.wordplat.quickstart.xutils.common.util.ProcessLock; + +import java.io.Closeable; +import java.io.File; +import java.io.IOException; + +/** + * Created by wyouflf on 15/8/3. + * 磁盘缓存文件, 操作完成后必须及时调用close()方法关闭. + * + * @since 2021-05-08 + */ +public final class DiskCacheFile extends File implements Closeable { + + private final DiskCacheEntity cacheEntity; + private final ProcessLock lock; + + DiskCacheFile(String path, DiskCacheEntity cacheEntity, ProcessLock lock) { + super(path); + this.cacheEntity = cacheEntity; + this.lock = lock; + } + + @Override + public void close() throws IOException { + IOUtil.closeQuietly(lock); + } + + /** + * DiskCacheFile + * + * @return DiskCacheFile + * @throws IOException + */ + public DiskCacheFile commit() throws IOException { + return getDiskCache().commitDiskCacheFile(this); + } + + /** + * LruDiskCache + * + * @return LruDiskCache + */ + public LruDiskCache getDiskCache() { + String dirName = this.getParentFile().getName(); + return LruDiskCache.getDiskCache(dirName); + } + + public DiskCacheEntity getCacheEntity() { + return cacheEntity; + } + + /** + * finalize + * + * @throws Throwable + */ + @Override + protected void finalize() throws Throwable { + super.finalize(); + this.close(); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/cache/LruCache.java b/entry/src/main/java/com/wordplat/quickstart/xutils/cache/LruCache.java new file mode 100644 index 0000000..2532b7f --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/cache/LruCache.java @@ -0,0 +1,357 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.cache; + +import java.util.LinkedHashMap; +import java.util.Locale; +import java.util.Map; + +/** + * Static library version . Used to write apps + * that run on API levels prior to 12. When running on API level 12 or above, + * this implementation is still used; it does not try to switch to the + * framework's implementation. See the framework SDK documentation for a class + * overview. + * + * @param K + * @param V + * @since 2021-05-08 + */ +public class LruCache { + private final LinkedHashMap map; + + /** + * Size of this cache in units. Not necessarily the number of elements. + */ + private int size; + private int maxSize; + + private int putCount; + private int createCount; + private int evictionCount; + private int hitCount; + private int missCount; + + /** + * LruCache + * + * @param maxSize + * @throws IllegalArgumentException + */ + public LruCache(int maxSize) { + if (maxSize <= 0) { + throw new IllegalArgumentException("maxSize <= 0"); + } + this.maxSize = maxSize; + this.map = new LinkedHashMap(0, 0.75f, true); + } + + /** + * resize + * + * @param maxsize + * @throws IllegalArgumentException + */ + public void resize(int maxsize) { + if (maxsize <= 0) { + throw new IllegalArgumentException("maxSize <= 0"); + } + + synchronized (this) { + this.maxSize = maxsize; + } + trimToSize(maxsize); + } + + /** + * get + * + * @param key + * @return V + * @throws NullPointerException + */ + public final V get(K key) { + if (key == null) { + throw new NullPointerException("key == null"); + } + + V mapValue; + synchronized (this) { + mapValue = map.get(key); + if (mapValue != null) { + hitCount++; + return mapValue; + } + missCount++; + } + + /* + * Attempt to create a value. This may take a long time, and the map + * may be different when create() returns. If a conflicting value was + * added to the map while create() was working, we leave that value in + * the map and release the created value. + */ + + V createdValue = create(key); + if (createdValue == null) { + return null; + } + + synchronized (this) { + createCount++; + mapValue = map.put(key, createdValue); + + if (mapValue != null) { + // There was a conflict so undo that last put + map.put(key, mapValue); + } else { + size += safeSizeOf(key, createdValue); + } + } + + if (mapValue != null) { + entryRemoved(false, key, createdValue, mapValue); + return mapValue; + } else { + trimToSize(maxSize); + return createdValue; + } + } + + /** + * put + * + * @param key + * @param value + * @return V + * @throws NullPointerException + */ + public final V put(K key, V value) { + if (key == null || value == null) { + throw new NullPointerException("key == null || value == null"); + } + + V previous; + synchronized (this) { + putCount++; + size += safeSizeOf(key, value); + previous = map.put(key, value); + if (previous != null) { + size -= safeSizeOf(key, previous); + } + } + + if (previous != null) { + entryRemoved(false, key, previous, value); + } + + trimToSize(maxSize); + return previous; + } + + /** + * trimToSize + * + * @param maxsize + * @throws IllegalStateException + */ + public void trimToSize(int maxsize) { + while (true) { + K key; + V value; + synchronized (this) { + if (size < 0 || (map.isEmpty() && size != 0)) { + throw new IllegalStateException(getClass().getName() + + ".sizeOf() is reporting inconsistent results!"); + } + + if (size <= maxsize || map.isEmpty()) { + break; + } + + Map.Entry toEvict = map.entrySet().iterator().next(); + key = toEvict.getKey(); + value = toEvict.getValue(); + map.remove(key); + size -= safeSizeOf(key, value); + evictionCount++; + } + + entryRemoved(true, key, value, null); + } + } + + /** + * remove + * + * @param key + * @return V + * @throws NullPointerException + */ + public final V remove(K key) { + if (key == null) { + throw new NullPointerException("key == null"); + } + + V previous; + synchronized (this) { + previous = map.remove(key); + if (previous != null) { + size -= safeSizeOf(key, previous); + } + } + + if (previous != null) { + entryRemoved(false, key, previous, null); + } + + return previous; + } + + /** + * entryRemoved + * + * @param evicted + * @param key + * @param oldValue + * @param newValue + */ + protected void entryRemoved(boolean evicted, K key, V oldValue, V newValue) { + } + + /** + * create + * + * @param key + * @return V + */ + protected V create(K key) { + return null; + } + + private int safeSizeOf(K key, V value) { + int result = sizeOf(key, value); + if (result < 0) { + throw new IllegalStateException("Negative size: " + key + "=" + value); + } + return result; + } + + /** + * sizeOf + * + * @param key + * @param value + * @return int + */ + protected int sizeOf(K key, V value) { + return 1; + } + + /** + * evictAll + */ + public final void evictAll() { + trimToSize(-1); // -1 will evict 0-sized elements + } + + /** + * size + * + * @return int + */ + public synchronized final int size() { + return size; + } + + /** + * maxSize + * + * @return int + */ + public synchronized final int maxSize() { + return maxSize; + } + + /** + * hitCount + * + * @return int + */ + public synchronized final int hitCount() { + return hitCount; + } + + /** + * missCount + * + * @return int + */ + public synchronized final int missCount() { + return missCount; + } + + /** + * createCount + * + * @return int + */ + public synchronized final int createCount() { + return createCount; + } + + /** + * putCount + * + * @return int + */ + public synchronized final int putCount() { + return putCount; + } + + /** + * evictionCount + * + * @return int + */ + public synchronized final int evictionCount() { + return evictionCount; + } + + /** + * snapshot + * + * @return Map + */ + public synchronized final Map snapshot() { + return new LinkedHashMap(map); + } + + /** + * toString + * + * @return String + */ + @Override + public synchronized final String toString() { + int accesses = hitCount + missCount; + int hitPercent = accesses != 0 ? (100 * hitCount / accesses) : 0; + return String.format(Locale.getDefault(), + "LruCache[maxSize=%d,hits=%d,misses=%d,hitRate=%d%%]", + maxSize, hitCount, missCount, hitPercent); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/cache/LruDiskCache.java b/entry/src/main/java/com/wordplat/quickstart/xutils/cache/LruDiskCache.java new file mode 100644 index 0000000..22d525c --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/cache/LruDiskCache.java @@ -0,0 +1,428 @@ +package com.wordplat.quickstart.xutils.cache; + +import com.wordplat.quickstart.xutils.DbManager; +import com.wordplat.quickstart.xutils.common.task.PriorityExecutor; +import com.wordplat.quickstart.xutils.common.util.*; +import com.wordplat.quickstart.xutils.config.DbConfigs; +import com.wordplat.quickstart.xutils.db.sqlite.WhereBuilder; +import com.wordplat.quickstart.xutils.ex.FileLockedException; +import com.wordplat.quickstart.xutils.x; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.Executor; + +/** + * Created by wyouflf on 15/7/23. + * 使用sqlite索引实现的LruDiskCache + * + * @since 2021-05-08 + */ +public final class LruDiskCache { + /** + * key: cacheDirName + */ + private static final HashMap DISK_CACHE_MAP = new HashMap(5); + + private static final int LIMIT_COUNT = 5000; // 限制最多5000条数据 + private static final long LIMIT_SIZE = 1024L * 1024L * 100L; // 限制最多100M文件 + + private static final int LOCK_WAIT = 1000 * 3; // 3s + private static final String CACHE_DIR_NAME = "xUtils_cache"; + private static final String TEMP_FILE_SUFFIX = ".tmp"; + + private static final long TRIM_TIME_SPAN = 1000; + private boolean available = false; + private DbManager cacheDb; + private File cacheDir; + private long diskCacheSize = LIMIT_SIZE; + private final Executor trimExecutor = new PriorityExecutor(1, true); + + private long lastTrimTime = 0L; + + /** + * LruDiskCache + * + * @param dirName + */ + private LruDiskCache(String dirName) { + try { + this.cacheDir = FileUtil.getCacheDir(dirName); + if (this.cacheDir != null && (this.cacheDir.exists() || this.cacheDir.mkdirs())) { + available = true; + } + this.cacheDb = x.getDb(DbConfigs.HTTP.getConfig()); + } catch (Throwable ex) { + available = false; + LogUtil.e(ex.getMessage(), ex); + } + deleteNoIndexFiles(); + } + + /** + * getDiskCache + * + * @param dirName + * @return LruDiskCache + */ + public synchronized static LruDiskCache getDiskCache(String dirName) { + if (TextUtils.isEmpty(dirName)) { + dirName = CACHE_DIR_NAME; + } + LruDiskCache cache = DISK_CACHE_MAP.get(dirName); + if (cache == null) { + cache = new LruDiskCache(dirName); + DISK_CACHE_MAP.put(dirName, cache); + } + return cache; + } + + /** + * setMaxSize + * + * @param maxSize + * @return LruDiskCache + */ + public LruDiskCache setMaxSize(long maxSize) { + if (maxSize > 0L) { + long diskFreeSize = FileUtil.getDiskAvailableSize(); + if (diskFreeSize > maxSize) { + diskCacheSize = maxSize; + } else { + diskCacheSize = diskFreeSize; + } + } + return this; + } + + /** + * get + * + * @param key + * @return DiskCacheEntity + */ + public DiskCacheEntity get(String key) { + if (!available || TextUtils.isEmpty(key)) { + return null; + } + + DiskCacheEntity result = null; + try { + result = this.cacheDb.selector(DiskCacheEntity.class) + .where("key", "=", key).findFirst(); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + if (result != null) { + if (result.getExpires() < System.currentTimeMillis()) { + return null; + } + + final DiskCacheEntity finalResult = result; + trimExecutor.execute(new Runnable() { + @Override + public void run() { + finalResult.setHits(finalResult.getHits() + 1); + finalResult.setLastAccess(System.currentTimeMillis()); + try { + cacheDb.update(finalResult, "hits", "lastAccess"); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + }); + } + + return result; + } + + /** + * put + * + * @param entity + */ + public void put(DiskCacheEntity entity) { + if (!available + || entity == null + || TextUtils.isEmpty(entity.getTextContent()) + || entity.getExpires() < System.currentTimeMillis()) { + return; + } + + try { + cacheDb.replace(entity); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + + trimSize(); + } + + /** + * getDiskCacheFile + * + * @param key + * @return DiskCacheFile + * @throws InterruptedException + */ + public DiskCacheFile getDiskCacheFile(String key) throws InterruptedException { + if (!available || TextUtils.isEmpty(key)) { + return null; + } + + DiskCacheFile result = null; + DiskCacheEntity entity = get(key); + if (entity != null && new File(entity.getPath()).exists()) { + ProcessLock processLock = ProcessLock.tryLock(entity.getPath(), false, LOCK_WAIT); + if (processLock != null && processLock.isValid()) { + result = new DiskCacheFile(entity.getPath(), entity, processLock); + if (!result.exists()) { + try { + cacheDb.delete(entity); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + result = null; + } + } + } + + return result; + } + + /** + * createDiskCacheFile + * + * @param entity + * @return DiskCacheFile + * @throws FileLockedException + * @throws IOException + */ + public DiskCacheFile createDiskCacheFile(DiskCacheEntity entity) throws IOException { + if (!available || entity == null) { + return null; + } + + DiskCacheFile result = null; + + entity.setPath(new File(this.cacheDir, MD5.md5(entity.getKey())).getCanonicalPath()); + String tempFilePath = entity.getPath() + TEMP_FILE_SUFFIX; + ProcessLock processLock = ProcessLock.tryLock(tempFilePath, true); + if (processLock != null && processLock.isValid()) { + result = new DiskCacheFile(tempFilePath, entity, processLock); + if (!result.getParentFile().exists()) { + result.mkdirs(); + } + } else { + throw new FileLockedException(entity.getPath()); + } + + return result; + } + + /** + * clearCacheFiles + */ + public void clearCacheFiles() { + IOUtil.deleteFileOrDir(cacheDir); + } + + DiskCacheFile commitDiskCacheFile(DiskCacheFile cacheFile) throws IOException { + if (!available || cacheFile == null) { + return cacheFile; + } + + DiskCacheFile result = null; + DiskCacheEntity cacheEntity = cacheFile.getCacheEntity(); + if (cacheFile.getName().endsWith(TEMP_FILE_SUFFIX)) { // is temp file + ProcessLock processLock = null; + DiskCacheFile destFile = null; + try { + String destPath = cacheEntity.getPath(); + processLock = ProcessLock.tryLock(destPath, true, LOCK_WAIT); + if (processLock != null && processLock.isValid()) { // lock + destFile = new DiskCacheFile(destPath, cacheEntity, processLock); + if (cacheFile.renameTo(destFile)) { + try { + result = destFile; + cacheDb.replace(cacheEntity); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + + trimSize(); + } else { + throw new IOException("rename:" + cacheFile.getAbsolutePath()); + } + } else { + throw new FileLockedException(destPath); + } + } catch (InterruptedException ex) { + result = cacheFile; + LogUtil.e(ex.getMessage(), ex); + } finally { + if (result == null) { + result = cacheFile; + IOUtil.closeQuietly(destFile); + IOUtil.closeQuietly(processLock); + IOUtil.deleteFileOrDir(destFile); + } else { + IOUtil.closeQuietly(cacheFile); + IOUtil.deleteFileOrDir(cacheFile); + } + } + } else { + result = cacheFile; + } + + return result; + } + + /** + * trimSize + */ + private void trimSize() { + trimExecutor.execute(() -> { + if (!available) { + return; + } + + long current = System.currentTimeMillis(); + if (current - lastTrimTime < TRIM_TIME_SPAN) { + return; + } else { + lastTrimTime = current; + } + deleteExpiry(); + + try { + int count = (int) cacheDb.selector(DiskCacheEntity.class).count(); + if (count > LIMIT_COUNT + 10) { + List rmList = cacheDb.selector(DiskCacheEntity.class) + .orderBy("lastAccess").orderBy("hits") + .limit(count - LIMIT_COUNT).offset(0).findAll(); + if (rmList != null && rmList.size() > 0) { + for (DiskCacheEntity entity : rmList) { + try { + cacheDb.delete(entity); + String path = entity.getPath(); + if (!TextUtils.isEmpty(path)) { + deleteFileWithLock(path); + deleteFileWithLock(path + TEMP_FILE_SUFFIX); + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + + } + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + + // trim disk + try { + while (FileUtil.getFileOrDirSize(cacheDir) > diskCacheSize) { + List rmList = cacheDb.selector(DiskCacheEntity.class) + .orderBy("lastAccess").orderBy("hits").limit(10).offset(0).findAll(); + if (rmList != null && rmList.size() > 0) { + // delete cache files + for (DiskCacheEntity entity : rmList) { + try { + // delete db entity + cacheDb.delete(entity); + // delete cache files + String path = entity.getPath(); + if (!TextUtils.isEmpty(path)) { + deleteFileWithLock(path); + deleteFileWithLock(path + TEMP_FILE_SUFFIX); + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + } + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + }); + } + + private void deleteExpiry() { + if (!available) { + return; + } + + try { + WhereBuilder whereBuilder = WhereBuilder.b("expires", "<", System.currentTimeMillis()); + List rmList = cacheDb.selector(DiskCacheEntity.class).where(whereBuilder).findAll(); + // delete db entities + cacheDb.delete(DiskCacheEntity.class, whereBuilder); + if (rmList != null && rmList.size() > 0) { + // delete cache files + for (DiskCacheEntity entity : rmList) { + String path = entity.getPath(); + if (!TextUtils.isEmpty(path)) { + deleteFileWithLock(path); + } + } + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + + /** + * 清理未被数据库索引的历史缓存文件 + */ + private void deleteNoIndexFiles() { + trimExecutor.execute(new Runnable() { + @Override + public void run() { + if (!available) { + return; + } + + try { + File[] fileList = cacheDir.listFiles(); + if (fileList != null) { + for (File file : fileList) { + try { + long count = cacheDb.selector(DiskCacheEntity.class) + .where("path", "=", file.getCanonicalFile()).count(); + if (count < 1) { + IOUtil.deleteFileOrDir(file); + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + }); + } + + private boolean deleteFileWithLock(String path) { + ProcessLock processLock = null; + try { + processLock = ProcessLock.tryLock(path, true); + if (processLock != null && processLock.isValid()) { + /** + * lock + */ + File file = new File(path); + return IOUtil.deleteFileOrDir(file); + } + } finally { + IOUtil.closeQuietly(processLock); + } + return false; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/common/Callback.java b/entry/src/main/java/com/wordplat/quickstart/xutils/common/Callback.java new file mode 100644 index 0000000..1cd9aed --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/common/Callback.java @@ -0,0 +1,173 @@ +package com.wordplat.quickstart.xutils.common; + +import java.lang.reflect.Type; + +/** + * Created by wyouflf on 15/6/5. + * 通用回调接口 + * + * @since 2021-05-09 + */ +public interface Callback { + + public interface CommonCallback extends Callback { + /** + * onSuccess + * + * @param result + */ + void onSuccess(ResultType result); + + /** + * onError + * + * @param ex + * @param isOnCallback + */ + void onError(Throwable ex, boolean isOnCallback); + + /** + * onCancelled + * + * @param cex + */ + void onCancelled(CancelledException cex); + + /** + * onFinished + */ + void onFinished(); + } + + public interface TypedCallback extends CommonCallback { + /** + * getLoadType + * + * @return Type + */ + Type getLoadType(); + } + + public interface CacheCallback extends CommonCallback { + /** + * onCache + * + * @param result + * @return boolean + */ + boolean onCache(ResultType result); + } + + public interface ProxyCacheCallback extends CacheCallback { + /** + * onlyCache + * + * @return boolean + */ + boolean onlyCache(); + } + + public interface PrepareCallback extends CommonCallback { + /** + * prepare + * + * @param rawData + * @return ResultType + * @throws Throwable + */ + ResultType prepare(PrepareType rawData) throws Throwable; + } + + public interface ProgressCallback extends CommonCallback { + /** + * onWaiting + */ + void onWaiting(); + + /** + * onStarted + */ + void onStarted(); + + /** + * onLoading + * + * @param total + * @param current + * @param isDownloading + */ + void onLoading(long total, long current, boolean isDownloading); + } + + public interface GroupCallback extends Callback { + /** + * onSuccess + * + * @param item + */ + void onSuccess(ItemType item); + + /** + * onError + * + * @param item + * @param ex + * @param isOnCallback + */ + void onError(ItemType item, Throwable ex, boolean isOnCallback); + + /** + * onCancelled + * + * @param item + * @param cex + */ + void onCancelled(ItemType item, CancelledException cex); + + /** + * onFinished + * + * @param item + */ + void onFinished(ItemType item); + + /** + * onAllFinished + */ + void onAllFinished(); + } + + public interface Callable { + /** + * call + * + * @param result + */ + void call(ResultType result); + } + + /** + * Cancelable + * + * @since 2021-05-09 + */ + public interface Cancelable { + /** + * cancel + */ + void cancel(); + + /** + * isCancelled + * + * @return boolean + */ + boolean isCancelled(); + } + + static class CancelledException extends RuntimeException { + public CancelledException(String detailMessage) { + super(detailMessage); + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/common/TaskController.java b/entry/src/main/java/com/wordplat/quickstart/xutils/common/TaskController.java new file mode 100644 index 0000000..9d0bf57 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/common/TaskController.java @@ -0,0 +1,76 @@ +package com.wordplat.quickstart.xutils.common; + +import com.wordplat.quickstart.xutils.common.task.AbsTask; + +/** + * Created by wyouflf on 15/6/11. + * 任务管理接口 + * + * @since 2021-05-09 + */ +public interface TaskController { + /** + * autoPost + * + * @param runnable + */ + void autoPost(Runnable runnable); + + /** + * post + * + * @param runnable + */ + void post(Runnable runnable); + + /** + * postDelayed + * + * @param runnable + * @param delayMillis + */ + void postDelayed(Runnable runnable, long delayMillis); + + /** + * run + * + * @param runnable + */ + void run(Runnable runnable); + + /** + * removeCallbacks + * + * @param runnable + */ + void removeCallbacks(Runnable runnable); + + /** + * start + * + * @param task + * @param + * @return AbsTask + */ + AbsTask start(AbsTask task); + + /** + * startSync + * + * @param task + * @param + * @return T + * @throws Throwable + */ + T startSync(AbsTask task) throws Throwable; + + /** + * startTasks + * + * @param groupCallback + * @param tasks + * @param + * @return Callback.Cancelable + */ + > Callback.Cancelable startTasks(Callback.GroupCallback groupCallback, T... tasks); +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/common/task/AbsTask.java b/entry/src/main/java/com/wordplat/quickstart/xutils/common/task/AbsTask.java new file mode 100644 index 0000000..a35dce1 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/common/task/AbsTask.java @@ -0,0 +1,252 @@ +package com.wordplat.quickstart.xutils.common.task; + + +import com.wordplat.quickstart.xutils.common.Callback; + +import ohos.eventhandler.EventRunner; + +import java.util.concurrent.Executor; + + +/** + * Created by wyouflf on 15/6/5. + * 异步任务基类 + * + * @param 任务返回值类型 + * @since 2021-05-08 + */ +public abstract class AbsTask implements Callback.Cancelable { + + private TaskProxy taskProxy = null; + private final Callback.Cancelable cancelHandler; + + private volatile boolean isCancelled = false; + private volatile State state = State.IDLE; + private ResultType result; + + /** + * AbsTask + */ + public AbsTask() { + this(null); + } + + /** + * AbsTask + * + * @param cancelHandler + */ + public AbsTask(Callback.Cancelable cancelHandler) { + this.cancelHandler = cancelHandler; + } + + /** + * doBackground + * + * @return ResultType + * @throws Throwable + */ + protected abstract ResultType doBackground() throws Throwable; + + /** + * onSuccess + * + * @param result + */ + protected abstract void onSuccess(ResultType result); + + /** + * onError + * + * @param ex + * @param isCallbackError + */ + protected abstract void onError(Throwable ex, boolean isCallbackError); + + /** + * onWaiting + */ + protected void onWaiting() { + } + + /** + * onStarted + */ + protected void onStarted() { + } + + /** + * onUpdate + * + * @param flag + * @param args + */ + protected void onUpdate(int flag, Object... args) { + } + + /** + * onCancelled + * + * @param cex + */ + protected void onCancelled(Callback.CancelledException cex) { + } + + /** + * onFinished + */ + protected void onFinished() { + } + + /** + * getPriority + * + * @return Priority + */ + public Priority getPriority() { + return null; + } + + public Executor getExecutor() { + return null; + } + + /** + * EventRunner + * + * @return EventRunner + */ + public EventRunner customLooper() { + return null; + } + + /** + * update + * + * @param flag + * @param args + */ + protected final void update(int flag, Object... args) { + if (taskProxy != null) { + taskProxy.onUpdate(flag, args); + } + } + + /** + * invoked via cancel() + */ + protected void cancelWorks() { + } + + /** + * 取消任务时是否不等待任务彻底结束, 立即收到取消的通知. + * + * @return 是否立即响应取消回调 + */ + protected boolean isCancelFast() { + return false; + } + + @Override + public final void cancel() { + /** + * LogUtil.e("图片请求abstask==="+isCancelled); + */ + if (this.isCancelled) { + return; + } + synchronized (this) { + if (this.isCancelled) { + return; + } + /** + * LogUtil.e("图片请求abstask1111==="+isCancelled); + */ + this.isCancelled = true; + cancelWorks(); + if (cancelHandler != null && !cancelHandler.isCancelled()) { + cancelHandler.cancel(); + } + if (this.state == State.WAITING || (this.state == State.STARTED && isCancelFast())) { + if (taskProxy != null) { + taskProxy.onCancelled(new Callback.CancelledException("cancelled by user")); + taskProxy.onFinished(); + } else if (this instanceof TaskProxy) { + this.onCancelled(new Callback.CancelledException("cancelled by user")); + this.onFinished(); + } + } + } + } + + @Override + public final boolean isCancelled() { + return isCancelled || state == State.CANCELLED + || (cancelHandler != null && cancelHandler.isCancelled()); + } + + public final boolean isFinished() { + return this.state.value() > State.STARTED.value(); + } + + public final State getState() { + return state; + } + + public final ResultType getResult() { + return result; + } + + /** + * package + * + * @param state + */ + void setState(State state) { + this.state = state; + } + + /** + * package + * + * @param taskProxy + */ + final void setTaskProxy(TaskProxy taskProxy) { + this.taskProxy = taskProxy; + } + + /** + * package + * + * @param result + */ + final void setResult(ResultType result) { + this.result = result; + } + + /** + * State + * + * @since 2021-04-22 + */ + public enum State { + /** + * IDLE WAITING STARTED SUCCESS CANCELLED ERROR + */ + IDLE(0), WAITING(1), STARTED(2), SUCCESS(3), CANCELLED(4), ERROR(5); + private final int value; + + private State(int value) { + this.value = value; + } + + /** + * value + * + * @return int + */ + public int value() { + return value; + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/common/task/Priority.java b/entry/src/main/java/com/wordplat/quickstart/xutils/common/task/Priority.java new file mode 100644 index 0000000..d63e195 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/common/task/Priority.java @@ -0,0 +1,14 @@ +package com.wordplat.quickstart.xutils.common.task; + +/** + * Created by wyouflf on 15/6/5. + * 任务的优先级 + * + * @since 2021-05-08 + */ +public enum Priority { + /** + * UI_TOP UI_NORMAL UI_LOW DEFAULT BG_TOP BG_NORMAL BG_LOW + */ + UI_TOP, UI_NORMAL, UI_LOW, DEFAULT, BG_TOP, BG_NORMAL, BG_LOW; +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/common/task/PriorityExecutor.java b/entry/src/main/java/com/wordplat/quickstart/xutils/common/task/PriorityExecutor.java new file mode 100644 index 0000000..2e720ce --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/common/task/PriorityExecutor.java @@ -0,0 +1,116 @@ +package com.wordplat.quickstart.xutils.common.task; + +import java.util.Comparator; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; + +/** + * Created by wyouflf on 15/6/5. + * 支持优先级的线程池管理类 + * + * @since 2021-05-08 + */ +public class PriorityExecutor implements Executor { + private static final int CORE_POOL_SIZE = 5; + private static final int MAXIMUM_POOL_SIZE = 256; + private static final int KEEP_ALIVE = 1; + private static final AtomicLong SEQ_SEED = new AtomicLong(0); + + private static final ThreadFactory FACTORY = new ThreadFactory() { + private final AtomicInteger mCount = new AtomicInteger(1); + + @Override + public Thread newThread(Runnable runnable) { + return new Thread(runnable, "xTID#" + mCount.getAndIncrement()); + } + }; + + private static final Comparator FIFO_CMP = new Comparator() { + @Override + public int compare(Runnable lhs, Runnable rhs) { + if (lhs instanceof PriorityRunnable && rhs instanceof PriorityRunnable) { + PriorityRunnable lpr = ((PriorityRunnable) lhs); + PriorityRunnable rpr = ((PriorityRunnable) rhs); + int result = lpr.priority.ordinal() - rpr.priority.ordinal(); + return result == 0 ? (int) (lpr.SEQ - rpr.SEQ) : result; + } else { + return 0; + } + } + }; + + private static final Comparator FILO_CMP = new Comparator() { + @Override + public int compare(Runnable lhs, Runnable rhs) { + if (lhs instanceof PriorityRunnable && rhs instanceof PriorityRunnable) { + PriorityRunnable lpr = ((PriorityRunnable) lhs); + PriorityRunnable rpr = ((PriorityRunnable) rhs); + int result = lpr.priority.ordinal() - rpr.priority.ordinal(); + return result == 0 ? (int) (rpr.SEQ - lpr.SEQ) : result; + } else { + return 0; + } + } + }; + + private final ThreadPoolExecutor mThreadPoolExecutor; + + /** + * 默认工作线程数5 + * + * @param fifo 优先级相同时, 等待队列的是否优先执行先加入的任务. + */ + public PriorityExecutor(boolean fifo) { + this(CORE_POOL_SIZE, fifo); + } + + /** + * PriorityExecutor + * + * @param poolSize 工作线程数 + * @param fifo 优先级相同时, 等待队列的是否优先执行先加入的任务. + */ + public PriorityExecutor(int poolSize, boolean fifo) { + BlockingQueue mPoolWorkQueue = + new PriorityBlockingQueue(MAXIMUM_POOL_SIZE, fifo ? FIFO_CMP : FILO_CMP); + mThreadPoolExecutor = new ThreadPoolExecutor( + poolSize, + MAXIMUM_POOL_SIZE, + KEEP_ALIVE, + TimeUnit.SECONDS, + mPoolWorkQueue, + FACTORY); + } + + public int getPoolSize() { + return mThreadPoolExecutor.getCorePoolSize(); + } + + /** + * setPoolSize + * + * @param poolSize + */ + public void setPoolSize(int poolSize) { + if (poolSize > 0) { + mThreadPoolExecutor.setCorePoolSize(poolSize); + } + } + + public ThreadPoolExecutor getThreadPoolExecutor() { + return mThreadPoolExecutor; + } + + public boolean isBusy() { + return mThreadPoolExecutor.getActiveCount() >= mThreadPoolExecutor.getCorePoolSize(); + } + + @Override + public void execute(Runnable runnable) { + if (runnable instanceof PriorityRunnable) { + ((PriorityRunnable) runnable).SEQ = SEQ_SEED.getAndIncrement(); + } + mThreadPoolExecutor.execute(runnable); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/common/task/PriorityRunnable.java b/entry/src/main/java/com/wordplat/quickstart/xutils/common/task/PriorityRunnable.java new file mode 100644 index 0000000..3bddb04 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/common/task/PriorityRunnable.java @@ -0,0 +1,29 @@ +package com.wordplat.quickstart.xutils.common.task; + +/** + * Created by wyouflf on 15/6/5. + * 带有优先级的Runnable类型(仅在task包内可用) + */ +class PriorityRunnable implements Runnable { + + long SEQ; + + private final Runnable runnable; + public final Priority priority; + + /** + * PriorityRunnable + * + * @param priority + * @param runnable + */ + public PriorityRunnable(Priority priority, Runnable runnable) { + this.priority = priority == null ? Priority.DEFAULT : priority; + this.runnable = runnable; + } + + @Override + public final void run() { + this.runnable.run(); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/common/task/TaskControllerImpl.java b/entry/src/main/java/com/wordplat/quickstart/xutils/common/task/TaskControllerImpl.java new file mode 100644 index 0000000..5c4b0fa --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/common/task/TaskControllerImpl.java @@ -0,0 +1,255 @@ +package com.wordplat.quickstart.xutils.common.task; + +import com.wordplat.quickstart.xutils.common.Callback; +import com.wordplat.quickstart.xutils.common.TaskController; +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.x; + +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Created by wyouflf on 15/6/5. + * 异步任务的管理类 + */ +public final class TaskControllerImpl implements TaskController { + private static volatile TaskController instance; + + private TaskControllerImpl() { + } + + /** + * registerInstance + */ + public static void registerInstance() { + if (instance == null) { + synchronized (TaskController.class) { + if (instance == null) { + instance = new TaskControllerImpl(); + } + } + } + x.Ext.setTaskController(instance); + } + + @Override + public AbsTask start(AbsTask task) { + TaskProxy proxy = null; + if (task instanceof TaskProxy) { + proxy = (TaskProxy) task; + } else { + proxy = new TaskProxy(task); + } + try { + proxy.doBackground(); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + return proxy; + } + + @Override + public T startSync(AbsTask task) throws Throwable { + T result = null; + try { + task.onWaiting(); + task.onStarted(); + result = task.doBackground(); + task.onSuccess(result); + } catch (Callback.CancelledException cex) { + task.onCancelled(cex); + } catch (Throwable ex) { + task.onError(ex, false); + throw ex; + } finally { + task.onFinished(); + } + return result; + } + + @Override + @SuppressWarnings("unchecked") + public > Callback.Cancelable startTasks( + final Callback.GroupCallback groupCallback, final T... tasks) { + + if (tasks == null) { + throw new IllegalArgumentException("task must not be null"); + } + + final Runnable callIfOnAllFinished = new Runnable() { + private final int total = tasks.length; + private final AtomicInteger count = new AtomicInteger(0); + + @Override + public void run() { + if (count.incrementAndGet() == total) { + if (groupCallback != null) { + try { + groupCallback.onAllFinished(); + } catch (Throwable ex) { + try { + groupCallback.onError(null, ex, true); + } catch (Throwable throwable) { + LogUtil.e(throwable.getMessage(), throwable); + } + } + } + } + } + }; + + for (final T task : tasks) { + start(new TaskProxy(task) { + @Override + protected void onSuccess(Object result) { + super.onSuccess(result); + post(new Runnable() { + @Override + public void run() { + if (groupCallback != null) { + try { + groupCallback.onSuccess(task); + } catch (Throwable ex) { + try { + groupCallback.onError(task, ex, true); + } catch (Throwable throwable) { + LogUtil.e(throwable.getMessage(), throwable); + } + } + } + } + }); + } + + @Override + protected void onCancelled(final Callback.CancelledException cex) { + super.onCancelled(cex); + post(new Runnable() { + @Override + public void run() { + if (groupCallback != null) { + try { + groupCallback.onCancelled(task, cex); + } catch (Throwable ex) { + try { + groupCallback.onError(task, ex, true); + } catch (Throwable throwable) { + LogUtil.e(throwable.getMessage(), throwable); + } + } + } + } + }); + } + + @Override + protected void onError(final Throwable ex, final boolean isCallbackError) { + super.onError(ex, isCallbackError); + post(new Runnable() { + @Override + public void run() { + if (groupCallback != null) { + try { + groupCallback.onError(task, ex, isCallbackError); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + } + }); + } + + @Override + protected void onFinished() { + super.onFinished(); + post(new Runnable() { + @Override + public void run() { + try { + if (groupCallback != null) { + groupCallback.onFinished(task); + } + } catch (Throwable ex) { + try { + groupCallback.onError(task, ex, true); + } catch (Throwable throwable) { + LogUtil.e(throwable.getMessage(), throwable); + } + } finally { + callIfOnAllFinished.run(); + } + } + }); + } + }); + } + + return new Callback.Cancelable() { + @Override + public void cancel() { + LogUtil.e("图片请求taskController imple==="); + for (T task : tasks) { + task.cancel(); + } + } + + @Override + public boolean isCancelled() { + boolean isCancelled = true; + for (T task : tasks) { + if (!task.isCancelled()) { + isCancelled = false; + } + } + return isCancelled; + } + }; + } + + @Override + public void autoPost(Runnable runnable) { + if (runnable == null) { + return; + } + /** + * // if (Thread.currentThread()==) { + * // runnable.run(); + * // } else { + */ + TaskProxy.INTERNAL_HANDLER.postTask(runnable); + /** + * } + */ + } + + @Override + public void post(Runnable runnable) { + if (runnable == null) { + return; + } + TaskProxy.INTERNAL_HANDLER.postTask(runnable); + } + + @Override + public void postDelayed(Runnable runnable, long delayMillis) { + if (runnable == null) { + return; + } + TaskProxy.INTERNAL_HANDLER.postTask(runnable, delayMillis); + } + + @Override + public void run(Runnable runnable) { + if (!TaskProxy.PRIORITY_EXECUTOR.isBusy()) { + TaskProxy.PRIORITY_EXECUTOR.execute(runnable); + } else { + new Thread(runnable).start(); + } + } + + @Override + public void removeCallbacks(Runnable runnable) { + /** + * TaskProxy.sHandler.removeCallbacks(runnable); + */ + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/common/task/TaskProxy.java b/entry/src/main/java/com/wordplat/quickstart/xutils/common/task/TaskProxy.java new file mode 100644 index 0000000..87962a2 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/common/task/TaskProxy.java @@ -0,0 +1,304 @@ +package com.wordplat.quickstart.xutils.common.task; + +import com.wordplat.quickstart.xutils.common.Callback; +import com.wordplat.quickstart.xutils.common.util.LogUtil; + +import ohos.eventhandler.EventHandler; +import ohos.eventhandler.EventRunner; +import ohos.eventhandler.InnerEvent; + +import com.wordplat.quickstart.xutils.x; + +import java.util.concurrent.Executor; + +/** + * 异步任务的代理类(仅在task包内可用) + * + * @param + */ +class TaskProxy extends AbsTask { + private final static int MSG_WHAT_BASE = 1000000000; + private final static int MSG_WHAT_ON_WAITING = MSG_WHAT_BASE + 1; + private final static int MSG_WHAT_ON_START = MSG_WHAT_BASE + 2; + private final static int MSG_WHAT_ON_SUCCESS = MSG_WHAT_BASE + 3; + private final static int MSG_WHAT_ON_ERROR = MSG_WHAT_BASE + 4; + private final static int MSG_WHAT_ON_UPDATE = MSG_WHAT_BASE + 5; + private final static int MSG_WHAT_ON_CANCEL = MSG_WHAT_BASE + 6; + private final static int MSG_WHAT_ON_FINISHED = MSG_WHAT_BASE + 7; + static final InternalHandler INTERNAL_HANDLER = new InternalHandler(); + static final PriorityExecutor PRIORITY_EXECUTOR = new PriorityExecutor(true); + + private final AbsTask task; + private final Executor executor; + private final EventHandler handler; + private volatile boolean callOnCanceled = false; + private volatile boolean callOnFinished = false; + + TaskProxy(AbsTask task) { + super(task); + this.task = task; + this.task.setTaskProxy(this); + this.setTaskProxy(null); + + // set handler + EventRunner looper = task.customLooper(); + if (looper != null) { + handler = new InternalHandler(looper); + } else { + handler = INTERNAL_HANDLER; + } + + // set executor + Executor taskExecutor = task.getExecutor(); + if (taskExecutor == null) { + taskExecutor = PRIORITY_EXECUTOR; + } + this.executor = taskExecutor; + } + + @Override + protected final ResultType doBackground() throws Throwable { + this.onWaiting(); + PriorityRunnable runnable = new PriorityRunnable( + task.getPriority(), + new Runnable() { + @Override + public void run() { + try { + // 等待过程中取消 + if (callOnCanceled || TaskProxy.this.isCancelled()) { + throw new Callback.CancelledException(""); + } + + // start running + TaskProxy.this.onStarted(); + + if (TaskProxy.this.isCancelled()) { // 开始时取消 + throw new Callback.CancelledException(""); + } + + // 执行task, 得到结果. + task.setResult(task.doBackground()); + TaskProxy.this.setResult(task.getResult()); + + // 未在doBackground过程中取消成功 + if (TaskProxy.this.isCancelled()) { + throw new Callback.CancelledException(""); + } + + // 执行成功 + TaskProxy.this.onSuccess(task.getResult()); + } catch (Callback.CancelledException cex) { + TaskProxy.this.onCancelled(cex); + } catch (Throwable ex) { + TaskProxy.this.onError(ex, false); + } finally { + TaskProxy.this.onFinished(); + } + } + }); + this.executor.execute(runnable); + return null; + } + + @Override + protected void onWaiting() { + this.setState(State.WAITING); + InnerEvent innerEvent = InnerEvent.get(MSG_WHAT_ON_WAITING, new ArgsObj(this)); + handler.sendEvent(innerEvent); + /** + * handler.obtainMessage(MSG_WHAT_ON_WAITING, this).sendToTarget(); + */ + } + + @Override + protected void onStarted() { + this.setState(State.STARTED); + InnerEvent innerEvent = InnerEvent.get(MSG_WHAT_ON_START, new ArgsObj(this)); + handler.sendEvent(innerEvent); + /** + * handler.obtainMessage(MSG_WHAT_ON_START, this).sendToTarget(); + */ + } + + @Override + protected void onSuccess(ResultType result) { + this.setState(State.SUCCESS); + InnerEvent innerEvent = InnerEvent.get(MSG_WHAT_ON_SUCCESS, new ArgsObj(this)); + handler.sendEvent(innerEvent); + /** + * handler.obtainMessage(MSG_WHAT_ON_SUCCESS, this).sendToTarget(); + */ + } + + @Override + protected void onError(Throwable ex, boolean isCallbackError) { + this.setState(State.ERROR); + /** + * handler.sendEvent(MSG_WHAT_ON_ERROR); + */ + InnerEvent innerEvent = InnerEvent.get(MSG_WHAT_ON_ERROR, new ArgsObj(this, ex)); + handler.sendEvent(innerEvent); + /** + * handler.obtainMessage(MSG_WHAT_ON_ERROR, new ArgsObj(this, ex)).sendToTarget(); + */ + } + + @Override + protected void onUpdate(int flag, Object... args) { + /** + * obtainMessage(int what, int arg1, int arg2, Object obj), arg2 not be used. + * handler.sendEvent(MSG_WHAT_ON_UPDATE); + */ + + InnerEvent innerEvent = InnerEvent.get(MSG_WHAT_ON_UPDATE, new ArgsObj(this, args)); + handler.sendEvent(innerEvent); + /** + * handler.obtainMessage(MSG_WHAT_ON_UPDATE, flag, flag, new ArgsObj(this, args)).sendToTarget(); + */ + } + + @Override + protected void onCancelled(Callback.CancelledException cex) { + this.setState(State.CANCELLED); + /** + * handler.sendEvent(MSG_WHAT_ON_CANCEL); + */ + InnerEvent innerEvent = InnerEvent.get(MSG_WHAT_ON_CANCEL, new ArgsObj(this, cex)); + handler.sendEvent(innerEvent); + /** + * handler.obtainMessage(MSG_WHAT_ON_CANCEL, new ArgsObj(this, cex)).sendToTarget(); + */ + } + + @Override + protected void onFinished() { + /** + * handler.sendEvent(MSG_WHAT_ON_FINISHED); + */ + InnerEvent innerEvent = InnerEvent.get(MSG_WHAT_ON_FINISHED, new ArgsObj(this, this)); + handler.sendEvent(innerEvent); + /** + * handler.obtainMessage(MSG_WHAT_ON_FINISHED, this).sendToTarget(); + */ + } + + @Override + final void setState(State state) { + super.setState(state); + this.task.setState(state); + } + + @Override + public final Priority getPriority() { + return task.getPriority(); + } + + @Override + public final Executor getExecutor() { + return this.executor; + } + + /** + * ########################### inner type ############################# + */ + private static class ArgsObj { + final TaskProxy taskProxy; + final Object[] args; + + /** + * ArgsObj + * + * @param taskProxy + * @param args + */ + public ArgsObj(TaskProxy taskProxy, Object... args) { + this.taskProxy = taskProxy; + this.args = args; + } + } + + final static class InternalHandler extends EventHandler { + TaskProxy taskProxy = null; + Object[] args = null; + + public InternalHandler() { + super(EventRunner.create()); + } + + public InternalHandler(EventRunner runner) throws IllegalArgumentException { + super(runner); + } + + @Override + protected void processEvent(InnerEvent event) { + super.processEvent(event); + LogUtil.e("网络请求接收==" + event + "," + event.eventId); + if (event.object instanceof TaskProxy) { + taskProxy = (TaskProxy) event.object; + } else if (event.object instanceof ArgsObj) { + ArgsObj argsObj = (ArgsObj) event.object; + taskProxy = argsObj.taskProxy; + args = argsObj.args; + } + if (taskProxy == null) { + throw new RuntimeException("msg.obj not instanceof TaskProxy"); + } + + try { + switch (event.eventId) { + case MSG_WHAT_ON_WAITING: { + taskProxy.task.onWaiting(); + break; + } + case MSG_WHAT_ON_START: { + taskProxy.task.onStarted(); + break; + } + case MSG_WHAT_ON_SUCCESS: { + taskProxy.task.onSuccess(taskProxy.getResult()); + break; + } + case MSG_WHAT_ON_ERROR: { + assert args != null; + Throwable throwable = (Throwable) args[0]; + LogUtil.d(throwable.getMessage(), throwable); + taskProxy.task.onError(throwable, false); + break; + } + case MSG_WHAT_ON_UPDATE: { + taskProxy.task.onUpdate((int) event.param, args); + break; + } + case MSG_WHAT_ON_CANCEL: { + if (taskProxy.callOnCanceled) { + return; + } + taskProxy.callOnCanceled = true; + assert args != null; + taskProxy.task.onCancelled((Callback.CancelledException) args[0]); + break; + } + case MSG_WHAT_ON_FINISHED: { + if (taskProxy.callOnFinished) { + return; + } + taskProxy.callOnFinished = true; + taskProxy.task.onFinished(); + break; + } + default: { + break; + } + } + } catch (Throwable ex) { + taskProxy.setState(State.ERROR); + if (event.eventId != MSG_WHAT_ON_ERROR) { + taskProxy.task.onError(ex, true); + } else if (x.isDebug()) { + throw new RuntimeException(ex); + } + } + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/DensityUtil.java b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/DensityUtil.java new file mode 100644 index 0000000..d8b7e4c --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/DensityUtil.java @@ -0,0 +1,47 @@ +package com.wordplat.quickstart.xutils.common.util; + +/** + * DensityUtil + * + * @since 2021-05-08 + */ +public final class DensityUtil { + private static float density = -1F; + private static int widthPixels = -1; + private static int heightPixels = -1; + + private DensityUtil() { + } + +/** + * // public static float getDensity() { + * // if (density <= 0F) { + * // density = x.app().getResources().getDisplayMetrics().density; + * // } + * // return density; + * // } + * // + * // public static int dip2px(float dpValue) { + * // return (int) (dpValue * getDensity() + 0.5F); + * // } + * // + * // public static int px2dip(float pxValue) { + * // return (int) (pxValue / getDensity() + 0.5F); + * // } + * // + * // public static int getScreenWidth() { + * // if (widthPixels <= 0) { + * // widthPixels = x.app().getResources().getDisplayMetrics().widthPixels; + * // } + * // return widthPixels; + * // } + * // + * // + * // public static int getScreenHeight() { + * // if (heightPixels <= 0) { + * // heightPixels = x.app().getResources().getDisplayMetrics().heightPixels; + * // } + * // return heightPixels; + * // } + */ +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/DoubleKeyValueMap.java b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/DoubleKeyValueMap.java new file mode 100644 index 0000000..edc6547 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/DoubleKeyValueMap.java @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.common.util; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Created with IntelliJ IDEA. + * User: wyouflf + * Date: 13-6-19 + * Time: PM 1:18 + * + * @param k1 + * @param k2 + * @param v + * @since 2021-05-08 + */ +public class DoubleKeyValueMap { + private final ConcurrentHashMap> k1ConcurrentHashMapConcurrentHashMap; + + /** + * DoubleKeyValueMap + */ + public DoubleKeyValueMap() { + this.k1ConcurrentHashMapConcurrentHashMap = new ConcurrentHashMap>(); + } + + /** + * put + * + * @param key1 + * @param key2 + * @param value + */ + public void put(K1 key1, K2 key2, V value) { + if (key1 == null || key2 == null || value == null) { + return; + } + if (k1ConcurrentHashMapConcurrentHashMap.containsKey(key1)) { + ConcurrentHashMap concurrentHashMap = k1ConcurrentHashMapConcurrentHashMap.get(key1); + if (concurrentHashMap != null) { + concurrentHashMap.put(key2, value); + } else { + concurrentHashMap = new ConcurrentHashMap(); + concurrentHashMap.put(key2, value); + k1ConcurrentHashMapConcurrentHashMap.put(key1, concurrentHashMap); + } + } else { + ConcurrentHashMap hashMap = new ConcurrentHashMap(); + hashMap.put(key2, value); + k1ConcurrentHashMapConcurrentHashMap.put(key1, hashMap); + } + } + + public Set getFirstKeys() { + return k1ConcurrentHashMapConcurrentHashMap.keySet(); + } + + /** + * get + * + * @param key1 + * @return ConcurrentHashMap + */ + public ConcurrentHashMap get(K1 key1) { + return k1ConcurrentHashMapConcurrentHashMap.get(key1); + } + + /** + * get + * + * @param key1 + * @param key2 + * @return V + */ + public V get(K1 key1, K2 key2) { + ConcurrentHashMap map = k1ConcurrentHashMapConcurrentHashMap.get(key1); + return map == null ? null : map.get(key2); + } + + /** + * getAllValues + * + * @param key1 + * @return Collection + */ + public Collection getAllValues(K1 key1) { + ConcurrentHashMap hashMap = k1ConcurrentHashMapConcurrentHashMap.get(key1); + return hashMap == null ? null : hashMap.values(); + } + + /** + * getAllValues + * + * @return Collection + */ + public Collection getAllValues() { + Collection result = null; + Set k1Set = k1ConcurrentHashMapConcurrentHashMap.keySet(); + if (k1Set != null) { + result = new ArrayList(); + for (K1 k1 : k1Set) { + ConcurrentHashMap value1 = k1ConcurrentHashMapConcurrentHashMap.get(k1); + if (value1 != null) { + Collection values = value1.values(); + if (values != null) { + result.addAll(values); + } + } + } + } + return result; + } + + /** + * containsKey + * + * @param key1 + * @param key2 + * @return boolean + */ + public boolean containsKey(K1 key1, K2 key2) { + if (k1ConcurrentHashMapConcurrentHashMap.containsKey(key1)) { + ConcurrentHashMap value1 = k1ConcurrentHashMapConcurrentHashMap.get(key1); + if (value1 != null) { + return value1.containsKey(key2); + } + } + return false; + } + + /** + * containsKey + * + * @param key1 + * @return boolean + */ + public boolean containsKey(K1 key1) { + return k1ConcurrentHashMapConcurrentHashMap.containsKey(key1); + } + + /** + * size + * + * @return int + */ + public int size() { + if (k1ConcurrentHashMapConcurrentHashMap.size() == 0) { + return 0; + } + int result = 0; + for (ConcurrentHashMap hashMap : k1ConcurrentHashMapConcurrentHashMap.values()) { + result += hashMap.size(); + } + return result; + } + + /** + * remove + * + * @param key1 + */ + public void remove(K1 key1) { + k1ConcurrentHashMapConcurrentHashMap.remove(key1); + } + + /** + * remove + * + * @param key1 + * @param key2 + */ + public void remove(K1 key1, K2 key2) { + ConcurrentHashMap hashMap = k1ConcurrentHashMapConcurrentHashMap.get(key1); + if (hashMap != null) { + hashMap.remove(key2); + } + if (hashMap == null || hashMap.isEmpty()) { + k1ConcurrentHashMapConcurrentHashMap.remove(key1); + } + } + + /** + * clear + */ + public void clear() { + if (k1ConcurrentHashMapConcurrentHashMap.size() > 0) { + for (ConcurrentHashMap hashMap : k1ConcurrentHashMapConcurrentHashMap.values()) { + hashMap.clear(); + } + k1ConcurrentHashMapConcurrentHashMap.clear(); + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/FileUtil.java b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/FileUtil.java new file mode 100644 index 0000000..fe8d194 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/FileUtil.java @@ -0,0 +1,171 @@ +package com.wordplat.quickstart.xutils.common.util; + +import com.wordplat.quickstart.xutils.x; + +import ohos.app.Environment; +import ohos.data.usage.DataUsage; +import ohos.data.usage.StatVfs; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +/** + * FileUtil + * + * @since 2021-05-08 + */ +public class FileUtil { + private FileUtil() { + } + + /** + * getCacheDir + * + * @param dirName + * @return File + */ + public static File getCacheDir(String dirName) { + File result = null; + if (isDiskAvailable()) { + File cacheDir = x.app().getExternalCacheDir(); + if (cacheDir != null) { + result = new File(cacheDir, dirName); + } + } + if (result == null) { + result = new File(x.app().getCacheDir(), dirName); + } + if (result.exists() || result.mkdirs()) { + return result; + } else { + return null; + } + } + + /** + * 检查磁盘空间是否大于10mb + * + * @return true 大于 + */ + public static boolean isDiskAvailable() { + long size = getDiskAvailableSize(); + return size > 10 * 1024 * 1024L; // > 10bm + } + + /** + * getDiskAvailableSize + * + * @return long + */ + public static long getDiskAvailableSize() { + if (!existsSdcard()) { + return 0; + } + File path = new File(Environment.DIRECTORY_DOWNLOADS); // 取得sdcard文件路径 + StatVfs stat = null; + try { + stat = new StatVfs(path.getCanonicalPath()); + } catch (IOException e) { + LogUtil.e("error:" + e); + } + long blockSize = 0; + long availableBlocks = 0; + blockSize = stat.getSpace(); + availableBlocks = stat.getAvailableSpace(); + return availableBlocks * blockSize; + } + + /** + * existsSdcard + * + * @return Boolean + */ + public static Boolean existsSdcard() { + return DataUsage.isDiskEmulated(); + } + + /** + * getFileOrDirSize + * + * @param file + * @return long + */ + public static long getFileOrDirSize(File file) { + if (!file.exists()) { + return 0; + } + if (!file.isDirectory()) { + return file.length(); + } + + long length = 0; + File[] list = file.listFiles(); + if (list != null) { // 文件夹被删除时, 子文件正在被写入, 文件属性异常返回null. + for (File item : list) { + length += getFileOrDirSize(item); + } + } + + return length; + } + + /** + * 复制文件到指定文件 + * + * @param fromPath 源文件 + * @param toPath 复制到的文件 + * @return true 成功,false 失败 + */ + public static boolean copy(String fromPath, String toPath) { + boolean result = false; + File from = new File(fromPath); + if (!from.exists()) { + return result; + } + + File toFile = new File(toPath); + IOUtil.deleteFileOrDir(toFile); + File toDir = toFile.getParentFile(); + if (toDir.exists() || toDir.mkdirs()) { + FileInputStream in = null; + FileOutputStream out = null; + try { + in = new FileInputStream(from); + out = new FileOutputStream(toFile); + IOUtil.copy(in, out); + result = true; + } catch (Throwable ex) { + LogUtil.d(ex.getMessage(), ex); + result = false; + } finally { + IOUtil.closeQuietly(in); + IOUtil.closeQuietly(out); + } + } + return result; + } + + /** + * deleteFileOrDir + * + * @param path + * @return boolean + */ + public static boolean deleteFileOrDir(File path) { + if (path == null || !path.exists()) { + return true; + } + if (path.isFile()) { + return path.delete(); + } + File[] files = path.listFiles(); + if (files != null) { + for (File file : files) { + deleteFileOrDir(file); + } + } + return path.delete(); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/IOUtil.java b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/IOUtil.java new file mode 100644 index 0000000..b478d0d --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/IOUtil.java @@ -0,0 +1,202 @@ +package com.wordplat.quickstart.xutils.common.util; + +import ohos.data.resultset.ResultSet; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.ByteArrayOutputStream; +import java.io.Closeable; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Reader; +import java.io.Writer; + +/** + * IOUtil + * + * @since 2021-05-08 + */ +public class IOUtil { + private IOUtil() { + } + + /** + * closeQuietly + * + * @param closeable + */ + public static void closeQuietly(Closeable closeable) { + if (closeable != null) { + try { + closeable.close(); + } catch (Throwable ex) { + LogUtil.d(ex.getMessage(), ex); + } + } + } + + /** + * closeQuietly + * + * @param cursor + */ + public static void closeQuietly(ResultSet cursor) { + if (cursor != null) { + try { + cursor.close(); + } catch (Throwable ex) { + LogUtil.d(ex.getMessage(), ex); + } + } + } + + /** + * readBytes + * + * @param in + * @return byte + * @throws IOException + */ + public static byte[] readBytes(InputStream in) throws IOException { + if (!(in instanceof BufferedInputStream)) { + in = new BufferedInputStream(in); + } + ByteArrayOutputStream out = null; + try { + out = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int len; + while ((len = in.read(buf)) != -1) { + out.write(buf, 0, len); + } + return out.toByteArray(); + } finally { + closeQuietly(out); + } + } + + /** + * readBytes + * + * @param in + * @param skip + * @param size + * @return byte + * @throws IOException + */ + public static byte[] readBytes(InputStream in, long skip, int size) throws IOException { + byte[] result = null; + if (skip > 0) { + long skipped = 0; + while (skip > 0 && (skipped = in.skip(skip)) > 0) { + skip -= skipped; + } + } + result = new byte[size]; + for (int i = 0; i < size; i++) { + result[i] = (byte) in.read(); + } + return result; + } + + /** + * readStr + * + * @param in + * @return String + * @throws IOException + */ + public static String readStr(InputStream in) throws IOException { + return readStr(in, "UTF-8"); + } + + /** + * readStr + * + * @param in + * @param charset + * @return String + * @throws IOException + */ + public static String readStr(InputStream in, String charset) throws IOException { + if (TextUtils.isEmpty(charset)) { + charset = "UTF-8"; + } + + if (!(in instanceof BufferedInputStream)) { + in = new BufferedInputStream(in); + } + Reader reader = new InputStreamReader(in, charset); + StringBuilder sb = new StringBuilder(); + char[] buf = new char[1024]; + int len; + while ((len = reader.read(buf)) >= 0) { + sb.append(buf, 0, len); + } + return sb.toString(); + } + + /** + * writeStr + * + * @param out + * @param str + * @throws IOException + */ + public static void writeStr(OutputStream out, String str) throws IOException { + writeStr(out, str, "UTF-8"); + } + + /** + * writeStr + * + * @param out + * @param str + * @param charset + * @throws IOException + */ + public static void writeStr(OutputStream out, String str, String charset) throws IOException { + if (TextUtils.isEmpty(charset)) { + charset = "UTF-8"; + } + Writer writer = new OutputStreamWriter(out, charset); + writer.write(str); + writer.flush(); + } + + /** + * copy + * + * @param in + * @param out + * @throws IOException + */ + public static void copy(InputStream in, OutputStream out) throws IOException { + if (!(in instanceof BufferedInputStream)) { + in = new BufferedInputStream(in); + } + if (!(out instanceof BufferedOutputStream)) { + out = new BufferedOutputStream(out); + } + int len = 0; + byte[] buffer = new byte[1024]; + while ((len = in.read(buffer)) != -1) { + out.write(buffer, 0, len); + } + out.flush(); + } + + /** + * deleteFileOrDir + * + * @param path + * @return boolean + */ + public static boolean deleteFileOrDir(File path) { + return FileUtil.deleteFileOrDir(path); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/KeyValue.java b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/KeyValue.java new file mode 100644 index 0000000..f044ac8 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/KeyValue.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.common.util; + +/** + * KeyValue + * + * @since 2021-05-08 + */ +public class KeyValue { + /** + * key + */ + public final String key; + /** + * value + */ + public final Object value; + + /** + * KeyValue + * + * @param key + * @param value + */ + public KeyValue(String key, Object value) { + this.key = key; + this.value = value; + } + + public String getValueStrOrEmpty() { + return value == null ? "" : value.toString(); + } + + public String getValueStrOrNull() { + return value == null ? null : value.toString(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + + KeyValue keyValue = (KeyValue) obj; + + return key == null ? keyValue.key == null : key.equals(keyValue.key); + } + + @Override + public int hashCode() { + return key != null ? key.hashCode() : 0; + } + + @Override + public String toString() { + return "KeyValue{" + "key='" + key + '\'' + ", value=" + value + '}'; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/LogUtil.java b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/LogUtil.java new file mode 100644 index 0000000..09af657 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/LogUtil.java @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.common.util; + +import ohos.hiviewdfx.HiLog; +import ohos.hiviewdfx.HiLogLabel; + +import com.wordplat.quickstart.xutils.x; + +import java.util.Locale; + +/** + * tag自动产生,格式: customTagPrefix:className.methodName(L:lineNumber), + * customTagPrefix为空时只输出:className.methodName(L:lineNumber)。 + * Author: wyouflf + * Date: 13-7-24 + * Time: 下午12:23 + * + * @since 2021-05-08 + */ +public class LogUtil { + private static String customTagPrefix = "x_log"; + private static final String TAG_LOG = "LogUtil"; + + private static final int DOMAIN_ID = 0xD000F00; + + private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, DOMAIN_ID, LogUtil.TAG_LOG); + private static final String LOG_FORMAT = "%{public}s: %{public}s"; + + private LogUtil() { + } + + private static String generateTag() { + StackTraceElement caller = new Throwable().getStackTrace()[2]; + String tag = "%s.%s(L:%d)"; + String callerClazzName = caller.getClassName(); + callerClazzName = callerClazzName.substring(callerClazzName.lastIndexOf(".") + 1); + tag = String.format(Locale.getDefault(), tag, callerClazzName, caller.getMethodName(), caller.getLineNumber()); + tag = TextUtils.isEmpty(customTagPrefix) ? tag : customTagPrefix + ":" + tag; + return tag; + } + + /** + * d + * + * @param content + */ + public static void d(String content) { + if (!x.isDebug() || TextUtils.isEmpty(content)) { + return; + } + String tag = generateTag(); + + HiLog.info(LABEL_LOG, LOG_FORMAT, tag, content); + } + + /** + * d + * + * @param content + * @param tr + */ + public static void d(String content, Throwable tr) { + if (!x.isDebug() || TextUtils.isEmpty(content)) { + return; + } + String tag = generateTag(); + HiLog.info(LABEL_LOG, LOG_FORMAT, tag, content); + } + + /** + * e + * + * @param content + */ + public static void e(String content) { + if (!x.isDebug() || TextUtils.isEmpty(content)) { + return; + } + String tag = generateTag(); + HiLog.error(LABEL_LOG, LOG_FORMAT, tag, content); + } + + /** + * e + * + * @param content + * @param tr + */ + public static void e(String content, Throwable tr) { + if (!x.isDebug() || TextUtils.isEmpty(content)) { + return; + } + String tag = generateTag(); + HiLog.error(LABEL_LOG, LOG_FORMAT, tag, content); + } + + /** + * i + * + * @param content + */ + public static void i(String content) { + if (!x.isDebug() || TextUtils.isEmpty(content)) { + return; + } + String tag = generateTag(); + HiLog.info(LABEL_LOG, LOG_FORMAT, tag, content); + } + + /** + * i + * + * @param content + * @param tr + */ + public static void i(String content, Throwable tr) { + if (!x.isDebug() || TextUtils.isEmpty(content)) { + return; + } + String tag = generateTag(); + HiLog.info(LABEL_LOG, LOG_FORMAT, tag, content); + } + + /** + * v + * + * @param content + */ + public static void v(String content) { + if (!x.isDebug() || TextUtils.isEmpty(content)) { + return; + } + String tag = generateTag(); + HiLog.info(LABEL_LOG, LOG_FORMAT, tag, content); + } + + /** + * v + * + * @param content + * @param tr + */ + public static void v(String content, Throwable tr) { + if (!x.isDebug() || TextUtils.isEmpty(content)) { + return; + } + String tag = generateTag(); + HiLog.info(LABEL_LOG, LOG_FORMAT, tag, content); + } + + /** + * w + * + * @param content + */ + public static void w(String content) { + if (!x.isDebug() || TextUtils.isEmpty(content)) { + return; + } + String tag = generateTag(); + HiLog.info(LABEL_LOG, LOG_FORMAT, tag, content); + } + + /** + * w + * + * @param content + * @param tr + */ + public static void w(String content, Throwable tr) { + if (!x.isDebug() || TextUtils.isEmpty(content)) { + return; + } + String tag = generateTag(); + HiLog.info(LABEL_LOG, LOG_FORMAT, tag, content); + } + + /** + * w + * + * @param tr + */ + public static void w(Throwable tr) { + if (!x.isDebug()) { + return; + } + String tag = generateTag(); + HiLog.info(LABEL_LOG, LOG_FORMAT, tag, tr); + } + + /** + * wtf + * + * @param content + */ + public static void wtf(String content) { + if (!x.isDebug() || TextUtils.isEmpty(content)) { + return; + } + String tag = generateTag(); + HiLog.info(LABEL_LOG, LOG_FORMAT, tag, content); + } + + /** + * wtf + * + * @param content + * @param tr + */ + public static void wtf(String content, Throwable tr) { + if (!x.isDebug() || TextUtils.isEmpty(content)) { + return; + } + String tag = generateTag(); + HiLog.info(LABEL_LOG, LOG_FORMAT, tag, content); + } + + /** + * wtf + * + * @param tr + */ + public static void wtf(Throwable tr) { + if (!x.isDebug()) { + return; + } + String tag = generateTag(); + HiLog.info(LABEL_LOG, LOG_FORMAT, tag, tr); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/MD5.java b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/MD5.java new file mode 100644 index 0000000..9735ca4 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/MD5.java @@ -0,0 +1,92 @@ +package com.wordplat.quickstart.xutils.common.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.nio.MappedByteBuffer; +import java.nio.channels.FileChannel; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * \ + * MD5 + * + * @since 2021-05-08 + */ +public final class MD5 { + private static final char[] CHARS = + {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + + private MD5() { + } + + /** + * toHexString + * + * @param bytes + * @return String + */ + public static String toHexString(byte[] bytes) { + if (bytes == null) { + return ""; + } + StringBuilder hex = new StringBuilder(bytes.length * 2); + for (byte b : bytes) { + hex.append(CHARS[(b >> 4) & 0x0F]); + hex.append(CHARS[b & 0x0F]); + } + return hex.toString(); + } + + /** + * md5 + * + * @param file + * @return String + * @throws IOException + * @throws RuntimeException + */ + public static String md5(File file) throws IOException { + MessageDigest messagedigest = null; + FileInputStream in = null; + FileChannel ch = null; + byte[] encodeBytes = null; + try { + messagedigest = MessageDigest.getInstance("MD5"); + in = new FileInputStream(file); + ch = in.getChannel(); + MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length()); + messagedigest.update(byteBuffer); + encodeBytes = messagedigest.digest(); + } catch (NoSuchAlgorithmException neverHappened) { + throw new RuntimeException(neverHappened); + } finally { + IOUtil.closeQuietly(in); + IOUtil.closeQuietly(ch); + } + + return toHexString(encodeBytes); + } + + /** + * md5 + * + * @param string + * @return String + * @throws RuntimeException + */ + public static String md5(String string) { + byte[] encodeBytes = null; + try { + encodeBytes = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8")); + } catch (NoSuchAlgorithmException neverHappened) { + throw new RuntimeException(neverHappened); + } catch (UnsupportedEncodingException neverHappened) { + throw new RuntimeException(neverHappened); + } + + return toHexString(encodeBytes); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/ParameterizedTypeUtil.java b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/ParameterizedTypeUtil.java new file mode 100644 index 0000000..6e27d28 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/ParameterizedTypeUtil.java @@ -0,0 +1,102 @@ +package com.wordplat.quickstart.xutils.common.util; + +import java.lang.reflect.Array; +import java.lang.reflect.GenericArrayType; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.lang.reflect.TypeVariable; + +/** + * ParameterizedTypeUtil + * + * @since 2021-05-08 + */ +public class ParameterizedTypeUtil { + private ParameterizedTypeUtil() { + } + + /** + * getParameterizedType + * + * @param ownerType + * @param declaredClass + * @param paramIndex + * @return Type + * @throws IllegalArgumentException + */ + public static Type getParameterizedType( + final Type ownerType, + final Class declaredClass, + int paramIndex) { + Class clazz = null; + ParameterizedType pt = null; + Type[] ats = null; + TypeVariable[] tps = null; + if (ownerType instanceof ParameterizedType) { + pt = (ParameterizedType) ownerType; + clazz = (Class) pt.getRawType(); + ats = pt.getActualTypeArguments(); + tps = clazz.getTypeParameters(); + } else { + clazz = (Class) ownerType; + } + if (declaredClass == clazz) { + if (ats != null) { + return ats[paramIndex]; + } + return Object.class; + } + + Type[] types = clazz.getGenericInterfaces(); + if (types != null) { + for (int i = 0; i < types.length; i++) { + Type t = types[i]; + if (t instanceof ParameterizedType) { + Class cls = (Class) ((ParameterizedType) t).getRawType(); + if (declaredClass.isAssignableFrom(cls)) { + try { + return getTrueType(getParameterizedType(t, declaredClass, paramIndex), tps, ats); + } catch (Throwable ex) { + LogUtil.w(ex.getMessage(), ex); + } + } + } + } + } + + Class superClass = clazz.getSuperclass(); + if (superClass != null) { + if (declaredClass.isAssignableFrom(superClass)) { + return getTrueType( + getParameterizedType(clazz.getGenericSuperclass(), + declaredClass, paramIndex), tps, ats); + } + } + throw new IllegalArgumentException("FindGenericType:" + ownerType + + ", declaredClass: " + declaredClass + ", index: " + paramIndex); + } + + private static Type getTrueType( + Type type, + TypeVariable[] typeVariables, + Type[] actualTypes) { + if (type instanceof TypeVariable) { + TypeVariable tv = (TypeVariable) type; + String name = tv.getName(); + if (actualTypes != null) { + for (int i = 0; i < typeVariables.length; i++) { + if (name.equals(typeVariables[i].getName())) { + return actualTypes[i]; + } + } + } + return tv; + } else if (type instanceof GenericArrayType) { + Type ct = ((GenericArrayType) type).getGenericComponentType(); + if (ct instanceof Class) { + return Array.newInstance((Class) ct, 0).getClass(); + } + } + return type; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/ProcessLock.java b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/ProcessLock.java new file mode 100644 index 0000000..53d7ac8 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/ProcessLock.java @@ -0,0 +1,257 @@ +package com.wordplat.quickstart.xutils.common.util; + +import ohos.app.Context; + +import java.io.Closeable; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; +import java.text.DecimalFormat; +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import com.wordplat.quickstart.xutils.x; + +/** + * 进程间锁, 仅在同一个应用中有效. + * + * @since 2021-05-08 + */ +public final class ProcessLock implements Closeable { + + private static final String LOCK_FILE_DIR = "process_lock"; + /** + * key1: lockName + * key2: fileLock.hashCode() + */ + private static final DoubleKeyValueMap LOCK_MAP = new DoubleKeyValueMap(); + private static final DecimalFormat FORMAT = new DecimalFormat("0.##################"); + private final String mLockName; + private final FileLock mFileLock; + private final File mFile; + private final Closeable mStream; + private final boolean mWriteMode; + + static { + File dir = x.app().getDir(LOCK_FILE_DIR, Context.MODE_PRIVATE); + IOUtil.deleteFileOrDir(dir); + } + + private ProcessLock(String lockName, File file, FileLock fileLock, Closeable stream, boolean writeMode) { + mLockName = lockName; + mFileLock = fileLock; + mFile = file; + mStream = stream; + mWriteMode = writeMode; + } + + /** + * isValid + * + * @param fileLock + * @return + */ + private static boolean isValid(FileLock fileLock) { + return fileLock != null && fileLock.isValid(); + } + + /** + * release + * + * @param lockName + * @param fileLock + * @param file + * @param stream + */ + private static void release(String lockName, FileLock fileLock, File file, Closeable stream) { + synchronized (LOCK_MAP) { + if (fileLock != null) { + try { + LOCK_MAP.remove(lockName, fileLock.hashCode()); + ConcurrentHashMap locks = LOCK_MAP.get(lockName); + if (locks == null || locks.isEmpty()) { + IOUtil.deleteFileOrDir(file); + } + + if (fileLock.channel().isOpen()) { + fileLock.release(); + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } finally { + IOUtil.closeQuietly(fileLock.channel()); + } + } + + IOUtil.closeQuietly(stream); + + LOCK_MAP.notifyAll(); + } + } + + /** + * tryLock + * + * @param lockName + * @param writeMode + * @return ProcessLock + */ + public static ProcessLock tryLock(final String lockName, final boolean writeMode) { + return tryLockInternal(lockName, customHash(lockName), writeMode); + } + + /** + * tryLock + * + * @param lockName + * @param writeMode + * @param maxWaitTimeMillis + * @return ProcessLock + * @throws InterruptedException + */ + public static ProcessLock tryLock(final String lockName, final boolean writeMode, final long maxWaitTimeMillis) throws InterruptedException { + ProcessLock lock = null; + long expiryTime = System.currentTimeMillis() + maxWaitTimeMillis; + String hash = customHash(lockName); + synchronized (LOCK_MAP) { + while (System.currentTimeMillis() < expiryTime) { + lock = tryLockInternal(lockName, hash, writeMode); + if (lock != null) { + break; + } else { + try { + LOCK_MAP.wait(10); + } catch (InterruptedException iex) { + throw iex; + } catch (Throwable ignored) { + LogUtil.e("error:" + ignored); + } + } + } + } + + return lock; + } + + /** + * isValid + * + * @return boolean + */ + public boolean isValid() { + return isValid(mFileLock); + } + + /** + * release + */ + public void release() { + release(mLockName, mFileLock, mFile, mStream); + } + + @Override + public void close() throws IOException { + release(); + } + + /** + * 取得字符串的自定义hash值, 尽量保证255字节内的hash不重复. + * + * @param str + * @return + */ + private static String customHash(String str) { + if (TextUtils.isEmpty(str)) { + return "0"; + } + double hash = 0.0; + byte[] bytes = str.getBytes(); + for (int i = 0; i < str.length(); i++) { + hash = (255.0 * hash + bytes[i]) * 0.005; + } + return FORMAT.format(hash); + } + + private static ProcessLock tryLockInternal(final String lockName, final String hash, final boolean writeMode) { + synchronized (LOCK_MAP) { + ConcurrentHashMap locks = LOCK_MAP.get(lockName); + if (locks != null && !locks.isEmpty()) { + Iterator> itr = locks.entrySet().iterator(); + while (itr.hasNext()) { + Map.Entry entry = itr.next(); + ProcessLock value = entry.getValue(); + if (value != null) { + if (!value.isValid()) { + itr.remove(); + } else if (writeMode) { + return null; + } else if (value.mWriteMode) { + return null; + } + } else { + itr.remove(); + } + } + } + + FileChannel channel = null; + Closeable stream = null; + try { + File file = new File( + x.app().getDir(LOCK_FILE_DIR, Context.MODE_PRIVATE), + hash); + if (file.exists() || file.createNewFile()) { + if (writeMode) { + FileOutputStream out = new FileOutputStream(file, false); + channel = out.getChannel(); + stream = out; + } else { + FileInputStream in = new FileInputStream(file); + channel = in.getChannel(); + stream = in; + } + if (channel != null) { + FileLock fileLock = channel.tryLock(0L, Long.MAX_VALUE, !writeMode); + if (isValid(fileLock)) { + ProcessLock result = new ProcessLock(lockName, file, fileLock, stream, writeMode); + LOCK_MAP.put(lockName, fileLock.hashCode(), result); + return result; + } else { + release(lockName, fileLock, file, stream); + } + } else { + throw new IOException("can not get file channel:" + file.getCanonicalPath()); + } + } + } catch (Throwable ex) { + LogUtil.d("tryLock: " + lockName + ", " + ex.getMessage()); + IOUtil.closeQuietly(stream); + IOUtil.closeQuietly(channel); + } + + LOCK_MAP.notifyAll(); + } + + return null; + } + + @Override + public String toString() { + return mLockName + ": " + mFile.getName(); + } + + /** + * finalize + * + * @throws Throwable + */ + @Override + protected void finalize() throws Throwable { + super.finalize(); + this.release(); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/TextUtils.java b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/TextUtils.java new file mode 100644 index 0000000..cee5378 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/TextUtils.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.common.util; + +import java.util.Iterator; + +/** + * TextUtils + * + * @since 2021-05-08 + */ +public class TextUtils { + private TextUtils() { + } + + /** + * isEmpty + * + * @param str + * @return boolean + */ + public static boolean isEmpty(String str) { + return str == null || str.length() == 0; + } + + /** + * join + * + * @param delimiter + * @param tokens + * @return String + */ + public static String join(CharSequence delimiter, Object[] tokens) { + final int length = tokens.length; + if (length == 0) { + return ""; + } + final StringBuilder sb = new StringBuilder(); + sb.append(tokens[0]); + for (int number = 1; number < length; number++) { + sb.append(delimiter); + sb.append(tokens[number]); + } + return sb.toString(); + } + + /** + * join + * + * @param delimiter + * @param tokens + * @return String + */ + public static String join(CharSequence delimiter, Iterable tokens) { + final Iterator it = tokens.iterator(); + if (!it.hasNext()) { + return ""; + } + final StringBuilder sb = new StringBuilder(); + sb.append(it.next()); + while (it.hasNext()) { + sb.append(delimiter); + sb.append(it.next()); + } + return sb.toString(); + } + + /** + * isDigitsOnly + * + * @param str + * @return boolean + */ + public static boolean isDigitsOnly(CharSequence str) { + final int len = str.length(); + for (int cp, number = 0; number < len; number += Character.charCount(cp)) { + cp = Character.codePointAt(str, number); + if (!Character.isDigit(cp)) { + return false; + } + } + return true; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/URLUtil.java b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/URLUtil.java new file mode 100644 index 0000000..3789f71 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/common/util/URLUtil.java @@ -0,0 +1,318 @@ +package com.wordplat.quickstart.xutils.common.util; + +import java.io.UnsupportedEncodingException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * URLUtil + * + * @since 2021-05-08 + */ +public final class URLUtil { + private static final Pattern CONTENT_DISPOSITION_PATTERN = + Pattern.compile("attachment;\\s*filename\\s*=\\s*(\"?)([^\"]*)\\1\\s*$", Pattern.CASE_INSENSITIVE); + + private static final String LOGTAG = "webkit"; + private static final boolean TRACE = false; + /** + * to refer to bar.png under your package's asset/foo/ directory, use + */ + private static final String ASSET_BASE = "file:///ohos_asset/"; + /** + * // to refer to bar.png under your package's res/drawable/ directory, use + * // "file:///ohos_asset/drawable/bar.png". Use "drawable" to refer to + * // "drawable-hdpi" directory as well. + */ + private static final String RESOURCE_BASE = "file:///ohos_asset/"; + private static final String FILE_BASE = "file:"; + private static final String PROXY_BASE = "file:///cookieless_proxy/"; + private static final String CONTENT_BASE = "content:"; + + private URLUtil() { + } + + /** + * composeSearchUrl + * + * @param inQuery + * @param template + * @param queryPlaceHolder + * @return String + */ + public static String composeSearchUrl(String inQuery, String template, + String queryPlaceHolder) { + int placeHolderIndex = template.indexOf(queryPlaceHolder); + if (placeHolderIndex < 0) { + return null; + } + + String query; + StringBuilder buffer = new StringBuilder(); + buffer.append(template.substring(0, placeHolderIndex)); + + try { + query = java.net.URLEncoder.encode(inQuery, "utf-8"); + buffer.append(query); + } catch (UnsupportedEncodingException ex) { + return null; + } + + buffer.append(template.substring( + placeHolderIndex + queryPlaceHolder.length())); + + return buffer.toString(); + } + + /** + * decode + * + * @param url + * @return byte + * @throws IllegalArgumentException + */ + public static byte[] decode(byte[] url) throws IllegalArgumentException { + if (url.length == 0) { + return new byte[0]; + } + + // Create a new byte array with the same length to ensure capacity + byte[] tempData = new byte[url.length]; + + int tempCount = 0; + for (int i = 0; i < url.length; i++) { + byte b = url[i]; + if (b == '%') { + if (url.length - i > 2) { + b = (byte) (parseHex(url[i + 1]) * 16 + + parseHex(url[i + 2])); + i += 2; + } else { + throw new IllegalArgumentException("Invalid format"); + } + } + tempData[tempCount++] = b; + } + byte[] retData = new byte[tempCount]; + System.arraycopy(tempData, 0, retData, 0, tempCount); + return retData; + } + + /** + * verifyURLEncoding + * + * @param url + * @return boolean + */ + static boolean verifyURLEncoding(String url) { + int count = url.length(); + if (count == 0) { + return false; + } + + int index = url.indexOf('%'); + while (index >= 0 && index < count) { + if (index < count - 2) { + try { + parseHex((byte) url.charAt(++index)); + parseHex((byte) url.charAt(++index)); + } catch (IllegalArgumentException e) { + return false; + } + } else { + return false; + } + index = url.indexOf('%', index + 1); + } + return true; + } + + private static int parseHex(byte b) { + if (b >= '0' && b <= '9') { + return (b - '0'); + } + if (b >= 'A' && b <= 'F') { + return (b - 'A' + 10); + } + if (b >= 'a' && b <= 'f') { + return (b - 'a' + 10); + } + + throw new IllegalArgumentException("Invalid hex char '" + b + "'"); + } + + /** + * isAssetUrl + * + * @param url + * @return boolean + */ + public static boolean isAssetUrl(String url) { + return (null != url) && url.startsWith(ASSET_BASE); + } + + /** + * isResourceUrl + * + * @param url + * @return boolean + */ + public static boolean isResourceUrl(String url) { + return (null != url) && url.startsWith(RESOURCE_BASE); + } + + /** + * isCookielessProxyUrl + * + * @param url + * @return boolean + */ + @Deprecated + public static boolean isCookielessProxyUrl(String url) { + return (null != url) && url.startsWith(PROXY_BASE); + } + + /** + * isFileUrl + * + * @param url + * @return boolean + */ + public static boolean isFileUrl(String url) { + return (null != url) && (url.startsWith(FILE_BASE) + && !url.startsWith(ASSET_BASE) + && !url.startsWith(PROXY_BASE)); + } + + /** + * isAboutUrl + * + * @param url + * @return boolean + */ + public static boolean isAboutUrl(String url) { + return (null != url) && url.startsWith("about:"); + } + + /** + * isDataUrl + * + * @param url + * @return boolean + */ + public static boolean isDataUrl(String url) { + return (null != url) && url.startsWith("data:"); + } + + /** + * isJavaScriptUrl + * + * @param url + * @return boolean + */ + public static boolean isJavaScriptUrl(String url) { + return (null != url) && url.startsWith("javascript:"); + } + + /** + * isHttpUrl + * + * @param url + * @return boolean + */ + public static boolean isHttpUrl(String url) { + return (null != url) + && (url.length() > 6) + && url.substring(0, 7).equalsIgnoreCase("http://"); + } + + /** + * isHttpsUrl + * + * @param url + * @return boolean + */ + public static boolean isHttpsUrl(String url) { + return (null != url) + && (url.length() > 7) + && url.substring(0, 8).equalsIgnoreCase("https://"); + } + + /** + * isNetworkUrl + * + * @param url + * @return boolean + */ + public static boolean isNetworkUrl(String url) { + if (url == null || url.length() == 0) { + return false; + } + return isHttpUrl(url) || isHttpsUrl(url); + } + + /** + * isContentUrl + * + * @param url + * @return boolean + */ + public static boolean isContentUrl(String url) { + return (null != url) && url.startsWith(CONTENT_BASE); + } + + /** + * isValidUrl + * + * @param url + * @return boolean + */ + public static boolean isValidUrl(String url) { + if (url == null || url.length() == 0) { + return false; + } + + return (isAssetUrl(url) + || isResourceUrl(url) + || isFileUrl(url) + || isAboutUrl(url) + || isHttpUrl(url) + || isHttpsUrl(url) + || isJavaScriptUrl(url) + || isContentUrl(url)); + } + + /** + * stripAnchor + * + * @param url + * @return String + */ + public static String stripAnchor(String url) { + int anchorIndex = url.indexOf('#'); + if (anchorIndex != -1) { + return url.substring(0, anchorIndex); + } + return url; + } + + + /** + * parseContentDisposition + * + * @param contentDisposition + * @return String + */ + static String parseContentDisposition(String contentDisposition) { + try { + Matcher matcher = CONTENT_DISPOSITION_PATTERN.matcher(contentDisposition); + if (matcher.find()) { + return matcher.group(2); + } + } catch (IllegalStateException ex) { + // This function is defined as returning null when it can't parse the header + LogUtil.e("error:" + ex); + } + return null; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/config/DbConfigs.java b/entry/src/main/java/com/wordplat/quickstart/xutils/config/DbConfigs.java new file mode 100644 index 0000000..62650d6 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/config/DbConfigs.java @@ -0,0 +1,66 @@ +package com.wordplat.quickstart.xutils.config; + +import com.wordplat.quickstart.xutils.DbManager; +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.ex.DbException; + +/** + * Created by wyouflf on 15/7/31. + * 全局db配置 + * + * @since 2021-05-09 + */ +public enum DbConfigs { + /** + * HTTP + */ + HTTP(new DbManager.DaoConfig() + .setDbName("xUtils_http_cache.db") + .setDbVersion(2) + .setDbOpenListener(new DbManager.DbOpenListener() { + @Override + public void onDbOpened(DbManager db) { + } + }) + .setDbUpgradeListener(new DbManager.DbUpgradeListener() { + @Override + public void onUpgrade(DbManager db, int oldVersion, int newVersion) { + try { + db.dropDb(); + } catch (DbException ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + })), + /** + * COOKIE + */ + COOKIE(new DbManager.DaoConfig() + .setDbName("xUtils_http_cookie.db") + .setDbVersion(1) + .setDbOpenListener(new DbManager.DbOpenListener() { + @Override + public void onDbOpened(DbManager db) { + } + }) + .setDbUpgradeListener(new DbManager.DbUpgradeListener() { + @Override + public void onUpgrade(DbManager db, int oldVersion, int newVersion) { + try { + db.dropDb(); // 默认删除所有表 + } catch (DbException ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + })); + + private DbManager.DaoConfig config; + + DbConfigs(DbManager.DaoConfig config) { + this.config = config; + } + + public DbManager.DaoConfig getConfig() { + return config; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/CursorUtils.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/CursorUtils.java new file mode 100644 index 0000000..bdc70ec --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/CursorUtils.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.db; + +import com.wordplat.quickstart.xutils.db.table.ColumnEntity; +import com.wordplat.quickstart.xutils.db.table.DbModel; +import com.wordplat.quickstart.xutils.db.table.TableEntity; + +import ohos.data.resultset.ResultSet; + +import java.util.HashMap; + +final class CursorUtils { + private CursorUtils() { + } + + /** + * getEntity + * + * @param table + * @param cursor + * @param + * @return T + * @throws Throwable + */ + public static T getEntity(TableEntity table, final ResultSet cursor) throws Throwable { + T entity = table.createEntity(); + HashMap columnMap = table.getColumnMap(); + int columnCount = cursor.getColumnCount(); + for (int i = 0; i < columnCount; i++) { + String columnName = cursor.getColumnNameForIndex(i); + ColumnEntity column = columnMap.get(columnName); + if (column != null) { + column.setValueFromCursor(entity, cursor, i); + } + } + return entity; + } + + /** + * getDbModel + * + * @param cursor + * @return DbModel + */ + public static DbModel getDbModel(final ResultSet cursor) { + DbModel result = new DbModel(); + int columnCount = cursor.getColumnCount(); + for (int i = 0; i < columnCount; i++) { + result.add(cursor.getColumnNameForIndex(i), cursor.getString(i)); + } + return result; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/DbManagerImpl.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/DbManagerImpl.java new file mode 100644 index 0000000..4b0db4b --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/DbManagerImpl.java @@ -0,0 +1,674 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.db; + +import com.wordplat.quickstart.xutils.DbManager; +import com.wordplat.quickstart.xutils.common.util.IOUtil; +import com.wordplat.quickstart.xutils.common.util.KeyValue; +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.db.sqlite.SqlInfo; +import com.wordplat.quickstart.xutils.db.sqlite.SqlInfoBuilder; +import com.wordplat.quickstart.xutils.db.sqlite.WhereBuilder; +import com.wordplat.quickstart.xutils.db.table.ColumnEntity; +import com.wordplat.quickstart.xutils.db.table.DbBase; +import com.wordplat.quickstart.xutils.db.table.DbModel; +import com.wordplat.quickstart.xutils.db.table.TableEntity; +import com.wordplat.quickstart.xutils.ex.DbException; +import com.wordplat.quickstart.xutils.x; + +import ohos.data.DatabaseHelper; +import ohos.data.rdb.RdbOpenCallback; +import ohos.data.rdb.RdbStore; +import ohos.data.rdb.Statement; +import ohos.data.rdb.StoreConfig; +import ohos.data.resultset.ResultSet; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * checkstyle:RegexpSingleline + */ +public final class DbManagerImpl extends DbBase { + /** + * key: dbName + */ + private static final HashMap DAO_MAP = new HashMap(); + + private RdbStore database; + private DaoConfig daoConfig; + private boolean allowTransaction; + + /** + * DbManagerImpl + * + * @param config + * @throws DbException + */ + private DbManagerImpl(DaoConfig config) throws DbException { + if (config == null) { + throw new IllegalArgumentException("daoConfig may not be null"); + } + + this.daoConfig = config; + this.allowTransaction = config.isAllowTransaction(); + try { + this.database = openOrCreateDatabase(config); + DbOpenListener dbOpenListener = config.getDbOpenListener(); + if (dbOpenListener != null) { + dbOpenListener.onDbOpened(this); + } + } catch (DbException ex) { + /** + * IOUtil.closeQuietly(this.database); + */ + throw ex; + } catch (Throwable ex) { + /** + * IOUtil.closeQuietly(this.database); + */ + throw new DbException(ex.getMessage(), ex); + } + } + + /** + * getInstance + * + * @param daoConfig + * @return DbManager + * @throws DbException + */ + public static synchronized DbManager getInstance(DaoConfig daoConfig) throws DbException { + if (daoConfig == null) { + /** + * 使用默认配置 + */ + daoConfig = new DaoConfig(); + } + + DbManagerImpl dao = DAO_MAP.get(daoConfig); + if (dao == null) { + dao = new DbManagerImpl(daoConfig); + DAO_MAP.put(daoConfig, dao); + } else { + dao.daoConfig = daoConfig; + } + + // update the database if needed + RdbStore database = dao.database; + int oldVersion = database.getVersion(); + int newVersion = daoConfig.getDbVersion(); + if (oldVersion != newVersion) { + if (oldVersion != 0) { + DbUpgradeListener upgradeListener = daoConfig.getDbUpgradeListener(); + if (upgradeListener != null) { + upgradeListener.onUpgrade(dao, oldVersion, newVersion); + } else { + dao.dropDb(); + } + } + database.setVersion(newVersion); + } + + return dao; + } + + @Override + public RdbStore getDatabase() { + return database; + } + + @Override + public DaoConfig getDaoConfig() { + return daoConfig; + } + + /** + * saveOrUpdate + * + * @param entity + * @throws DbException + */ + @Override + public void saveOrUpdate(Object entity) throws DbException { + try { + beginTransaction(); + + if (entity instanceof List) { + List entities = (List) entity; + if (entities.isEmpty()) { + return; + } + TableEntity table = this.getTable(entities.get(0).getClass()); + table.createTableIfNotExists(); + for (Object item : entities) { + saveOrUpdateWithoutTransaction(table, item); + } + } else { + TableEntity table = this.getTable(entity.getClass()); + table.createTableIfNotExists(); + saveOrUpdateWithoutTransaction(table, entity); + } + + setTransactionSuccessful(); + } finally { + endTransaction(); + } + } + + /** + * replace + * + * @param entity + * @throws DbException + */ + @Override + public void replace(Object entity) throws DbException { + try { + beginTransaction(); + + if (entity instanceof List) { + List entities = (List) entity; + if (entities.isEmpty()) { + return; + } + TableEntity table = this.getTable(entities.get(0).getClass()); + table.createTableIfNotExists(); + for (Object item : entities) { + execNonQuery(SqlInfoBuilder.buildReplaceSqlInfo(table, item)); + } + } else { + TableEntity table = this.getTable(entity.getClass()); + table.createTableIfNotExists(); + execNonQuery(SqlInfoBuilder.buildReplaceSqlInfo(table, entity)); + } + + setTransactionSuccessful(); + } finally { + endTransaction(); + } + } + + /** + * save + * + * @param entity + * @throws DbException + */ + @Override + public void save(Object entity) throws DbException { + try { + beginTransaction(); + + if (entity instanceof List) { + List entities = (List) entity; + if (entities.isEmpty()) { + return; + } + TableEntity table = this.getTable(entities.get(0).getClass()); + table.createTableIfNotExists(); + for (Object item : entities) { + execNonQuery(SqlInfoBuilder.buildInsertSqlInfo(table, item)); + } + } else { + TableEntity table = this.getTable(entity.getClass()); + table.createTableIfNotExists(); + execNonQuery(SqlInfoBuilder.buildInsertSqlInfo(table, entity)); + } + + setTransactionSuccessful(); + } finally { + endTransaction(); + } + } + + /** + * saveBindingId + * + * @param entity + * @return boolean + * @throws DbException + */ + @Override + public boolean saveBindingId(Object entity) throws DbException { + boolean result = false; + try { + beginTransaction(); + + if (entity instanceof List) { + List entities = (List) entity; + if (entities.isEmpty()) { + return false; + } + TableEntity table = this.getTable(entities.get(0).getClass()); + table.createTableIfNotExists(); + for (Object item : entities) { + if (!saveBindingIdWithoutTransaction(table, item)) { + throw new DbException("saveBindingId error, transaction will not commit!"); + } + } + } else { + TableEntity table = this.getTable(entity.getClass()); + table.createTableIfNotExists(); + result = saveBindingIdWithoutTransaction(table, entity); + } + + setTransactionSuccessful(); + } finally { + endTransaction(); + } + return result; + } + + /** + * deleteById + * + * @param entityType + * @param idValue + * @throws DbException + */ + @Override + public void deleteById(Class entityType, Object idValue) throws DbException { + TableEntity table = this.getTable(entityType); + if (!table.tableIsExists()) { + return; + } + try { + beginTransaction(); + + execNonQuery(SqlInfoBuilder.buildDeleteSqlInfoById(table, idValue)); + + setTransactionSuccessful(); + } finally { + endTransaction(); + } + } + + @Override + public void delete(Object entity) throws DbException { + try { + beginTransaction(); + + if (entity instanceof List) { + List entities = (List) entity; + if (entities.isEmpty()) { + return; + } + TableEntity table = this.getTable(entities.get(0).getClass()); + if (!table.tableIsExists()) { + return; + } + for (Object item : entities) { + execNonQuery(SqlInfoBuilder.buildDeleteSqlInfo(table, item)); + } + } else { + TableEntity table = this.getTable(entity.getClass()); + if (!table.tableIsExists()) { + return; + } + execNonQuery(SqlInfoBuilder.buildDeleteSqlInfo(table, entity)); + } + + setTransactionSuccessful(); + } finally { + endTransaction(); + } + } + + @Override + public void delete(Class entityType) throws DbException { + delete(entityType, null); + } + + @Override + public int delete(Class entityType, WhereBuilder whereBuilder) throws DbException { + TableEntity table = this.getTable(entityType); + if (!table.tableIsExists()) { + return 0; + } + int result = 0; + try { + beginTransaction(); + + result = executeUpdateDelete(SqlInfoBuilder.buildDeleteSqlInfo(table, whereBuilder)); + + setTransactionSuccessful(); + } finally { + endTransaction(); + } + return result; + } + + @Override + public void update(Object entity, String... updateColumnNames) throws DbException { + try { + beginTransaction(); + + if (entity instanceof List) { + List entities = (List) entity; + if (entities.isEmpty()) { + return; + } + TableEntity table = this.getTable(entities.get(0).getClass()); + if (!table.tableIsExists()) { + return; + } + for (Object item : entities) { + execNonQuery(SqlInfoBuilder.buildUpdateSqlInfo(table, item, updateColumnNames)); + } + } else { + TableEntity table = this.getTable(entity.getClass()); + if (!table.tableIsExists()) { + return; + } + execNonQuery(SqlInfoBuilder.buildUpdateSqlInfo(table, entity, updateColumnNames)); + } + + setTransactionSuccessful(); + } finally { + endTransaction(); + } + } + + @Override + public int update(Class entityType, WhereBuilder whereBuilder, KeyValue... nameValuePairs) throws DbException { + TableEntity table = this.getTable(entityType); + if (!table.tableIsExists()) { + return 0; + } + + int result = 0; + try { + beginTransaction(); + + result = executeUpdateDelete(SqlInfoBuilder.buildUpdateSqlInfo(table, whereBuilder, nameValuePairs)); + + setTransactionSuccessful(); + } finally { + endTransaction(); + } + + return result; + } + + @Override + public T findById(Class entityType, Object idValue) throws DbException { + TableEntity table = this.getTable(entityType); + if (!table.tableIsExists()) { + return null; + } + + Selector selector = Selector.from(table).where(table.getId().getName(), "=", idValue); + String sql = selector.limit(1).toString(); + ResultSet cursor = execQuery(sql); + if (cursor != null) { + try { + if (cursor.goToNextRow()) { + return CursorUtils.getEntity(table, cursor); + } + } catch (Throwable e) { + throw new DbException(e); + } finally { + IOUtil.closeQuietly(cursor); + } + } + return null; + } + + @Override + public T findFirst(Class entityType) throws DbException { + return this.selector(entityType).findFirst(); + } + + @Override + public List findAll(Class entityType) throws DbException { + return this.selector(entityType).findAll(); + } + + @Override + public Selector selector(Class entityType) throws DbException { + return Selector.from(this.getTable(entityType)); + } + + @Override + public DbModel findDbModelFirst(SqlInfo sqlInfo) throws DbException { + ResultSet cursor = execQuery(sqlInfo); + if (cursor != null) { + try { + if (cursor.goToNextRow()) { + return CursorUtils.getDbModel(cursor); + } + } catch (Throwable e) { + throw new DbException(e); + } finally { + IOUtil.closeQuietly(cursor); + } + } + return null; + } + + @Override + public List findDbModelAll(SqlInfo sqlInfo) throws DbException { + List dbModelList = new ArrayList(); + + ResultSet cursor = execQuery(sqlInfo); + if (cursor != null) { + try { + while (cursor.goToNextRow()) { + dbModelList.add(CursorUtils.getDbModel(cursor)); + } + } catch (Throwable e) { + throw new DbException(e); + } finally { + IOUtil.closeQuietly(cursor); + } + } + return dbModelList; + } + + private RdbStore openOrCreateDatabase(DaoConfig config) { + RdbStore result = null; + /** + File dbDir = config.getDbDir(); + if (dbDir != null && (dbDir.exists() || dbDir.mkdirs())) { + File dbFile = new File(dbDir, config.getDbName()); + */ + StoreConfig storeConfig = StoreConfig.newDefaultConfig(config.getDbName()); + RdbOpenCallback callback = new RdbOpenCallback() { + @Override + public void onCreate(RdbStore store) { + } + + @Override + public void onUpgrade(RdbStore store, int oldVersion, int newVersion) { + } + }; + DatabaseHelper helper = new DatabaseHelper(x.app()); + result = helper.getRdbStore(storeConfig, 1, callback, null); + /** + * // } else { + * // result = x.app().op(config.getDbName(), 0, null); + * // } + */ + return result; + } + + private void saveOrUpdateWithoutTransaction(TableEntity table, Object entity) throws DbException { + ColumnEntity id = table.getId(); + if (id.isAutoId()) { + if (id.getColumnValue(entity) != null) { + execNonQuery(SqlInfoBuilder.buildUpdateSqlInfo(table, entity)); + } else { + saveBindingIdWithoutTransaction(table, entity); + } + } else { + execNonQuery(SqlInfoBuilder.buildReplaceSqlInfo(table, entity)); + } + } + + private boolean saveBindingIdWithoutTransaction(TableEntity table, Object entity) throws DbException { + ColumnEntity id = table.getId(); + if (id.isAutoId()) { + execNonQuery(SqlInfoBuilder.buildInsertSqlInfo(table, entity)); + long idValue = getLastAutoIncrementId(table.getName()); + if (idValue == -1) { + return false; + } + id.setAutoIdValue(entity, idValue); + return true; + } else { + execNonQuery(SqlInfoBuilder.buildInsertSqlInfo(table, entity)); + return true; + } + } + + private long getLastAutoIncrementId(String tableName) throws DbException { + long id = -1; + ResultSet cursor = execQuery("SELECT seq FROM sqlite_sequence WHERE name='" + tableName + "' LIMIT 1"); + if (cursor != null) { + try { + if (cursor.goToNextRow()) { + id = cursor.getLong(0); + } + } catch (Throwable e) { + throw new DbException(e); + } finally { + IOUtil.closeQuietly(cursor); + } + } + return id; + } + + @Override + public void close() throws IOException { + if (DAO_MAP.containsKey(daoConfig)) { + DAO_MAP.remove(daoConfig); + this.database.close(); + } + } + + ///////////////////////////////////// exec sql ///////////////////////////////////////////////////// + + private void beginTransaction() { + if (allowTransaction) { + /** + * if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && database.isWriteAheadLoggingEnabled()) { + * database.beginTransactionNonExclusive(); + * } else { + */ + database.beginTransaction(); + } + } + + private void setTransactionSuccessful() { + if (allowTransaction) { + database.markAsCommit(); + } + } + + private void endTransaction() { + if (allowTransaction) { + database.endTransaction(); + } + } + + + @Override + public int executeUpdateDelete(SqlInfo sqlInfo) throws DbException { + Statement statement = null; + try { + statement = sqlInfo.buildStatement(database); + return statement.executeAndGetChanges(); + } catch (Throwable e) { + throw new DbException(e); + } finally { + if (statement != null) { + try { + statement.close(); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + } + } + + @Override + public int executeUpdateDelete(String sql) throws DbException { + Statement statement = null; + try { + statement = database.buildStatement(sql); + return statement.executeAndGetChanges(); + } catch (Throwable e) { + throw new DbException(e); + } finally { + if (statement != null) { + try { + statement.close(); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + } + } + + @Override + public void execNonQuery(SqlInfo sqlInfo) throws DbException { + Statement statement = null; + try { + statement = sqlInfo.buildStatement(database); + statement.execute(); + } catch (Throwable e) { + throw new DbException(e); + } finally { + if (statement != null) { + try { + statement.close(); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + } + } + + @Override + public void execNonQuery(String sql) throws DbException { + try { + database.executeSql(sql); + } catch (Throwable e) { + throw new DbException(e); + } + } + + @Override + public ResultSet execQuery(SqlInfo sqlInfo) throws DbException { + try { + return database.querySql(sqlInfo.getSql(), sqlInfo.getBindArgsAsStrArray()); + } catch (Throwable e) { + throw new DbException(e); + } + } + + @Override + public ResultSet execQuery(String sql) throws DbException { + try { + return database.querySql(sql, null); + } catch (Throwable e) { + throw new DbException(e); + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/DbModelSelector.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/DbModelSelector.java new file mode 100644 index 0000000..ca37824 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/DbModelSelector.java @@ -0,0 +1,340 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.db; + +import com.wordplat.quickstart.xutils.common.util.IOUtil; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.db.sqlite.WhereBuilder; +import com.wordplat.quickstart.xutils.db.table.DbModel; +import com.wordplat.quickstart.xutils.db.table.TableEntity; +import com.wordplat.quickstart.xutils.ex.DbException; + +import ohos.data.resultset.ResultSet; + +import java.util.ArrayList; +import java.util.List; + +/** + * Author: wyouflf + * Date: 13-8-10 + * Time: 下午2:15 + * + * @since 2021-05-09 + */ +public final class DbModelSelector { + private String[] columnExpressions; + private String groupByColumnName; + private WhereBuilder having; + + private Selector selector; + + private DbModelSelector(TableEntity table) { + selector = Selector.from(table); + } + + /** + * DbModelSelector + * + * @param selector + * @param groupByColumnName + */ + protected DbModelSelector(Selector selector, String groupByColumnName) { + this.selector = selector; + this.groupByColumnName = groupByColumnName; + } + + /** + * DbModelSelector + * + * @param selector + * @param columnExpressions + */ + protected DbModelSelector(Selector selector, String[] columnExpressions) { + this.selector = selector; + this.columnExpressions = columnExpressions; + } + + static DbModelSelector from(TableEntity table) { + return new DbModelSelector(table); + } + + /** + * where + * + * @param whereBuilder + * @return DbModelSelector + */ + public DbModelSelector where(WhereBuilder whereBuilder) { + selector.where(whereBuilder); + return this; + } + + /** + * where + * + * @param columnName + * @param op + * @param value + * @return DbModelSelector + */ + public DbModelSelector where(String columnName, String op, Object value) { + selector.where(columnName, op, value); + return this; + } + + /** + * and + * + * @param columnName + * @param op + * @param value + * @return DbModelSelector + */ + public DbModelSelector and(String columnName, String op, Object value) { + selector.and(columnName, op, value); + return this; + } + + /** + * and + * + * @param where + * @return DbModelSelector + */ + public DbModelSelector and(WhereBuilder where) { + selector.and(where); + return this; + } + + /** + * or + * + * @param columnName + * @param op + * @param value + * @return DbModelSelector + */ + public DbModelSelector or(String columnName, String op, Object value) { + selector.or(columnName, op, value); + return this; + } + + /** + * or + * + * @param where + * @return DbModelSelector + */ + public DbModelSelector or(WhereBuilder where) { + selector.or(where); + return this; + } + + /** + * expr + * + * @param expr + * @return DbModelSelector + */ + public DbModelSelector expr(String expr) { + selector.expr(expr); + return this; + } + + /** + * groupBy + * + * @param columnName + * @return DbModelSelector + */ + public DbModelSelector groupBy(String columnName) { + this.groupByColumnName = columnName; + return this; + } + + /** + * having + * + * @param whereBuilder + * @return DbModelSelector + */ + public DbModelSelector having(WhereBuilder whereBuilder) { + this.having = whereBuilder; + return this; + } + + /** + * select + * + * @param columnExpressions + * @return DbModelSelector + */ + public DbModelSelector select(String... columnExpressions) { + this.columnExpressions = columnExpressions; + return this; + } + + /** + * orderBy + * + * @param columnName + * @return DbModelSelector + */ + public DbModelSelector orderBy(String columnName) { + selector.orderBy(columnName); + return this; + } + + /** + * orderBy + * + * @param columnName + * @param desc + * @return DbModelSelector + */ + public DbModelSelector orderBy(String columnName, boolean desc) { + selector.orderBy(columnName, desc); + return this; + } + + /** + * limit + * + * @param limit + * @return DbModelSelector + */ + public DbModelSelector limit(int limit) { + selector.limit(limit); + return this; + } + + /** + * DbModelSelector + * + * @param offset + * @return offset + */ + public DbModelSelector offset(int offset) { + selector.offset(offset); + return this; + } + + public TableEntity getTable() { + return selector.getTable(); + } + + /** + * findFirst + * + * @return DbModel + * @throws DbException + */ + public DbModel findFirst() throws DbException { + TableEntity table = selector.getTable(); + if (!table.tableIsExists()) { + return null; + } + + this.limit(1); + ResultSet cursor = table.getDb().execQuery(this.toString()); + if (cursor != null) { + try { + if (cursor.goToNextRow()) { + return CursorUtils.getDbModel(cursor); + } + } catch (Throwable e) { + throw new DbException(e); + } finally { + IOUtil.closeQuietly(cursor); + } + } + return null; + } + + /** + * findAll + * + * @return DbModel + * @throws DbException + */ + public List findAll() throws DbException { + TableEntity table = selector.getTable(); + if (!table.tableIsExists()) { + return null; + } + + List result = null; + + ResultSet cursor = table.getDb().execQuery(this.toString()); + if (cursor != null) { + try { + result = new ArrayList(); + while (cursor.goToNextRow()) { + DbModel entity = CursorUtils.getDbModel(cursor); + result.add(entity); + } + } catch (Throwable e) { + throw new DbException(e); + } finally { + IOUtil.closeQuietly(cursor); + } + } + return result; + } + + @Override + public String toString() { + StringBuilder result = new StringBuilder(); + result.append("SELECT "); + if (columnExpressions != null && columnExpressions.length > 0) { + for (String columnExpression : columnExpressions) { + result.append(columnExpression); + result.append(","); + } + result.deleteCharAt(result.length() - 1); + } else { + if (!TextUtils.isEmpty(groupByColumnName)) { + result.append(groupByColumnName); + } else { + result.append("*"); + } + } + result.append(" FROM ").append("\"").append(selector.getTable().getName()).append("\""); + WhereBuilder whereBuilder = selector.getWhereBuilder(); + if (whereBuilder != null && whereBuilder.getWhereItemSize() > 0) { + result.append(" WHERE ").append(whereBuilder.toString()); + } + if (!TextUtils.isEmpty(groupByColumnName)) { + result.append(" GROUP BY ").append("\"").append(groupByColumnName).append("\""); + if (having != null && having.getWhereItemSize() > 0) { + result.append(" HAVING ").append(having.toString()); + } + } + List orderByList = selector.getOrderByList(); + if (orderByList != null && orderByList.size() > 0) { + result.append(" ORDER BY "); + for (Selector.OrderBy orderBy : orderByList) { + result.append(orderBy.toString()).append(','); + } + result.deleteCharAt(result.length() - 1); + } + if (selector.getLimit() > 0) { + result.append(" LIMIT ").append(selector.getLimit()); + result.append(" OFFSET ").append(selector.getOffset()); + } + return result.toString(); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/Selector.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/Selector.java new file mode 100644 index 0000000..98d1f63 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/Selector.java @@ -0,0 +1,355 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.db; + +import com.wordplat.quickstart.xutils.common.util.IOUtil; +import com.wordplat.quickstart.xutils.db.sqlite.WhereBuilder; +import com.wordplat.quickstart.xutils.db.table.DbModel; +import com.wordplat.quickstart.xutils.db.table.TableEntity; +import com.wordplat.quickstart.xutils.ex.DbException; + +import ohos.data.resultset.ResultSet; + +import java.util.ArrayList; +import java.util.List; + +/** + * Author: wyouflf + * Date: 13-8-9 + * Time: 下午10:19 + * + * @since 2021-05-09 + */ +public final class Selector { + private final TableEntity table; + + private WhereBuilder whereBuilder; + private List orderByList; + private int limit = 0; + private int offset = 0; + + private Selector(TableEntity table) { + this.table = table; + } + + static Selector from(TableEntity table) { + return new Selector(table); + } + + /** + * where + * + * @param whereBuilder + * @return Selector + */ + public Selector where(WhereBuilder whereBuilder) { + this.whereBuilder = whereBuilder; + return this; + } + + /** + * where + * + * @param columnName + * @param op + * @param value + * @return Selector + */ + public Selector where(String columnName, String op, Object value) { + this.whereBuilder = WhereBuilder.b(columnName, op, value); + return this; + } + + /** + * and + * + * @param columnName + * @param op + * @param value + * @return Selector + */ + public Selector and(String columnName, String op, Object value) { + this.whereBuilder.and(columnName, op, value); + return this; + } + + /** + * and + * + * @param where + * @return Selector + */ + public Selector and(WhereBuilder where) { + this.whereBuilder.and(where); + return this; + } + + /** + * or + * + * @param columnName + * @param op + * @param value + * @return Selector + */ + public Selector or(String columnName, String op, Object value) { + this.whereBuilder.or(columnName, op, value); + return this; + } + + /** + * or + * + * @param where + * @return Selector + */ + public Selector or(WhereBuilder where) { + this.whereBuilder.or(where); + return this; + } + + /** + * expr + * + * @param expr + * @return Selector + */ + public Selector expr(String expr) { + if (this.whereBuilder == null) { + this.whereBuilder = WhereBuilder.b(); + } + this.whereBuilder.expr(expr); + return this; + } + + /** + * groupBy + * + * @param columnName + * @return DbModelSelector + */ + public DbModelSelector groupBy(String columnName) { + return new DbModelSelector(this, columnName); + } + + /** + * select + * + * @param columnExpressions + * @return DbModelSelector + */ + public DbModelSelector select(String... columnExpressions) { + return new DbModelSelector(this, columnExpressions); + } + + /** + * orderBy + * + * @param columnName + * @return Selector + */ + public Selector orderBy(String columnName) { + if (orderByList == null) { + orderByList = new ArrayList(5); + } + orderByList.add(new OrderBy(columnName)); + return this; + } + + /** + * orderBy + * + * @param columnName + * @param desc + * @return Selector + */ + public Selector orderBy(String columnName, boolean desc) { + if (orderByList == null) { + orderByList = new ArrayList(5); + } + orderByList.add(new OrderBy(columnName, desc)); + return this; + } + + /** + * limit + * + * @param limit + * @return Selector + */ + public Selector limit(int limit) { + this.limit = limit; + return this; + } + + /** + * offset + * + * @param offset + * @return Selector + */ + public Selector offset(int offset) { + this.offset = offset; + return this; + } + + public TableEntity getTable() { + return table; + } + + public WhereBuilder getWhereBuilder() { + return whereBuilder; + } + + public List getOrderByList() { + return orderByList; + } + + public int getLimit() { + return limit; + } + + public int getOffset() { + return offset; + } + + /** + * findFirst + * + * @return T + * @throws DbException + */ + public T findFirst() throws DbException { + if (!table.tableIsExists()) { + return null; + } + + this.limit(1); + ResultSet cursor = table.getDb().execQuery(this.toString()); + if (cursor != null) { + try { + if (cursor.goToNextRow()) { + return CursorUtils.getEntity(table, cursor); + } + } catch (Throwable e) { + throw new DbException(e); + } finally { + IOUtil.closeQuietly(cursor); + } + } + return null; + } + + /** + * findAll + * + * @return List + * @throws DbException + */ + public List findAll() throws DbException { + if (!table.tableIsExists()) { + return null; + } + + List result = null; + ResultSet cursor = table.getDb().execQuery(this.toString()); + if (cursor != null) { + try { + result = new ArrayList(); + while (cursor.goToNextRow()) { + T entity = CursorUtils.getEntity(table, cursor); + result.add(entity); + } + } catch (Throwable e) { + throw new DbException(e); + } finally { + IOUtil.closeQuietly(cursor); + } + } + return result; + } + + /** + * count + * + * @return long + * @throws DbException + */ + public long count() throws DbException { + if (!table.tableIsExists()) { + return 0; + } + + DbModelSelector dmSelector = this.select("count(\"" + table.getId().getName() + "\") as count"); + DbModel firstModel = dmSelector.findFirst(); + if (firstModel != null) { + return firstModel.getLong("count", 0); + } + return 0; + } + + @Override + public String toString() { + StringBuilder result = new StringBuilder(); + result.append("SELECT "); + result.append("*"); + result.append(" FROM ").append("\"").append(table.getName()).append("\""); + if (whereBuilder != null && whereBuilder.getWhereItemSize() > 0) { + result.append(" WHERE ").append(whereBuilder.toString()); + } + if (orderByList != null && orderByList.size() > 0) { + result.append(" ORDER BY "); + for (OrderBy orderBy : orderByList) { + result.append(orderBy.toString()).append(','); + } + result.deleteCharAt(result.length() - 1); + } + if (limit > 0) { + result.append(" LIMIT ").append(limit); + result.append(" OFFSET ").append(offset); + } + return result.toString(); + } + + public static class OrderBy { + private String columnName; + private boolean desc; + /** + * 排序条件, 默认ASC + * + * @param columnName + */ + public OrderBy(String columnName) { + this.columnName = columnName; + } + + /** + * 排序条件, 默认ASC + * + * @param columnName + * @param desc + */ + public OrderBy(String columnName, boolean desc) { + this.columnName = columnName; + this.desc = desc; + } + + @Override + public String toString() { + return "\"" + columnName + "\"" + (desc ? " DESC" : " ASC"); + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/annotation/Column.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/annotation/Column.java new file mode 100644 index 0000000..731b8db --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/annotation/Column.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.db.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Column + * + * @since 2021-05-09 + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Column { + /** + * name + * + * @return String + */ + String name(); + + /** + * property + * + * @return String + */ + String property() default ""; + + /** + * isId + * + * @return boolean + */ + boolean isId() default false; + + /** + * autoGen + * + * @return boolean + */ + boolean autoGen() default true; +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/annotation/Table.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/annotation/Table.java new file mode 100644 index 0000000..5a7bf7a --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/annotation/Table.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.db.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Table + * + * @since 2021-085-09 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface Table { + /** + * name + * + * @return String + */ + String name(); + + /** + * onCreated + * + * @return String + */ + String onCreated() default ""; +} \ No newline at end of file diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/BooleanColumnConverter.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/BooleanColumnConverter.java new file mode 100644 index 0000000..d40816d --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/BooleanColumnConverter.java @@ -0,0 +1,32 @@ +package com.wordplat.quickstart.xutils.db.converter; + +import com.wordplat.quickstart.xutils.db.sqlite.ColumnDbType; + +import ohos.data.resultset.ResultSet; + +/** + * Author: wyouflf + * Date: 13-11-4 + * Time: 下午10:51 + * + * @since 2021-05-09 + */ +public class BooleanColumnConverter implements ColumnConverter { + @Override + public Boolean getFieldValue(final ResultSet cursor, int index) { + return cursor.isColumnNull(index) ? null : cursor.getInt(index) == 1; + } + + @Override + public Object fieldValue2DbValue(Boolean fieldValue) { + if (fieldValue == null) { + return null; + } + return fieldValue ? 1 : 0; + } + + @Override + public ColumnDbType getColumnDbType() { + return ColumnDbType.INTEGER; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ByteArrayColumnConverter.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ByteArrayColumnConverter.java new file mode 100644 index 0000000..906ed34 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ByteArrayColumnConverter.java @@ -0,0 +1,29 @@ +package com.wordplat.quickstart.xutils.db.converter; + +import com.wordplat.quickstart.xutils.db.sqlite.ColumnDbType; + +import ohos.data.resultset.ResultSet; + +/** + * Author: wyouflf + * Date: 13-11-4 + * Time: 下午10:51 + * + * @since 2021-05-09 + */ +public class ByteArrayColumnConverter implements ColumnConverter { + @Override + public byte[] getFieldValue(final ResultSet cursor, int index) { + return cursor.isColumnNull(index) ? null : cursor.getBlob(index); + } + + @Override + public Object fieldValue2DbValue(byte[] fieldValue) { + return fieldValue; + } + + @Override + public ColumnDbType getColumnDbType() { + return ColumnDbType.BLOB; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ByteColumnConverter.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ByteColumnConverter.java new file mode 100644 index 0000000..91170a6 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ByteColumnConverter.java @@ -0,0 +1,28 @@ +package com.wordplat.quickstart.xutils.db.converter; + +import com.wordplat.quickstart.xutils.db.sqlite.ColumnDbType; +import ohos.data.resultset.ResultSet; + +/** + * Author: wyouflf + * Date: 13-11-4 + * Time: 下午10:51 + * + * @since 2021-05-09 + */ +public class ByteColumnConverter implements ColumnConverter { + @Override + public Byte getFieldValue(final ResultSet cursor, int index) { + return cursor.isColumnNull(index) ? null : (byte) cursor.getInt(index); + } + + @Override + public Object fieldValue2DbValue(Byte fieldValue) { + return fieldValue; + } + + @Override + public ColumnDbType getColumnDbType() { + return ColumnDbType.INTEGER; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/CharColumnConverter.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/CharColumnConverter.java new file mode 100644 index 0000000..0594f5b --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/CharColumnConverter.java @@ -0,0 +1,32 @@ +package com.wordplat.quickstart.xutils.db.converter; + +import com.wordplat.quickstart.xutils.db.sqlite.ColumnDbType; + +import ohos.data.resultset.ResultSet; + +/** + * Author: wyouflf + * Date: 13-11-4 + * Time: 下午10:51 + * + * @since 2021-05-09 + */ +public class CharColumnConverter implements ColumnConverter { + @Override + public Character getFieldValue(final ResultSet cursor, int index) { + return cursor.isColumnNull(index) ? null : (char) cursor.getInt(index); + } + + @Override + public Object fieldValue2DbValue(Character fieldValue) { + if (fieldValue == null) { + return null; + } + return (int) fieldValue; + } + + @Override + public ColumnDbType getColumnDbType() { + return ColumnDbType.INTEGER; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ColumnConverter.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ColumnConverter.java new file mode 100644 index 0000000..cbfbf85 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ColumnConverter.java @@ -0,0 +1,38 @@ +package com.wordplat.quickstart.xutils.db.converter; + +import com.wordplat.quickstart.xutils.db.sqlite.ColumnDbType; + +import ohos.data.resultset.ResultSet; + +/** + * Author: wyouflf + * Date: 13-11-4 + * Time: 下午8:57 + * + * @since 2021-05-09 + */ +public interface ColumnConverter { + /** + * getFieldValue + * + * @param cursor + * @param index + * @return T + */ + T getFieldValue(final ResultSet cursor, int index); + + /** + * fieldValue2DbValue + * + * @param fieldValue + * @return Object + */ + Object fieldValue2DbValue(T fieldValue); + + /** + * getColumnDbType + * + * @return ColumnDbType + */ + ColumnDbType getColumnDbType(); +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ColumnConverterFactory.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ColumnConverterFactory.java new file mode 100644 index 0000000..9bfdca4 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ColumnConverterFactory.java @@ -0,0 +1,128 @@ +package com.wordplat.quickstart.xutils.db.converter; + +import com.wordplat.quickstart.xutils.common.util.LogUtil; + +import java.util.Date; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Author: wyouflf + * Date: 13-11-4 + * Time: 下午10:27 + * + * @since 2021-05-09 + */ +public final class ColumnConverterFactory { + private static final ConcurrentHashMap HASH_MAP; + + private ColumnConverterFactory() { + } + + /** + * getColumnConverter + * + * @param columnType + * @return ColumnConverter + * @throws RuntimeException + */ + public static ColumnConverter getColumnConverter(Class columnType) { + ColumnConverter result = null; + if (HASH_MAP.containsKey(columnType.getName())) { + result = HASH_MAP.get(columnType.getName()); + } else if (ColumnConverter.class.isAssignableFrom(columnType)) { + try { + ColumnConverter columnConverter = (ColumnConverter) columnType.newInstance(); + HASH_MAP.put(columnType.getName(), columnConverter); + result = columnConverter; + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + + if (result == null) { + throw new RuntimeException("Database Column Not Support: " + columnType.getName() + + ", please impl ColumnConverter or use ColumnConverterFactory#registerColumnConverter(...)"); + } + + return result; + } + + /** + * registerColumnConverter + * + * @param columnType + * @param columnConverter + */ + public static void registerColumnConverter(Class columnType, ColumnConverter columnConverter) { + HASH_MAP.put(columnType.getName(), columnConverter); + } + + /** + * isSupportColumnConverter + * + * @param columnType + * @return boolean + */ + public static boolean isSupportColumnConverter(Class columnType) { + if (HASH_MAP.containsKey(columnType.getName())) { + return true; + } else if (ColumnConverter.class.isAssignableFrom(columnType)) { + try { + ColumnConverter columnConverter = (ColumnConverter) columnType.newInstance(); + HASH_MAP.put(columnType.getName(), columnConverter); + return true; + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + return false; + } + + static { + HASH_MAP = new ConcurrentHashMap(); + + BooleanColumnConverter booleanColumnConverter = new BooleanColumnConverter(); + HASH_MAP.put(boolean.class.getName(), booleanColumnConverter); + HASH_MAP.put(Boolean.class.getName(), booleanColumnConverter); + + ByteArrayColumnConverter byteArrayColumnConverter = new ByteArrayColumnConverter(); + HASH_MAP.put(byte[].class.getName(), byteArrayColumnConverter); + + ByteColumnConverter byteColumnConverter = new ByteColumnConverter(); + HASH_MAP.put(byte.class.getName(), byteColumnConverter); + HASH_MAP.put(Byte.class.getName(), byteColumnConverter); + + CharColumnConverter charColumnConverter = new CharColumnConverter(); + HASH_MAP.put(char.class.getName(), charColumnConverter); + HASH_MAP.put(Character.class.getName(), charColumnConverter); + + DateColumnConverter dateColumnConverter = new DateColumnConverter(); + HASH_MAP.put(Date.class.getName(), dateColumnConverter); + + DoubleColumnConverter doubleColumnConverter = new DoubleColumnConverter(); + HASH_MAP.put(double.class.getName(), doubleColumnConverter); + HASH_MAP.put(Double.class.getName(), doubleColumnConverter); + + FloatColumnConverter floatColumnConverter = new FloatColumnConverter(); + HASH_MAP.put(float.class.getName(), floatColumnConverter); + HASH_MAP.put(Float.class.getName(), floatColumnConverter); + + IntegerColumnConverter integerColumnConverter = new IntegerColumnConverter(); + HASH_MAP.put(int.class.getName(), integerColumnConverter); + HASH_MAP.put(Integer.class.getName(), integerColumnConverter); + + LongColumnConverter longColumnConverter = new LongColumnConverter(); + HASH_MAP.put(long.class.getName(), longColumnConverter); + HASH_MAP.put(Long.class.getName(), longColumnConverter); + + ShortColumnConverter shortColumnConverter = new ShortColumnConverter(); + HASH_MAP.put(short.class.getName(), shortColumnConverter); + HASH_MAP.put(Short.class.getName(), shortColumnConverter); + + SqlDateColumnConverter sqlDateColumnConverter = new SqlDateColumnConverter(); + HASH_MAP.put(java.sql.Date.class.getName(), sqlDateColumnConverter); + + StringColumnConverter stringColumnConverter = new StringColumnConverter(); + HASH_MAP.put(String.class.getName(), stringColumnConverter); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/DateColumnConverter.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/DateColumnConverter.java new file mode 100644 index 0000000..980108f --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/DateColumnConverter.java @@ -0,0 +1,34 @@ +package com.wordplat.quickstart.xutils.db.converter; + +import com.wordplat.quickstart.xutils.db.sqlite.ColumnDbType; + +import ohos.data.resultset.ResultSet; + +import java.util.Date; + +/** + * Author: wyouflf + * Date: 13-11-4 + * Time: 下午10:51 + * + * @since 2021-05-09 + */ +public class DateColumnConverter implements ColumnConverter { + @Override + public Date getFieldValue(final ResultSet cursor, int index) { + return cursor.isColumnNull(index) ? null : new Date(cursor.getLong(index)); + } + + @Override + public Object fieldValue2DbValue(Date fieldValue) { + if (fieldValue == null) { + return null; + } + return fieldValue.getTime(); + } + + @Override + public ColumnDbType getColumnDbType() { + return ColumnDbType.INTEGER; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/DoubleColumnConverter.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/DoubleColumnConverter.java new file mode 100644 index 0000000..a6cdb3b --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/DoubleColumnConverter.java @@ -0,0 +1,29 @@ +package com.wordplat.quickstart.xutils.db.converter; + +import com.wordplat.quickstart.xutils.db.sqlite.ColumnDbType; + +import ohos.data.resultset.ResultSet; + +/** + * Author: wyouflf + * Date: 13-11-4 + * Time: 下午10:51 + * + * @since 2021-05-09 + */ +public class DoubleColumnConverter implements ColumnConverter { + @Override + public Double getFieldValue(final ResultSet cursor, int index) { + return cursor.isColumnNull(index) ? null : cursor.getDouble(index); + } + + @Override + public Object fieldValue2DbValue(Double fieldValue) { + return fieldValue; + } + + @Override + public ColumnDbType getColumnDbType() { + return ColumnDbType.REAL; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/FloatColumnConverter.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/FloatColumnConverter.java new file mode 100644 index 0000000..4cd8a3a --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/FloatColumnConverter.java @@ -0,0 +1,29 @@ +package com.wordplat.quickstart.xutils.db.converter; + +import com.wordplat.quickstart.xutils.db.sqlite.ColumnDbType; + +import ohos.data.resultset.ResultSet; + +/** + * Author: wyouflf + * Date: 13-11-4 + * Time: 下午10:51 + * + * @since 2021-05-09 + */ +public class FloatColumnConverter implements ColumnConverter { + @Override + public Float getFieldValue(final ResultSet cursor, int index) { + return cursor.isColumnNull(index) ? null : cursor.getFloat(index); + } + + @Override + public Object fieldValue2DbValue(Float fieldValue) { + return fieldValue; + } + + @Override + public ColumnDbType getColumnDbType() { + return ColumnDbType.REAL; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/IntegerColumnConverter.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/IntegerColumnConverter.java new file mode 100644 index 0000000..48116a7 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/IntegerColumnConverter.java @@ -0,0 +1,29 @@ +package com.wordplat.quickstart.xutils.db.converter; + +import com.wordplat.quickstart.xutils.db.sqlite.ColumnDbType; + +import ohos.data.resultset.ResultSet; + +/** + * Author: wyouflf + * Date: 13-11-4 + * Time: 下午10:51 + * + * @since 2021-05-09 + */ +public class IntegerColumnConverter implements ColumnConverter { + @Override + public Integer getFieldValue(final ResultSet cursor, int index) { + return cursor.isColumnNull(index) ? null : cursor.getInt(index); + } + + @Override + public Object fieldValue2DbValue(Integer fieldValue) { + return fieldValue; + } + + @Override + public ColumnDbType getColumnDbType() { + return ColumnDbType.INTEGER; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/LongColumnConverter.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/LongColumnConverter.java new file mode 100644 index 0000000..d262f3f --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/LongColumnConverter.java @@ -0,0 +1,29 @@ +package com.wordplat.quickstart.xutils.db.converter; + +import com.wordplat.quickstart.xutils.db.sqlite.ColumnDbType; + +import ohos.data.resultset.ResultSet; + +/** + * Author: wyouflf + * Date: 13-11-4 + * Time: 下午10:51 + * + * @since 2021-05-09 + */ +public class LongColumnConverter implements ColumnConverter { + @Override + public Long getFieldValue(final ResultSet cursor, int index) { + return cursor.isColumnNull(index) ? null : cursor.getLong(index); + } + + @Override + public Object fieldValue2DbValue(Long fieldValue) { + return fieldValue; + } + + @Override + public ColumnDbType getColumnDbType() { + return ColumnDbType.INTEGER; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ShortColumnConverter.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ShortColumnConverter.java new file mode 100644 index 0000000..1189588 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/ShortColumnConverter.java @@ -0,0 +1,29 @@ +package com.wordplat.quickstart.xutils.db.converter; + +import com.wordplat.quickstart.xutils.db.sqlite.ColumnDbType; + +import ohos.data.resultset.ResultSet; + +/** + * Author: wyouflf + * Date: 13-11-4 + * Time: 下午10:51 + * + * @since 2021-05-09 + */ +public class ShortColumnConverter implements ColumnConverter { + @Override + public Short getFieldValue(final ResultSet cursor, int index) { + return cursor.isColumnNull(index) ? null : cursor.getShort(index); + } + + @Override + public Object fieldValue2DbValue(Short fieldValue) { + return fieldValue; + } + + @Override + public ColumnDbType getColumnDbType() { + return ColumnDbType.INTEGER; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/SqlDateColumnConverter.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/SqlDateColumnConverter.java new file mode 100644 index 0000000..c52abd8 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/SqlDateColumnConverter.java @@ -0,0 +1,32 @@ +package com.wordplat.quickstart.xutils.db.converter; + +import com.wordplat.quickstart.xutils.db.sqlite.ColumnDbType; + +import ohos.data.resultset.ResultSet; + +/** + * Author: wyouflf + * Date: 13-11-4 + * Time: 下午10:51 + * + * @since 2021-05-09 + */ +public class SqlDateColumnConverter implements ColumnConverter { + @Override + public java.sql.Date getFieldValue(final ResultSet cursor, int index) { + return cursor.isColumnNull(index) ? null : new java.sql.Date(cursor.getLong(index)); + } + + @Override + public Object fieldValue2DbValue(java.sql.Date fieldValue) { + if (fieldValue == null) { + return null; + } + return fieldValue.getTime(); + } + + @Override + public ColumnDbType getColumnDbType() { + return ColumnDbType.INTEGER; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/StringColumnConverter.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/StringColumnConverter.java new file mode 100644 index 0000000..9648f99 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/converter/StringColumnConverter.java @@ -0,0 +1,29 @@ +package com.wordplat.quickstart.xutils.db.converter; + +import com.wordplat.quickstart.xutils.db.sqlite.ColumnDbType; + +import ohos.data.resultset.ResultSet; + +/** + * Author: wyouflf + * Date: 13-11-4 + * Time: 下午10:51 + * + * @since 2021-05-09 + */ +public class StringColumnConverter implements ColumnConverter { + @Override + public String getFieldValue(final ResultSet cursor, int index) { + return cursor.isColumnNull(index) ? null : cursor.getString(index); + } + + @Override + public Object fieldValue2DbValue(String fieldValue) { + return fieldValue; + } + + @Override + public ColumnDbType getColumnDbType() { + return ColumnDbType.TEXT; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/sqlite/ColumnDbType.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/sqlite/ColumnDbType.java new file mode 100644 index 0000000..8e6b27c --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/sqlite/ColumnDbType.java @@ -0,0 +1,24 @@ +package com.wordplat.quickstart.xutils.db.sqlite; + +/** + * Created by wyouflf on 14-2-20. + * + * @since 2021-05-09 + */ +public enum ColumnDbType { + /** + * INTEGER("INTEGER"), REAL("REAL"), TEXT("TEXT"), BLOB("BLOB"); + */ + INTEGER("INTEGER"), REAL("REAL"), TEXT("TEXT"), BLOB("BLOB"); + + private String value; + + ColumnDbType(String value) { + this.value = value; + } + + @Override + public String toString() { + return value; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/sqlite/SqlInfo.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/sqlite/SqlInfo.java new file mode 100644 index 0000000..0e2e39a --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/sqlite/SqlInfo.java @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.db.sqlite; + +import com.wordplat.quickstart.xutils.common.util.KeyValue; +import com.wordplat.quickstart.xutils.db.converter.ColumnConverter; +import com.wordplat.quickstart.xutils.db.converter.ColumnConverterFactory; +import com.wordplat.quickstart.xutils.db.table.ColumnUtils; + +import ohos.data.rdb.RdbStore; +import ohos.data.rdb.Statement; + +import java.util.ArrayList; +import java.util.List; + +/** + * SqlInfo + * + * @since 2021-05-09 + */ +public final class SqlInfo { + private String sql; + private List bindArgs; + + /** + * SqlInfo + */ + public SqlInfo() { + } + + /** + * SqlInfo + * + * @param sql + */ + public SqlInfo(String sql) { + this.sql = sql; + } + + public String getSql() { + return sql; + } + + public void setSql(String sql) { + this.sql = sql; + } + + /** + * addBindArg + * + * @param kv + */ + public void addBindArg(KeyValue kv) { + if (bindArgs == null) { + bindArgs = new ArrayList(); + } + bindArgs.add(kv); + } + + /** + * addBindArgs + * + * @param bindArgs + */ + public void addBindArgs(List bindArgs) { + if (this.bindArgs == null) { + this.bindArgs = bindArgs; + } else { + this.bindArgs.addAll(bindArgs); + } + } + + /** + * buildStatement + * + * @param database + * @return Statement + */ + @SuppressWarnings("unchecked") + public Statement buildStatement(RdbStore database) { + Statement result = database.buildStatement(sql); + if (bindArgs != null) { + for (int i = 1; i < bindArgs.size() + 1; i++) { + KeyValue kv = bindArgs.get(i - 1); + if (kv.value == null) { + result.setNull(i); + continue; + } + ColumnConverter converter = ColumnConverterFactory.getColumnConverter(kv.value.getClass()); + Object value = converter.fieldValue2DbValue(kv.value); + ColumnDbType type = converter.getColumnDbType(); + switch (type) { + case INTEGER: + result.setLong(i, ((Number) value).longValue()); + break; + case REAL: + result.setDouble(i, ((Number) value).doubleValue()); + break; + case TEXT: + result.setString(i, value.toString()); + break; + case BLOB: + result.setBlob(i, (byte[]) value); + break; + default: + result.setNull(i); + break; + } // end switch + } + } + return result; + } + + /** + * getBindArgs + * + * @return Object + */ + public Object[] getBindArgs() { + Object[] result = null; + if (bindArgs != null) { + result = new Object[bindArgs.size()]; + for (int i = 0; i < bindArgs.size(); i++) { + result[i] = ColumnUtils.convert2DbValueIfNeeded(bindArgs.get(i).value); + } + } + return result; + } + + /** + * getBindArgsAsStrArray + * + * @return String + */ + public String[] getBindArgsAsStrArray() { + String[] result = null; + if (bindArgs != null) { + result = new String[bindArgs.size()]; + for (int i = 0; i < bindArgs.size(); i++) { + Object value = ColumnUtils.convert2DbValueIfNeeded(bindArgs.get(i).value); + result[i] = value == null ? null : value.toString(); + } + } + return result; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/sqlite/SqlInfoBuilder.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/sqlite/SqlInfoBuilder.java new file mode 100644 index 0000000..4611be1 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/sqlite/SqlInfoBuilder.java @@ -0,0 +1,345 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.db.sqlite; + +import com.wordplat.quickstart.xutils.common.util.KeyValue; +import com.wordplat.quickstart.xutils.db.table.ColumnEntity; +import com.wordplat.quickstart.xutils.db.table.TableEntity; +import com.wordplat.quickstart.xutils.ex.DbException; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Build "insert", "replace",,"update", "delete" and "create" sql. + * + * @since 2021-05-09 + */ +public final class SqlInfoBuilder { + private static final ConcurrentHashMap, String> INSERT_SQL_CACHE = + new ConcurrentHashMap, String>(); + private static final ConcurrentHashMap, String> REPLACE_SQL_CACHE = + new ConcurrentHashMap, String>(); + + private SqlInfoBuilder() { + } + + /** + * buildInsertSqlInfo + * + * @param table + * @param entity + * @return SqlInfo + * @throws DbException + */ + public static SqlInfo buildInsertSqlInfo(TableEntity table, Object entity) throws DbException { + List keyValueList = entity2KeyValueList(table, entity); + if (keyValueList.size() == 0) { + return null; + } + + SqlInfo result = new SqlInfo(); + String sql = INSERT_SQL_CACHE.get(table); + if (sql == null) { + StringBuilder builder = new StringBuilder(); + builder.append("INSERT INTO "); + builder.append("\"").append(table.getName()).append("\""); + builder.append(" ("); + for (KeyValue kv : keyValueList) { + builder.append("\"").append(kv.key).append("\"").append(','); + } + builder.deleteCharAt(builder.length() - 1); + builder.append(") VALUES ("); + + int length = keyValueList.size(); + for (int i = 0; i < length; i++) { + builder.append("?,"); + } + builder.deleteCharAt(builder.length() - 1); + builder.append(")"); + + sql = builder.toString(); + result.setSql(sql); + result.addBindArgs(keyValueList); + INSERT_SQL_CACHE.put(table, sql); + } else { + result.setSql(sql); + result.addBindArgs(keyValueList); + } + + return result; + } + + /** + * buildReplaceSqlInfo + * + * @param table + * @param entity + * @return SqlInfo + * @throws DbException + */ + public static SqlInfo buildReplaceSqlInfo(TableEntity table, Object entity) throws DbException { + List keyValueList = entity2KeyValueList(table, entity); + if (keyValueList.size() == 0) { + return null; + } + + SqlInfo result = new SqlInfo(); + String sql = REPLACE_SQL_CACHE.get(table); + if (sql == null) { + StringBuilder builder = new StringBuilder(); + builder.append("REPLACE INTO "); + builder.append("\"").append(table.getName()).append("\""); + builder.append(" ("); + for (KeyValue kv : keyValueList) { + builder.append("\"").append(kv.key).append("\"").append(','); + } + builder.deleteCharAt(builder.length() - 1); + builder.append(") VALUES ("); + + int length = keyValueList.size(); + for (int i = 0; i < length; i++) { + builder.append("?,"); + } + builder.deleteCharAt(builder.length() - 1); + builder.append(")"); + + sql = builder.toString(); + result.setSql(sql); + result.addBindArgs(keyValueList); + REPLACE_SQL_CACHE.put(table, sql); + } else { + result.setSql(sql); + result.addBindArgs(keyValueList); + } + + return result; + } + + /** + * buildDeleteSqlInfo + * + * @param table + * @param entity + * @return SqlInfo + * @throws DbException + */ + public static SqlInfo buildDeleteSqlInfo(TableEntity table, Object entity) throws DbException { + SqlInfo result = new SqlInfo(); + + ColumnEntity id = table.getId(); + Object idValue = id.getColumnValue(entity); + + if (idValue == null) { + throw new DbException("this entity id value is null"); + } + StringBuilder builder = new StringBuilder("DELETE FROM "); + builder.append("\"").append(table.getName()).append("\""); + builder.append(" WHERE ").append(WhereBuilder.b(id.getName(), "=", idValue)); + + result.setSql(builder.toString()); + + return result; + } + + /** + * buildDeleteSqlInfoById + * + * @param table + * @param idValue + * @return SqlInfo + * @throws DbException + */ + public static SqlInfo buildDeleteSqlInfoById(TableEntity table, Object idValue) throws DbException { + SqlInfo result = new SqlInfo(); + + ColumnEntity id = table.getId(); + + if (idValue == null) { + throw new DbException("this entity id value is null"); + } + StringBuilder builder = new StringBuilder("DELETE FROM "); + builder.append("\"").append(table.getName()).append("\""); + builder.append(" WHERE ").append(WhereBuilder.b(id.getName(), "=", idValue)); + + result.setSql(builder.toString()); + + return result; + } + + /** + * buildDeleteSqlInfo + * + * @param table + * @param whereBuilder + * @return SqlInfo + * @throws DbException + */ + public static SqlInfo buildDeleteSqlInfo(TableEntity table, WhereBuilder whereBuilder) throws DbException { + StringBuilder builder = new StringBuilder("DELETE FROM "); + builder.append("\"").append(table.getName()).append("\""); + + if (whereBuilder != null && whereBuilder.getWhereItemSize() > 0) { + builder.append(" WHERE ").append(whereBuilder.toString()); + } + + return new SqlInfo(builder.toString()); + } + + /** + * buildUpdateSqlInfo + * + * @param table + * @param entity + * @param updateColumnNames + * @return SqlInfo + * @throws DbException + */ + public static SqlInfo buildUpdateSqlInfo(TableEntity table, Object entity, String... updateColumnNames) throws DbException { + List keyValueList = entity2KeyValueList(table, entity); + if (keyValueList.size() == 0) { + return null; + } + + HashSet updateColumnNameSet = null; + if (updateColumnNames != null && updateColumnNames.length > 0) { + updateColumnNameSet = new HashSet(updateColumnNames.length); + Collections.addAll(updateColumnNameSet, updateColumnNames); + } + + ColumnEntity id = table.getId(); + Object idValue = id.getColumnValue(entity); + + if (idValue == null) { + throw new DbException("this entity id value is null"); + } + + SqlInfo result = new SqlInfo(); + StringBuilder builder = new StringBuilder("UPDATE "); + builder.append("\"").append(table.getName()).append("\""); + builder.append(" SET "); + for (KeyValue kv : keyValueList) { + if (updateColumnNameSet == null || updateColumnNameSet.contains(kv.key)) { + builder.append("\"").append(kv.key).append("\"").append("=?,"); + result.addBindArg(kv); + } + } + builder.deleteCharAt(builder.length() - 1); + builder.append(" WHERE ").append(WhereBuilder.b(id.getName(), "=", idValue)); + + result.setSql(builder.toString()); + return result; + } + + /** + * buildUpdateSqlInfo + * + * @param table + * @param whereBuilder + * @param nameValuePairs + * @return SqlInfo + * @throws DbException + */ + public static SqlInfo buildUpdateSqlInfo(TableEntity table, WhereBuilder whereBuilder, KeyValue... nameValuePairs) throws DbException { + + if (nameValuePairs == null || nameValuePairs.length == 0) { + return null; + } + + SqlInfo result = new SqlInfo(); + StringBuilder builder = new StringBuilder("UPDATE "); + builder.append("\"").append(table.getName()).append("\""); + builder.append(" SET "); + for (KeyValue kv : nameValuePairs) { + builder.append("\"").append(kv.key).append("\"").append("=?,"); + result.addBindArg(kv); + } + builder.deleteCharAt(builder.length() - 1); + if (whereBuilder != null && whereBuilder.getWhereItemSize() > 0) { + builder.append(" WHERE ").append(whereBuilder.toString()); + } + + result.setSql(builder.toString()); + return result; + } + + /** + * buildCreateTableSqlInfo + * + * @param table + * @return SqlInfo + * @throws DbException + */ + public static SqlInfo buildCreateTableSqlInfo(TableEntity table) throws DbException { + ColumnEntity id = table.getId(); + + StringBuilder builder = new StringBuilder(); + builder.append("CREATE TABLE IF NOT EXISTS "); + builder.append("\"").append(table.getName()).append("\""); + builder.append(" ( "); + + if (id.isAutoId()) { + builder.append("\"").append(id.getName()).append("\"").append(" INTEGER PRIMARY KEY AUTOINCREMENT, "); + } else { + builder.append("\"").append(id.getName()).append("\"").append(id.getColumnDbType()).append(" PRIMARY KEY, "); + } + + Collection columns = table.getColumnMap().values(); + for (ColumnEntity column : columns) { + if (column.isId()) { + continue; + } + builder.append("\"").append(column.getName()).append("\""); + builder.append(' ').append(column.getColumnDbType()); + builder.append(' ').append(column.getProperty()); + builder.append(','); + } + + builder.deleteCharAt(builder.length() - 1); + builder.append(" )"); + return new SqlInfo(builder.toString()); + } + + /** + * entity2KeyValueList + * + * @param table + * @param entity + * @return List + */ + public static List entity2KeyValueList(TableEntity table, Object entity) { + Collection columns = table.getColumnMap().values(); + List keyValueList = new ArrayList(columns.size()); + for (ColumnEntity column : columns) { + KeyValue kv = column2KeyValue(entity, column); + if (kv != null) { + keyValueList.add(kv); + } + } + + return keyValueList; + } + + private static KeyValue column2KeyValue(Object entity, ColumnEntity column) { + if (column.isAutoId()) { + return null; + } + + String key = column.getName(); + Object value = column.getFieldValue(entity); + return new KeyValue(key, value); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/sqlite/WhereBuilder.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/sqlite/WhereBuilder.java new file mode 100644 index 0000000..25a58b7 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/sqlite/WhereBuilder.java @@ -0,0 +1,271 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.db.sqlite; + +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.db.table.ColumnUtils; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * Author: wyouflf + * Date: 13-7-29 + * Time: 上午9:35 + * + * @since 2021-05-09 + */ +public class WhereBuilder { + private final List whereItems; + + private WhereBuilder() { + this.whereItems = new ArrayList(); + } + + /** + * b + * + * @return WhereBuilder + */ + public static WhereBuilder b() { + return new WhereBuilder(); + } + + /** + * b + * + * @param columnName + * @param op + * @param value + * @return WhereBuilder + */ + public static WhereBuilder b(String columnName, String op, Object value) { + WhereBuilder result = new WhereBuilder(); + result.appendCondition(null, columnName, op, value); + return result; + } + + /** + * and + * + * @param columnName + * @param op + * @param value + * @return WhereBuilder + */ + public WhereBuilder and(String columnName, String op, Object value) { + appendCondition(whereItems.size() == 0 ? null : "AND", columnName, op, value); + return this; + } + + /** + * and + * + * @param where + * @return WhereBuilder + */ + public WhereBuilder and(WhereBuilder where) { + String condition = whereItems.size() == 0 ? " " : "AND "; + return expr(condition + "(" + where.toString() + ")"); + } + + /** + * or + * + * @param columnName + * @param op + * @param value + * @return WhereBuilder + */ + public WhereBuilder or(String columnName, String op, Object value) { + appendCondition(whereItems.size() == 0 ? null : "OR", columnName, op, value); + return this; + } + + /** + * or + * + * @param where + * @return WhereBuilder + */ + public WhereBuilder or(WhereBuilder where) { + String condition = whereItems.size() == 0 ? " " : "OR "; + return expr(condition + "(" + where.toString() + ")"); + } + + /** + * expr + * + * @param expr + * @return WhereBuilder + */ + public WhereBuilder expr(String expr) { + whereItems.add(" " + expr); + return this; + } + + /** + * getWhereItemSize + * + * @return int + */ + public int getWhereItemSize() { + return whereItems.size(); + } + + /** + * toString + * + * @return String + */ + @Override + public String toString() { + if (whereItems.size() == 0) { + return ""; + } + StringBuilder sb = new StringBuilder(); + for (String item : whereItems) { + sb.append(item); + } + return sb.toString(); + } + + /** + * appendCondition + * + * @param conj + * @param columnName + * @param op + * @param value + */ + private void appendCondition(String conj, String columnName, String op, Object value) { + StringBuilder builder = new StringBuilder(); + + if (whereItems.size() > 0) { + builder.append(" "); + } + + if (!TextUtils.isEmpty(conj)) { + builder.append(conj).append(" "); + } + + builder.append("\"").append(columnName).append("\""); + + // convert op + if ("!=".equals(op)) { + op = "<>"; + } else if ("==".equals(op)) { + op = "="; + } + + if (value == null) { + if ("=".equals(op)) { + builder.append(" IS NULL"); + } else if ("<>".equals(op)) { + builder.append(" IS NOT NULL"); + } else { + builder.append(" ").append(op).append(" NULL"); + } + } else { + builder.append(" ").append(op).append(" "); + + if ("IN".equalsIgnoreCase(op)) { + Iterable items = null; + if (value instanceof Iterable) { + items = (Iterable) value; + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + List arrayList = new ArrayList(len); + for (int i = 0; i < len; i++) { + arrayList.add(Array.get(value, i)); + } + items = arrayList; + } + if (items != null) { + StringBuilder inSb = new StringBuilder("("); + for (Object item : items) { + Object itemColValue = ColumnUtils.convert2DbValueIfNeeded(item); + if (ColumnUtils.isTextColumnDbType(itemColValue)) { + String valueStr = ColumnUtils.convert2SafeExpr(itemColValue); + inSb.append("'").append(valueStr).append("'"); + } else { + inSb.append(itemColValue); + } + inSb.append(","); + } + if (inSb.length() > 1) { + inSb.deleteCharAt(inSb.length() - 1); + } + inSb.append(")"); + builder.append(inSb.toString()); + } else { + throw new IllegalArgumentException("value must be an Array or an Iterable."); + } + } else if ("BETWEEN".equalsIgnoreCase(op)) { + Iterable items = null; + if (value instanceof Iterable) { + items = (Iterable) value; + } else if (value.getClass().isArray()) { + int len = Array.getLength(value); + List arrayList = new ArrayList(len); + for (int i = 0; i < len; i++) { + arrayList.add(Array.get(value, i)); + } + items = arrayList; + } + if (items != null) { + Iterator iterator = items.iterator(); + if (!iterator.hasNext()) { + throw new IllegalArgumentException("value must contains tow items."); + } + Object start = iterator.next(); + if (!iterator.hasNext()) { + throw new IllegalArgumentException("value must contains tow items."); + } + Object end = iterator.next(); + + Object startColValue = ColumnUtils.convert2DbValueIfNeeded(start); + Object endColValue = ColumnUtils.convert2DbValueIfNeeded(end); + + if (ColumnUtils.isTextColumnDbType(startColValue)) { + String startStr = ColumnUtils.convert2SafeExpr(startColValue); + String endStr = ColumnUtils.convert2SafeExpr(endColValue); + builder.append("'").append(startStr).append("'"); + builder.append(" AND "); + builder.append("'").append(endStr).append("'"); + } else { + builder.append(startColValue); + builder.append(" AND "); + builder.append(endColValue); + } + } else { + throw new IllegalArgumentException("value must be an Array or an Iterable."); + } + } else { + value = ColumnUtils.convert2DbValueIfNeeded(value); + if (ColumnUtils.isTextColumnDbType(value)) { + String valueStr = ColumnUtils.convert2SafeExpr(value); + builder.append("'").append(valueStr).append("'"); + } else { + builder.append(value); + } + } + } + whereItems.add(builder.toString()); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/table/ColumnEntity.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/table/ColumnEntity.java new file mode 100644 index 0000000..ec44586 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/table/ColumnEntity.java @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.db.table; + +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.db.annotation.Column; +import com.wordplat.quickstart.xutils.db.converter.ColumnConverter; +import com.wordplat.quickstart.xutils.db.converter.ColumnConverterFactory; +import com.wordplat.quickstart.xutils.db.sqlite.ColumnDbType; + +import ohos.data.resultset.ResultSet; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +public final class ColumnEntity { + protected final String name; + private final String property; + private final boolean isId; + private final boolean isAutoId; + + protected final Method getMethod; + protected final Method setMethod; + + protected final Field columnField; + protected final ColumnConverter columnConverter; + + /* package */ ColumnEntity(Class entityType, Field field, Column column) { + field.setAccessible(true); + + this.columnField = field; + this.name = column.name(); + this.property = column.property(); + this.isId = column.isId(); + + Class fieldType = field.getType(); + this.isAutoId = this.isId && column.autoGen() && ColumnUtils.isAutoIdType(fieldType); + this.columnConverter = ColumnConverterFactory.getColumnConverter(fieldType); + + + this.getMethod = ColumnUtils.findGetMethod(entityType, field); + if (this.getMethod != null && !this.getMethod.isAccessible()) { + this.getMethod.setAccessible(true); + } + this.setMethod = ColumnUtils.findSetMethod(entityType, field); + if (this.setMethod != null && !this.setMethod.isAccessible()) { + this.setMethod.setAccessible(true); + } + } + + /** + * setValueFromCursor + * + * @param entity + * @param cursor + * @param index + */ + public void setValueFromCursor(Object entity, ResultSet cursor, int index) { + Object value = columnConverter.getFieldValue(cursor, index); + if (value == null) { + return; + } + + if (setMethod != null) { + try { + setMethod.invoke(entity, value); + } catch (Throwable e) { + LogUtil.e(e.getMessage(), e); + } + } else { + try { + this.columnField.set(entity, value); + } catch (Throwable e) { + LogUtil.e(e.getMessage(), e); + } + } + } + + /** + * getColumnValue + * + * @param entity + * @return + */ + @SuppressWarnings("unchecked") + public Object getColumnValue(Object entity) { + Object fieldValue = getFieldValue(entity); + if (this.isAutoId && (fieldValue.equals(0L) || fieldValue.equals(0))) { + return null; + } + return columnConverter.fieldValue2DbValue(fieldValue); + } + + /** + * setAutoIdValue + * + * @param entity + * @param value + */ + public void setAutoIdValue(Object entity, long value) { + Object idValue = value; + if (ColumnUtils.isInteger(columnField.getType())) { + idValue = (int) value; + } + + if (setMethod != null) { + try { + setMethod.invoke(entity, idValue); + } catch (Throwable e) { + LogUtil.e(e.getMessage(), e); + } + } else { + try { + this.columnField.set(entity, idValue); + } catch (Throwable e) { + LogUtil.e(e.getMessage(), e); + } + } + } + + /** + * getFieldValue + * + * @param entity + * @return Object + */ + public Object getFieldValue(Object entity) { + Object fieldValue = null; + if (entity != null) { + if (getMethod != null) { + try { + fieldValue = getMethod.invoke(entity); + } catch (Throwable e) { + LogUtil.e(e.getMessage(), e); + } + } else { + try { + fieldValue = this.columnField.get(entity); + } catch (Throwable e) { + LogUtil.e(e.getMessage(), e); + } + } + } + return fieldValue; + } + + public String getName() { + return name; + } + + public String getProperty() { + return property; + } + + public boolean isId() { + return isId; + } + + public boolean isAutoId() { + return isAutoId; + } + + public Field getColumnField() { + return columnField; + } + + public ColumnConverter getColumnConverter() { + return columnConverter; + } + + public ColumnDbType getColumnDbType() { + return columnConverter.getColumnDbType(); + } + + @Override + public String toString() { + return name; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/table/ColumnUtils.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/table/ColumnUtils.java new file mode 100644 index 0000000..935b91f --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/table/ColumnUtils.java @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.db.table; + +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.db.converter.ColumnConverter; +import com.wordplat.quickstart.xutils.db.converter.ColumnConverterFactory; +import com.wordplat.quickstart.xutils.db.sqlite.ColumnDbType; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashSet; + +/** + * ColumnUtils + * + * @since 2021-05-09 + */ +public final class ColumnUtils { + private static final HashSet> BOOLEAN_TYPES = new HashSet>(2); + private static final HashSet> INTEGER_TYPES = new HashSet>(2); + private static final HashSet> AUTO_INCREMENT_TYPES = new HashSet>(4); + + private ColumnUtils() { + } + + static { + BOOLEAN_TYPES.add(boolean.class); + BOOLEAN_TYPES.add(Boolean.class); + + INTEGER_TYPES.add(int.class); + INTEGER_TYPES.add(Integer.class); + + AUTO_INCREMENT_TYPES.addAll(INTEGER_TYPES); + AUTO_INCREMENT_TYPES.add(long.class); + AUTO_INCREMENT_TYPES.add(Long.class); + } + + /** + * isAutoIdType + * + * @param fieldType + * @return boolean + */ + public static boolean isAutoIdType(Class fieldType) { + return AUTO_INCREMENT_TYPES.contains(fieldType); + } + + /** + * isInteger + * + * @param fieldType + * @return boolean + */ + public static boolean isInteger(Class fieldType) { + return INTEGER_TYPES.contains(fieldType); + } + + /** + * isBoolean + * + * @param fieldType + * @return boolean + */ + public static boolean isBoolean(Class fieldType) { + return BOOLEAN_TYPES.contains(fieldType); + } + + /** + * isTextColumnDbType + * + * @param value + * @return boolean + */ + public static boolean isTextColumnDbType(Object value) { + if (value == null) { + return false; + } + ColumnConverter converter = ColumnConverterFactory.getColumnConverter(value.getClass()); + return converter != null && ColumnDbType.TEXT.equals(converter.getColumnDbType()); + } + + /** + * convert2SafeExpr + * + * @param value + * @return String + */ + public static String convert2SafeExpr(Object value) { + String result = String.valueOf(value); + if (result.indexOf('\'') != -1) { + result = result.replace("'", "''"); + } + return result; + } + + /** + * convert2DbValueIfNeeded + * + * @param value + * @return Object + */ + @SuppressWarnings("unchecked") + public static Object convert2DbValueIfNeeded(final Object value) { + Object result = value; + if (value != null) { + Class valueType = value.getClass(); + ColumnConverter converter = ColumnConverterFactory.getColumnConverter(valueType); + result = converter.fieldValue2DbValue(value); + } + return result; + } + + static Method findGetMethod(Class entityType, Field field) { + if (Object.class.equals(entityType)) { + return null; + } + String fieldName = field.getName(); + Method getMethod = null; + if (isBoolean(field.getType())) { + getMethod = findBooleanGetMethod(entityType, fieldName); + } + if (getMethod == null) { + String methodName = "get" + fieldName.substring(0, 1).toUpperCase(); + if (fieldName.length() > 1) { + methodName += fieldName.substring(1); + } + try { + getMethod = entityType.getDeclaredMethod(methodName); + } catch (NoSuchMethodException e) { + LogUtil.d(entityType.getName() + "#" + methodName + " not exist"); + } + } + + if (getMethod == null) { + return findGetMethod(entityType.getSuperclass(), field); + } + return getMethod; + } + + static Method findSetMethod(Class entityType, Field field) { + if (Object.class.equals(entityType)) { + return null; + } + String fieldName = field.getName(); + Class fieldType = field.getType(); + Method setMethod = null; + if (isBoolean(fieldType)) { + setMethod = findBooleanSetMethod(entityType, fieldName, fieldType); + } + if (setMethod == null) { + String methodName = "set" + fieldName.substring(0, 1).toUpperCase(); + if (fieldName.length() > 1) { + methodName += fieldName.substring(1); + } + try { + setMethod = entityType.getDeclaredMethod(methodName, fieldType); + } catch (NoSuchMethodException e) { + LogUtil.d(entityType.getName() + "#" + methodName + " not exist"); + } + } + + if (setMethod == null) { + return findSetMethod(entityType.getSuperclass(), field); + } + return setMethod; + } + + private static Method findBooleanGetMethod(Class entityType, final String fieldName) { + String methodName = null; + if (fieldName.startsWith("is")) { + methodName = fieldName; + } else { + methodName = "is" + fieldName.substring(0, 1).toUpperCase(); + if (fieldName.length() > 1) { + methodName += fieldName.substring(1); + } + } + try { + return entityType.getDeclaredMethod(methodName); + } catch (NoSuchMethodException e) { + LogUtil.d(entityType.getName() + "#" + methodName + " not exist"); + } + return null; + } + + private static Method findBooleanSetMethod(Class entityType, final String fieldName, Class fieldType) { + String methodName = null; + if (fieldName.startsWith("is") && fieldName.length() > 2) { + methodName = "set" + fieldName.substring(2, 3).toUpperCase(); + if (fieldName.length() > 3) { + methodName += fieldName.substring(3); + } + } else { + methodName = "set" + fieldName.substring(0, 1).toUpperCase(); + if (fieldName.length() > 1) { + methodName += fieldName.substring(1); + } + } + try { + return entityType.getDeclaredMethod(methodName, fieldType); + } catch (NoSuchMethodException e) { + LogUtil.d(entityType.getName() + "#" + methodName + " not exist"); + } + return null; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/table/DbBase.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/table/DbBase.java new file mode 100644 index 0000000..bd44757 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/table/DbBase.java @@ -0,0 +1,113 @@ +package com.wordplat.quickstart.xutils.db.table; + +import com.wordplat.quickstart.xutils.DbManager; +import com.wordplat.quickstart.xutils.common.util.IOUtil; +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.ex.DbException; + +import ohos.data.resultset.ResultSet; + +import java.util.HashMap; + +/** + * DbManager基类, 包含表结构的基本操作. + * Created by wyouflf on 16/1/22. + * + * @since 2021-05-09 + */ +public abstract class DbBase implements DbManager { + + private final HashMap, TableEntity> tableMap = new HashMap, TableEntity>(); + + @Override + @SuppressWarnings("unchecked") + public TableEntity getTable(Class entityType) throws DbException { + synchronized (tableMap) { + TableEntity table = (TableEntity) tableMap.get(entityType); + if (table == null) { + try { + table = new TableEntity(this, entityType); + } catch (DbException ex) { + throw ex; + } catch (Throwable ex) { + throw new DbException(ex); + } + tableMap.put(entityType, table); + } + + return table; + } + } + + @Override + public void dropTable(Class entityType) throws DbException { + TableEntity table = this.getTable(entityType); + if (!table.tableIsExists()) { + return; + } + execNonQuery("DROP TABLE \"" + table.getName() + "\""); + table.setTableCheckedStatus(false); + this.removeTable(entityType); + } + + @Override + public void dropDb() throws DbException { + ResultSet cursor = execQuery("SELECT name FROM sqlite_master WHERE type='table' AND name<>'sqlite_sequence'"); + if (cursor != null) { + try { + while (cursor.goToNextRow()) { + try { + String tableName = cursor.getString(0); + execNonQuery("DROP TABLE " + tableName); + } catch (Throwable e) { + LogUtil.e(e.getMessage(), e); + } + } + + synchronized (tableMap) { + for (TableEntity table : tableMap.values()) { + table.setTableCheckedStatus(false); + } + tableMap.clear(); + } + } catch (Throwable e) { + throw new DbException(e); + } finally { + IOUtil.closeQuietly(cursor); + } + } + } + + @Override + public void addColumn(Class entityType, String column) throws DbException { + TableEntity table = this.getTable(entityType); + ColumnEntity col = table.getColumnMap().get(column); + if (col != null) { + /** + * // 不需要添加, 表创建时会自动添加 + */ + if (!table.tableIsExists()) { + return; + } + StringBuilder builder = new StringBuilder(); + builder.append("ALTER TABLE ").append("\"").append(table.getName()).append("\""). + append(" ADD COLUMN ").append("\"").append(col.getName()).append("\""). + append(" ").append(col.getColumnDbType()). + append(" ").append(col.getProperty()); + execNonQuery(builder.toString()); + } else { + throw new DbException("the column(" + column + ") is not defined in table: " + table.getName()); + } + } + + /** + * removeTable + * + * @param entityType + */ + protected void removeTable(Class entityType) { + synchronized (tableMap) { + tableMap.remove(entityType); + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/table/DbModel.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/table/DbModel.java new file mode 100644 index 0000000..58f150e --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/table/DbModel.java @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.db.table; + +import com.wordplat.quickstart.xutils.common.util.TextUtils; + +import java.util.Date; +import java.util.HashMap; + +/** + * DbModel + * + * @since 2021-05-09 + */ +public final class DbModel { + private final HashMap dataMap = new HashMap(); + /** + * getString + * + * @param columnName + * @return String + */ + public String getString(String columnName) { + return dataMap.get(columnName); + } + + /** + * getInt + * + * @param columnName + * @param defaultValue + * @return getInt + */ + public int getInt(String columnName, int defaultValue) { + String value = dataMap.get(columnName); + if (TextUtils.isEmpty(value)) { + return defaultValue; + } else { + try { + return Integer.valueOf(value); + } catch (Throwable ex) { + return defaultValue; + } + } + } + + /** + * getBoolean + * + * @param columnName + * @return getBoolean + */ + public boolean getBoolean(String columnName) { + String value = dataMap.get(columnName); + if (value != null) { + return value.length() == 1 ? "1".equals(value) : Boolean.valueOf(value); + } + return false; + } + + /** + * getDouble + * + * @param columnName + * @param defaultValue + * @return getDouble + */ + public double getDouble(String columnName, double defaultValue) { + String value = dataMap.get(columnName); + if (TextUtils.isEmpty(value)) { + return defaultValue; + } else { + try { + return Double.valueOf(value); + } catch (Throwable ex) { + return defaultValue; + } + } + } + + /** + * getFloat + * + * @param columnName + * @param defaultValue + * @return getFloat + */ + public float getFloat(String columnName, float defaultValue) { + String value = dataMap.get(columnName); + if (TextUtils.isEmpty(value)) { + return defaultValue; + } else { + try { + return Float.valueOf(value); + } catch (Throwable ex) { + return defaultValue; + } + } + } + + /** + * getLong + * + * @param columnName + * @param defaultValue + * @return getLong + */ + public long getLong(String columnName, long defaultValue) { + String value = dataMap.get(columnName); + if (TextUtils.isEmpty(value)) { + return defaultValue; + } else { + try { + return Long.valueOf(value); + } catch (Throwable ex) { + return defaultValue; + } + } + } + + /** + * getDate + * + * @param columnName + * @param defaultTime + * @return getDate + */ + public Date getDate(String columnName, long defaultTime) { + return new Date(getLong(columnName, defaultTime)); + } + + /** + * getSqlDate + * + * @param columnName + * @param defaultTime + * @return getSqlDate + */ + public java.sql.Date getSqlDate(String columnName, long defaultTime) { + return new java.sql.Date(getLong(columnName, defaultTime)); + } + + /** + * add + * + * @param columnName + * @param valueStr + */ + public void add(String columnName, String valueStr) { + dataMap.put(columnName, valueStr); + } + + /** + * getDataMap + * + * @return HashMap + */ + public HashMap getDataMap() { + return dataMap; + } + + /** + * isEmpty + * + * @param columnName + * @return boolean + */ + public boolean isEmpty(String columnName) { + return TextUtils.isEmpty(dataMap.get(columnName)); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/table/TableEntity.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/table/TableEntity.java new file mode 100644 index 0000000..a35096c --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/table/TableEntity.java @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.db.table; + +import com.wordplat.quickstart.xutils.DbManager; +import com.wordplat.quickstart.xutils.common.util.IOUtil; +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.db.annotation.Table; +import com.wordplat.quickstart.xutils.db.sqlite.SqlInfo; +import com.wordplat.quickstart.xutils.db.sqlite.SqlInfoBuilder; +import com.wordplat.quickstart.xutils.ex.DbException; + +import ohos.data.resultset.ResultSet; + +import java.lang.reflect.Constructor; +import java.util.LinkedHashMap; + +/** + * TableEntity + * + * @param + * @since 2021-05-09 + */ +public final class TableEntity { + private final DbManager db; + private final String name; + private final String onCreated; + private final Class entityType; + private final Constructor constructor; + private ColumnEntity id; + private volatile Boolean tableCheckedStatus; + private final Object lock = new Object(); // private final lock object + + /** + * key: columnName + */ + private final LinkedHashMap columnMap; + + TableEntity(DbManager db, Class entityType) throws Throwable { + this.db = db; + this.entityType = entityType; + + Table table = entityType.getAnnotation(Table.class); + if (table == null) { + throw new DbException("missing @Table on " + entityType.getName()); + } + this.name = table.name(); + this.onCreated = table.onCreated(); + + try { + this.constructor = entityType.getConstructor(); + this.constructor.setAccessible(true); + } catch (Throwable ex) { + throw new DbException("missing no-argument constructor for the table: " + this.name); + } + + this.columnMap = TableUtils.findColumnMap(entityType); + for (ColumnEntity column : columnMap.values()) { + if (column.isId()) { + this.id = column; + break; + } + } + } + + /** + * createEntity + * + * @return T + * @throws Throwable + */ + public T createEntity() throws Throwable { + return this.constructor.newInstance(); + } + + /** + * tableIsExists + * + * @return boolean + * @throws DbException + */ + public boolean tableIsExists() throws DbException { + return tableIsExists(false); + } + + /** + * tableIsExists + * + * @param forceCheckFromDb + * @return boolean + * @throws DbException + */ + public boolean tableIsExists(boolean forceCheckFromDb) throws DbException { + if (tableCheckedStatus != null && (tableCheckedStatus || !forceCheckFromDb)) { + return tableCheckedStatus; + } + + ResultSet cursor = db.execQuery("SELECT COUNT(*) AS c FROM sqlite_master " + + "WHERE type='table' AND name='" + name + "'"); + if (cursor != null) { + try { + if (cursor.goToNextRow()) { + int count = cursor.getInt(0); + if (count > 0) { + tableCheckedStatus = true; + return tableCheckedStatus; + } + } + } catch (Throwable e) { + throw new DbException(e); + } finally { + IOUtil.closeQuietly(cursor); + } + } + + tableCheckedStatus = false; + return tableCheckedStatus; + } + + /** + * createTableIfNotExists + * + * @throws DbException + */ + public void createTableIfNotExists() throws DbException { + if (tableCheckedStatus != null && tableCheckedStatus) { + return; + } + synchronized (entityType) { + if (!this.tableIsExists(true)) { + SqlInfo sqlInfo = SqlInfoBuilder.buildCreateTableSqlInfo(this); + db.execNonQuery(sqlInfo); + tableCheckedStatus = true; + + if (!TextUtils.isEmpty(onCreated)) { + db.execNonQuery(onCreated); + } + + DbManager.TableCreateListener listener = db.getDaoConfig().getTableCreateListener(); + if (listener != null) { + try { + listener.onTableCreated(db, this); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + } + } + } + + public DbManager getDb() { + return db; + } + + public String getName() { + return name; + } + + public String getOnCreated() { + return onCreated; + } + + public ColumnEntity getId() { + return id; + } + + public LinkedHashMap getColumnMap() { + return columnMap; + } + + void setTableCheckedStatus(boolean tableCheckedStatus) { + this.tableCheckedStatus = tableCheckedStatus; + } + + @Override + public String toString() { + return name; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/db/table/TableUtils.java b/entry/src/main/java/com/wordplat/quickstart/xutils/db/table/TableUtils.java new file mode 100644 index 0000000..c855222 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/db/table/TableUtils.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.db.table; + +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.db.annotation.Column; +import com.wordplat.quickstart.xutils.db.converter.ColumnConverterFactory; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.HashMap; +import java.util.LinkedHashMap; + +/** + * TableUtils + * + * @since 2021-05-09 + */ +final class TableUtils { + private TableUtils() { + } + + static LinkedHashMap findColumnMap(Class entityType) { + LinkedHashMap columnMap = new LinkedHashMap(); + addColumns2Map(entityType, columnMap); + return columnMap; + } + + private static void addColumns2Map(Class entityType, HashMap columnMap) { + if (Object.class.equals(entityType)) { + return; + } + + try { + Field[] fields = entityType.getDeclaredFields(); + for (Field field : fields) { + int modify = field.getModifiers(); + if (Modifier.isStatic(modify) || Modifier.isTransient(modify)) { + continue; + } + Column columnAnn = field.getAnnotation(Column.class); + if (columnAnn != null) { + if (ColumnConverterFactory.isSupportColumnConverter(field.getType())) { + ColumnEntity column = new ColumnEntity(entityType, field, columnAnn); + if (!columnMap.containsKey(column.getName())) { + columnMap.put(column.getName(), column); + } + } + } + } + + addColumns2Map(entityType.getSuperclass(), columnMap); + } catch (Throwable e) { + LogUtil.e(e.getMessage(), e); + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/ex/BaseException.java b/entry/src/main/java/com/wordplat/quickstart/xutils/ex/BaseException.java new file mode 100644 index 0000000..4ec8efe --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/ex/BaseException.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.ex; + +import java.io.IOException; + +/** + * Author: wyouflf + * Date: 13-7-24 + * Time: 下午3:00 + * + * @since 2021-05-09 + */ +public class BaseException extends IOException { + private static final long serialVersionUID = 1L; + + /** + * BaseException + */ + public BaseException() { + super(); + } + + /** + * BaseException + * + * @param detailMessage + */ + public BaseException(String detailMessage) { + super(detailMessage); + } + + /** + * BaseException + * + * @param detailMessage + * @param throwable + */ + public BaseException(String detailMessage, Throwable throwable) { + super(detailMessage); + this.initCause(throwable); + } + + /** + * BaseException + * + * @param throwable + */ + public BaseException(Throwable throwable) { + super(throwable.getMessage()); + this.initCause(throwable); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/ex/DbException.java b/entry/src/main/java/com/wordplat/quickstart/xutils/ex/DbException.java new file mode 100644 index 0000000..08cb61d --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/ex/DbException.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.ex; + +/** + * DbException + * + * @since 2021-05-09 + */ +public class DbException extends BaseException { + private static final long serialVersionUID = 1L; + + /** + * DbException + */ + public DbException() { + } + + /** + * DbException + * + * @param detailMessage + */ + public DbException(String detailMessage) { + super(detailMessage); + } + + /** + * DbException + * + * @param detailMessage + * @param throwable + */ + public DbException(String detailMessage, Throwable throwable) { + super(detailMessage, throwable); + } + + /** + * DbException + * + * @param throwable + */ + public DbException(Throwable throwable) { + super(throwable); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/ex/FileLockedException.java b/entry/src/main/java/com/wordplat/quickstart/xutils/ex/FileLockedException.java new file mode 100644 index 0000000..07cf5b7 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/ex/FileLockedException.java @@ -0,0 +1,19 @@ +package com.wordplat.quickstart.xutils.ex; + +/** + * Created by wyouflf on 15/10/9. + * + * @since 2021-05-09 + */ +public class FileLockedException extends BaseException { + private static final long serialVersionUID = 1L; + + /** + * FileLockedException + * + * @param detailMessage + */ + public FileLockedException(String detailMessage) { + super(detailMessage); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/ex/HttpException.java b/entry/src/main/java/com/wordplat/quickstart/xutils/ex/HttpException.java new file mode 100644 index 0000000..3d71c6c --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/ex/HttpException.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.ex; + +/** + * HttpException + * + * @since 2021-05-09 + */ +public class HttpException extends BaseException { + private static final long serialVersionUID = 1L; + + private int code; + private String errorCode; + private String customMessage; + private String result; + + /** + * HttpException + * + * @param code The http response status code, 0 if the http request error and has no response. + * @param detailMessage The http response message. + */ + public HttpException(int code, String detailMessage) { + super(detailMessage); + this.code = code; + } + + public void setCode(int code) { + this.code = code; + } + + public void setMessage(String message) { + this.customMessage = message; + } + + public int getCode() { + return code; + } + + public String getErrorCode() { + return errorCode == null ? String.valueOf(code) : errorCode; + } + + public void setErrorCode(String errorCode) { + this.errorCode = errorCode; + } + + @Override + public String getMessage() { + if (customMessage != null && customMessage.length() > 0) { + return customMessage; + } else { + return super.getMessage(); + } + } + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + @Override + public String toString() { + return "errorCode: " + getErrorCode() + ", msg: " + getMessage() + ", result: " + result; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/ex/HttpRedirectException.java b/entry/src/main/java/com/wordplat/quickstart/xutils/ex/HttpRedirectException.java new file mode 100644 index 0000000..9d0ab1b --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/ex/HttpRedirectException.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.ex; + +/** + * HttpRedirectException + * + * @since 2021-05-09 + */ +public class HttpRedirectException extends HttpException { + private static final long serialVersionUID = 1L; + + /** + * HttpRedirectException + * + * @param code + * @param detailMessage + * @param result + */ + public HttpRedirectException(int code, String detailMessage, String result) { + super(code, detailMessage); + this.setResult(result); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/BaseParams.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/BaseParams.java new file mode 100644 index 0000000..bd5a138 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/BaseParams.java @@ -0,0 +1,606 @@ +package com.wordplat.quickstart.xutils.http; + +import com.wordplat.quickstart.json.JSONArray; +import com.wordplat.quickstart.json.JSONException; +import com.wordplat.quickstart.json.JSONObject; +import com.wordplat.quickstart.xutils.common.util.KeyValue; +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.http.body.*; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Array; +import java.util.*; + +/** + * 请求的基础参数 + * Created by wyouflf on 16/1/23. + * + * @since 2021-05-09 + */ +public abstract class BaseParams { + private String charset = "UTF-8"; + private HttpMethod method; + private String bodyContent; + private String bodyContentType; + private boolean multipart = false; // 是否使用multipart表单 + private boolean asJsonContent = false; // 用json形式的bodyParams上传 + private boolean asJsonArrayContent = false; // 用json array形式的bodyParams上传 + private RequestBody requestBody; // 生成的表单 + + private final List
headers = new ArrayList
(); + private final List queryStringParams = new ArrayList(); + private final List bodyParams = new ArrayList(); + + /** + * setCharset + * + * @param charset + */ + public void setCharset(String charset) { + if (!TextUtils.isEmpty(charset)) { + this.charset = charset; + } + } + + public String getCharset() { + return charset; + } + + public void setMethod(HttpMethod method) { + this.method = method; + } + + public HttpMethod getMethod() { + return method; + } + + public boolean isMultipart() { + return multipart; + } + + public void setMultipart(boolean multipart) { + this.multipart = multipart; + } + + + public boolean isAsJsonContent() { + return asJsonContent; + } + + public void setAsJsonContent(boolean asJsonContent) { + this.asJsonContent = asJsonContent; + } + + + public boolean isAsJsonArrayContent() { + return asJsonArrayContent; + } + + + public void setAsJsonArrayContent(boolean asJsonArrayContent) { + this.asJsonArrayContent = asJsonArrayContent; + } + + /** + * setHeader + * + * @param name + * @param value + */ + public void setHeader(String name, String value) { + if (TextUtils.isEmpty(name)) { + return; + } + Header header = new Header(name, value, true); + Iterator
it = headers.iterator(); + while (it.hasNext()) { + KeyValue kv = it.next(); + + if (name.equals(kv.key)) { + it.remove(); + } + } + this.headers.add(header); + } + + /** + * addHeader + * + * @param name + * @param value + */ + public void addHeader(String name, String value) { + if (TextUtils.isEmpty(name)) { + return; + } + this.headers.add(new Header(name, value, false)); + } + + /** + * addParameter + * + * @param name + * @param value + */ + public void addParameter(String name, Object value) { + if (HttpMethod.permitsRequestBody(method)) { + addBodyParameter(name, value, null, null); + } else { + addQueryStringParameter(name, value); + } + } + + /** + * addQueryStringParameter + * + * @param name + * @param value + */ + public void addQueryStringParameter(String name, Object value) { + if (TextUtils.isEmpty(name)) { + return; + } + if (value instanceof Iterable) { + for (Object item : (Iterable) value) { + this.queryStringParams.add(new ArrayItem(name, item)); + } + } else if (value instanceof JSONArray) { + JSONArray array = (JSONArray) value; + int len = array.length(); + for (int i = 0; i < len; i++) { + this.queryStringParams.add(new ArrayItem(name, array.opt(i))); + } + } else if (value != null && value.getClass().isArray()) { + int len = Array.getLength(value); + for (int i = 0; i < len; i++) { + this.queryStringParams.add(new ArrayItem(name, Array.get(value, i))); + } + } else { + this.queryStringParams.add(new KeyValue(name, value)); + } + } + + /** + * addBodyParameter + * + * @param name + * @param value + */ + public void addBodyParameter(String name, Object value) { + addBodyParameter(name, value, null, null); + } + + /** + * addBodyParameter + * + * @param name + * @param value + * @param contentType + */ + public void addBodyParameter(String name, Object value, String contentType) { + addBodyParameter(name, value, contentType, null); + } + + /** + * addBodyParameter + * + * @param name + * @param value + * @param contentType + * @param fileName + */ + public void addBodyParameter(String name, Object value, String contentType, String fileName) { + if (TextUtils.isEmpty(name) && value == null) { + return; + } + if (TextUtils.isEmpty(contentType) && TextUtils.isEmpty(fileName)) { + if (value instanceof Iterable) { + for (Object item : (Iterable) value) { + this.bodyParams.add(new ArrayItem(name, item)); + } + } else if (value instanceof JSONArray) { + JSONArray array = (JSONArray) value; + int len = array.length(); + for (int i = 0; i < len; i++) { + this.bodyParams.add(new ArrayItem(name, array.opt(i))); + } + } else if (value instanceof byte[]) { + this.bodyParams.add(new KeyValue(name, value)); + } else if (value != null && value.getClass().isArray()) { + int len = Array.getLength(value); + for (int i = 0; i < len; i++) { + this.bodyParams.add(new ArrayItem(name, Array.get(value, i))); + } + } else { + this.bodyParams.add(new KeyValue(name, value)); + } + } else { + this.bodyParams.add(new BodyItemWrapper(name, value, contentType, fileName)); + } + } + + public void setBodyContent(String content) { + this.bodyContent = content; + } + + /** + * getBodyContent + * + * @return String + */ + public String getBodyContent() { + checkBodyParams(); + return bodyContent; + } + + public void setBodyContentType(String bodyContentType) { + this.bodyContentType = bodyContentType; + } + + public List
getHeaders() { + return new ArrayList
(headers); + } + + /** + * getQueryStringParams + * + * @return + */ + public List getQueryStringParams() { + checkBodyParams(); + return new ArrayList(queryStringParams); + } + + /** + * getBodyParams + * + * @return List + */ + public List getBodyParams() { + checkBodyParams(); + return new ArrayList(bodyParams); + } + + /** + * getParams + * + * @param name + * @return List + */ + public List getParams(String name) { + List result = new ArrayList(); + for (KeyValue kv : queryStringParams) { + if (name != null && name.equals(kv.key)) { + result.add(kv); + } + } + for (KeyValue kv : bodyParams) { + if (name == null && kv.key == null) { + result.add(kv); + } else if (name != null && name.equals(kv.key)) { + result.add(kv); + } + } + return result; + } + + /** + * clearParams + */ + public void clearParams() { + queryStringParams.clear(); + bodyParams.clear(); + bodyContent = null; + bodyContentType = null; + requestBody = null; + } + + /** + * removeParameter + * + * @param name + */ + public void removeParameter(String name) { + if (TextUtils.isEmpty(name)) { + bodyContent = null; + bodyContentType = null; + } else { + Iterator it = queryStringParams.iterator(); + while (it.hasNext()) { + KeyValue kv = it.next(); + if (name.equals(kv.key)) { + it.remove(); + } + } + } + + Iterator it = bodyParams.iterator(); + while (it.hasNext()) { + KeyValue kv = it.next(); + if (name == null && kv.key == null) { + it.remove(); + } else if (name != null && name.equals(kv.key)) { + it.remove(); + } + } + } + + public void setRequestBody(RequestBody requestBody) { + this.requestBody = requestBody; + } + + /** + * getRequestBody + * + * @return RequestBody + * @throws IOException + */ + public RequestBody getRequestBody() throws IOException { + checkBodyParams(); + if (this.requestBody != null) { + return this.requestBody; + } + + RequestBody result = null; + if (!TextUtils.isEmpty(bodyContent)) { + result = new StringBody(bodyContent, charset); + result.setContentType(bodyContentType); + } else if (multipart) { + result = new MultipartBody(bodyParams, charset); + result.setContentType(bodyContentType); + } else if (bodyParams.size() == 1) { + KeyValue kv = bodyParams.get(0); + String name = kv.key; + Object value = kv.value; + String contentType = null; + if (kv instanceof BodyItemWrapper) { + BodyItemWrapper wrapper = (BodyItemWrapper) kv; + contentType = wrapper.contentType; + } + if (TextUtils.isEmpty(contentType)) { + contentType = bodyContentType; + } + if (value instanceof File) { + result = new FileBody((File) value, contentType); + } else if (value instanceof InputStream) { + result = new InputStreamBody((InputStream) value, contentType); + } else if (value instanceof byte[]) { + result = new InputStreamBody(new ByteArrayInputStream((byte[]) value), contentType); + } else { + if (TextUtils.isEmpty(name)) { + result = new StringBody(kv.getValueStrOrEmpty(), charset); + result.setContentType(contentType); + } else { + result = new UrlEncodedBody(bodyParams, charset); + result.setContentType(contentType); + } + } + } else { + result = new UrlEncodedBody(bodyParams, charset); + result.setContentType(bodyContentType); + } + + return result; + } + + /** + * toJSONString + * + * @return String + * @throws JSONException + */ + public String toJSONString() throws JSONException { + return toJSONString(true); + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder(); + if (!queryStringParams.isEmpty()) { + for (KeyValue kv : queryStringParams) { + sb.append(kv.key).append("=").append(kv.value).append("&"); + } + sb.deleteCharAt(sb.length() - 1); + } + + if (!TextUtils.isEmpty(bodyContent)) { + sb.append("<").append(bodyContent).append(">"); + } else if (!bodyParams.isEmpty()) { + sb.append("<"); + for (KeyValue kv : bodyParams) { + sb.append(kv.key).append("=").append(kv.value).append("&"); + } + sb.deleteCharAt(sb.length() - 1); + sb.append(">"); + } + return sb.toString(); + } + + private synchronized void checkBodyParams() { + if (bodyParams.isEmpty()) { + return; + } + + if (requestBody != null || !HttpMethod.permitsRequestBody(method)) { + queryStringParams.addAll(bodyParams); + bodyParams.clear(); + return; + } + + if (asJsonContent || asJsonArrayContent) { + try { + bodyContent = toJSONString(false); + bodyParams.clear(); + } catch (JSONException ex) { + throw new IllegalArgumentException(ex.getMessage(), ex); + } + } else if (!TextUtils.isEmpty(bodyContent)) { + queryStringParams.addAll(bodyParams); + bodyParams.clear(); + } + } + + private void params2Json(final JSONObject jsonObject, final List paramList) throws JSONException { + HashSet arraySet = new HashSet(paramList.size()); + LinkedHashMap tempData = new LinkedHashMap(paramList.size()); + for (int i = 0; i < paramList.size(); i++) { + KeyValue kv = paramList.get(i); + final String key = kv.key; + if (TextUtils.isEmpty(key)) { + continue; + } + + JSONArray ja = null; + if (tempData.containsKey(key)) { + ja = tempData.get(key); + } else { + ja = new JSONArray(); + tempData.put(key, ja); + } + + ja.put(RequestParamsHelper.parseJSONObject(kv.value)); + + if (kv instanceof ArrayItem) { + arraySet.add(key); + } + } + + for (Map.Entry entry : tempData.entrySet()) { + String key = entry.getKey(); + JSONArray ja = entry.getValue(); + if (ja.length() > 1 || arraySet.contains(key)) { + jsonObject.put(key, ja); + } else { + Object value = ja.get(0); + jsonObject.put(key, value); + } + } + } + + /** + * toJSONString + * + * @param withQueryString + * @return String + * @throws JSONException + */ + private String toJSONString(boolean withQueryString) throws JSONException { + JSONArray jsonArray = null; + JSONObject jsonObject = null; + if (!TextUtils.isEmpty(bodyContent)) { + if (bodyContent.trim().startsWith("[")) { + jsonArray = new JSONArray(bodyContent); + if (jsonArray.length() > 0) { + Object first = jsonArray.get(0); + if (first instanceof JSONObject) { + jsonObject = (JSONObject) first; + } else { + LogUtil.w("only contains bodyContent"); + return jsonArray.toString(); + } + } else { + jsonObject = new JSONObject(); + jsonArray.put(jsonObject); + } + } else { + jsonObject = new JSONObject(bodyContent); + } + } else { + jsonObject = new JSONObject(); + if (asJsonArrayContent) { + jsonArray = new JSONArray(); + jsonArray.put(jsonObject); + } + } + + if (withQueryString) { + List list = new ArrayList(queryStringParams.size() + bodyParams.size()); + list.addAll(queryStringParams); + list.addAll(bodyParams); + params2Json(jsonObject, list); + } else { + params2Json(jsonObject, bodyParams); + } + + return jsonArray != null ? jsonArray.toString() : jsonObject.toString(); + } + + /** + * ArrayItem + * + * @since 2021-05-09 + */ + public static final class ArrayItem extends KeyValue { + /** + * ArrayItem + * + * @param key + * @param value + */ + public ArrayItem(String key, Object value) { + super(key, value); + } + } + + /** + * Header + * + * @since 2021-05-09 + */ + public static final class Header extends KeyValue { + /** + * setHeader + */ + public final boolean setHeader; + + /** + * Header + * + * @param key + * @param value + * @param setHeader + */ + public Header(String key, String value, boolean setHeader) { + super(key, value); + this.setHeader = setHeader; + } + } + + /** + * BodyItemWrapper + * + * @since 2021-05-09 + */ + public static final class BodyItemWrapper extends KeyValue { + /** + * fileName + */ + public final String fileName; + /** + * contentType + */ + public final String contentType; + + /** + * BodyItemWrapper + * + * @param key + * @param value + * @param contentType + * @param fileName + */ + public BodyItemWrapper(String key, Object value, String contentType, String fileName) { + super(key, value); + if (TextUtils.isEmpty(contentType)) { + this.contentType = "application/octet-stream"; + } else { + this.contentType = contentType; + } + this.fileName = fileName; + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/HttpManagerImpl.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/HttpManagerImpl.java new file mode 100644 index 0000000..0e9b282 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/HttpManagerImpl.java @@ -0,0 +1,114 @@ +package com.wordplat.quickstart.xutils.http; + +import com.wordplat.quickstart.xutils.HttpManager; +import com.wordplat.quickstart.xutils.common.Callback; +import com.wordplat.quickstart.xutils.x; + +import java.lang.reflect.Type; + +/** + * Created by wyouflf on 15/7/23. + * HttpManager实现 + * + * @since 2021-05-09 + */ +public final class HttpManagerImpl implements HttpManager { + private static final Object lock = new Object(); + private static volatile HttpManagerImpl instance; + + private HttpManagerImpl() { + } + + /** + * registerInstance + */ + public static void registerInstance() { + if (instance == null) { + synchronized (lock) { + if (instance == null) { + instance = new HttpManagerImpl(); + } + } + } + x.Ext.setHttpManager(instance); + } + + @Override + public Callback.Cancelable get(RequestParams entity, Callback.CommonCallback callback) { + return request(HttpMethod.GET, entity, callback); + } + + @Override + public Callback.Cancelable post(RequestParams entity, Callback.CommonCallback callback) { + return request(HttpMethod.POST, entity, callback); + } + + @Override + public Callback.Cancelable request(HttpMethod method, RequestParams entity, Callback.CommonCallback callback) { + entity.setMethod(method); + Callback.Cancelable cancelable = null; + if (callback instanceof Callback.Cancelable) { + cancelable = (Callback.Cancelable) callback; + } + HttpTask task = new HttpTask(entity, cancelable, callback); + return x.task().start(task); + } + + @Override + public T getSync(RequestParams entity, Class resultType) throws Throwable { + return requestSync(HttpMethod.GET, entity, resultType); + } + + @Override + public T postSync(RequestParams entity, Class resultType) throws Throwable { + return requestSync(HttpMethod.POST, entity, resultType); + } + + @Override + public T requestSync(HttpMethod method, RequestParams entity, Class resultType) throws Throwable { + DefaultSyncCallback callback = new DefaultSyncCallback(resultType); + return requestSync(method, entity, callback); + } + + @Override + public T requestSync(HttpMethod method, RequestParams entity, Callback.TypedCallback callback) throws Throwable { + entity.setMethod(method); + HttpTask task = new HttpTask(entity, null, callback); + return x.task().startSync(task); + } + + /** + * DefaultSyncCallback + * + * @param + */ + private class DefaultSyncCallback implements Callback.TypedCallback { + + private final Class resultType; + + public DefaultSyncCallback(Class resultType) { + this.resultType = resultType; + } + + @Override + public Type getLoadType() { + return resultType; + } + + @Override + public void onSuccess(T result) { + } + + @Override + public void onError(Throwable ex, boolean isOnCallback) { + } + + @Override + public void onCancelled(CancelledException cex) { + } + + @Override + public void onFinished() { + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/HttpMethod.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/HttpMethod.java new file mode 100644 index 0000000..2660eb2 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/HttpMethod.java @@ -0,0 +1,70 @@ +package com.wordplat.quickstart.xutils.http; + +/** + * Created by wyouflf on 15/8/4. + * HTTP谓词枚举 + * + * @since 2021-05-09 + */ +public enum HttpMethod { + /** + * GET("GET"), + * POST("POST"), + * PUT("PUT"), + * PATCH("PATCH"), + * HEAD("HEAD"), + * MOVE("MOVE"), + * COPY("COPY"), + * DELETE("DELETE"), + * OPTIONS("OPTIONS"), + * TRACE("TRACE"), + * CONNECT("CONNECT"); + */ + GET("GET"), POST("POST"), PUT("PUT"), PATCH("PATCH"), HEAD("HEAD"), MOVE("MOVE"), + COPY("COPY"), DELETE("DELETE"), OPTIONS("OPTIONS"), TRACE("TRACE"), CONNECT("CONNECT"); + + private final String value; + + HttpMethod(String value) { + this.value = value; + } + + @Override + public String toString() { + return this.value; + } + + /** + * permitsRetry + * + * @param method + * @return boolean + */ + public static boolean permitsRetry(HttpMethod method) { + return method == GET; + } + + /** + * permitsCache + * + * @param method + * @return boolean + */ + public static boolean permitsCache(HttpMethod method) { + return method == GET || method == POST; + } + + /** + * permitsRequestBody + * + * @param method + * @return boolean + */ + public static boolean permitsRequestBody(HttpMethod method) { + return method == null + || method == POST + || method == PUT + || method == PATCH + || method == DELETE; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/HttpTask.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/HttpTask.java new file mode 100644 index 0000000..e42df7c --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/HttpTask.java @@ -0,0 +1,642 @@ +package com.wordplat.quickstart.xutils.http; + +import com.wordplat.quickstart.xutils.common.Callback; +import com.wordplat.quickstart.xutils.common.task.AbsTask; +import com.wordplat.quickstart.xutils.common.task.Priority; +import com.wordplat.quickstart.xutils.common.task.PriorityExecutor; +import com.wordplat.quickstart.xutils.common.util.IOUtil; +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.common.util.ParameterizedTypeUtil; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.ex.HttpException; +import com.wordplat.quickstart.xutils.ex.HttpRedirectException; +import com.wordplat.quickstart.xutils.http.app.HttpRetryHandler; +import com.wordplat.quickstart.xutils.http.app.RedirectHandler; +import com.wordplat.quickstart.xutils.http.app.RequestInterceptListener; +import com.wordplat.quickstart.xutils.http.app.RequestTracker; +import com.wordplat.quickstart.xutils.http.request.UriRequest; +import com.wordplat.quickstart.xutils.http.request.UriRequestFactory; +import com.wordplat.quickstart.xutils.x; + +import java.io.Closeable; +import java.io.File; +import java.lang.ref.WeakReference; +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Created by wyouflf on 15/7/23. + * http 请求任务 + * + * @since 2021-05-09 + */ +public class HttpTask extends AbsTask implements ProgressHandler { + private static final int FLAG_REQUEST_CREATED = 1; + private static final int FLAG_CACHE = 2; + private static final int FLAG_PROGRESS = 3; + + private static final PriorityExecutor HTTP_EXECUTOR = new PriorityExecutor(5, true); + private static final PriorityExecutor CACHE_EXECUTOR = new PriorityExecutor(5, true); + /** + * 文件下载任务 + */ + private static final AtomicInteger sCurrFileLoadCount = new AtomicInteger(0); + private static final HashMap>> + DOWNLOAD_TASK = new HashMap>>(1); + + /** + * 线程池 + */ + private final Executor executor; + private long lastUpdateTime; + private long loadingUpdateMaxTimeSpan = 300L; + /** + * 请求相关 + */ + private RequestParams params; + private UriRequest request; + private Type loadType; + private volatile boolean hasException = false; + private final Callback.CommonCallback callback; + + /** + * 缓存控制 + */ + private Object rawResult = null; + private volatile Boolean trustCache = null; + private final Object cacheLock = new Object(); + + /** + * 扩展callback + */ + private Callback.CacheCallback cacheCallback; + private Callback.PrepareCallback prepareCallback; + private Callback.ProgressCallback progressCallback; + private RequestInterceptListener requestInterceptListener; + + /** + * 日志追踪 + */ + private RequestTracker tracker; + + /** + * HttpTask + * + * @param params + * @param cancelHandler + * @param callback + */ + public HttpTask(RequestParams params, Callback.Cancelable cancelHandler, + Callback.CommonCallback callback) { + super(cancelHandler); + + assert params != null; + assert callback != null; + + this.params = params; + this.callback = callback; + + if (callback instanceof Callback.CacheCallback) { + this.cacheCallback = (Callback.CacheCallback) callback; + } + if (callback instanceof Callback.PrepareCallback) { + this.prepareCallback = (Callback.PrepareCallback) callback; + } + if (callback instanceof Callback.ProgressCallback) { + this.progressCallback = (Callback.ProgressCallback) callback; + } + if (callback instanceof RequestInterceptListener) { + this.requestInterceptListener = (RequestInterceptListener) callback; + } + + // init tracker + { + RequestTracker customTracker = params.getRequestTracker(); + if (customTracker == null) { + if (callback instanceof RequestTracker) { + customTracker = (RequestTracker) callback; + } else { + customTracker = UriRequestFactory.getDefaultTracker(); + } + } + if (customTracker != null) { + tracker = new RequestTrackerWrapper(customTracker); + } + } + + // init executor + if (params.getExecutor() != null) { + this.executor = params.getExecutor(); + } else { + if (cacheCallback != null) { + this.executor = CACHE_EXECUTOR; + } else { + this.executor = HTTP_EXECUTOR; + } + } + } + + // 解析loadType + private void resolveLoadType() { + Class callBackType = callback.getClass(); + if (callback instanceof Callback.TypedCallback) { + loadType = ((Callback.TypedCallback) callback).getLoadType(); + } else if (callback instanceof Callback.PrepareCallback) { + loadType = ParameterizedTypeUtil.getParameterizedType(callBackType, Callback.PrepareCallback.class, 0); + } else { + loadType = ParameterizedTypeUtil.getParameterizedType(callBackType, Callback.CommonCallback.class, 0); + } + } + + // 初始化请求参数 + private UriRequest createNewRequest() throws Throwable { + // init request + params.init(); + UriRequest result = UriRequestFactory.getUriRequest(params, loadType); + result.setProgressHandler(this); + this.loadingUpdateMaxTimeSpan = params.getLoadingUpdateMaxTimeSpan(); + this.update(FLAG_REQUEST_CREATED, result); + return result; + } + + // 文件下载冲突检测 + private void checkDownloadTask() { + if (File.class == loadType) { + synchronized (DOWNLOAD_TASK) { + String downloadTaskKey = this.params.getSaveFilePath(); + /*{ + // 不处理缓存文件下载冲突, + // 缓存文件下载冲突会抛出FileLockedException异常, + // 回调方法中处理控制是否重新尝试下载. + }*/ + if (!TextUtils.isEmpty(downloadTaskKey)) { + WeakReference> taskRef = DOWNLOAD_TASK.get(downloadTaskKey); + if (taskRef != null) { + HttpTask task = taskRef.get(); + if (task != null) { + task.cancel(); + task.closeRequestSync(); + } + DOWNLOAD_TASK.remove(downloadTaskKey); + } + DOWNLOAD_TASK.put(downloadTaskKey, new WeakReference>(this)); + } // end if (!TextUtils.isEmpty(downloadTaskKey)) + + if (DOWNLOAD_TASK.size() > RequestParams.MAX_FILE_LOAD_WORKER) { + Iterator>>> + entryItr = DOWNLOAD_TASK.entrySet().iterator(); + while (entryItr.hasNext()) { + Map.Entry>> next = entryItr.next(); + WeakReference> value = next.getValue(); + if (value == null || value.get() == null) { + entryItr.remove(); + } + } + } + } // end synchronized + } + } + + @Override + protected ResultType doBackground() throws Throwable { + if (this.isCancelled()) { + throw new Callback.CancelledException("cancelled before request"); + } + ResultType result = null; + resolveLoadType(); + request = createNewRequest(); + checkDownloadTask(); + boolean retry = true; + int retryCount = 0; + Throwable exception = null; + HttpRetryHandler retryHandler = this.params.getHttpRetryHandler(); + if (retryHandler == null) { + retryHandler = new HttpRetryHandler(); + } + retryHandler.setMaxRetryCount(this.params.getMaxRetryCount()); + + if (this.isCancelled()) { + throw new Callback.CancelledException("cancelled before request"); + } + + // 检查缓存 + Object cacheResult = null; + if (cacheCallback != null && HttpMethod.permitsCache(params.getMethod())) { + // 尝试从缓存获取结果, 并为请求头加入缓存控制参数. + try { + clearRawResult(); + LogUtil.d("load cache: " + this.request.getRequestUri()); + rawResult = this.request.loadResultFromCache(); + } catch (Throwable ex) { + LogUtil.w("load disk cache error", ex); + } + + if (this.isCancelled()) { + clearRawResult(); + throw new Callback.CancelledException("cancelled before request"); + } + + if (rawResult != null) { + if (prepareCallback != null) { + try { + cacheResult = prepareCallback.prepare(rawResult); + } catch (Throwable ex) { + cacheResult = null; + LogUtil.w("prepare disk cache error", ex); + } finally { + clearRawResult(); + } + } else { + cacheResult = rawResult; + } + + if (this.isCancelled()) { + throw new Callback.CancelledException("cancelled before request"); + } + + if (cacheResult != null) { + // 同步等待是否信任缓存 + this.update(FLAG_CACHE, cacheResult); + synchronized (cacheLock) { + while (trustCache == null) { + try { + cacheLock.wait(); + } catch (InterruptedException iex) { + throw new Callback.CancelledException("cancelled before request"); + } catch (Throwable ignored) { + String ss = ignored.toString(); + } + } + } + if (trustCache) { + return null; + } + } + } + } + + if (trustCache == null) { + trustCache = false; + } + + if (cacheResult == null) { + this.request.clearCacheHeader(); + } + + // 判断请求的缓存策略 + if (callback instanceof Callback.ProxyCacheCallback) { + if (((Callback.ProxyCacheCallback) callback).onlyCache()) { + return null; + } + } + + // 发起请求 + retry = true; + while (retry) { + retry = false; + + try { + if (this.isCancelled()) { + throw new Callback.CancelledException("cancelled before request"); + } + this.request.close(); + + try { + clearRawResult(); + LogUtil.d("load: " + this.request.getRequestUri()); + RequestWorker requestWorker = new RequestWorker(); + requestWorker.request(); + if (requestWorker.ex != null) { + throw requestWorker.ex; + } + rawResult = requestWorker.result; + } catch (Throwable ex) { + clearRawResult(); + if (this.isCancelled()) { + throw new Callback.CancelledException("cancelled during request"); + } else { + throw ex; + } + } + + if (prepareCallback != null) { + if (this.isCancelled()) { + throw new Callback.CancelledException("cancelled before request"); + } + + try { + result = (ResultType) prepareCallback.prepare(rawResult); + } finally { + clearRawResult(); + } + } else { + result = (ResultType) rawResult; + } + + // 保存缓存 + if (cacheCallback != null && HttpMethod.permitsCache(params.getMethod())) { + try { + this.request.save2Cache(); + } catch (Throwable ex) { + LogUtil.e("Error while storing the http cache.", ex); + } + } + + if (this.isCancelled()) { + throw new Callback.CancelledException("cancelled after request"); + } + } catch (HttpRedirectException redirectEx) { + retry = true; + LogUtil.w("Http Redirect:" + params.getUri()); + } catch (Throwable ex) { + switch (this.request.getResponseCode()) { + case 204: // empty content + case 205: // empty content + case 304: // disk cache is valid. + return null; + default: { + exception = ex; + if (this.isCancelled() && !(exception instanceof Callback.CancelledException)) { + exception = new Callback.CancelledException("canceled by user"); + } + retry = retryHandler.canRetry(this.request, exception, ++retryCount); + } + } + } + } + + if (exception != null && result == null && !trustCache) { + hasException = true; + throw exception; + } + return result; + } + + @Override + @SuppressWarnings("unchecked") + protected void onUpdate(int flag, Object... args) { + switch (flag) { + case FLAG_REQUEST_CREATED: { + if (this.tracker != null) { + this.tracker.onRequestCreated((UriRequest) args[0]); + } + break; + } + case FLAG_CACHE: { + synchronized (cacheLock) { + try { + ResultType result = (ResultType) args[0]; + if (tracker != null) { + tracker.onCache(request, result); + } + trustCache = this.cacheCallback.onCache(result); + } catch (Throwable ex) { + trustCache = false; + callback.onError(ex, true); + } finally { + cacheLock.notifyAll(); + } + } + break; + } + case FLAG_PROGRESS: { + if (this.progressCallback != null && args.length == 3) { + try { + this.progressCallback.onLoading( + ((Number) args[0]).longValue(), + ((Number) args[1]).longValue(), + (Boolean) args[2]); + } catch (Throwable ex) { + callback.onError(ex, true); + } + } + break; + } + default: { + break; + } + } + } + + @Override + protected void onWaiting() { + if (tracker != null) { + tracker.onWaiting(params); + } + if (progressCallback != null) { + progressCallback.onWaiting(); + } + } + + @Override + protected void onStarted() { + if (tracker != null) { + tracker.onStart(params); + } + if (progressCallback != null) { + progressCallback.onStarted(); + } + } + + @Override + protected void onSuccess(ResultType result) { + if (hasException) { + return; + } + if (tracker != null) { + tracker.onSuccess(request, result); + } + callback.onSuccess(result); + } + + @Override + protected void onError(Throwable ex, boolean isCallbackError) { + if (tracker != null) { + tracker.onError(request, ex, isCallbackError); + } + callback.onError(ex, isCallbackError); + } + + @Override + protected void onCancelled(Callback.CancelledException cex) { + if (tracker != null) { + tracker.onCancelled(request); + } + callback.onCancelled(cex); + } + + @Override + protected void onFinished() { + if (tracker != null) { + tracker.onFinished(request); + } + x.task().run(new Runnable() { + @Override + public void run() { + closeRequestSync(); + } + }); + callback.onFinished(); + } + + private void clearRawResult() { + if (rawResult instanceof Closeable) { + IOUtil.closeQuietly((Closeable) rawResult); + } + rawResult = null; + } + + @Override + protected void cancelWorks() { + x.task().run(new Runnable() { + @Override + public void run() { + closeRequestSync(); + } + }); + } + + @Override + protected boolean isCancelFast() { + return params.isCancelFast(); + } + + private void closeRequestSync() { + if (File.class == loadType) { + synchronized (sCurrFileLoadCount) { + sCurrFileLoadCount.notifyAll(); + } + } + clearRawResult(); + IOUtil.closeQuietly(request); + } + + @Override + public Executor getExecutor() { + return this.executor; + } + + @Override + public Priority getPriority() { + return params.getPriority(); + } + + @Override + public boolean updateProgress(long total, long current, boolean forceUpdateUI) { + if (isCancelled() || isFinished()) { + return false; + } + + if (progressCallback != null && request != null && current > 0) { + if (total < 0) { + total = -1; + } else if (total < current) { + total = current; + } + if (forceUpdateUI) { + lastUpdateTime = System.currentTimeMillis(); + this.update(FLAG_PROGRESS, total, current, request.isLoading()); + } else { + long currTime = System.currentTimeMillis(); + if (currTime - lastUpdateTime >= loadingUpdateMaxTimeSpan) { + lastUpdateTime = currTime; + this.update(FLAG_PROGRESS, total, current, request.isLoading()); + } + } + } + + return !isCancelled() && !isFinished(); + } + + @Override + public String toString() { + return params.toString(); + } + + /** + * 请求发送和加载数据线程. + * 该线程被join到HttpTask的工作线程去执行. + * 它的主要作用是为了能强行中断请求的链接过程; + * 并辅助限制同时下载文件的线程数. + */ + private final class RequestWorker { + Object result; + Throwable ex; + + private RequestWorker() { + } + + public void request() { + try { + boolean interrupted = false; + if (File.class == loadType) { + synchronized (sCurrFileLoadCount) { + while (sCurrFileLoadCount.get() >= RequestParams.MAX_FILE_LOAD_WORKER + && !HttpTask.this.isCancelled()) { + try { + sCurrFileLoadCount.wait(10); + } catch (InterruptedException iex) { + interrupted = true; + break; + } catch (Throwable ignored) { + } + } + } + sCurrFileLoadCount.incrementAndGet(); + } + + if (interrupted || HttpTask.this.isCancelled()) { + throw new Callback.CancelledException("cancelled before request" + + (interrupted ? "(interrupted)" : "")); + } + + try { + request.setRequestInterceptListener(requestInterceptListener); + this.result = request.loadResult(); + } catch (Throwable ex) { + this.ex = ex; + } + + if (this.ex != null) { + throw this.ex; + } + } catch (Throwable ex) { + this.ex = ex; + if (ex instanceof HttpException) { + HttpException httpEx = (HttpException) ex; + int errorCode = httpEx.getCode(); + if (errorCode == 301 || errorCode == 302) { + RedirectHandler redirectHandler = params.getRedirectHandler(); + if (redirectHandler != null) { + try { + RequestParams redirectParams = redirectHandler.getRedirectParams(request); + if (redirectParams != null) { + if (redirectParams.getMethod() == null) { + redirectParams.setMethod(params.getMethod()); + } + HttpTask.this.params = redirectParams; + HttpTask.this.request = createNewRequest(); + this.ex = new HttpRedirectException(errorCode, + httpEx.getMessage(), httpEx.getResult()); + } + } catch (Throwable throwable) { + this.ex = ex; + } + } + } + } + } finally { + if (File.class == loadType) { + synchronized (sCurrFileLoadCount) { + sCurrFileLoadCount.decrementAndGet(); + sCurrFileLoadCount.notifyAll(); + } + } + } + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/ProgressHandler.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/ProgressHandler.java new file mode 100644 index 0000000..62e3e6c --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/ProgressHandler.java @@ -0,0 +1,21 @@ +package com.wordplat.quickstart.xutils.http; + +/** + * 进度控制接口, updateProgress方式中ProgressCallback#onLoading. + * 默认最长间隔300毫秒调用一次. + * Author: wyouflf + * Time: 2014/05/23 + * + * @since 2021-05-09 + */ +public interface ProgressHandler { + /** + * updateProgress + * + * @param total + * @param current + * @param forceUpdateUI + * @return boolean + */ + boolean updateProgress(long total, long current, boolean forceUpdateUI); +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/RequestParams.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/RequestParams.java new file mode 100644 index 0000000..3f28816 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/RequestParams.java @@ -0,0 +1,380 @@ +package com.wordplat.quickstart.xutils.http; + +import com.wordplat.quickstart.xutils.common.task.Priority; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.http.annotation.HttpRequest; +import com.wordplat.quickstart.xutils.http.app.*; +import com.wordplat.quickstart.xutils.x; + +import ohos.app.Context; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLSocketFactory; +import java.net.Proxy; +import java.util.concurrent.Executor; + +/** + * Created by wyouflf on 15/7/17. + * 网络请求参数实体 + * + * @since 2021-05-09 + */ +public class RequestParams extends BaseParams { + /** + * int MAX_FILE_LOAD_WORKER + */ + public static final int MAX_FILE_LOAD_WORKER = 10; + private static final DefaultRedirectHandler DEFAULT_REDIRECT_HANDLER = new DefaultRedirectHandler(); + + // 注解及其扩展参数 + private HttpRequest httpRequest; + private String uri; + private final String[] signs; + private final String[] cacheKeys; + private ParamsBuilder builder; + private String buildUri; + private String buildCacheKey; + private SSLSocketFactory sslSocketFactory; + + private boolean invokedGetHttpRequest = false; + + // 扩展参数 + private Context context; + private Proxy proxy; // 代理 + private HostnameVerifier hostnameVerifier; // https域名校验 + private boolean useCookie = true; // 是否在请求过程中启用cookie + private String cacheDirName; // 缓存文件夹名称 + private long cacheSize; // 缓存文件夹大小 + private long cacheMaxAge; // 默认缓存存活时间, 单位:毫秒.(如果服务没有返回有效的max-age或Expires) + private Executor executor; // 自定义线程池 + private Priority priority = Priority.DEFAULT; // 请求优先级 + private int connectTimeout = 1000 * 15; // 连接超时时间 + private int readTimeout = 1000 * 15; // 读取超时时间 + private boolean autoResume = true; // 是否在下载是自动断点续传 + private boolean autoRename = false; // 是否根据头信息自动命名文件 + private int maxRetryCount = 2; // 最大请求错误重试次数 + private String saveFilePath; // 下载文件时文件保存的路径和文件名 + private boolean cancelFast = false; // 是否可以被立即停止, true: 为请求创建新的线程, 取消时请求线程被立即中断. + private int loadingUpdateMaxTimeSpan = 300; // 进度刷新最大间隔时间(ms) + private HttpRetryHandler httpRetryHandler; // 自定义HttpRetryHandler + private RequestTracker requestTracker; // 自定义日志记录接口. + private RedirectHandler redirectHandler = DEFAULT_REDIRECT_HANDLER; + + /** + * RequestParams + */ + public RequestParams() { + this(null, null, null, null); + } + + /** + * RequestParams + * + * @param uri + */ + public RequestParams(String uri) { + this(uri, null, null, null); + } + + /** + * RequestParams + * + * @param uri + * @param builder + * @param signs + * @param cacheKeys + */ + public RequestParams(String uri, ParamsBuilder builder, String[] signs, String[] cacheKeys) { + if (uri != null && builder == null) { + builder = new DefaultParamsBuilder(); + } + this.uri = uri; + this.signs = signs; + this.cacheKeys = cacheKeys; + this.builder = builder; + this.context = x.app(); + } + + // invoke via HttpTask#createNewRequest + void init() throws Throwable { + if (!TextUtils.isEmpty(buildUri)) { + return; + } + + if (TextUtils.isEmpty(uri) && getHttpRequest() == null) { + throw new IllegalStateException("uri is empty && @HttpRequest == null"); + } + + // init params from entity + initEntityParams(); + + // build uri & cacheKey + buildUri = uri; + HttpRequest request = this.getHttpRequest(); + if (request != null) { + builder = request.builder().newInstance(); + buildUri = builder.buildUri(this, request); + builder.buildParams(this); + builder.buildSign(this, request.signs()); + if (sslSocketFactory == null) { + sslSocketFactory = builder.getSSLSocketFactory(); + } + } else if (this.builder != null) { + builder.buildParams(this); + builder.buildSign(this, signs); + if (sslSocketFactory == null) { + sslSocketFactory = builder.getSSLSocketFactory(); + } + } + } + + /** + * getUri + * + * @return String + */ + public String getUri() { + return TextUtils.isEmpty(buildUri) ? uri : buildUri; + } + + /** + * setUri + * + * @param uri + */ + public void setUri(String uri) { + if (TextUtils.isEmpty(buildUri)) { + this.uri = uri; + } else { + this.buildUri = uri; + } + } + + /** + * getCacheKey + * + * @return String + */ + public String getCacheKey() { + if (TextUtils.isEmpty(buildCacheKey) && builder != null) { + HttpRequest request = this.getHttpRequest(); + if (request != null) { + buildCacheKey = builder.buildCacheKey(this, request.cacheKeys()); + } else { + buildCacheKey = builder.buildCacheKey(this, cacheKeys); + } + } + return buildCacheKey; + } + + public void setSslSocketFactory(SSLSocketFactory sslSocketFactory) { + this.sslSocketFactory = sslSocketFactory; + } + + public SSLSocketFactory getSslSocketFactory() { + return sslSocketFactory; + } + + public HostnameVerifier getHostnameVerifier() { + return hostnameVerifier; + } + + public void setHostnameVerifier(HostnameVerifier hostnameVerifier) { + this.hostnameVerifier = hostnameVerifier; + } + + public boolean isUseCookie() { + return useCookie; + } + + public void setUseCookie(boolean useCookie) { + this.useCookie = useCookie; + } + + public Context getContext() { + return context; + } + + public void setContext(Context context) { + this.context = context; + } + + public Proxy getProxy() { + return proxy; + } + + public void setProxy(Proxy proxy) { + this.proxy = proxy; + } + + public Priority getPriority() { + return priority; + } + + public void setPriority(Priority priority) { + this.priority = priority; + } + + public int getConnectTimeout() { + return connectTimeout; + } + + /** + * setConnectTimeout + * + * @param connectTimeout + */ + public void setConnectTimeout(int connectTimeout) { + if (connectTimeout > 0) { + this.connectTimeout = connectTimeout; + } + } + + public int getReadTimeout() { + return readTimeout; + } + + /** + * setReadTimeout + * + * @param readTimeout + */ + public void setReadTimeout(int readTimeout) { + if (readTimeout > 0) { + this.readTimeout = readTimeout; + } + } + + public String getCacheDirName() { + return cacheDirName; + } + + public void setCacheDirName(String cacheDirName) { + this.cacheDirName = cacheDirName; + } + + public long getCacheSize() { + return cacheSize; + } + + public void setCacheSize(long cacheSize) { + this.cacheSize = cacheSize; + } + + public long getCacheMaxAge() { + return cacheMaxAge; + } + + public void setCacheMaxAge(long cacheMaxAge) { + this.cacheMaxAge = cacheMaxAge; + } + + public Executor getExecutor() { + return executor; + } + + public void setExecutor(Executor executor) { + this.executor = executor; + } + + public boolean isAutoResume() { + return autoResume; + } + + public void setAutoResume(boolean autoResume) { + this.autoResume = autoResume; + } + + public boolean isAutoRename() { + return autoRename; + } + + public void setAutoRename(boolean autoRename) { + this.autoRename = autoRename; + } + + public String getSaveFilePath() { + return saveFilePath; + } + + public void setSaveFilePath(String saveFilePath) { + this.saveFilePath = saveFilePath; + } + + public int getMaxRetryCount() { + return maxRetryCount; + } + + public void setMaxRetryCount(int maxRetryCount) { + this.maxRetryCount = maxRetryCount; + } + + public boolean isCancelFast() { + return cancelFast; + } + + public void setCancelFast(boolean cancelFast) { + this.cancelFast = cancelFast; + } + + public int getLoadingUpdateMaxTimeSpan() { + return loadingUpdateMaxTimeSpan; + } + + public void setLoadingUpdateMaxTimeSpan(int loadingUpdateMaxTimeSpan) { + this.loadingUpdateMaxTimeSpan = loadingUpdateMaxTimeSpan; + } + + public HttpRetryHandler getHttpRetryHandler() { + return httpRetryHandler; + } + + public void setHttpRetryHandler(HttpRetryHandler httpRetryHandler) { + this.httpRetryHandler = httpRetryHandler; + } + + public RedirectHandler getRedirectHandler() { + return redirectHandler; + } + + public void setRedirectHandler(RedirectHandler redirectHandler) { + this.redirectHandler = redirectHandler; + } + + public RequestTracker getRequestTracker() { + return requestTracker; + } + + public void setRequestTracker(RequestTracker requestTracker) { + this.requestTracker = requestTracker; + } + + private void initEntityParams() { + RequestParamsHelper.parseKV(this, this.getClass(), new RequestParamsHelper.ParseKVListener() { + @Override + public void onParseKV(String name, Object value) { + addParameter(name, value); + } + }); + } + + private HttpRequest getHttpRequest() { + if (httpRequest == null && !invokedGetHttpRequest) { + invokedGetHttpRequest = true; + Class thisCls = this.getClass(); + if (thisCls != RequestParams.class) { + httpRequest = thisCls.getAnnotation(HttpRequest.class); + } + } + + return httpRequest; + } + + @Override + public String toString() { + String url = this.getUri(); + String baseParamsStr = super.toString(); + return TextUtils.isEmpty(url) + ? baseParamsStr : url + (url.contains("?") ? "&" : "?") + baseParamsStr; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/RequestParamsHelper.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/RequestParamsHelper.java new file mode 100644 index 0000000..2141e3a --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/RequestParamsHelper.java @@ -0,0 +1,113 @@ +package com.wordplat.quickstart.xutils.http; + +import com.wordplat.quickstart.json.JSONArray; +import com.wordplat.quickstart.json.JSONException; +import com.wordplat.quickstart.json.JSONObject; +import com.wordplat.quickstart.xutils.common.util.LogUtil; + +import ohos.utils.Sequenceable; + +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.Map; + +/** + * Created by wyouflf on 16/1/23. + */ +final class RequestParamsHelper { + private static final ClassLoader BOOT_CL = String.class.getClassLoader(); + + private RequestParamsHelper() { + } + + interface ParseKVListener { + void onParseKV(String name, Object value); + } + + static void parseKV(Object entity, Class type, ParseKVListener listener) { + if (entity == null || type == null || type == RequestParams.class || type == Object.class) { + return; + } else { + ClassLoader cl = type.getClassLoader(); + if (cl == null || cl == BOOT_CL) { + return; + } + } + + Field[] fields = type.getDeclaredFields(); + if (fields != null && fields.length > 0) { + for (Field field : fields) { + String name = field.getName(); + if (!Modifier.isTransient(field.getModifiers()) + && !"serialVersionUID".equals(name) + && field.getType() != Sequenceable.Producer.class) { + try { + field.setAccessible(true); + Object value = field.get(entity); + if (value != null) { + listener.onParseKV(name, value); + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + } + } + + parseKV(entity, type.getSuperclass(), listener); + } + + static Object parseJSONObject(Object value) throws JSONException { + if (value == null) { + return null; + } + + Object result = value; + Class cls = value.getClass(); + if (cls.isArray()) { + JSONArray array = new JSONArray(); + int len = Array.getLength(value); + for (int i = 0; i < len; i++) { + array.put(parseJSONObject(Array.get(value, i))); + } + result = array; + } else if (value instanceof Iterable) { + JSONArray array = new JSONArray(); + Iterable list = (Iterable) value; + for (Object item : list) { + array.put(parseJSONObject(item)); + } + result = array; + } else if (value instanceof Map) { + final JSONObject jo = new JSONObject(); + Map map = (Map) value; + for (Map.Entry entry : map.entrySet()) { + Object k = entry.getKey(); + Object v = entry.getValue(); + if (k != null && v != null) { + jo.put(String.valueOf(k), parseJSONObject(v)); + } + } + result = jo; + } else { + ClassLoader cl = cls.getClassLoader(); + if (cl != null && cl != BOOT_CL) { + final JSONObject jo = new JSONObject(); + parseKV(value, cls, new ParseKVListener() { + @Override + public void onParseKV(String name, Object value) { + try { + value = parseJSONObject(value); + jo.put(name, value); + } catch (JSONException ex) { + throw new IllegalArgumentException("parse RequestParams to json failed", ex); + } + } + }); + result = jo; + } + } + return result; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/RequestTrackerWrapper.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/RequestTrackerWrapper.java new file mode 100644 index 0000000..0969604 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/RequestTrackerWrapper.java @@ -0,0 +1,90 @@ +package com.wordplat.quickstart.xutils.http; + +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.http.app.RequestTracker; +import com.wordplat.quickstart.xutils.http.request.UriRequest; + +/** + * Created by wyouflf on 15/11/4. + * Wrapper for tracker + */ +final class RequestTrackerWrapper implements RequestTracker { + + private final RequestTracker base; + + public RequestTrackerWrapper(RequestTracker base) { + this.base = base; + } + + @Override + public void onWaiting(RequestParams params) { + try { + base.onWaiting(params); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + + @Override + public void onStart(RequestParams params) { + try { + base.onStart(params); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + + @Override + public void onRequestCreated(UriRequest request) { + try { + base.onRequestCreated(request); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + + @Override + public void onCache(UriRequest request, Object result) { + try { + base.onCache(request, result); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + + @Override + public void onSuccess(UriRequest request, Object result) { + try { + base.onSuccess(request, result); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + + @Override + public void onCancelled(UriRequest request) { + try { + base.onCancelled(request); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + + @Override + public void onError(UriRequest request, Throwable ex, boolean isCallbackError) { + try { + base.onError(request, ex, isCallbackError); + } catch (Throwable exOnError) { + LogUtil.e(exOnError.getMessage(), exOnError); + } + } + + @Override + public void onFinished(UriRequest request) { + try { + base.onFinished(request); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/annotation/HttpRequest.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/annotation/HttpRequest.java new file mode 100644 index 0000000..2ef8fa7 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/annotation/HttpRequest.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.http.annotation; + +import com.wordplat.quickstart.xutils.http.app.DefaultParamsBuilder; +import com.wordplat.quickstart.xutils.http.app.ParamsBuilder; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * HttpRequest + * + * @since 2021-05-09 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface HttpRequest { + /** + * host + * + * @return String + */ + String host() default ""; + + /** + * String + * + * @return String + */ + String path(); + + /** + * builder + * + * @return Class + */ + Class builder() default DefaultParamsBuilder.class; + + /** + * signs + * + * @return String + */ + String[] signs() default ""; + + /** + * cacheKeys + * + * @return String + */ + String[] cacheKeys() default ""; +} \ No newline at end of file diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/annotation/HttpResponse.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/annotation/HttpResponse.java new file mode 100644 index 0000000..52dd597 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/annotation/HttpResponse.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.http.annotation; + +import com.wordplat.quickstart.xutils.http.app.ResponseParser; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * HttpResponse + * + * @since 2021-05-09 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface HttpResponse { + /** + * parser + * + * @return Class + */ + Class parser(); +} \ No newline at end of file diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/DefaultParamsBuilder.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/DefaultParamsBuilder.java new file mode 100644 index 0000000..1fb008b --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/DefaultParamsBuilder.java @@ -0,0 +1,109 @@ +package com.wordplat.quickstart.xutils.http.app; + +import com.wordplat.quickstart.xutils.common.util.KeyValue; +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.http.RequestParams; +import com.wordplat.quickstart.xutils.http.annotation.HttpRequest; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import java.security.cert.X509Certificate; +import java.util.List; + +/** + * Created by wyouflf on 15/8/20. + * 默认参数构造器 + * + * @since 2021-05-09 + */ +public class DefaultParamsBuilder implements ParamsBuilder { + private static SSLSocketFactory trustAllSSlSocketFactory; + + /** + * DefaultParamsBuilder + */ + public DefaultParamsBuilder() { + } + + @Override + public String buildUri(RequestParams params, HttpRequest httpRequest) throws Throwable { + return httpRequest.host() + "/" + httpRequest.path(); + } + + @Override + public String buildCacheKey(RequestParams params, String[] cacheKeys) { + StringBuilder result = new StringBuilder(); + if (cacheKeys != null && cacheKeys.length > 0) { + result.append(params.getUri()).append("?"); + + // 添加cacheKeys对应的参数 + for (String key : cacheKeys) { + List kvList = params.getParams(key); + if (kvList != null && !kvList.isEmpty()) { + for (KeyValue kv : kvList) { + String value = kv.getValueStrOrNull(); + if (value != null) { + result.append(key).append("=").append(value).append("&"); + } + } + } + } + } + return result.toString(); + } + + @Override + public SSLSocketFactory getSSLSocketFactory() throws Throwable { + return getTrustAllSSLSocketFactory(); + } + + @Override + public void buildParams(RequestParams params) throws Throwable { + } + + @Override + public void buildSign(RequestParams params, String[] signs) throws Throwable { + } + + /** + * getTrustAllSSLSocketFactory + * + * @return SSLSocketFactory + */ + public static SSLSocketFactory getTrustAllSSLSocketFactory() { + if (trustAllSSlSocketFactory == null) { + synchronized (DefaultParamsBuilder.class) { + if (trustAllSSlSocketFactory == null) { + TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + + @Override + public void checkClientTrusted(X509Certificate[] certs, String authType) { + LogUtil.d("checkClientTrusted:" + authType); + } + + @Override + public void checkServerTrusted(X509Certificate[] certs, String authType) { + LogUtil.d("checkServerTrusted:" + authType); + } + } + }; + try { + SSLContext sslContext = SSLContext.getInstance("TLS"); + sslContext.init(null, trustAllCerts, null); + trustAllSSlSocketFactory = sslContext.getSocketFactory(); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + } + } + return trustAllSSlSocketFactory; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/DefaultRedirectHandler.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/DefaultRedirectHandler.java new file mode 100644 index 0000000..d5e311f --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/DefaultRedirectHandler.java @@ -0,0 +1,52 @@ +package com.wordplat.quickstart.xutils.http.app; + +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.common.util.URLUtil; +import com.wordplat.quickstart.xutils.http.HttpMethod; +import com.wordplat.quickstart.xutils.http.RequestParams; +import com.wordplat.quickstart.xutils.http.request.HttpRequest; +import com.wordplat.quickstart.xutils.http.request.UriRequest; + +/** + * DefaultRedirectHandler + * + * @since 2021-05-09 + */ +public class DefaultRedirectHandler implements RedirectHandler { + @Override + public RequestParams getRedirectParams(UriRequest request) throws Throwable { + if (request instanceof HttpRequest) { + HttpRequest httpRequest = (HttpRequest) request; + RequestParams params = httpRequest.getParams(); + String location = httpRequest.getResponseHeader("Location"); + if (!TextUtils.isEmpty(location)) { + if (!URLUtil.isHttpsUrl(location) && !URLUtil.isHttpUrl(location)) { + String url = params.getUri(); + if (location.startsWith("/")) { + int pathIndex = url.indexOf("/", 8); + if (pathIndex != -1) { + url = url.substring(0, pathIndex); + } + } else { + int pathIndex = url.lastIndexOf("/"); + if (pathIndex >= 8) { + url = url.substring(0, pathIndex + 1); + } else { + url += "/"; + } + } + location = url + location; + } + params.setUri(location); + + int code = request.getResponseCode(); + if (code == 301 || code == 302 || code == 303) { + params.clearParams(); + params.setMethod(HttpMethod.GET); + return params; + } + } + } + return null; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/HttpRetryHandler.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/HttpRetryHandler.java new file mode 100644 index 0000000..80e6fed --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/HttpRetryHandler.java @@ -0,0 +1,80 @@ +package com.wordplat.quickstart.xutils.http.app; + +import com.wordplat.quickstart.json.JSONException; +import com.wordplat.quickstart.xutils.common.Callback; +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.ex.HttpException; +import com.wordplat.quickstart.xutils.http.HttpMethod; +import com.wordplat.quickstart.xutils.http.request.UriRequest; + +import java.io.FileNotFoundException; +import java.net.*; +import java.util.HashSet; + +/** + * Author: wyouflf + * Time: 2014/05/30 + * + * @since 2021-05-09 + */ +public class HttpRetryHandler { + protected static HashSet> blackList = new HashSet>(); + protected int maxRetryCount = 2; + + static { + blackList.add(HttpException.class); + blackList.add(Callback.CancelledException.class); + blackList.add(MalformedURLException.class); + blackList.add(URISyntaxException.class); + blackList.add(NoRouteToHostException.class); + blackList.add(PortUnreachableException.class); + blackList.add(ProtocolException.class); + blackList.add(NullPointerException.class); + blackList.add(FileNotFoundException.class); + blackList.add(JSONException.class); + blackList.add(UnknownHostException.class); + blackList.add(IllegalArgumentException.class); + } + + /** + * HttpRetryHandler + */ + public HttpRetryHandler() { + } + + public void setMaxRetryCount(int maxRetryCount) { + this.maxRetryCount = maxRetryCount; + } + + /** + * canRetry + * + * @param request + * @param ex + * @param count + * @return boolean + */ + public boolean canRetry(UriRequest request, Throwable ex, int count) { + LogUtil.w(ex.getMessage(), ex); + + if (count > maxRetryCount) { + LogUtil.w(request.toString()); + LogUtil.w("The Max Retry times has been reached!"); + return false; + } + + if (!HttpMethod.permitsRetry(request.getParams().getMethod())) { + LogUtil.w(request.toString()); + LogUtil.w("The Request Method can not be retried."); + return false; + } + + if (blackList.contains(ex.getClass())) { + LogUtil.w(request.toString()); + LogUtil.w("The Exception can not be retried."); + return false; + } + + return true; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/ParamsBuilder.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/ParamsBuilder.java new file mode 100644 index 0000000..56ecb44 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/ParamsBuilder.java @@ -0,0 +1,58 @@ +package com.wordplat.quickstart.xutils.http.app; + +import com.wordplat.quickstart.xutils.http.RequestParams; +import com.wordplat.quickstart.xutils.http.annotation.HttpRequest; + +import javax.net.ssl.SSLSocketFactory; + +/** + * Created by wyouflf on 15/8/20. + *

+ * + * @since 2021-05-09 + */ +public interface ParamsBuilder { + /** + * buildUri + * + * @param params + * @param httpRequest + * @return String + * @throws Throwable + */ + String buildUri(RequestParams params, HttpRequest httpRequest) throws Throwable; + + /** + * buildCacheKey + * + * @param params + * @param cacheKeys + * @return String + */ + String buildCacheKey(RequestParams params, String[] cacheKeys); + + /** + * getSSLSocketFactory + * + * @return SSLSocketFactory + * @throws Throwable + */ + SSLSocketFactory getSSLSocketFactory() throws Throwable; + + /** + * buildParams + * + * @param params + * @throws Throwable + */ + void buildParams(RequestParams params) throws Throwable; + + /** + * buildSign + * + * @param params + * @param signs + * @throws Throwable + */ + void buildSign(RequestParams params, String[] signs) throws Throwable; +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/RedirectHandler.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/RedirectHandler.java new file mode 100644 index 0000000..cf16633 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/RedirectHandler.java @@ -0,0 +1,21 @@ +package com.wordplat.quickstart.xutils.http.app; + +import com.wordplat.quickstart.xutils.http.RequestParams; +import com.wordplat.quickstart.xutils.http.request.UriRequest; + +/** + * Created by wyouflf on 15/11/12. + * 请求重定向控制接口 + * + * @since 2021-05-09 + */ +public interface RedirectHandler { + /** + * getRedirectParams + * + * @param request + * @return RequestParams + * @throws Throwable + */ + RequestParams getRedirectParams(UriRequest request) throws Throwable; +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/RequestInterceptListener.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/RequestInterceptListener.java new file mode 100644 index 0000000..b8d9955 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/RequestInterceptListener.java @@ -0,0 +1,31 @@ +package com.wordplat.quickstart.xutils.http.app; + +import com.wordplat.quickstart.xutils.http.request.UriRequest; + +/** + * Created by wyouflf on 15/11/10. + * 拦截请求响应(在后台线程工作). + *

+ * 用法: + * 1. 请求的callback参数同时实现RequestInterceptListener + * 2. 或者使用 @HttpRequest 注解实现ParamsBuilder接口 + * + * @since 2021-05-09 + */ +public interface RequestInterceptListener { + /** + * beforeRequest + * + * @param request + * @throws Throwable + */ + void beforeRequest(UriRequest request) throws Throwable; + + /** + * afterRequest + * + * @param request + * @throws Throwable + */ + void afterRequest(UriRequest request) throws Throwable; +} \ No newline at end of file diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/RequestTracker.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/RequestTracker.java new file mode 100644 index 0000000..b1b1e7f --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/RequestTracker.java @@ -0,0 +1,78 @@ +package com.wordplat.quickstart.xutils.http.app; + +import com.wordplat.quickstart.xutils.http.RequestParams; +import com.wordplat.quickstart.xutils.http.request.UriRequest; + +/** + * Created by wyouflf on 15/9/10. + * 请求过程追踪, 适合用来记录请求日志. + * 所有回调方法都在主线程进行. + *

+ * 用法: + * 1. 将RequestTracker实例设置给请求参数RequestParams. + * 2. 请的callback参数同时实现RequestTracker接口; + * 3. 注册给UriRequestFactory的默认RequestTracker. + * 注意: 请求回调RequestTracker时优先级按照上面的顺序, + * 找到一个RequestTracker的实现会忽略其他. + */ +public interface RequestTracker { + /** + * onWaiting + * + * @param params + */ + void onWaiting(RequestParams params); + + /** + * onStart + * + * @param params + */ + void onStart(RequestParams params); + + /** + * onRequestCreated + * + * @param request + */ + void onRequestCreated(UriRequest request); + + /** + * onCache + * + * @param request + * @param result + */ + void onCache(UriRequest request, Object result); + + /** + * onSuccess + * + * @param request + * @param result + */ + void onSuccess(UriRequest request, Object result); + + /** + * onCancelled + * + * @param request + */ + void onCancelled(UriRequest request); + + /** + * onError + * + * @param request + * @param ex + * @param isCallbackError + */ + void onError(UriRequest request, Throwable ex, boolean isCallbackError); + + /** + * onFinished + * + * @param request + */ + void onFinished(UriRequest request); +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/ResponseParser.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/ResponseParser.java new file mode 100644 index 0000000..66b4506 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/app/ResponseParser.java @@ -0,0 +1,22 @@ +package com.wordplat.quickstart.xutils.http.app; + +import java.lang.reflect.Type; + +/** + * Created by wyouflf on 15/8/4. + * + * @param 支持String, byte[], JSONObject, JSONArray, InputStream + * @since 2021-05-09 + */ +public interface ResponseParser extends RequestInterceptListener { + /** + * parse + * + * @param resultType + * @param resultClass + * @param result + * @return Object + * @throws Throwable + */ + Object parse(Type resultType, Class resultClass, ResponseDataType result) throws Throwable; +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/FileBody.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/FileBody.java new file mode 100644 index 0000000..32f1b7b --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/FileBody.java @@ -0,0 +1,79 @@ +package com.wordplat.quickstart.xutils.http.body; + +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import ohos.utils.net.Uri; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.net.HttpURLConnection; + +/** + * Created by wyouflf on 15/8/13. + * + * @since 2021-05-09 + */ +public class FileBody extends InputStreamBody { + private File file; + private String contentType; + + /** + * FileBody + * + * @param file + * @throws IOException + */ + public FileBody(File file) throws IOException { + this(file, null); + } + + /** + * FileBody + * + * @param file + * @param contentType + * @throws IOException + */ + public FileBody(File file, String contentType) throws IOException { + super(new FileInputStream(file)); + this.file = file; + this.contentType = contentType; + } + + @Override + public void setContentType(String contentType) { + this.contentType = contentType; + } + + @Override + public String getContentType() { + if (TextUtils.isEmpty(contentType)) { + contentType = getFileContentType(file); + } + return contentType; + } + + /** + * getFileContentType + * + * @param file + * @return String + */ + public static String getFileContentType(File file) { + String filename = file.getName(); + String contentType = null; + try { + filename = Uri.encode(filename, "-![.:/,?&=]"); + contentType = HttpURLConnection.guessContentTypeFromName(filename); + } catch (Exception e) { + LogUtil.e(e.toString()); + } + if (TextUtils.isEmpty(contentType)) { + contentType = "application/octet-stream"; + } else { + contentType = contentType.replaceFirst("\\/jpg$", "/jpeg"); + } + return contentType; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/InputStreamBody.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/InputStreamBody.java new file mode 100644 index 0000000..02529fb --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/InputStreamBody.java @@ -0,0 +1,110 @@ +package com.wordplat.quickstart.xutils.http.body; + +import com.wordplat.quickstart.xutils.common.Callback; +import com.wordplat.quickstart.xutils.common.util.IOUtil; +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.http.ProgressHandler; + +import java.io.*; + +/** + * Author: wyouflf + * Time: 2014/05/30 + * + * @since 2021-05-09 + */ +public class InputStreamBody implements ProgressBody { + private InputStream content; + private String contentType; + + private final long total; + private long current = 0; + + private ProgressHandler callBackHandler; + + /** + * InputStreamBody + * + * @param inputStream + */ + public InputStreamBody(InputStream inputStream) { + this(inputStream, null); + } + + /** + * InputStreamBody + * + * @param inputStream + * @param contentType + */ + public InputStreamBody(InputStream inputStream, String contentType) { + this.content = inputStream; + this.contentType = contentType; + this.total = getInputStreamLength(inputStream); + } + + @Override + public void setProgressHandler(ProgressHandler progressHandler) { + this.callBackHandler = progressHandler; + } + + @Override + public long getContentLength() { + return total; + } + + @Override + public void setContentType(String contentType) { + this.contentType = contentType; + } + + @Override + public String getContentType() { + return TextUtils.isEmpty(contentType) ? "application/octet-stream" : contentType; + } + + @Override + public void writeTo(OutputStream out) throws IOException { + if (callBackHandler != null && !callBackHandler.updateProgress(total, current, true)) { + throw new Callback.CancelledException("upload stopped!"); + } + + byte[] buffer = new byte[4096]; + try { + int len = 0; + while ((len = content.read(buffer)) != -1) { + out.write(buffer, 0, len); + current += len; + if (callBackHandler != null && !callBackHandler.updateProgress(total, current, false)) { + throw new Callback.CancelledException("upload stopped!"); + } + } + out.flush(); + + if (callBackHandler != null) { + callBackHandler.updateProgress(total, current, true); + } + } finally { + IOUtil.closeQuietly(content); + } + } + + /** + * getInputStreamLength + * + * @param inputStream + * @return long + */ + public static long getInputStreamLength(InputStream inputStream) { + try { + if (inputStream instanceof FileInputStream || + inputStream instanceof ByteArrayInputStream) { + return inputStream.available(); + } + } catch (Throwable ex) { + LogUtil.w(ex.getMessage(), ex); + } + return -1L; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/MultipartBody.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/MultipartBody.java new file mode 100644 index 0000000..713102b --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/MultipartBody.java @@ -0,0 +1,274 @@ +package com.wordplat.quickstart.xutils.http.body; + +import com.wordplat.quickstart.xutils.common.Callback; +import com.wordplat.quickstart.xutils.common.util.IOUtil; +import com.wordplat.quickstart.xutils.common.util.KeyValue; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.http.BaseParams; +import com.wordplat.quickstart.xutils.http.BaseParams.BodyItemWrapper; +import com.wordplat.quickstart.xutils.http.ProgressHandler; + +import java.io.*; +import java.util.List; +import java.util.concurrent.atomic.AtomicLong; + +/** + * Author: wyouflf + * Time: 2014/05/30 + * + * @since 2021-05-09 + */ +public class MultipartBody implements ProgressBody { + private static byte[] BOUNDARY_PREFIX_BYTES = "--------7da3d81520810".getBytes(); + private static byte[] END_BYTES = "\r\n".getBytes(); + private static byte[] TWO_DASHES_BYTES = "--".getBytes(); + private byte[] boundaryPostfixBytes; + private String contentType; // multipart/subtype; boundary=xxx... + private String charset = "UTF-8"; + private ProgressHandler callBackHandler; + private List multipartParams; + private long total = 0; + private long current = 0; + + /** + * \ + * MultipartBody + * + * @param multipartParams + * @param charset + */ + public MultipartBody(List multipartParams, String charset) { + if (!TextUtils.isEmpty(charset)) { + this.charset = charset; + } + this.multipartParams = multipartParams; + generateContentType(); + + // calc total + CounterOutputStream counter = new CounterOutputStream(); + try { + this.writeTo(counter); + this.total = counter.total.get(); + } catch (IOException e) { + this.total = -1; + } + } + + @Override + public void setProgressHandler(ProgressHandler progressHandler) { + this.callBackHandler = progressHandler; + } + + private void generateContentType() { + String boundaryPostfix = Double.toHexString(Math.random() * 0xFFFF); + boundaryPostfixBytes = boundaryPostfix.getBytes(); + contentType = "multipart/form-data; boundary=" + new String(BOUNDARY_PREFIX_BYTES) + boundaryPostfix; + } + + @Override + public long getContentLength() { + return total; + } + + /** + * only change subType: + * "multipart/subType; boundary=xxx..." + * + * @param subType "form-data" or "related" + */ + @Override + public void setContentType(String subType) { + if (TextUtils.isEmpty(subType)) { + return; + } + int index = contentType.indexOf(";"); + this.contentType = "multipart/" + subType + contentType.substring(index); + } + + @Override + public String getContentType() { + return contentType; + } + + @Override + public void writeTo(OutputStream out) throws IOException { + if (callBackHandler != null && !callBackHandler.updateProgress(total, current, true)) { + throw new Callback.CancelledException("upload stopped!"); + } + + for (KeyValue entry : multipartParams) { + writeEntry(out, entry); + } + writeLine(out, TWO_DASHES_BYTES, BOUNDARY_PREFIX_BYTES, boundaryPostfixBytes, TWO_DASHES_BYTES); + out.flush(); + + if (callBackHandler != null) { + callBackHandler.updateProgress(total, current, true); + } + } + + private void writeEntry(OutputStream out, KeyValue entry) throws IOException { + String name = entry.key; + Object value = entry.value; + if (TextUtils.isEmpty(name) || value == null) { + return; + } + + writeLine(out, TWO_DASHES_BYTES, BOUNDARY_PREFIX_BYTES, boundaryPostfixBytes); + + String fileName = ""; + String contentType = null; + if (entry instanceof BodyItemWrapper) { + BaseParams.BodyItemWrapper wrapper = (BaseParams.BodyItemWrapper) entry; + fileName = wrapper.fileName; + contentType = wrapper.contentType; + } + + if (value instanceof File) { + File file = (File) value; + if (TextUtils.isEmpty(fileName)) { + fileName = file.getName(); + } + if (TextUtils.isEmpty(contentType)) { + contentType = FileBody.getFileContentType(file); + } + writeLine(out, buildContentDisposition(name, fileName, charset)); + writeLine(out, buildContentType(value, contentType, charset)); + writeLine(out); // 内容前空一行 + writeFile(out, file); + writeLine(out); + } else { + writeLine(out, buildContentDisposition(name, fileName, charset)); + writeLine(out, buildContentType(value, contentType, charset)); + writeLine(out); // 内容前空一行 + if (value instanceof InputStream) { + writeStreamAndCloseIn(out, (InputStream) value); + writeLine(out); + } else { + byte[] content; + if (value instanceof byte[]) { + content = (byte[]) value; + } else { + content = entry.getValueStrOrEmpty().getBytes(charset); + } + writeLine(out, content); + current += content.length; + if (callBackHandler != null && !callBackHandler.updateProgress(total, current, false)) { + throw new Callback.CancelledException("upload stopped!"); + } + } + } + } + + private void writeLine(OutputStream out, byte[]... bs) throws IOException { + if (bs != null) { + for (byte[] b : bs) { + out.write(b); + } + } + out.write(END_BYTES); + } + + private void writeFile(OutputStream out, File file) throws IOException { + if (out instanceof CounterOutputStream) { + ((CounterOutputStream) out).addFile(file); + } else { + writeStreamAndCloseIn(out, new FileInputStream(file)); + } + } + + private void writeStreamAndCloseIn(OutputStream out, InputStream in) throws IOException { + if (out instanceof CounterOutputStream) { + ((CounterOutputStream) out).addStream(in); + } else { + try { + int len; + byte[] buf = new byte[4096]; + while ((len = in.read(buf)) >= 0) { + out.write(buf, 0, len); + current += len; + if (callBackHandler != null && !callBackHandler.updateProgress(total, current, false)) { + throw new Callback.CancelledException("upload stopped!"); + } + } + } finally { + IOUtil.closeQuietly(in); + } + } + } + + private static byte[] buildContentDisposition(String name, String fileName, String charset) throws UnsupportedEncodingException { + StringBuilder result = new StringBuilder("Content-Disposition: form-data"); + result.append("; name=\"").append(name.replace("\"", "\\\"")).append("\""); + if (!TextUtils.isEmpty(fileName)) { + result.append("; filename=\"").append(fileName.replace("\"", "\\\"")).append("\""); + } + return result.toString().getBytes(charset); + } + + private static byte[] buildContentType(Object value, String contentType, String charset) throws UnsupportedEncodingException { + StringBuilder result = new StringBuilder("Content-Type: "); + if (TextUtils.isEmpty(contentType)) { + if (value instanceof String) { + contentType = "text/plain; charset=" + charset; + } else { + contentType = "application/octet-stream"; + } + } else { + contentType = contentType.replaceFirst("\\/jpg$", "/jpeg"); + } + result.append(contentType); + return result.toString().getBytes(charset); + } + + private class CounterOutputStream extends OutputStream { + final AtomicLong total = new AtomicLong(0L); + + /** + * CounterOutputStream + */ + public CounterOutputStream() { + } + + public void addFile(File file) { + if (total.get() == -1L) { + return; + } + total.addAndGet(file.length()); + } + + public void addStream(InputStream inputStream) { + if (total.get() == -1L) return; + long length = InputStreamBody.getInputStreamLength(inputStream); + if (length > 0) { + total.addAndGet(length); + } else { + total.set(-1L); + } + } + + @Override + public void write(int oneByte) throws IOException { + if (total.get() == -1L) { + return; + } + total.incrementAndGet(); + } + + @Override + public void write(byte[] buffer) throws IOException { + if (total.get() == -1L) { + return; + } + total.addAndGet(buffer.length); + } + + @Override + public void write(byte[] buffer, int offset, int count) throws IOException { + if (total.get() == -1L) { + return; + } + total.addAndGet(count); + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/ProgressBody.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/ProgressBody.java new file mode 100644 index 0000000..db5b757 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/ProgressBody.java @@ -0,0 +1,17 @@ +package com.wordplat.quickstart.xutils.http.body; + +import com.wordplat.quickstart.xutils.http.ProgressHandler; + +/** + * Created by wyouflf on 15/8/13. + * + * @since 2021-05-09 + */ +public interface ProgressBody extends RequestBody { + /** + * setProgressHandler + * + * @param progressHandler + */ + void setProgressHandler(ProgressHandler progressHandler); +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/RequestBody.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/RequestBody.java new file mode 100644 index 0000000..8857c25 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/RequestBody.java @@ -0,0 +1,40 @@ +package com.wordplat.quickstart.xutils.http.body; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * Created by wyouflf on 15/10/29. + * + * @since 2021-05-09 + */ +public interface RequestBody { + /** + * getContentLength + * + * @return long + */ + long getContentLength(); + + /** + * setContentType + * + * @param contentType + */ + void setContentType(String contentType); + + /** + * getContentType + * + * @return String + */ + String getContentType(); + + /** + * writeTo + * + * @param out + * @throws IOException + */ + void writeTo(OutputStream out) throws IOException; +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/StringBody.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/StringBody.java new file mode 100644 index 0000000..7e5fd55 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/StringBody.java @@ -0,0 +1,54 @@ +package com.wordplat.quickstart.xutils.http.body; + +import com.wordplat.quickstart.xutils.common.util.TextUtils; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; + +/** + * Author: wyouflf + * Time: 2014/05/30 + * + * @since 2021-05-09 + */ +public class StringBody implements RequestBody { + private byte[] content; + private String contentType; + private String charset = "UTF-8"; + + /** + * StringBody + * + * @param str + * @param charset + * @throws UnsupportedEncodingException + */ + public StringBody(String str, String charset) throws UnsupportedEncodingException { + if (!TextUtils.isEmpty(charset)) { + this.charset = charset; + } + this.content = str.getBytes(this.charset); + } + + @Override + public long getContentLength() { + return content.length; + } + + @Override + public void setContentType(String contentType) { + this.contentType = contentType; + } + + @Override + public String getContentType() { + return TextUtils.isEmpty(contentType) ? "application/json;charset=" + charset : contentType; + } + + @Override + public void writeTo(OutputStream out) throws IOException { + out.write(content); + out.flush(); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/UrlEncodedBody.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/UrlEncodedBody.java new file mode 100644 index 0000000..4557909 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/body/UrlEncodedBody.java @@ -0,0 +1,74 @@ +package com.wordplat.quickstart.xutils.http.body; + +import com.wordplat.quickstart.xutils.common.util.KeyValue; +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.common.util.TextUtils; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.URLEncoder; +import java.util.List; + +/** + * Author: wyouflf + * Time: 2014/05/30 + * + * @since 2021-05-09 + */ +public class UrlEncodedBody implements RequestBody { + private byte[] content; + private String charset = "UTF-8"; + + /** + * UrlEncodedBody + * + * @param params + * @param charset + * @throws IOException + */ + public UrlEncodedBody(List params, String charset) throws IOException { + if (!TextUtils.isEmpty(charset)) { + this.charset = charset; + } + StringBuilder contentSb = new StringBuilder(); + if (params != null) { + for (KeyValue kv : params) { + String name = kv.key; + String value = kv.getValueStrOrNull(); + if (!TextUtils.isEmpty(name) && value != null) { + if (contentSb.length() > 0) { + contentSb.append("&"); + } + contentSb.append(URLEncoder.encode(name, this.charset).replaceAll("\\+", "%20")) + .append("=") + .append(URLEncoder.encode(value, this.charset).replaceAll("\\+", "%20")); + } + } + } + + this.content = contentSb.toString().getBytes(this.charset); + } + + @Override + public long getContentLength() { + return content.length; + } + + @Override + public void setContentType(String contentType) { + if (!TextUtils.isEmpty(contentType)) { + LogUtil.w("ignored Content-Type: " + contentType); + } + } + + @Override + public String getContentType() { + return "application/x-www-form-urlencoded;charset=" + charset; + } + + @Override + public void writeTo(OutputStream sink) throws IOException { + sink.write(this.content); + sink.flush(); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/cookie/CookieEntity.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/cookie/CookieEntity.java new file mode 100644 index 0000000..6cca900 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/cookie/CookieEntity.java @@ -0,0 +1,128 @@ +package com.wordplat.quickstart.xutils.http.cookie; + +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.db.annotation.Column; +import com.wordplat.quickstart.xutils.db.annotation.Table; + +import java.net.HttpCookie; +import java.net.URI; + +/** + * Created by wyouflf on 15/8/20. + * 数据库中的cookie实体 + */ +/** + * CookieEntity + * + * @since 2021-05-09 + */ +@Table(name = "cookie", + onCreated = "CREATE UNIQUE INDEX index_cookie_unique ON cookie(\"name\",\"domain\",\"path\")") +final class CookieEntity { + private static final long MAX_EXPIRY = System.currentTimeMillis() + 1000L * 60L * 60L * 24L * 30L * 12L * 100L; + + @Column(name = "id", isId = true) + private long id; + + @Column(name = "uri") + private String uri; // cookie add by this uri. + + @Column(name = "name") + private String name; + @Column(name = "value") + private String value; + @Column(name = "comment") + private String comment; + @Column(name = "commentURL") + private String commentURL; + @Column(name = "discard") + private boolean discard; + @Column(name = "domain") + private String domain; + @Column(name = "expiry") + private long expiry = MAX_EXPIRY; + @Column(name = "path") + private String path; + @Column(name = "portList") + private String portList; + @Column(name = "secure") + private boolean secure; + @Column(name = "version") + private int version = 1; + + /** + * CookieEntity + */ + public CookieEntity() { + } + + /** + * CookieEntity + * + * @param uri + * @param cookie + */ + public CookieEntity(URI uri, HttpCookie cookie) { + this.uri = uri == null ? null : uri.toString(); + this.name = cookie.getName(); + this.value = cookie.getValue(); + this.comment = cookie.getComment(); + this.commentURL = cookie.getCommentURL(); + this.discard = cookie.getDiscard(); + this.domain = cookie.getDomain(); + long maxAge = cookie.getMaxAge(); + if (maxAge > 0) { + this.expiry = (maxAge * 1000L) + System.currentTimeMillis(); + if (this.expiry < 0L) { // 计算溢出? + this.expiry = MAX_EXPIRY; + } + } else { + this.expiry = -1L; + } + this.path = cookie.getPath(); + if (!TextUtils.isEmpty(path) && path.length() > 1 && path.endsWith("/")) { + this.path = path.substring(0, path.length() - 1); + } + this.portList = cookie.getPortlist(); + this.secure = cookie.getSecure(); + this.version = cookie.getVersion(); + } + + public HttpCookie toHttpCookie() { + HttpCookie cookie = new HttpCookie(name, value); + cookie.setComment(comment); + cookie.setCommentURL(commentURL); + cookie.setDiscard(discard); + cookie.setDomain(domain); + if (expiry == -1L) { + cookie.setMaxAge(-1L); + } else { + cookie.setMaxAge((expiry - System.currentTimeMillis()) / 1000L); + } + cookie.setPath(path); + cookie.setPortlist(portList); + cookie.setSecure(secure); + cookie.setVersion(version); + return cookie; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + + public boolean isExpired() { + return expiry != -1L && expiry < System.currentTimeMillis(); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/cookie/DbCookieStore.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/cookie/DbCookieStore.java new file mode 100644 index 0000000..5a0b849 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/cookie/DbCookieStore.java @@ -0,0 +1,304 @@ +package com.wordplat.quickstart.xutils.http.cookie; + +import com.wordplat.quickstart.xutils.DbManager; +import com.wordplat.quickstart.xutils.common.task.PriorityExecutor; +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.config.DbConfigs; +import com.wordplat.quickstart.xutils.db.Selector; +import com.wordplat.quickstart.xutils.db.sqlite.WhereBuilder; +import com.wordplat.quickstart.xutils.db.table.DbModel; +import com.wordplat.quickstart.xutils.x; + +import java.net.CookieStore; +import java.net.HttpCookie; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Executor; + +/** + * Created by wyouflf on 15/8/20. + * 基于数据库的CookieStore实现. + * + * @since 2021-05-09 + */ +public enum DbCookieStore implements CookieStore { + /** + * INSTANCE + */ + INSTANCE; + private static final long TRIM_TIME_SPAN = 1000; + /** + * 限制最多5000条数据 + */ + private static final int LIMIT_COUNT = 5000; + + private DbManager db; + private final Executor trimExecutor = new PriorityExecutor(1, true); + + private long lastTrimTime = 0L; + + DbCookieStore() { + x.task().run(new Runnable() { + @Override + public void run() { + tryInit(); + } + }); + } + + private void tryInit() { + if (db == null) { + synchronized (this) { + if (db == null) { + try { + db = x.getDb(DbConfigs.COOKIE.getConfig()); + db.delete(CookieEntity.class, + WhereBuilder.b("expiry", "=", -1L)); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + } + } + } + + @Override + public void add(URI uri, HttpCookie cookie) { + if (cookie == null) { + return; + } + + tryInit(); + + uri = getEffectiveURI(uri); + + try { + db.replace(new CookieEntity(uri, cookie)); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + + trimSize(); + } + + @Override + public List get(URI uri) { + if (uri == null) { + throw new NullPointerException("uri is null"); + } + + tryInit(); + + uri = getEffectiveURI(uri); + + List rt = new ArrayList(); + + try { + Selector selector = db.selector(CookieEntity.class); + + WhereBuilder where = WhereBuilder.b(); + + String host = uri.getHost(); + if (!TextUtils.isEmpty(host)) { + WhereBuilder subWhere = WhereBuilder.b("domain", "=", host).or("domain", "=", "." + host); + int firstDot = host.indexOf("."); + int lastDot = host.lastIndexOf("."); + if (firstDot > 0 && lastDot > firstDot) { + String domain = host.substring(firstDot, host.length()); + if (!TextUtils.isEmpty(domain)) { + subWhere.or("domain", "=", domain); + } + } + where.and(subWhere); + } + + String path = uri.getPath(); + if (!TextUtils.isEmpty(path)) { + WhereBuilder subWhere = WhereBuilder.b("path", "=", path) + .or("path", "=", "/").or("path", "=", null); + int lastSplit = path.lastIndexOf("/"); + while (lastSplit > 0) { + path = path.substring(0, lastSplit); + subWhere.or("path", "=", path); + lastSplit = path.lastIndexOf("/"); + } + + where.and(subWhere); + } + + where.or("uri", "=", uri.toString()); + + List cookieEntityList = selector.where(where).findAll(); + if (cookieEntityList != null) { + for (CookieEntity cookieEntity : cookieEntityList) { + if (!cookieEntity.isExpired()) { + rt.add(cookieEntity.toHttpCookie()); + } + } + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + return rt; + } + + @Override + public List getCookies() { + tryInit(); + + List rt = new ArrayList(); + + try { + List cookieEntityList = db.findAll(CookieEntity.class); + if (cookieEntityList != null) { + for (CookieEntity cookieEntity : cookieEntityList) { + if (!cookieEntity.isExpired()) { + rt.add(cookieEntity.toHttpCookie()); + } + } + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + return rt; + } + + @Override + public List getURIs() { + tryInit(); + + List uris = new ArrayList(); + + try { + List uriList = + db.selector(CookieEntity.class).select("uri").findAll(); + if (uriList != null) { + for (DbModel model : uriList) { + String uri = model.getString("uri"); + if (!TextUtils.isEmpty(uri)) { + try { + uris.add(new URI(uri)); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + try { + db.delete(CookieEntity.class, WhereBuilder.b("uri", "=", uri)); + } catch (Throwable throwable) { + LogUtil.e(throwable.getMessage(), throwable); + } + } + } + } + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + + return uris; + } + + @Override + public boolean remove(URI uri, HttpCookie cookie) { + if (cookie == null) { + return true; + } + + tryInit(); + + boolean modified = false; + try { + WhereBuilder where = WhereBuilder.b("name", "=", cookie.getName()); + + String domain = cookie.getDomain(); + if (!TextUtils.isEmpty(domain)) { + where.and("domain", "=", domain); + } + + String path = cookie.getPath(); + if (!TextUtils.isEmpty(path)) { + if (path.length() > 1 && path.endsWith("/")) { + path = path.substring(0, path.length() - 1); + } + where.and("path", "=", path); + } + + db.delete(CookieEntity.class, where); + + modified = true; + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + + return modified; + } + + @Override + public boolean removeAll() { + tryInit(); + + try { + db.delete(CookieEntity.class); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + return true; + } + + private void trimSize() { + trimExecutor.execute(new Runnable() { + @Override + public void run() { + tryInit(); + + long current = System.currentTimeMillis(); + if (current - lastTrimTime < TRIM_TIME_SPAN) { + return; + } else { + lastTrimTime = current; + } + + // delete expires + try { + db.delete(CookieEntity.class, WhereBuilder + .b("expiry", "<", System.currentTimeMillis()) + .and("expiry", "!=", -1L)); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + + // trim by limit count + try { + int count = (int) db.selector(CookieEntity.class).count(); + if (count > LIMIT_COUNT + 10) { + List rmList = db.selector(CookieEntity.class) + .where("expiry", "!=", -1L).orderBy("expiry") + .limit(count - LIMIT_COUNT).findAll(); + if (rmList != null) { + db.delete(rmList); + } + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + }); + } + + private URI getEffectiveURI(final URI uri) { + URI effectiveURI = null; + try { + effectiveURI = new URI("http", + uri.getHost(), + uri.getPath(), + null, + null + ); + } catch (Throwable ex) { + LogUtil.w(ex.getMessage(), ex); + effectiveURI = uri; + } + + return effectiveURI; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/BooleanLoader.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/BooleanLoader.java new file mode 100644 index 0000000..c5b2cc8 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/BooleanLoader.java @@ -0,0 +1,32 @@ +package com.wordplat.quickstart.xutils.http.loader; + +import com.wordplat.quickstart.xutils.cache.DiskCacheEntity; +import com.wordplat.quickstart.xutils.http.request.UriRequest; + +/** + * Author: wyouflf + * Time: 2014/05/30 + * + * @since 2021-05-09 + */ +class BooleanLoader extends Loader { + @Override + public Loader newInstance() { + return new BooleanLoader(); + } + + @Override + public Boolean load(final UriRequest request) throws Throwable { + request.sendRequest(); + return request.getResponseCode() < 300; + } + + @Override + public Boolean loadFromCache(final DiskCacheEntity cacheEntity) throws Throwable { + return null; + } + + @Override + public void save2Cache(final UriRequest request) { + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/ByteArrayLoader.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/ByteArrayLoader.java new file mode 100644 index 0000000..d6dee3b --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/ByteArrayLoader.java @@ -0,0 +1,43 @@ +package com.wordplat.quickstart.xutils.http.loader; + +import com.wordplat.quickstart.xutils.cache.DiskCacheEntity; +import com.wordplat.quickstart.xutils.common.util.IOUtil; +import com.wordplat.quickstart.xutils.http.request.UriRequest; + +/** + * Author: wyouflf + * Time: 2014/05/30 + * + * @since 2021-05-09 + */ +class ByteArrayLoader extends Loader { + private byte[] resultData; + + @Override + public Loader newInstance() { + return new ByteArrayLoader(); + } + + @Override + public byte[] load(final UriRequest request) throws Throwable { + request.sendRequest(); + resultData = IOUtil.readBytes(request.getInputStream()); + return resultData; + } + + @Override + public byte[] loadFromCache(final DiskCacheEntity cacheEntity) throws Throwable { + if (cacheEntity != null) { + byte[] data = cacheEntity.getBytesContent(); + if (data != null && data.length > 0) { + return data; + } + } + return null; + } + + @Override + public void save2Cache(final UriRequest request) { + saveByteArrayCache(request, resultData); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/FileLoader.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/FileLoader.java new file mode 100644 index 0000000..6042a05 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/FileLoader.java @@ -0,0 +1,345 @@ +package com.wordplat.quickstart.xutils.http.loader; + +import com.wordplat.quickstart.xutils.cache.DiskCacheEntity; +import com.wordplat.quickstart.xutils.cache.DiskCacheFile; +import com.wordplat.quickstart.xutils.cache.LruDiskCache; +import com.wordplat.quickstart.xutils.common.Callback; +import com.wordplat.quickstart.xutils.common.util.IOUtil; +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.common.util.ProcessLock; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.ex.FileLockedException; +import com.wordplat.quickstart.xutils.ex.HttpException; +import com.wordplat.quickstart.xutils.http.RequestParams; +import com.wordplat.quickstart.xutils.http.request.UriRequest; + +import java.io.*; +import java.net.URLDecoder; +import java.util.Arrays; +import java.util.Date; + +/** + * Author: wyouflf + * Time: 2014/05/30 + * 下载参数策略: + * 1. RequestParams#saveFilePath不为空时, 目标文件保存在saveFilePath; + * 否则由Cache策略分配文件下载路径. + * 2. 下载时临时目标文件路径为tempSaveFilePath, 下载完后进行a: CacheFile#commit; b:重命名等操作. + * 断点下载策略: + * 1. 要下载的目标文件不存在或小于 CHECK_SIZE 时删除目标文件, 重新下载. + * 2. 若文件存在且大于 CHECK_SIZE, range = fileLen - CHECK_SIZE , 校验check_buffer, 相同: 继续下载; + * 不相同: 删掉目标文件, 并抛出RuntimeException(HttpRetryHandler会使下载重新开始). + * + * @since 2021-05-09 + */ +public class FileLoader extends Loader { + private static final int CHECK_SIZE = 512; + + private RequestParams params; + private String tempSaveFilePath; + private String saveFilePath; + private boolean isAutoResume; + private boolean isAutoRename; + private long contentLength; + private String responseFileName; + + private DiskCacheFile diskCacheFile; + + @Override + public Loader newInstance() { + return new FileLoader(); + } + + @Override + public void setParams(final RequestParams params) { + if (params != null) { + this.params = params; + isAutoResume = params.isAutoResume(); + isAutoRename = params.isAutoRename(); + } + } + + /** + * load + * + * @param in + * @return File + * @throws Throwable + * @throws IOException + * @throws RuntimeException + * @throws Callback.CancelledException + */ + protected File load(final InputStream in) throws Throwable { + File targetFile = null; + BufferedInputStream bis = null; + BufferedOutputStream bos = null; + try { + targetFile = new File(tempSaveFilePath); + if (targetFile.isDirectory()) { + throw new IOException("could not create the file: " + tempSaveFilePath); + } + if (!targetFile.exists()) { + File dir = targetFile.getParentFile(); + if ((!dir.exists() && !dir.mkdirs()) || !dir.isDirectory()) { + throw new IOException("could not create the dir: " + dir.getCanonicalPath()); + } + } + + // 处理[断点逻辑2](见文件头doc) + long targetFileLen = targetFile.length(); + if (isAutoResume && targetFileLen > 0) { + FileInputStream fis = null; + try { + long filePos = targetFileLen - CHECK_SIZE; + if (filePos > 0) { + fis = new FileInputStream(targetFile); + byte[] fileCheckBuffer = IOUtil.readBytes(fis, filePos, CHECK_SIZE); + byte[] checkBuffer = IOUtil.readBytes(in, 0, CHECK_SIZE); + if (!Arrays.equals(checkBuffer, fileCheckBuffer)) { + IOUtil.closeQuietly(fis); // 先关闭文件流, 否则文件删除会失败. + IOUtil.deleteFileOrDir(targetFile); + throw new RuntimeException("need retry"); + } else { + contentLength -= CHECK_SIZE; + } + } else { + IOUtil.deleteFileOrDir(targetFile); + throw new RuntimeException("need retry"); + } + } finally { + IOUtil.closeQuietly(fis); + } + } + + // 开始下载 + long current = 0; + FileOutputStream fileOutputStream = null; + if (isAutoResume) { + current = targetFileLen; + fileOutputStream = new FileOutputStream(targetFile, true); + } else { + fileOutputStream = new FileOutputStream(targetFile); + } + + long total = contentLength + current; + bis = new BufferedInputStream(in); + bos = new BufferedOutputStream(fileOutputStream); + + if (progressHandler != null && !progressHandler.updateProgress(total, current, true)) { + throw new Callback.CancelledException("download stopped!"); + } + + byte[] tmp = new byte[4096]; + int len; + while ((len = bis.read(tmp)) != -1) { + if (!targetFile.getParentFile().exists()) { + targetFile.getParentFile().mkdirs(); + throw new IOException("parent be deleted!"); + } + + bos.write(tmp, 0, len); + current += len; + if (progressHandler != null) { + if (!progressHandler.updateProgress(total, current, false)) { + bos.flush(); + throw new Callback.CancelledException("download stopped!"); + } + } + } + bos.flush(); + if (diskCacheFile != null) { + targetFile = diskCacheFile.commit(); + } + + if (progressHandler != null) { + progressHandler.updateProgress(total, current, true); + } + } finally { + IOUtil.closeQuietly(bis); + IOUtil.closeQuietly(bos); + } + + return autoRename(targetFile); + } + + @Override + public File load(final UriRequest request) throws Throwable { + ProcessLock processLock = null; + File result = null; + try { + saveFilePath = params.getSaveFilePath(); + diskCacheFile = null; + if (TextUtils.isEmpty(saveFilePath)) { + + if (progressHandler != null && !progressHandler.updateProgress(0, 0, false)) { + throw new Callback.CancelledException("download stopped!"); + } + initDiskCacheFile(request); + } else { + tempSaveFilePath = saveFilePath + ".tmp"; + } + + if (progressHandler != null && !progressHandler.updateProgress(0, 0, false)) { + throw new Callback.CancelledException("download stopped!"); + } + + // 等待, 若不能下载则取消此次下载. + processLock = ProcessLock.tryLock(saveFilePath + "_lock", true); + if (processLock == null || !processLock.isValid()) { + throw new FileLockedException("download exists: " + saveFilePath); + } + + params = request.getParams(); + long range = 0; + if (isAutoResume) { + File tempFile = new File(tempSaveFilePath); + long fileLen = tempFile.length(); + if (fileLen <= CHECK_SIZE) { + IOUtil.deleteFileOrDir(tempFile); + range = 0; + } else { + range = fileLen - CHECK_SIZE; + } + } + params.setHeader("Range", "bytes=" + range + "-"); + + if (progressHandler != null && !progressHandler.updateProgress(0, 0, false)) { + throw new Callback.CancelledException("download stopped!"); + } + + request.sendRequest(); // may be throw an HttpException + + contentLength = request.getContentLength(); + if (isAutoRename) { + responseFileName = getResponseFileName(request); + } + if (isAutoResume) { + isAutoResume = isSupportRange(request); + } + + if (progressHandler != null && !progressHandler.updateProgress(0, 0, false)) { + throw new Callback.CancelledException("download stopped!"); + } + + if (diskCacheFile != null) { + try { + DiskCacheEntity entity = diskCacheFile.getCacheEntity(); + entity.setLastAccess(System.currentTimeMillis()); + entity.setEtag(request.getETag()); + entity.setExpires(request.getExpiration()); + entity.setLastModify(new Date(request.getLastModified())); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + result = this.load(request.getInputStream()); + } catch (HttpException httpException) { + if (httpException.getCode() == 416) { + if (diskCacheFile != null) { + result = diskCacheFile.commit(); + } else { + result = new File(tempSaveFilePath); + } + if (result != null && result.exists()) { + if (isAutoRename) { + responseFileName = getResponseFileName(request); + } + result = autoRename(result); + } else { + IOUtil.deleteFileOrDir(result); + throw new IllegalStateException("cache file not found" + request.getCacheKey()); + } + } else { + throw httpException; + } + } finally { + IOUtil.closeQuietly(processLock); + IOUtil.closeQuietly(diskCacheFile); + } + return result; + } + + // 保存路径为空, 存入磁盘缓存. + private void initDiskCacheFile(final UriRequest request) throws Throwable { + DiskCacheEntity entity = new DiskCacheEntity(); + entity.setKey(request.getCacheKey()); + diskCacheFile = LruDiskCache.getDiskCache(params.getCacheDirName()).createDiskCacheFile(entity); + + if (diskCacheFile != null) { + saveFilePath = diskCacheFile.getAbsolutePath(); + tempSaveFilePath = saveFilePath; + isAutoRename = false; + } else { + throw new IOException("create cache file error:" + request.getCacheKey()); + } + } + + // 处理[下载逻辑2.b](见文件头doc) + private File autoRename(File loadedFile) { + if (isAutoRename && loadedFile.exists() && !TextUtils.isEmpty(responseFileName)) { + File newFile = new File(loadedFile.getParent(), responseFileName); + while (newFile.exists()) { + newFile = new File(loadedFile.getParent(), System.currentTimeMillis() + responseFileName); + } + return loadedFile.renameTo(newFile) ? newFile : loadedFile; + } else if (!saveFilePath.equals(tempSaveFilePath)) { + File newFile = new File(saveFilePath); + return loadedFile.renameTo(newFile) ? newFile : loadedFile; + } else { + return loadedFile; + } + } + + private static String getResponseFileName(UriRequest request) { + if (request == null) { + return null; + } + String disposition = request.getResponseHeader("Content-Disposition"); + if (!TextUtils.isEmpty(disposition)) { + int startIndex = disposition.indexOf("filename="); + if (startIndex > 0) { + startIndex += 9; // "filename=".length() + int endIndex = disposition.indexOf(";", startIndex); + if (endIndex < 0) { + endIndex = disposition.length(); + } + if (endIndex > startIndex) { + try { + String name = URLDecoder.decode( + disposition.substring(startIndex, endIndex), + request.getParams().getCharset()); + if (name.startsWith("\"") && name.endsWith("\"")) { + name = name.substring(1, name.length() - 1); + } + return name; + } catch (UnsupportedEncodingException ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + } + } + return null; + } + + private static boolean isSupportRange(UriRequest request) { + if (request == null) { + return false; + } + String ranges = request.getResponseHeader("Accept-Ranges"); + if (ranges != null) { + return ranges.contains("bytes"); + } + ranges = request.getResponseHeader("Content-Range"); + return ranges != null && ranges.contains("bytes"); + } + + @Override + public File loadFromCache(final DiskCacheEntity cacheEntity) throws Throwable { + return LruDiskCache.getDiskCache(params.getCacheDirName()).getDiskCacheFile(cacheEntity.getKey()); + } + + @Override + public void save2Cache(final UriRequest request) { + // the file caches already saved by diskCacheFile#commit + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/InputStreamLoader.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/InputStreamLoader.java new file mode 100644 index 0000000..7a080a8 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/InputStreamLoader.java @@ -0,0 +1,36 @@ +package com.wordplat.quickstart.xutils.http.loader; + +import com.wordplat.quickstart.xutils.cache.DiskCacheEntity; +import com.wordplat.quickstart.xutils.http.request.UriRequest; + +import java.io.InputStream; + +/** + * 将PrepareType设置为InputStream, 以便在PrepareCallback#prepare中做耗时的数据任务处理. + *

+ * Author: wyouflf + * Time: 2014/05/30 + * + * @since 2021-05-09 + */ +class InputStreamLoader extends Loader { + @Override + public Loader newInstance() { + return new InputStreamLoader(); + } + + @Override + public InputStream load(final UriRequest request) throws Throwable { + request.sendRequest(); + return request.getInputStream(); + } + + @Override + public InputStream loadFromCache(final DiskCacheEntity cacheEntity) throws Throwable { + return null; + } + + @Override + public void save2Cache(final UriRequest request) { + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/IntegerLoader.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/IntegerLoader.java new file mode 100644 index 0000000..39f7675 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/IntegerLoader.java @@ -0,0 +1,32 @@ +package com.wordplat.quickstart.xutils.http.loader; + +import com.wordplat.quickstart.xutils.cache.DiskCacheEntity; +import com.wordplat.quickstart.xutils.http.request.UriRequest; + +/** + * Author: wyouflf + * Time: 2014/10/17 + * + * @since 2021-05-09 + */ +class IntegerLoader extends Loader { + @Override + public Loader newInstance() { + return new IntegerLoader(); + } + + @Override + public Integer load(UriRequest request) throws Throwable { + request.sendRequest(); + return request.getResponseCode(); + } + + @Override + public Integer loadFromCache(final DiskCacheEntity cacheEntity) throws Throwable { + return null; + } + + @Override + public void save2Cache(UriRequest request) { + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/JSONArrayLoader.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/JSONArrayLoader.java new file mode 100644 index 0000000..7a6d9bf --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/JSONArrayLoader.java @@ -0,0 +1,58 @@ +package com.wordplat.quickstart.xutils.http.loader; + +import com.wordplat.quickstart.json.JSONArray; +import com.wordplat.quickstart.xutils.cache.DiskCacheEntity; +import com.wordplat.quickstart.xutils.common.util.IOUtil; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.http.RequestParams; +import com.wordplat.quickstart.xutils.http.request.UriRequest; + +/** + * Author: wyouflf + * Time: 2014/06/16 + * + * @since 2021-05-09 + */ +class JSONArrayLoader extends Loader { + private String charset = "UTF-8"; + private String resultStr = null; + + @Override + public Loader newInstance() { + return new JSONArrayLoader(); + } + + @Override + public void setParams(final RequestParams params) { + if (params != null) { + String charset = params.getCharset(); + if (!TextUtils.isEmpty(charset)) { + this.charset = charset; + } + } + } + + @Override + public JSONArray load(final UriRequest request) throws Throwable { + request.sendRequest(); + resultStr = IOUtil.readStr(request.getInputStream(), charset); + return new JSONArray(resultStr); + } + + @Override + public JSONArray loadFromCache(final DiskCacheEntity cacheEntity) throws Throwable { + if (cacheEntity != null) { + String text = cacheEntity.getTextContent(); + if (!TextUtils.isEmpty(text)) { + return new JSONArray(text); + } + } + + return null; + } + + @Override + public void save2Cache(UriRequest request) { + saveStringCache(request, resultStr); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/JSONObjectLoader.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/JSONObjectLoader.java new file mode 100644 index 0000000..6600e5e --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/JSONObjectLoader.java @@ -0,0 +1,58 @@ +package com.wordplat.quickstart.xutils.http.loader; + +import com.wordplat.quickstart.json.JSONObject; +import com.wordplat.quickstart.xutils.cache.DiskCacheEntity; +import com.wordplat.quickstart.xutils.common.util.IOUtil; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.http.RequestParams; +import com.wordplat.quickstart.xutils.http.request.UriRequest; + +/** + * Author: wyouflf + * Time: 2014/06/16 + * + * @since 2021-05-09 + */ +class JSONObjectLoader extends Loader { + private String charset = "UTF-8"; + private String resultStr = null; + + @Override + public Loader newInstance() { + return new JSONObjectLoader(); + } + + @Override + public void setParams(final RequestParams params) { + if (params != null) { + String charset = params.getCharset(); + if (!TextUtils.isEmpty(charset)) { + this.charset = charset; + } + } + } + + @Override + public JSONObject load(final UriRequest request) throws Throwable { + request.sendRequest(); + resultStr = IOUtil.readStr(request.getInputStream(), charset); + return new JSONObject(resultStr); + } + + @Override + public JSONObject loadFromCache(final DiskCacheEntity cacheEntity) throws Throwable { + if (cacheEntity != null) { + String text = cacheEntity.getTextContent(); + if (!TextUtils.isEmpty(text)) { + return new JSONObject(text); + } + } + + return null; + } + + @Override + public void save2Cache(UriRequest request) { + saveStringCache(request, resultStr); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/Loader.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/Loader.java new file mode 100644 index 0000000..ae96e74 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/Loader.java @@ -0,0 +1,98 @@ +package com.wordplat.quickstart.xutils.http.loader; + +import com.wordplat.quickstart.xutils.cache.DiskCacheEntity; +import com.wordplat.quickstart.xutils.cache.LruDiskCache; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.http.ProgressHandler; +import com.wordplat.quickstart.xutils.http.RequestParams; +import com.wordplat.quickstart.xutils.http.request.UriRequest; + +import java.util.Date; + +/** + * Author: wyouflf + * Time: 2014/05/26 + * + * @since 2021-05-09 + */ +public abstract class Loader { + protected ProgressHandler progressHandler; + + /** + * setParams + * + * @param params + */ + public void setParams(final RequestParams params) { + } + + public void setProgressHandler(final ProgressHandler callbackHandler) { + this.progressHandler = callbackHandler; + } + + /** + * saveStringCache + * + * @param request + * @param resultStr + */ + protected void saveStringCache(UriRequest request, String resultStr) { + saveCacheInternal(request, resultStr, null); + } + + /** + * saveByteArrayCache + * + * @param request + * @param resultData + */ + protected void saveByteArrayCache(UriRequest request, byte[] resultData) { + saveCacheInternal(request, null, resultData); + } + + /** + * newInstance + * + * @return Loader + */ + public abstract Loader newInstance(); + + /** + * load + * + * @param request + * @return T + * @throws Throwable + */ + public abstract T load(final UriRequest request) throws Throwable; + + /** + * loadFromCache + * + * @param cacheEntity + * @return T + * @throws Throwable + */ + public abstract T loadFromCache(final DiskCacheEntity cacheEntity) throws Throwable; + + /** + * save2Cache + * + * @param request + */ + public abstract void save2Cache(final UriRequest request); + + private void saveCacheInternal(UriRequest request, String resultStr, byte[] resultData) { + if (!TextUtils.isEmpty(resultStr) || (resultData != null && resultData.length > 0)) { + DiskCacheEntity entity = new DiskCacheEntity(); + entity.setKey(request.getCacheKey()); + entity.setLastAccess(System.currentTimeMillis()); + entity.setEtag(request.getETag()); + entity.setExpires(request.getExpiration()); + entity.setLastModify(new Date(request.getLastModified())); + entity.setTextContent(resultStr); + entity.setBytesContent(resultData); + LruDiskCache.getDiskCache(request.getParams().getCacheDirName()).put(entity); + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/LoaderFactory.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/LoaderFactory.java new file mode 100644 index 0000000..ec423fd --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/LoaderFactory.java @@ -0,0 +1,67 @@ +package com.wordplat.quickstart.xutils.http.loader; + +import com.wordplat.quickstart.json.JSONArray; +import com.wordplat.quickstart.json.JSONObject; + +import java.io.File; +import java.io.InputStream; +import java.lang.reflect.Type; +import java.util.HashMap; + +/** + * Author: wyouflf + * Time: 2014/05/26 + */ +public final class LoaderFactory { + private LoaderFactory() { + } + + /** + * key: loadType + */ + private static final HashMap converterHashMap = new HashMap(); + + static { + converterHashMap.put(JSONObject.class, new JSONObjectLoader()); + converterHashMap.put(JSONArray.class, new JSONArrayLoader()); + converterHashMap.put(String.class, new StringLoader()); + converterHashMap.put(File.class, new FileLoader()); + converterHashMap.put(byte[].class, new ByteArrayLoader()); + converterHashMap.put(InputStream.class, new InputStreamLoader()); + + BooleanLoader booleanLoader = new BooleanLoader(); + converterHashMap.put(boolean.class, booleanLoader); + converterHashMap.put(Boolean.class, booleanLoader); + + IntegerLoader integerLoader = new IntegerLoader(); + converterHashMap.put(int.class, integerLoader); + converterHashMap.put(Integer.class, integerLoader); + } + + /** + * getLoader + * + * @param type + * @return Loader + */ + public static Loader getLoader(Type type) { + Loader result = converterHashMap.get(type); + if (result == null) { + result = new ObjectLoader(type); + } else { + result = result.newInstance(); + } + return result; + } + + /** + * registerLoader + * + * @param type + * @param loader + * @param + */ + public static void registerLoader(Type type, Loader loader) { + converterHashMap.put(type, loader); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/ObjectLoader.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/ObjectLoader.java new file mode 100644 index 0000000..2aabbae --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/ObjectLoader.java @@ -0,0 +1,111 @@ +package com.wordplat.quickstart.xutils.http.loader; + +import com.wordplat.quickstart.xutils.cache.DiskCacheEntity; +import com.wordplat.quickstart.xutils.common.util.ParameterizedTypeUtil; +import com.wordplat.quickstart.xutils.http.RequestParams; +import com.wordplat.quickstart.xutils.http.annotation.HttpResponse; +import com.wordplat.quickstart.xutils.http.app.ResponseParser; +import com.wordplat.quickstart.xutils.http.request.UriRequest; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.lang.reflect.TypeVariable; +import java.util.List; + +/** + * Created by lei.jiao on 2014/6/27. + * 其他对象的下载转换. + * 使用类型上的@HttpResponse注解信息进行数据转换. + * + * @since 2021-05-09 + */ +class ObjectLoader extends Loader { + private final Type objectType; + private final Class objectClass; + private final ResponseParser parser; + private final Loader innerLoader; + + /** + * ObjectLoader + * + * @param objectType + */ + public ObjectLoader(Type objectType) { + this.objectType = objectType; + + // check loadType & resultType + if (objectType instanceof ParameterizedType) { + objectClass = (Class) ((ParameterizedType) objectType).getRawType(); + } else if (objectType instanceof TypeVariable) { + throw new IllegalArgumentException( + "not support callback type " + objectType.toString()); + } else { + objectClass = (Class) objectType; + } + + HttpResponse response = null; + Type itemType = objectType; + if (List.class.equals(objectClass)) { + itemType = ParameterizedTypeUtil.getParameterizedType(this.objectType, List.class, 0); + Class itemClass = null; + if (itemType instanceof ParameterizedType) { + itemClass = (Class) ((ParameterizedType) itemType).getRawType(); + } else if (itemType instanceof TypeVariable) { + throw new IllegalArgumentException( + "not support callback type " + itemType.toString()); + } else { + itemClass = (Class) itemType; + } + + response = itemClass.getAnnotation(HttpResponse.class); + } else { + response = objectClass.getAnnotation(HttpResponse.class); + } + if (response != null) { + try { + Class parserCls = response.parser(); + this.parser = parserCls.newInstance(); + this.innerLoader = LoaderFactory.getLoader( + ParameterizedTypeUtil.getParameterizedType(parserCls, ResponseParser.class, 0)); + } catch (Throwable ex) { + throw new RuntimeException("create parser error", ex); + } + } else { + throw new IllegalArgumentException("not found @HttpResponse from " + itemType); + } + + if (innerLoader instanceof ObjectLoader) { + throw new IllegalArgumentException("not support callback type " + itemType); + } + } + + @Override + public Loader newInstance() { + throw new IllegalAccessError("use constructor create ObjectLoader."); + } + + @Override + public void setParams(final RequestParams params) { + this.innerLoader.setParams(params); + } + + @Override + @SuppressWarnings("unchecked") + public Object load(final UriRequest request) throws Throwable { + request.setResponseParser(parser); + Object innerLoaderResult = innerLoader.load(request); + return parser.parse(objectType, objectClass, innerLoaderResult); + } + + @Override + @SuppressWarnings("unchecked") + public Object loadFromCache(final DiskCacheEntity cacheEntity) throws Throwable { + Object innerLoaderResult = innerLoader.loadFromCache(cacheEntity); + return parser.parse(objectType, objectClass, innerLoaderResult); + } + + @Override + public void save2Cache(UriRequest request) { + innerLoader.save2Cache(request); + } +} \ No newline at end of file diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/StringLoader.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/StringLoader.java new file mode 100644 index 0000000..08372e7 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/loader/StringLoader.java @@ -0,0 +1,54 @@ +package com.wordplat.quickstart.xutils.http.loader; + +import com.wordplat.quickstart.xutils.cache.DiskCacheEntity; +import com.wordplat.quickstart.xutils.common.util.IOUtil; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.http.RequestParams; +import com.wordplat.quickstart.xutils.http.request.UriRequest; + +/** + * Author: wyouflf + * Time: 2014/05/30 + * + * @since 2021-05-09 + */ +class StringLoader extends Loader { + private String charset = "UTF-8"; + private String resultStr = null; + + @Override + public Loader newInstance() { + return new StringLoader(); + } + + @Override + public void setParams(final RequestParams params) { + if (params != null) { + String charset = params.getCharset(); + if (!TextUtils.isEmpty(charset)) { + this.charset = charset; + } + } + } + + @Override + public String load(final UriRequest request) throws Throwable { + request.sendRequest(); + resultStr = IOUtil.readStr(request.getInputStream(), charset); + return resultStr; + } + + @Override + public String loadFromCache(final DiskCacheEntity cacheEntity) throws Throwable { + if (cacheEntity != null) { + return cacheEntity.getTextContent(); + } + + return null; + } + + @Override + public void save2Cache(UriRequest request) { + saveStringCache(request, resultStr); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/request/AssetsRequest.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/request/AssetsRequest.java new file mode 100644 index 0000000..8d21f54 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/request/AssetsRequest.java @@ -0,0 +1,42 @@ +package com.wordplat.quickstart.xutils.http.request; + +import com.wordplat.quickstart.xutils.http.RequestParams; + +import ohos.app.Context; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Type; + +/** + * Created by wyouflf on 15/11/4. + * Assets资源文件请求 + * + * @since 2021-05-09 + */ +public class AssetsRequest extends ResRequest { + /** + * AssetsRequest + * + * @param params + * @param loadType + * @throws Throwable + */ + public AssetsRequest(RequestParams params, Type loadType) throws Throwable { + super(params, loadType); + } + + @Override + public InputStream getInputStream() throws IOException { + if (inputStream == null) { + Context context = params.getContext(); + String assetsPath = queryUrl.replace("assets://", ""); + /** + * todo + * inputStream = context.getResources().getAssets().open(assetsPath); + */ + contentLength = inputStream.available(); + } + return inputStream; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/request/HttpRequest.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/request/HttpRequest.java new file mode 100644 index 0000000..07c280a --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/request/HttpRequest.java @@ -0,0 +1,446 @@ +package com.wordplat.quickstart.xutils.http.request; + +import com.wordplat.quickstart.xutils.cache.DiskCacheEntity; +import com.wordplat.quickstart.xutils.cache.LruDiskCache; +import com.wordplat.quickstart.xutils.common.util.IOUtil; +import com.wordplat.quickstart.xutils.common.util.KeyValue; +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.ex.HttpException; +import com.wordplat.quickstart.xutils.http.HttpMethod; +import com.wordplat.quickstart.xutils.http.RequestParams; +import com.wordplat.quickstart.xutils.http.body.ProgressBody; +import com.wordplat.quickstart.xutils.http.body.RequestBody; +import com.wordplat.quickstart.xutils.http.cookie.DbCookieStore; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLSocketFactory; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Type; +import java.net.*; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * Created by wyouflf on 15/7/23. + * Uri请求发送和数据接收 + * + * @since 2021-05-09 + */ +public class HttpRequest extends UriRequest { + private static final CookieManager COOKIE_MANAGER = + new CookieManager(DbCookieStore.INSTANCE, CookiePolicy.ACCEPT_ALL); + private String cacheKey = null; + private boolean isLoading = false; + private InputStream inputStream = null; + private HttpURLConnection connection = null; + private int responseCode = 0; + + /** + * HttpRequest + * + * @param params + * @param loadType + * @throws Throwable + */ + public HttpRequest(RequestParams params, Type loadType) throws Throwable { + super(params, loadType); + } + + // build query + @Override + protected String buildQueryUrl(RequestParams params) throws IOException { + String uri = params.getUri(); + StringBuilder queryBuilder = new StringBuilder(uri); + if (!uri.contains("?")) { + queryBuilder.append("?"); + } else if (!uri.endsWith("?")) { + queryBuilder.append("&"); + } + List queryParams = params.getQueryStringParams(); + if (queryParams != null) { + for (KeyValue kv : queryParams) { + String name = kv.key; + String value = kv.getValueStrOrNull(); + if (!TextUtils.isEmpty(name) && value != null) { + queryBuilder.append(URLEncoder.encode(name, params.getCharset()).replaceAll("\\+", "%20")) + .append("=") + .append(URLEncoder.encode(value, params.getCharset()).replaceAll("\\+", "%20")) + .append("&"); + } + } + } + + if (queryBuilder.charAt(queryBuilder.length() - 1) == '&') { + queryBuilder.deleteCharAt(queryBuilder.length() - 1); + } + + if (queryBuilder.charAt(queryBuilder.length() - 1) == '?') { + queryBuilder.deleteCharAt(queryBuilder.length() - 1); + } + return queryBuilder.toString(); + } + + @Override + public String getRequestUri() { + String result = queryUrl; + if (connection != null) { + URL url = connection.getURL(); + if (url != null) { + result = url.toString(); + } + } + return result; + } + + @Override + public void sendRequest() throws Throwable { + isLoading = false; + responseCode = 0; + + URL url = new URL(queryUrl); + + Proxy proxy = params.getProxy(); + if (proxy != null) { + connection = (HttpURLConnection) url.openConnection(proxy); + } else { + connection = (HttpURLConnection) url.openConnection(); + } + connection.setReadTimeout(params.getReadTimeout()); + connection.setConnectTimeout(params.getConnectTimeout()); + connection.setInstanceFollowRedirects(params.getRedirectHandler() == null); + if (connection instanceof HttpsURLConnection) { + SSLSocketFactory sslSocketFactory = params.getSslSocketFactory(); + if (sslSocketFactory != null) { + ((HttpsURLConnection) connection).setSSLSocketFactory(sslSocketFactory); + } + + HostnameVerifier hostnameVerifier = params.getHostnameVerifier(); + if (hostnameVerifier != null) { + ((HttpsURLConnection) connection).setHostnameVerifier(hostnameVerifier); + } + } + + if (params.isUseCookie()) { + try { + Map> singleMap = + COOKIE_MANAGER.get(url.toURI(), new HashMap>(0)); + List cookies = singleMap.get("Cookie"); + if (cookies != null) { + connection.setRequestProperty("Cookie", TextUtils.join(";", cookies)); + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + + List headers = params.getHeaders(); + if (headers != null) { + for (RequestParams.Header header : headers) { + String name = header.key; + String value = header.getValueStrOrNull(); + if (!TextUtils.isEmpty(name)) { + if (header.setHeader) { + connection.setRequestProperty(name, value); + } else { + connection.addRequestProperty(name, value); + } + } + } + } + if (responseParser != null) { + responseParser.beforeRequest(this); + } + if (requestInterceptListener != null) { + requestInterceptListener.beforeRequest(this); + } + + { // write body + HttpMethod method = params.getMethod(); + try { + connection.setRequestMethod(method.toString()); + } catch (ProtocolException ex) { + try { // fix: HttpURLConnection not support PATCH method. + Field methodField = HttpURLConnection.class.getDeclaredField("method"); + methodField.setAccessible(true); + methodField.set(connection, method.toString()); + } catch (Throwable ignored) { + throw ex; + } + } + if (HttpMethod.permitsRequestBody(method)) { + RequestBody body = params.getRequestBody(); + if (body != null) { + if (body instanceof ProgressBody) { + ((ProgressBody) body).setProgressHandler(progressHandler); + } + String contentType = body.getContentType(); + if (!TextUtils.isEmpty(contentType)) { + connection.setRequestProperty("Content-Type", contentType); + } + boolean isChunkedMode = false; + long contentLength = body.getContentLength(); + if (contentLength < 0) { + connection.setChunkedStreamingMode(256 * 1024); + isChunkedMode = true; + } else { + if (contentLength < Integer.MAX_VALUE) { + connection.setFixedLengthStreamingMode((int) contentLength); + } else { + connection.setChunkedStreamingMode(256 * 1024); + isChunkedMode = true; + } + } + + if (isChunkedMode) { + connection.setRequestProperty("Transfer-Encoding", "chunked"); + } else { + connection.setRequestProperty("Content-Length", String.valueOf(contentLength)); + } + + connection.setDoOutput(true); + body.writeTo(connection.getOutputStream()); + } + } + } + + responseCode = connection.getResponseCode(); + { + if (responseParser != null) { + responseParser.afterRequest(this); + } + if (requestInterceptListener != null) { + requestInterceptListener.afterRequest(this); + } + } + if (responseCode == 204 || responseCode == 205) { // empty content + throw new HttpException(responseCode, this.getResponseMessage()); + } else if (responseCode >= 300) { + HttpException httpException = new HttpException(responseCode, this.getResponseMessage()); + try { + httpException.setResult(IOUtil.readStr(this.getInputStream(), params.getCharset())); + } catch (Throwable ex) { + LogUtil.w(ex.getMessage(), ex); + } + LogUtil.e(httpException.toString() + ", url: " + queryUrl); + throw httpException; + } + + isLoading = true; + } + + @Override + public boolean isLoading() { + return isLoading; + } + + @Override + public String getCacheKey() { + if (cacheKey == null) { + cacheKey = params.getCacheKey(); + + if (TextUtils.isEmpty(cacheKey)) { + cacheKey = params.toString(); + } + } + return cacheKey; + } + + @Override + public Object loadResult() throws Throwable { + isLoading = true; + return super.loadResult(); + } + + @Override + public Object loadResultFromCache() throws Throwable { + isLoading = true; + DiskCacheEntity cacheEntity = LruDiskCache.getDiskCache(params.getCacheDirName()) + .setMaxSize(params.getCacheSize()) + .get(this.getCacheKey()); + + if (cacheEntity != null) { + if (HttpMethod.permitsCache(params.getMethod())) { + Date lastModified = cacheEntity.getLastModify(); + if (lastModified.getTime() > 0) { + params.setHeader("If-Modified-Since", toGMTString(lastModified)); + } + String eTag = cacheEntity.getEtag(); + if (!TextUtils.isEmpty(eTag)) { + params.setHeader("If-None-Match", eTag); + } + } + return loader.loadFromCache(cacheEntity); + } else { + return null; + } + } + + @Override + public void clearCacheHeader() { + params.setHeader("If-Modified-Since", null); + params.setHeader("If-None-Match", null); + } + + @Override + public InputStream getInputStream() throws IOException { + if (connection != null && inputStream == null) { + inputStream = connection.getResponseCode() >= 400 + ? connection.getErrorStream() : connection.getInputStream(); + } + return inputStream; + } + + @Override + public void close() throws IOException { + if (inputStream != null) { + IOUtil.closeQuietly(inputStream); + inputStream = null; + } + if (connection != null) { + connection.disconnect(); + /** + * connection = null; + */ + } + } + + @Override + public long getContentLength() { + long result = -1; + if (connection != null) { + try { + String value = connection.getHeaderField("content-length"); + if (value != null) { + result = Long.parseLong(value); + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + if (result < 1) { + try { + result = this.getInputStream().available(); + } catch (Throwable ignored) { + String ss = ignored.toString(); + } + } + return result; + } + + @Override + public int getResponseCode() throws IOException { + if (connection != null) { + return responseCode; + } else { + if (this.getInputStream() != null) { + return 200; + } else { + return 404; + } + } + } + + @Override + public String getResponseMessage() throws IOException { + if (connection != null) { + return URLDecoder.decode(connection.getResponseMessage(), params.getCharset()); + } else { + return null; + } + } + + @Override + public long getExpiration() { + if (connection == null) { + return -1L; + } + + long expiration = -1L; + + String cacheControl = connection.getHeaderField("Cache-Control"); + if (!TextUtils.isEmpty(cacheControl)) { + StringTokenizer tok = new StringTokenizer(cacheControl, ","); + while (tok.hasMoreTokens()) { + String token = tok.nextToken().trim().toLowerCase(); + if (token.startsWith("max-age")) { + int eqIdx = token.indexOf('='); + if (eqIdx > 0) { + try { + String value = token.substring(eqIdx + 1).trim(); + long seconds = Long.parseLong(value); + if (seconds > 0L) { + expiration = System.currentTimeMillis() + seconds * 1000L; + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + break; + } + } + } + + // from expires + if (expiration <= 0L) { + expiration = connection.getExpiration(); + } + + if (expiration <= 0L && params.getCacheMaxAge() > 0L) { + expiration = System.currentTimeMillis() + params.getCacheMaxAge(); + } + + if (expiration <= 0L) { + expiration = Long.MAX_VALUE; + } + return expiration; + } + + @Override + public long getLastModified() { + return getHeaderFieldDate("Last-Modified", System.currentTimeMillis()); + } + + @Override + public String getETag() { + if (connection == null) { + return null; + } + return connection.getHeaderField("ETag"); + } + + @Override + public String getResponseHeader(String name) { + if (connection == null) { + return null; + } + return connection.getHeaderField(name); + } + + @Override + public Map> getResponseHeaders() { + if (connection == null) { + return null; + } + return connection.getHeaderFields(); + } + + @Override + public long getHeaderFieldDate(String name, long defaultValue) { + if (connection == null) { + return defaultValue; + } + return connection.getHeaderFieldDate(name, defaultValue); + } + + private static String toGMTString(Date date) { + SimpleDateFormat sdf = new SimpleDateFormat( + "EEE, dd MMM y HH:mm:ss 'GMT'", Locale.US); + TimeZone gmtZone = TimeZone.getTimeZone("GMT"); + sdf.setTimeZone(gmtZone); + return sdf.format(date); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/request/LocalFileRequest.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/request/LocalFileRequest.java new file mode 100644 index 0000000..48860cd --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/request/LocalFileRequest.java @@ -0,0 +1,141 @@ +package com.wordplat.quickstart.xutils.http.request; + +import com.wordplat.quickstart.xutils.common.util.IOUtil; +import com.wordplat.quickstart.xutils.http.RequestParams; +import com.wordplat.quickstart.xutils.http.loader.FileLoader; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Type; +import java.util.List; +import java.util.Map; + +/** + * Created by wyouflf on 15/11/4. + * 本地文件请求 + * + * @since 2021-05-09 + */ +public class LocalFileRequest extends UriRequest { + private InputStream inputStream; + + /** + * LocalFileRequest + * + * @param params + * @param loadType + * @throws Throwable + */ + public LocalFileRequest(RequestParams params, Type loadType) throws Throwable { + super(params, loadType); + } + + @Override + public void sendRequest() throws Throwable { + + } + + @Override + public boolean isLoading() { + return true; + } + + @Override + public String getCacheKey() { + return queryUrl; + } + + @Override + public Object loadResult() throws Throwable { + if (loader instanceof FileLoader) { + return getFile(); + } + return this.loader.load(this); + } + + @Override + public Object loadResultFromCache() throws Throwable { + return null; + } + + @Override + public void clearCacheHeader() { + + } + + @Override + public void save2Cache() { + + } + + private File getFile() { + String filePath = null; + if (queryUrl.startsWith("file:")) { + filePath = queryUrl.substring("file:".length()); + } else { + filePath = queryUrl; + } + return new File(filePath); + } + + @Override + public InputStream getInputStream() throws IOException { + if (inputStream == null) { + inputStream = new FileInputStream(getFile()); + } + return inputStream; + } + + @Override + public void close() throws IOException { + IOUtil.closeQuietly(inputStream); + inputStream = null; + } + + @Override + public long getContentLength() { + return getFile().length(); + } + + @Override + public int getResponseCode() throws IOException { + return getFile().exists() ? 200 : 404; + } + + @Override + public String getResponseMessage() throws IOException { + return null; + } + + @Override + public long getExpiration() { + return -1; + } + + @Override + public long getLastModified() { + return getFile().lastModified(); + } + + @Override + public String getETag() { + return null; + } + + @Override + public String getResponseHeader(String name) { + return null; + } + + @Override + public Map> getResponseHeaders() { + return null; + } + + @Override + public long getHeaderFieldDate(String name, long defaultValue) { + return defaultValue; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/request/ResRequest.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/request/ResRequest.java new file mode 100644 index 0000000..bcaa25b --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/request/ResRequest.java @@ -0,0 +1,184 @@ +package com.wordplat.quickstart.xutils.http.request; + +import com.wordplat.quickstart.xutils.cache.DiskCacheEntity; +import com.wordplat.quickstart.xutils.cache.LruDiskCache; +import com.wordplat.quickstart.xutils.common.util.IOUtil; +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.http.RequestParams; +import com.wordplat.quickstart.xutils.x; + +import ohos.app.Context; +import ohos.bundle.ApplicationInfo; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Type; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * Created by wyouflf on 15/11/4. + * 本地资源请求 + * + * @since 2021-05-09 + */ +public class ResRequest extends UriRequest { + private static long lastModifiedTime = 0; + protected long contentLength = 0; + protected InputStream inputStream; + + /** + * ResRequest + * + * @param params + * @param loadType + * @throws Throwable + */ + public ResRequest(RequestParams params, Type loadType) throws Throwable { + super(params, loadType); + } + + @Override + public void sendRequest() throws Throwable { + } + + @Override + public boolean isLoading() { + return true; + } + + @Override + public String getCacheKey() { + return queryUrl; + } + + @Override + public Object loadResult() throws Throwable { + return this.loader.load(this); + } + + @Override + public Object loadResultFromCache() throws Throwable { + DiskCacheEntity cacheEntity = LruDiskCache.getDiskCache(params.getCacheDirName()) + .setMaxSize(params.getCacheSize()) + .get(this.getCacheKey()); + + if (cacheEntity != null) { + Date lastModifiedDate = cacheEntity.getLastModify(); + if (lastModifiedDate == null || lastModifiedDate.getTime() < getLastModified()) { + return null; + } + return loader.loadFromCache(cacheEntity); + } else { + return null; + } + } + + @Override + public void clearCacheHeader() { + } + + private int getResId() { + int resId = 0; + String resIdStr = queryUrl.substring("res:".length()); + resIdStr = resIdStr.replace("/", ""); + if (TextUtils.isDigitsOnly(resIdStr)) { + resId = Integer.parseInt(resIdStr); + } + + if (resId <= 0) { + throw new IllegalArgumentException("resId not found in url:" + queryUrl); + } + + return resId; + } + + @Override + public InputStream getInputStream() throws IOException { + if (inputStream == null) { + Context context = params.getContext(); + /** + * todo + * inputStream = context.getResources().openRawResource(getResId()); + */ + contentLength = inputStream.available(); + } + return inputStream; + } + + @Override + public void close() throws IOException { + IOUtil.closeQuietly(inputStream); + inputStream = null; + } + + @Override + public long getContentLength() { + try { + getInputStream(); + return contentLength; + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + return -1; + } + + @Override + public int getResponseCode() throws IOException { + return getInputStream() != null ? 200 : 404; + } + + @Override + public String getResponseMessage() throws IOException { + return null; + } + + @Override + public long getExpiration() { + return Long.MAX_VALUE; + } + + @Override + public long getLastModified() { + if (lastModifiedTime == 0) { + try { + Context context = params.getContext(); + File appFile = new File(x.app().getFilesDir().getPath()); + if (appFile.exists()) { + lastModifiedTime = appFile.lastModified(); + } + } catch (Throwable ex) { + LogUtil.w(ex.getMessage(), ex); + lastModifiedTime = 0; + } finally { + if (lastModifiedTime == 0) { + lastModifiedTime = System.currentTimeMillis(); + } + } + } + return lastModifiedTime; + } + + @Override + public String getETag() { + return null; + } + + @Override + public String getResponseHeader(String name) { + return null; + } + + @Override + public Map> getResponseHeaders() { + return null; + } + + @Override + public long getHeaderFieldDate(String name, long defaultValue) { + return defaultValue; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/request/UriRequest.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/request/UriRequest.java new file mode 100644 index 0000000..75be74a --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/request/UriRequest.java @@ -0,0 +1,228 @@ +package com.wordplat.quickstart.xutils.http.request; + +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.http.ProgressHandler; +import com.wordplat.quickstart.xutils.http.RequestParams; +import com.wordplat.quickstart.xutils.http.app.RequestInterceptListener; +import com.wordplat.quickstart.xutils.http.app.ResponseParser; +import com.wordplat.quickstart.xutils.http.loader.Loader; +import com.wordplat.quickstart.xutils.http.loader.LoaderFactory; +import com.wordplat.quickstart.xutils.x; + +import java.io.Closeable; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Type; +import java.util.List; +import java.util.Map; + +/** + * Created by wyouflf on 15/7/23. + * Uri请求发送和数据接收 + * + * @since 2021-05-09 + */ +public abstract class UriRequest implements Closeable { + protected final String queryUrl; + protected final RequestParams params; + protected final Loader loader; + + protected ProgressHandler progressHandler = null; + protected ResponseParser responseParser = null; + protected RequestInterceptListener requestInterceptListener = null; + + /** + * UriRequest + * + * @param params + * @param loadType + * @throws Throwable + */ + public UriRequest(RequestParams params, Type loadType) throws Throwable { + this.params = params; + this.queryUrl = buildQueryUrl(params); + this.loader = LoaderFactory.getLoader(loadType); + this.loader.setParams(params); + } + + /** + * // build query + * + * @param params + * @return String + * @throws IOException + */ + protected String buildQueryUrl(RequestParams params) throws IOException { + return params.getUri(); + } + + /** + * setProgressHandler + * + * @param progressHandler + */ + public void setProgressHandler(ProgressHandler progressHandler) { + this.progressHandler = progressHandler; + this.loader.setProgressHandler(progressHandler); + } + + public void setResponseParser(ResponseParser responseParser) { + this.responseParser = responseParser; + } + + public void setRequestInterceptListener(RequestInterceptListener requestInterceptListener) { + this.requestInterceptListener = requestInterceptListener; + } + + public RequestParams getParams() { + return params; + } + + public String getRequestUri() { + return queryUrl; + } + + /** + * sendRequest + * + * @throws Throwable + */ + public abstract void sendRequest() throws Throwable; + + /** + * isLoading + * + * @return boolean + */ + public abstract boolean isLoading(); + + /** + * getCacheKey + * + * @return String + */ + public abstract String getCacheKey(); + + /** + * loadResult + * + * @return loadResult + * @throws Throwable + */ + public Object loadResult() throws Throwable { + return this.loader.load(this); + } + + /** + * loadResultFromCache + * + * @return Object + * @throws Throwable + */ + public abstract Object loadResultFromCache() throws Throwable; + + /** + * clearCacheHeader + */ + public abstract void clearCacheHeader(); + + /** + * save2Cache + */ + public void save2Cache() { + x.task().run(new Runnable() { + @Override + public void run() { + try { + loader.save2Cache(UriRequest.this); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + }); + } + + /** + * getInputStream + * + * @return InputStream + * @throws IOException + */ + public abstract InputStream getInputStream() throws IOException; + + @Override + public abstract void close() throws IOException; + + /** + * getContentLength + * + * @return long + */ + public abstract long getContentLength(); + + /** + * getResponseCode + * + * @return int + * @throws IOException + */ + public abstract int getResponseCode() throws IOException; + + /** + * getResponseMessage + * + * @return String + * @throws IOException + */ + public abstract String getResponseMessage() throws IOException; + + /** + * getExpiration + * + * @return long + */ + public abstract long getExpiration(); + + /** + * getLastModified + * + * @return long + */ + public abstract long getLastModified(); + + /** + * getETag + * + * @return String + */ + public abstract String getETag(); + + /** + * getResponseHeader + * + * @param name + * @return String + */ + public abstract String getResponseHeader(String name); + + /** + * getResponseHeaders + * + * @return Map + */ + public abstract Map> getResponseHeaders(); + + /** + * getHeaderFieldDate + * + * @param name + * @param defaultValue + * @return long + */ + public abstract long getHeaderFieldDate(String name, long defaultValue); + + @Override + public String toString() { + return getRequestUri(); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/http/request/UriRequestFactory.java b/entry/src/main/java/com/wordplat/quickstart/xutils/http/request/UriRequestFactory.java new file mode 100644 index 0000000..2cee02c --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/http/request/UriRequestFactory.java @@ -0,0 +1,104 @@ +package com.wordplat.quickstart.xutils.http.request; + +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.http.RequestParams; +import com.wordplat.quickstart.xutils.http.app.RequestTracker; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Type; +import java.util.HashMap; + +/** + * Created by wyouflf on 15/11/4. + * Uri请求创建工厂 + * + * @since 2021-05-09 + */ +public final class UriRequestFactory { + private static Class defaultTrackerCls; + + private static final HashMap> + SCHEME_CLS_MAP = new HashMap>(); + + private UriRequestFactory() { + } + + /** + * getUriRequest + * + * @param params + * @param loadType + * @return UriRequest + * @throws Throwable + * @throws IllegalArgumentException + */ + public static UriRequest getUriRequest(RequestParams params, Type loadType) throws Throwable { + + String scheme = null; + String uri = params.getUri(); + int index = uri.indexOf(":"); + if (uri.startsWith("/")) { + scheme = "file"; + } else if (index > 0) { + scheme = uri.substring(0, index); + } + + if (!TextUtils.isEmpty(scheme)) { + scheme = scheme.toLowerCase(); + Class cls = SCHEME_CLS_MAP.get(scheme); + if (cls != null) { + Constructor constructor + = cls.getConstructor(RequestParams.class, Type.class); + return constructor.newInstance(params, loadType); + } else { + if (scheme.startsWith("http")) { + return new HttpRequest(params, loadType); + } else if (scheme.equals("assets")) { + return new AssetsRequest(params, loadType); + } else if (scheme.equals("file")) { + return new LocalFileRequest(params, loadType); + } else if (scheme.equals("res")) { + return new ResRequest(params, loadType); + } else { + throw new IllegalArgumentException("The url not be support: " + uri); + } + } + } else { + throw new IllegalArgumentException("The url not be support: " + uri); + } + } + + /** + * registerDefaultTrackerClass + * + * @param trackerCls + */ + public static void registerDefaultTrackerClass(Class trackerCls) { + UriRequestFactory.defaultTrackerCls = trackerCls; + } + + /** + * getDefaultTracker + * + * @return RequestTracker + */ + public static RequestTracker getDefaultTracker() { + try { + return defaultTrackerCls == null ? null : defaultTrackerCls.newInstance(); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + return null; + } + + /** + * registerRequestClass + * + * @param scheme + * @param uriRequestCls + */ + public static void registerRequestClass(String scheme, Class uriRequestCls) { + SCHEME_CLS_MAP.put(scheme, uriRequestCls); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageAnimationHelper.java b/entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageAnimationHelper.java new file mode 100644 index 0000000..0abf2bb --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageAnimationHelper.java @@ -0,0 +1,52 @@ +package com.wordplat.quickstart.xutils.image; + +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import ohos.agp.animation.Animator; +import ohos.agp.components.Image; +import ohos.media.image.PixelMap; + +import java.lang.reflect.Method; + +/** + * Created by wyouflf on 15/10/13. + * ImageView Animation Helper + * + * @since 2021-05-09 + */ +public final class ImageAnimationHelper { + private static final Method cloneMethod; + + static { + Method method = null; + try { + method = Animator.class.getDeclaredMethod("clone"); + method.setAccessible(true); + } catch (Throwable ex) { + method = null; + LogUtil.w(ex.getMessage(), ex); + } + cloneMethod = method; + } + + private ImageAnimationHelper() { + } + + /** + * fadeInDisplay + * + * @param imageView + * @param drawable + */ + public static void fadeInDisplay(final Image imageView, PixelMap drawable) { + } + + /** + * animationDisplay + * + * @param imageView + * @param drawable + * @param animation + */ + public static void animationDisplay(Image imageView, PixelMap drawable, Animator animation) { + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageDecoder.java b/entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageDecoder.java new file mode 100644 index 0000000..e00881a --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageDecoder.java @@ -0,0 +1,231 @@ +package com.wordplat.quickstart.xutils.image; + +import com.wordplat.quickstart.xutils.cache.DiskCacheEntity; +import com.wordplat.quickstart.xutils.cache.DiskCacheFile; +import com.wordplat.quickstart.xutils.cache.LruDiskCache; +import com.wordplat.quickstart.xutils.common.Callback; +import com.wordplat.quickstart.xutils.common.task.PriorityExecutor; +import com.wordplat.quickstart.xutils.common.util.IOUtil; +import com.wordplat.quickstart.xutils.common.util.LogUtil; + +import ohos.media.image.ImageSource; +import ohos.media.image.PixelMap; +import ohos.media.image.common.ColorSpace; + +import java.io.*; +import java.util.Arrays; +import java.util.concurrent.Executor; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Created by wyouflf on 15/10/9. + * ImageDecoder for ImageLoader + */ +public final class ImageDecoder { + private static final int BITMAP_DECODE_MAX_WORKER; + private static final AtomicInteger bitmapDecodeWorker = new AtomicInteger(0); + private static final Object bitmapDecodeLock = new Object(); + + private static final Object gifDecodeLock = new Object(); + private static final byte[] GIF_HEADER = new byte[]{'G', 'I', 'F'}; + + private static final Executor THUMB_CACHE_EXECUTOR = new PriorityExecutor(1, true); + private static final LruDiskCache THUMB_CACHE = LruDiskCache.getDiskCache("xUtils_img_thumb"); + + static { + int cpuCount = Runtime.getRuntime().availableProcessors(); + BITMAP_DECODE_MAX_WORKER = cpuCount > 4 ? 2 : 1; + } + + private ImageDecoder() { + } + + static void clearCacheFiles() { + THUMB_CACHE.clearCacheFiles(); + } + + static PixelMap decodeFileWithLock(final File file, + final ImageOptions options, + final Callback.Cancelable cancelable) throws IOException { + if (file == null || !file.exists() || file.length() < 1) { + return null; + } + if (cancelable != null && cancelable.isCancelled()) { + throw new Callback.CancelledException("cancelled during decode image"); + } + + PixelMap result = null; + PixelMap bitmap = null; + boolean decodeStarted = false; + try { + synchronized (bitmapDecodeLock) { + while (bitmapDecodeWorker.get() >= BITMAP_DECODE_MAX_WORKER + && (cancelable == null || !cancelable.isCancelled())) { + try { + bitmapDecodeLock.wait(); + } catch (InterruptedException iex) { + throw new Callback.CancelledException("cancelled during decode image"); + } catch (Throwable ignored) { + String ss = ignored.toString(); + } + } + } + + if (cancelable != null && cancelable.isCancelled()) { + throw new Callback.CancelledException("cancelled during decode image"); + } + + decodeStarted = true; + bitmapDecodeWorker.incrementAndGet(); + if (options.isCompress()) { + bitmap = getThumbCache(file, options); + } + if (bitmap == null) { + bitmap = decodeBitmap(file, options, cancelable); + if (bitmap != null && options.isCompress()) { + final PixelMap finalBitmap = bitmap; + THUMB_CACHE_EXECUTOR.execute(new Runnable() { + @Override + public void run() { + saveThumbCache(file, options, finalBitmap); + } + }); + } + } + } finally { + if (decodeStarted) { + bitmapDecodeWorker.decrementAndGet(); + } + synchronized (bitmapDecodeLock) { + bitmapDecodeLock.notifyAll(); + } + } + if (bitmap != null) { + result = bitmap; + } + + return result; + } + + /** + * isGif + * + * @param file + * @return boolean + */ + public static boolean isGif(File file) { + FileInputStream in = null; + try { + in = new FileInputStream(file); + byte[] header = IOUtil.readBytes(in, 0, 3); + return Arrays.equals(GIF_HEADER, header); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } finally { + IOUtil.closeQuietly(in); + } + + return false; + } + + /** + * decodeBitmap + * + * @param file + * @param options + * @param cancelable + * @return PixelMap + * @throws IOException + */ + public static PixelMap decodeBitmap(File file, ImageOptions options, Callback.Cancelable cancelable) throws IOException { + ImageSource.SourceOptions sourceOptions = new ImageSource.SourceOptions(); + ImageSource imageSource = ImageSource.create(file, sourceOptions); + ImageSource.DecodingOptions decodingOptions = new ImageSource.DecodingOptions(); + decodingOptions.sampleSize = calculateSampleSize( + imageSource.getImageInfo().size.width, imageSource.getImageInfo().size.height, + options.getMaxWidth(), options.getMaxHeight()); + return imageSource.createPixelmap(decodingOptions); + } + + /** + * 计算压缩采样倍数 + * + * @param rawWidth 图片宽度 + * @param rawHeight 图片高度 + * @param maxWidth 最大宽度 + * @param maxHeight 最大高度 + * @return 压缩采样倍数 + */ + public static int calculateSampleSize(final int rawWidth, final int rawHeight, + final int maxWidth, final int maxHeight) { + int sampleSize = 1; + + if (rawWidth > maxWidth || rawHeight > maxHeight) { + if (rawWidth > rawHeight) { + sampleSize = Math.round((float) rawHeight / (float) maxHeight); + } else { + sampleSize = Math.round((float) rawWidth / (float) maxWidth); + } + + if (sampleSize < 1) { + sampleSize = 1; + } + + final float totalPixels = rawWidth * rawHeight; + + final float maxTotalPixels = maxWidth * maxHeight * 2; + + while (totalPixels / (sampleSize * sampleSize) > maxTotalPixels) { + sampleSize++; + } + } + return sampleSize; + } + + private static void saveThumbCache(File file, ImageOptions options, PixelMap thumbBitmap) { + DiskCacheEntity entity = new DiskCacheEntity(); + try { + entity.setKey( + file.getCanonicalPath() + "@" + file.lastModified() + options.toString()); + } catch (IOException e) { + String ee = e.toString(); + } + DiskCacheFile cacheFile = null; + OutputStream out = null; + try { + cacheFile = THUMB_CACHE.createDiskCacheFile(entity); + if (cacheFile != null) { + out = new FileOutputStream(cacheFile); + out.flush(); + cacheFile = cacheFile.commit(); + } + } catch (Throwable ex) { + IOUtil.deleteFileOrDir(cacheFile); + LogUtil.w(ex.getMessage(), ex); + } finally { + IOUtil.closeQuietly(cacheFile); + IOUtil.closeQuietly(out); + } + } + + private static PixelMap getThumbCache(File file, ImageOptions options) { + DiskCacheFile cacheFile = null; + try { + cacheFile = THUMB_CACHE.getDiskCacheFile( + file.getCanonicalPath() + "@" + file.lastModified() + options.toString()); + if (cacheFile != null && cacheFile.exists()) { + + ImageSource.SourceOptions sourceOptions = new ImageSource.SourceOptions(); + ImageSource imageSource = ImageSource.create(file, sourceOptions); + ImageSource.DecodingOptions decodingOptions = new ImageSource.DecodingOptions(); + decodingOptions.desiredColorSpace = ColorSpace.ADOBE_RGB_1998; + return imageSource.createPixelmap(decodingOptions); + } + } catch (Throwable ex) { + LogUtil.w(ex.getMessage(), ex); + } finally { + IOUtil.closeQuietly(cacheFile); + } + return null; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageLoader.java b/entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageLoader.java new file mode 100644 index 0000000..afad962 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageLoader.java @@ -0,0 +1,580 @@ +package com.wordplat.quickstart.xutils.image; + +import com.wordplat.quickstart.xutils.cache.LruCache; +import com.wordplat.quickstart.xutils.cache.LruDiskCache; +import com.wordplat.quickstart.xutils.common.Callback; +import com.wordplat.quickstart.xutils.common.task.Priority; +import com.wordplat.quickstart.xutils.common.task.PriorityExecutor; +import com.wordplat.quickstart.xutils.common.util.IOUtil; +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.ex.FileLockedException; +import com.wordplat.quickstart.xutils.http.RequestParams; +import com.wordplat.quickstart.xutils.x; + +import ohos.agp.components.Image; +import ohos.agp.components.element.Element; +import ohos.app.Context; +import ohos.media.image.PixelMap; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.lang.ref.WeakReference; +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.concurrent.Executor; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; + +/** + * Created by wyouflf on 15/10/9. + * 图片加载控制 + */ +final class ImageLoader implements + Callback.PrepareCallback, + Callback.CacheCallback, + Callback.ProgressCallback, + Callback.TypedCallback, + Callback.Cancelable { + private static final AtomicInteger hashCodeSeed = new AtomicInteger(0); + private static final Type loadType = File.class; + private static final HashMap FAKE_IMG_MAP = new HashMap(); + private static final AtomicLong SEQ_SEEK = new AtomicLong(0); + private static final String DISK_CACHE_DIR_NAME = "xUtils_img"; + private static final Executor EXECUTOR = new PriorityExecutor(10, false); + private static final int MEM_CACHE_MIN_SIZE = 1024 * 1024 * 4; // 4M + private static final LruCache MEM_CACHE = + new LruCache(MEM_CACHE_MIN_SIZE) { + private boolean deepClear = false; + + @Override + protected int sizeOf(MemCacheKey key, PixelMap value) { + if (value instanceof PixelMap) { + PixelMap bitmap = value; + return bitmap == null ? 0 : bitmap.getBaseDensity(); + } + return super.sizeOf(key, value); + } + + @Override + public void trimToSize(int maxSize) { + if (maxSize < 0) { + deepClear = true; + } + super.trimToSize(maxSize); + deepClear = false; + } + + @Override + protected void entryRemoved(boolean evicted, MemCacheKey key, PixelMap oldValue, PixelMap newValue) { + super.entryRemoved(evicted, key, oldValue, newValue); + if (evicted && deepClear && oldValue instanceof ReusableDrawable) { + ((ReusableDrawable) oldValue).setMemCacheKey(null); + } + } + }; + private MemCacheKey key; + private ImageOptions options; + private WeakReference viewRef; + private int fileLockedExceptionRetryCount = 0; + private boolean hasCache = false; + + private final long seq = SEQ_SEEK.incrementAndGet(); + + private volatile boolean stopped = false; + private volatile boolean cancelled = false; + private volatile boolean skipOnWaitingCallback = false; + private volatile boolean skipOnFinishedCallback = false; + private Callback.Cancelable httpCancelable; + private Callback.CommonCallback callback; + private Callback.PrepareCallback prepareCallback; + private Callback.CacheCallback cacheCallback; + private Callback.ProgressCallback progressCallback; + + static { + int memClass = 1024 * 1024 * 1024; + + // Use 1/8th of the available memory for this memory cache. + int cacheSize = 1024 * 1024 * memClass / 8; + if (cacheSize < MEM_CACHE_MIN_SIZE) { + cacheSize = MEM_CACHE_MIN_SIZE; + } + MEM_CACHE.resize(cacheSize); + } + + private ImageLoader() { + } + + static void clearMemCache() { + MEM_CACHE.evictAll(); + } + + static void clearCacheFiles() { + LruDiskCache.getDiskCache(DISK_CACHE_DIR_NAME).clearCacheFiles(); + } + + /** + * load from Network or DiskCache, invoke in any thread. + */ + static Cancelable doLoadDrawable(final String url, + final ImageOptions options, + final Callback.CommonCallback callback) { + if (TextUtils.isEmpty(url)) { + postArgsException(null, options, "url is null", callback); + return null; + } + + FakeImageView fakeImageView = new FakeImageView(); + return doBind(fakeImageView, url, options, 0, callback); + } + + /** + * load from Network or DiskCache, invoke in any thread. + */ + /*package*/ + static Cancelable doLoadFile(final String url, + final ImageOptions options, + final Callback.CacheCallback callback) { + if (TextUtils.isEmpty(url)) { + postArgsException(null, options, "url is null", callback); + return null; + } + + RequestParams params = createRequestParams(null, url, options); + return x.http().get(params, callback); + } + + /** + * load from Network or DiskCache, invoke in ui thread. + */ + static Cancelable doBind(final Image view, + final String url, + final ImageOptions options, + final int fileLockedExceptionRetryCount, + final Callback.CommonCallback callback) { + ImageOptions localOptions = options; + if (view == null) { + postArgsException(null, localOptions, "view is null", callback); + return null; + } + + if (TextUtils.isEmpty(url)) { + postArgsException(view, localOptions, "url is null", callback); + return null; + } + + if (localOptions == null) { + localOptions = ImageOptions.DEFAULT; + } + localOptions.optimizeMaxSize(view); + MemCacheKey key = new MemCacheKey(url, localOptions); + PixelMap memDrawable = null; + if (localOptions.isUseMemCache()) { + memDrawable = MEM_CACHE.get(key); + if (memDrawable instanceof PixelMap) { + PixelMap bitmap = memDrawable; + if (bitmap == null || bitmap.isReleased()) { + memDrawable = null; + } + } + } + if (memDrawable != null) { // has mem cache + boolean trustMemCache = false; + try { + if (callback instanceof ProgressCallback) { + try { + ((ProgressCallback) callback).onWaiting(); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + + if (callback instanceof CacheCallback) { + try { + // 是否信任内存缓存. onStart 之后再次调用 onCache 时, 入参是磁盘缓存. + trustMemCache = ((CacheCallback) callback).onCache(memDrawable); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } else { + trustMemCache = true; + } + + // hit mem cache + if (trustMemCache) { + view.setScaleMode(localOptions.getImageScaleType()); + view.setPixelMap(memDrawable); + if (callback != null) { + try { + callback.onSuccess(memDrawable); + } catch (Throwable ex) { + callback.onError(ex, true); + } + } + } else { + ImageLoader loader = new ImageLoader(); + loader.fileLockedExceptionRetryCount = fileLockedExceptionRetryCount; + loader.skipOnWaitingCallback = true; + return loader.doLoadRequest(view, url, localOptions, callback); + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + trustMemCache = false; + ImageLoader loader = new ImageLoader(); + loader.fileLockedExceptionRetryCount = fileLockedExceptionRetryCount; + loader.skipOnWaitingCallback = true; + return loader.doLoadRequest(view, url, localOptions, callback); + } finally { + if (trustMemCache && callback != null) { + try { + callback.onFinished(); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + } + } else { + ImageLoader loader = new ImageLoader(); + loader.fileLockedExceptionRetryCount = fileLockedExceptionRetryCount; + return loader.doLoadRequest(view, url, localOptions, callback); + } + return null; + } + + private Cancelable doLoadRequest(Image view, + String url, + ImageOptions options, + Callback.CommonCallback callback) { + this.viewRef = new WeakReference(view); + this.options = options; + this.key = new MemCacheKey(url, options); + this.callback = callback; + if (callback instanceof Callback.ProgressCallback) { + this.progressCallback = (Callback.ProgressCallback) callback; + } + if (callback instanceof Callback.PrepareCallback) { + this.prepareCallback = (Callback.PrepareCallback) callback; + } + if (callback instanceof Callback.CacheCallback) { + this.cacheCallback = (Callback.CacheCallback) callback; + } + RequestParams params = createRequestParams(view.getContext(), url, options); + if (view instanceof FakeImageView) { + synchronized (FAKE_IMG_MAP) { + FAKE_IMG_MAP.put(view.hashCode() + url, (FakeImageView) view); + } + } + return httpCancelable = x.http().get(params, this); + } + + @Override + public void cancel() { + stopped = true; + cancelled = true; + if (httpCancelable != null) { + httpCancelable.cancel(); + } + } + + @Override + public boolean isCancelled() { + return cancelled || !validView4Callback(false); + } + + @Override + public void onWaiting() { + if (!skipOnWaitingCallback && progressCallback != null) { + progressCallback.onWaiting(); + } + } + + @Override + public void onStarted() { + if (validView4Callback(true) && progressCallback != null) { + progressCallback.onStarted(); + } + } + + @Override + public void onLoading(long total, long current, boolean isDownloading) { + if (validView4Callback(true) && progressCallback != null) { + progressCallback.onLoading(total, current, isDownloading); + } + } + + @Override + public Type getLoadType() { + return loadType; + } + + @Override + public PixelMap prepare(File rawData) throws Throwable { + if (!validView4Callback(true)) { + return null; + } + + if (!rawData.exists()) { + throw new FileNotFoundException(rawData.getCanonicalPath()); + } + + try { + PixelMap result = null; + if (prepareCallback != null) { + result = prepareCallback.prepare(rawData); + } + if (result == null) { + result = ImageDecoder.decodeFileWithLock(rawData, options, this); + } + if (result != null) { + if (result instanceof ReusableDrawable) { + ((ReusableDrawable) result).setMemCacheKey(key); + MEM_CACHE.put(key, result); + } + } + return result; + } catch (IOException ex) { + IOUtil.deleteFileOrDir(rawData); + throw ex; + } + } + + @Override + public boolean onCache(PixelMap result) { + if (!validView4Callback(true)) { + return false; + } + + if (result != null) { + hasCache = true; + setSuccessDrawable4Callback(result); + if (cacheCallback != null) { + return cacheCallback.onCache(result); + } else if (callback != null) { + callback.onSuccess(result); + return true; + } + return true; + } + + return false; + } + + @Override + public void onSuccess(PixelMap result) { + if (!validView4Callback(!hasCache)) { + return; + } + + if (result != null) { + setSuccessDrawable4Callback(result); + if (callback != null) { + callback.onSuccess(result); + LogUtil.e("图片请求成功success==" + result); + viewRef.get().getContext().getUITaskDispatcher().asyncDispatch(new Runnable() { + @Override + public void run() { + viewRef.get().setPixelMap(result); + } + }); + } + } + } + + @Override + public void onError(Throwable ex, boolean isOnCallback) { + stopped = true; + if (!validView4Callback(false)) { + return; + } + + fileLockedExceptionRetryCount++; + if (ex instanceof FileLockedException && fileLockedExceptionRetryCount < 1000/*max*/) { + LogUtil.d("ImageFileLocked: " + key.url); + x.task().postDelayed(new Runnable() { + @Override + public void run() { + Image imageView = viewRef.get(); + if (imageView != null) { + doBind(imageView, key.url, options, fileLockedExceptionRetryCount, callback); + } else { + ImageLoader.this.onFinished(); + } + } + }, 10); + skipOnFinishedCallback = true; + } else { + LogUtil.e(key.url, ex); + setErrorDrawable4Callback(); + if (callback != null) { + callback.onError(ex, isOnCallback); + } + } + } + + @Override + public void onCancelled(CancelledException cex) { + stopped = true; + if (!validView4Callback(false)) { + return; + } + if (callback != null) { + callback.onCancelled(cex); + } + } + + @Override + public void onFinished() { + stopped = true; + if (skipOnFinishedCallback) { + return; + } + + Image view = viewRef.get(); + if (view instanceof FakeImageView) { + synchronized (FAKE_IMG_MAP) { + FAKE_IMG_MAP.remove(view.hashCode() + key.url); + } + } + + if (callback != null) { + callback.onFinished(); + } + } + + private static RequestParams createRequestParams(Context context, String url, ImageOptions options) { + RequestParams params = new RequestParams(url); + if (context != null) { + params.setContext(context); + } + params.setCacheDirName(DISK_CACHE_DIR_NAME); + params.setConnectTimeout(1000 * 8); + params.setPriority(Priority.BG_LOW); + params.setExecutor(EXECUTOR); + params.setCancelFast(true); + params.setUseCookie(false); + if (options != null) { + ImageOptions.ParamsBuilder paramsBuilder = options.getParamsBuilder(); + if (paramsBuilder != null) { + params = paramsBuilder.buildParams(params, options); + } + } + return params; + } + + private boolean validView4Callback(boolean forceValidAsyncDrawable) { + final Image view = viewRef.get(); + if (view != null) { + PixelMap otherDrawable = view.getPixelMap(); + if (otherDrawable instanceof PixelMap) { + return true; + } else if (forceValidAsyncDrawable) { + this.cancel(); + return false; + } + return true; + } + return false; + } + + private void setSuccessDrawable4Callback(final PixelMap drawable) { + final Image view = viewRef.get(); + view.getContext().getUITaskDispatcher().asyncDispatch(new Runnable() { + @Override + public void run() { + if (view != null) { + view.setScaleMode(options.getImageScaleType()); + if (options.getAnimation() != null) { + ImageAnimationHelper.animationDisplay(view, drawable, options.getAnimation()); + } else if (options.isFadeIn()) { + ImageAnimationHelper.fadeInDisplay(view, drawable); + } else { + view.setPixelMap(drawable); + } + } + } + }); + } + + private void setErrorDrawable4Callback() { + final Image view = viewRef.get(); + view.getContext().getUITaskDispatcher().asyncDispatch(new Runnable() { + @Override + public void run() { + if (view != null) { + PixelMap drawable = (PixelMap) options.getFailureDrawable(view); + view.setScaleMode(options.getPlaceholderScaleType()); + view.setPixelMap(drawable); + } + } + }); + } + + private static void postArgsException( + final Image view, final ImageOptions options, + final String exMsg, final Callback.CommonCallback callback) { + x.task().autoPost(new Runnable() { + @Override + public void run() { + x.app().getContext().getUITaskDispatcher().asyncDispatch(new Runnable() { + @Override + public void run() { + try { + if (callback instanceof ProgressCallback) { + ((ProgressCallback) callback).onWaiting(); + } + if (view != null && options != null) { + view.setScaleMode(options.getPlaceholderScaleType()); + view.setPixelMap(options.getFailureDrawable(view)); + } + if (callback != null) { + callback.onError(new IllegalArgumentException(exMsg), false); + } + } catch (Throwable ex) { + if (callback != null) { + try { + callback.onError(ex, true); + } catch (Throwable throwable) { + LogUtil.e(throwable.getMessage(), throwable); + } + } + } finally { + if (callback != null) { + try { + callback.onFinished(); + } catch (Throwable throwable) { + LogUtil.e(throwable.getMessage(), throwable); + } + } + } + } + }); + } + }); + } + + private static final class FakeImageView extends Image { + private final int hashCode; + private PixelMap drawable; + + + public FakeImageView() { + super(x.app()); + hashCode = hashCodeSeed.incrementAndGet(); + } + + @Override + public int hashCode() { + return hashCode; + } + + @Override + public void setImageElement(Element element) { + } + + @Override + public Element getImageElement() { + return null; + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageManagerImpl.java b/entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageManagerImpl.java new file mode 100644 index 0000000..304913f --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageManagerImpl.java @@ -0,0 +1,98 @@ +package com.wordplat.quickstart.xutils.image; + +import com.wordplat.quickstart.xutils.ImageManager; +import com.wordplat.quickstart.xutils.common.Callback; +import com.wordplat.quickstart.xutils.x; + +import ohos.agp.components.Image; +import ohos.media.image.PixelMap; + +import java.io.File; + +/** + * Created by wyouflf on 15/10/9. + * + * @since 2021-05-09 + */ +public final class ImageManagerImpl implements ImageManager { + private static final Object lock = new Object(); + private static volatile ImageManagerImpl instance; + + private ImageManagerImpl() { + } + + /** + * registerInstance + */ + public static void registerInstance() { + if (instance == null) { + synchronized (lock) { + if (instance == null) { + instance = new ImageManagerImpl(); + } + } + } + x.Ext.setImageManager(instance); + } + + @Override + public void bind(final Image view, final String url) { + x.task().autoPost(new Runnable() { + @Override + public void run() { + ImageLoader.doBind(view, url, null, 0, null); + } + }); + } + + @Override + public void bind(final Image view, final String url, final ImageOptions options) { + x.task().autoPost(new Runnable() { + @Override + public void run() { + ImageLoader.doBind(view, url, options, 0, null); + } + }); + } + + @Override + public void bind(final Image view, final String url, final Callback.CommonCallback callback) { + x.task().autoPost(new Runnable() { + @Override + public void run() { + ImageLoader.doBind(view, url, null, 0, callback); + } + }); + } + + @Override + public void bind(final Image view, final String url, final ImageOptions options, final Callback.CommonCallback callback) { + x.task().autoPost(new Runnable() { + @Override + public void run() { + ImageLoader.doBind(view, url, options, 0, callback); + } + }); + } + + @Override + public Callback.Cancelable loadDrawable(String url, ImageOptions options, Callback.CommonCallback callback) { + return ImageLoader.doLoadDrawable(url, options, callback); + } + + @Override + public Callback.Cancelable loadFile(String url, ImageOptions options, Callback.CacheCallback callback) { + return ImageLoader.doLoadFile(url, options, callback); + } + + @Override + public void clearMemCache() { + ImageLoader.clearMemCache(); + } + + @Override + public void clearCacheFiles() { + ImageLoader.clearCacheFiles(); + ImageDecoder.clearCacheFiles(); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageOptions.java b/entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageOptions.java new file mode 100644 index 0000000..ebcb131 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/image/ImageOptions.java @@ -0,0 +1,541 @@ +package com.wordplat.quickstart.xutils.image; + +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.http.RequestParams; +import com.wordplat.quickstart.xutils.x; + +import ohos.agp.animation.Animator; +import ohos.agp.components.Image; +import ohos.agp.window.service.DisplayManager; +import ohos.media.image.PixelMap; + +/** + * Created by wyouflf on 15/8/21. + * 图片加载参数 + * + * @since 2021-05-09 + */ +public class ImageOptions { + public static final ImageOptions DEFAULT = new ImageOptions(); + + // region ###################### decode options (equals & hashcode prop) ################ + private int maxWidth = 0; + private int maxHeight = 0; + /** + * // 小于0时不采样压缩. 等于0时自动识别ImageView的宽高和maxWidth. + */ + private int width = 0; + /** + * // 小于0时不采样压缩. 等于0时自动识别ImageView的宽高和maxHeight. + */ + private int height = 0; + private boolean crop = false; // crop to (width, height) + + private int radius = 0; + private boolean square = false; + private boolean circular = false; + private boolean autoRotate = false; + private boolean compress = true; + + private boolean ignoreGif = true; + private int gifRate = 100; + + private int loadingDrawableId = 0; + private int failureDrawableId = 0; + private PixelMap loadingDrawable = null; + private PixelMap failureDrawable = null; + private boolean forceLoadingDrawable = true; + + private Image.ScaleMode placeholderScaleType = Image.ScaleMode.INSIDE; + private Image.ScaleMode imageScaleType = Image.ScaleMode.CENTER; + + private boolean fadeIn = false; + private Animator animation = null; + + private boolean useMemCache = true; + private ParamsBuilder paramsBuilder; + + /** + * ImageOptions + */ + protected ImageOptions() { + } + + final void optimizeMaxSize(Image view) { + if (width > 0 && height > 0) { + maxWidth = width; + maxHeight = height; + return; + } + + int screenWidth = DisplayManager.getInstance().getDefaultDisplay(x.app()).get().getAttributes().width; + int screenHeight = DisplayManager.getInstance().getDefaultDisplay(x.app()).get().getAttributes().height; + + if (this == DEFAULT) { + maxWidth = width = screenWidth * 3 / 2; + maxHeight = height = screenHeight * 3 / 2; + return; + } + + if (width < 0) { + maxWidth = screenWidth * 3 / 2; + compress = false; + } + if (height < 0) { + maxHeight = screenHeight * 3 / 2; + compress = false; + } + + if (view == null && maxWidth <= 0 && maxHeight <= 0) { + maxWidth = screenWidth; + maxHeight = screenHeight; + } else { + int tempWidth = maxWidth; + int tempHeight = maxHeight; + + if (tempWidth <= 0) { + tempWidth = screenWidth; + } + if (tempHeight <= 0) { + tempHeight = screenHeight; + } + + maxWidth = tempWidth; + maxHeight = tempHeight; + } + } + + public int getMaxWidth() { + return maxWidth; + } + + public int getMaxHeight() { + return maxHeight; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + public boolean isCrop() { + return crop; + } + + public int getRadius() { + return radius; + } + + public boolean isSquare() { + return square; + } + + public boolean isCircular() { + return circular; + } + + public boolean isIgnoreGif() { + return ignoreGif; + } + + public int getGifRate() { + return gifRate; + } + + public boolean isAutoRotate() { + return autoRotate; + } + + public boolean isCompress() { + return compress; + } + + public PixelMap getLoadingDrawable(Image view) { + if (loadingDrawable == null && loadingDrawableId > 0 && view != null) { + try { + view.setImageAndDecodeBounds(loadingDrawableId); + loadingDrawable = view.getPixelMap(); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + return loadingDrawable; + } + + /** + * getFailureDrawable + * + * @param view + * @return PixelMap + */ + public PixelMap getFailureDrawable(Image view) { + if (failureDrawable == null && failureDrawableId > 0 && view != null) { + try { + view.setImageAndDecodeBounds(failureDrawableId); + failureDrawable = view.getPixelMap(); + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + return failureDrawable; + } + + public boolean isFadeIn() { + return fadeIn; + } + + public Animator getAnimation() { + return animation; + } + + public Image.ScaleMode getPlaceholderScaleType() { + return placeholderScaleType; + } + + public Image.ScaleMode getImageScaleType() { + return imageScaleType; + } + + public boolean isForceLoadingDrawable() { + return forceLoadingDrawable; + } + + public boolean isUseMemCache() { + return useMemCache; + } + + public ParamsBuilder getParamsBuilder() { + return paramsBuilder; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + ImageOptions options = (ImageOptions) o; + + if (maxWidth != options.maxWidth) { + return false; + } + if (maxHeight != options.maxHeight) { + return false; + } + if (width != options.width) { + return false; + } + if (height != options.height) { + return false; + } + if (crop != options.crop) { + return false; + } + if (radius != options.radius) { + return false; + } + if (square != options.square) { + return false; + } + if (circular != options.circular) { + return false; + } + if (autoRotate != options.autoRotate) { + return false; + } + if (compress != options.compress) { + return false; + } + return false; + } + + @Override + public int hashCode() { + int result = maxWidth; + result = 31 * result + maxHeight; + result = 31 * result + width; + result = 31 * result + height; + result = 31 * result + (crop ? 1 : 0); + result = 31 * result + radius; + result = 31 * result + (square ? 1 : 0); + result = 31 * result + (circular ? 1 : 0); + result = 31 * result + (autoRotate ? 1 : 0); + result = 31 * result + (compress ? 1 : 0); + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("_"); + sb.append(maxWidth).append("_"); + sb.append(maxHeight).append("_"); + sb.append(width).append("_"); + sb.append(height).append("_"); + sb.append(radius).append("_"); + sb.append(crop ? 1 : 0).append(square ? 1 : 0).append(circular ? 1 : 0); + sb.append(autoRotate ? 1 : 0).append(compress ? 1 : 0); + return sb.toString(); + } + + /** + * ParamsBuilder + * + * @since 2021-05-09 + */ + public interface ParamsBuilder { + /** + * buildParams + * + * @param params + * @param options + * @return RequestParams + */ + RequestParams buildParams(RequestParams params, ImageOptions options); + } + + public static class Builder { + protected ImageOptions options; + + /** + * Builder + */ + public Builder() { + newImageOptions(); + } + + /** + * newImageOptions + */ + protected void newImageOptions() { + options = new ImageOptions(); + } + + /** + * build + * + * @return ImageOptions + */ + public ImageOptions build() { + return options; + } + + /** + * setSize + * + * @param width + * @param height + * @return Builder + */ + public Builder setSize(int width, int height) { + options.width = width; + options.height = height; + return this; + } + + /** + * setCrop + * + * @param crop + * @return Builder + */ + public Builder setCrop(boolean crop) { + options.crop = crop; + return this; + } + + /** + * setRadius + * + * @param radius + * @return Builder + */ + public Builder setRadius(int radius) { + options.radius = radius; + return this; + } + + /** + * setSquare + * + * @param square + * @return Builder + */ + public Builder setSquare(boolean square) { + options.square = square; + return this; + } + + /** + * setCircular + * + * @param circular + * @return Builder + */ + public Builder setCircular(boolean circular) { + options.circular = circular; + return this; + } + + /** + * setAutoRotate + * + * @param autoRotate + * @return Builder + */ + public Builder setAutoRotate(boolean autoRotate) { + options.autoRotate = autoRotate; + return this; + } + + + /** + * setIgnoreGif + * + * @param ignoreGif + * @return Builder + */ + public Builder setIgnoreGif(boolean ignoreGif) { + options.ignoreGif = ignoreGif; + return this; + } + + /** + * setGifRate + * + * @param rate + * @return Builder + */ + public Builder setGifRate(int rate) { + options.gifRate = rate; + return this; + } + + /** + * setLoadingDrawableId + * + * @param loadingDrawableId + * @return Builder + */ + public Builder setLoadingDrawableId(int loadingDrawableId) { + options.loadingDrawableId = loadingDrawableId; + return this; + } + + /** + * setLoadingDrawable + * + * @param loadingDrawable + * @return Builder + */ + public Builder setLoadingDrawable(PixelMap loadingDrawable) { + options.loadingDrawable = loadingDrawable; + return this; + } + + /** + * setFailureDrawableId + * + * @param failureDrawableId + * @return Builder + */ + public Builder setFailureDrawableId(int failureDrawableId) { + options.failureDrawableId = failureDrawableId; + return this; + } + + /** + * setFailureDrawable + * + * @param failureDrawable + * @return Builder + */ + public Builder setFailureDrawable(PixelMap failureDrawable) { + options.failureDrawable = failureDrawable; + return this; + } + + /** + * setFadeIn + * + * @param fadeIn + * @return Builder + */ + public Builder setFadeIn(boolean fadeIn) { + options.fadeIn = fadeIn; + return this; + } + + /** + * setAnimation + * + * @param animation + * @return Builder + */ + public Builder setAnimation(Animator animation) { + options.animation = animation; + return this; + } + + /** + * setPlaceholderScaleType + * + * @param placeholderScaleType + * @return Builder + */ + public Builder setPlaceholderScaleType(Image.ScaleMode placeholderScaleType) { + options.placeholderScaleType = placeholderScaleType; + return this; + } + + /** + * setImageScaleType + * + * @param imageScaleType + * @return Builder + */ + public Builder setImageScaleType(Image.ScaleMode imageScaleType) { + options.imageScaleType = imageScaleType; + return this; + } + + /** + * setForceLoadingDrawable + * + * @param forceLoadingDrawable + * @return Builder + */ + public Builder setForceLoadingDrawable(boolean forceLoadingDrawable) { + options.forceLoadingDrawable = forceLoadingDrawable; + return this; + } + + /** + * setUseMemCache + * + * @param useMemCache + * @return Builder + */ + public Builder setUseMemCache(boolean useMemCache) { + options.useMemCache = useMemCache; + return this; + } + + /** + * setParamsBuilder + * + * @param paramsBuilder + * @return Builder + */ + public Builder setParamsBuilder(ParamsBuilder paramsBuilder) { + options.paramsBuilder = paramsBuilder; + return this; + } + } + +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/image/MemCacheKey.java b/entry/src/main/java/com/wordplat/quickstart/xutils/image/MemCacheKey.java new file mode 100644 index 0000000..4218397 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/image/MemCacheKey.java @@ -0,0 +1,49 @@ +package com.wordplat.quickstart.xutils.image; + +/** + * Created by wyouflf on 15/10/20. + */ +final class MemCacheKey { + public final String url; + public final ImageOptions options; + + /** + * MemCacheKey + * + * @param url + * @param options + */ + public MemCacheKey(String url, ImageOptions options) { + this.url = url; + this.options = options; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + MemCacheKey that = (MemCacheKey) o; + + if (!url.equals(that.url)) { + return false; + } + return options.equals(that.options); + } + + @Override + public int hashCode() { + int result = url.hashCode(); + result = 31 * result + options.hashCode(); + return result; + } + + @Override + public String toString() { + return url + options.toString(); + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/image/ReusableBitmapDrawable.java b/entry/src/main/java/com/wordplat/quickstart/xutils/image/ReusableBitmapDrawable.java new file mode 100644 index 0000000..5191968 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/image/ReusableBitmapDrawable.java @@ -0,0 +1,21 @@ +package com.wordplat.quickstart.xutils.image; + +import ohos.media.image.PixelMap; + +final class ReusableBitmapDrawable extends PixelMap implements ReusableDrawable { + private MemCacheKey key; + + protected ReusableBitmapDrawable(long nativeImagePixelMap, long nativeAllocBytes) { + super(nativeImagePixelMap, nativeAllocBytes); + } + + @Override + public MemCacheKey getMemCacheKey() { + return key; + } + + @Override + public void setMemCacheKey(MemCacheKey key) { + this.key = key; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/image/ReusableDrawable.java b/entry/src/main/java/com/wordplat/quickstart/xutils/image/ReusableDrawable.java new file mode 100644 index 0000000..8ce1a9a --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/image/ReusableDrawable.java @@ -0,0 +1,11 @@ +package com.wordplat.quickstart.xutils.image; + +/** + * Created by wyouflf on 15/10/20. + * 使已被LruCache移除, 但还在被ImageView使用的Drawable可以再次被回收使用. + */ +interface ReusableDrawable { + MemCacheKey getMemCacheKey(); + + void setMemCacheKey(MemCacheKey key); +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/view/EventListenerManager.java b/entry/src/main/java/com/wordplat/quickstart/xutils/view/EventListenerManager.java new file mode 100644 index 0000000..6ab54a8 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/view/EventListenerManager.java @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.view; + +import com.wordplat.quickstart.xutils.common.util.DoubleKeyValueMap; +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.common.util.TextUtils; +import com.wordplat.quickstart.xutils.view.annotation.Event; + +import ohos.agp.components.Component; + +import java.lang.ref.WeakReference; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + +final class EventListenerManager { + private static final DoubleKeyValueMap, Object> + listenerCache = new DoubleKeyValueMap, Object>(); + + private static final long QUICK_EVENT_TIME_SPAN = 300; + private static final HashSet AVOID_QUICK_EVENT_SET = new HashSet(2); + + static { + AVOID_QUICK_EVENT_SET.add("onClick"); + AVOID_QUICK_EVENT_SET.add("onItemClick"); + } + + private EventListenerManager() { + } + + /** + * k1: viewInjectInfo + * k2: interface Type + * value: listener + */ + public static void addEventMethod( + ViewFinder finder, + ViewInfo info, + Event event, + Object handler, + Method method) { + try { + Component view = finder.findViewByInfo(info); + + if (view != null) { + Class listenerType = event.type(); + String listenerSetter = event.setter(); + if (TextUtils.isEmpty(listenerSetter)) { + listenerSetter = "set" + listenerType.getSimpleName(); + } + + String methodName = event.method(); + + boolean addNewMethod = false; + Object listener = listenerCache.get(info, listenerType); + DynamicHandler dynamicHandler = null; + if (listener != null) { + dynamicHandler = (DynamicHandler) Proxy.getInvocationHandler(listener); + addNewMethod = handler.equals(dynamicHandler.getHandler()); + if (addNewMethod) { + dynamicHandler.addMethod(methodName, method); + } + } + + if (!addNewMethod) { + dynamicHandler = new DynamicHandler(handler); + + dynamicHandler.addMethod(methodName, method); + + listener = Proxy.newProxyInstance( + listenerType.getClassLoader(), + new Class[]{listenerType}, + dynamicHandler); + + listenerCache.put(info, listenerType, listener); + } + + Method setEventListenerMethod = view.getClass().getMethod(listenerSetter, listenerType); + setEventListenerMethod.invoke(view, listener); + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + + public static class DynamicHandler implements InvocationHandler { + private static long lastClickTime = 0; + private WeakReference handlerRef; + private final HashMap methodMap = new HashMap(1); + + private DynamicHandler(Object handler) { + this.handlerRef = new WeakReference(handler); + } + + public void addMethod(String name, Method method) { + methodMap.put(name, method); + } + + public Object getHandler() { + return handlerRef.get(); + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + Object handler = handlerRef.get(); + if (handler != null) { + String eventMethod = method.getName(); + if ("toString".equals(eventMethod)) { + return DynamicHandler.class.getSimpleName(); + } + + method = methodMap.get(eventMethod); + if (method == null && methodMap.size() == 1) { + for (Map.Entry entry : methodMap.entrySet()) { + if (TextUtils.isEmpty(entry.getKey())) { + method = entry.getValue(); + } + break; + } + } + + if (method != null) { + if (AVOID_QUICK_EVENT_SET.contains(eventMethod)) { + long timeSpan = System.currentTimeMillis() - lastClickTime; + if (timeSpan > 0 && timeSpan < QUICK_EVENT_TIME_SPAN) { + LogUtil.d("onClick cancelled: " + timeSpan); + return null; + } + lastClickTime = System.currentTimeMillis(); + } + + try { + return method.invoke(handler, args); + } catch (Throwable ex) { + throw new RuntimeException("invoke method error:" + + handler.getClass().getName() + "#" + method.getName(), ex); + } + } else { + LogUtil.w("method not impl: " + eventMethod + "(" + handler.getClass().getSimpleName() + ")"); + } + } + return null; + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/view/ViewFinder.java b/entry/src/main/java/com/wordplat/quickstart/xutils/view/ViewFinder.java new file mode 100644 index 0000000..3853e93 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/view/ViewFinder.java @@ -0,0 +1,53 @@ +package com.wordplat.quickstart.xutils.view; + +import ohos.aafwk.ability.AbilitySlice; +import ohos.agp.components.Component; + +/** + * Author: wyouflf + * Date: 13-9-9 + * Time: 下午12:29 + * + * @since 2021-05-09 + */ +final class ViewFinder { + private Component view; + private AbilitySlice activity; + + public ViewFinder(Component view) { + this.view = view; + } + + public ViewFinder(AbilitySlice activity) { + this.activity = activity; + } + + public Component findViewById(int id) { + if (view != null) { + return view.findComponentById(id); + } + if (activity != null) { + return activity.findComponentById(id); + } + return null; + } + + public Component findViewByInfo(ViewInfo info) { + return findViewById(info.value, info.parentId); + } + + public Component findViewById(int id, int pid) { + Component pView = null; + if (pid > 0) { + pView = this.findViewById(pid); + } + + Component view = null; + if (pView != null) { + view = pView.findComponentById(id); + } else { + view = this.findViewById(id); + } + return view; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/view/ViewInfo.java b/entry/src/main/java/com/wordplat/quickstart/xutils/view/ViewInfo.java new file mode 100644 index 0000000..fe2a903 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/view/ViewInfo.java @@ -0,0 +1,37 @@ +package com.wordplat.quickstart.xutils.view; + +/** + * Author: wyouflf + * Date: 13-12-5 + * Time: 下午11:25 + * + * @since 2021-05-09 + */ +final class ViewInfo { + public int value; + public int parentId; + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + ViewInfo viewInfo = (ViewInfo) o; + + if (value != viewInfo.value) { + return false; + } + return parentId == viewInfo.parentId; + } + + @Override + public int hashCode() { + int result = value; + result = 31 * result + parentId; + return result; + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/view/ViewInjectorImpl.java b/entry/src/main/java/com/wordplat/quickstart/xutils/view/ViewInjectorImpl.java new file mode 100644 index 0000000..3ca88ca --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/view/ViewInjectorImpl.java @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.view; + +import com.wordplat.quickstart.xutils.ViewInjector; +import com.wordplat.quickstart.xutils.common.util.LogUtil; +import com.wordplat.quickstart.xutils.view.annotation.ContentView; +import com.wordplat.quickstart.xutils.view.annotation.Event; +import com.wordplat.quickstart.xutils.view.annotation.ViewInject; +import com.wordplat.quickstart.xutils.x; +import ohos.aafwk.ability.AbilitySlice; +import ohos.agp.components.Component; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.HashSet; + +/** + * ViewInjectorImpl + * + * @since 2021-05-09 + */ +public final class ViewInjectorImpl implements ViewInjector { + private static final HashSet> IGNORED = new HashSet>(); + + static { + IGNORED.add(Object.class); + IGNORED.add(AbilitySlice.class); + } + + private static final Object lock = new Object(); + private static volatile ViewInjectorImpl instance; + + private ViewInjectorImpl() { + } + + /** + * registerInstance + */ + public static void registerInstance() { + if (instance == null) { + synchronized (lock) { + if (instance == null) { + instance = new ViewInjectorImpl(); + } + } + } + x.Ext.setViewInjector(instance); + } + + @Override + public void inject(Component view) { + injectObject(view, view.getClass(), new ViewFinder(view)); + } + + @Override + public void inject(AbilitySlice activity) { + /** + * 获取Activity的ContentView的注解 + */ + Class handlerType = activity.getClass(); + try { + ContentView contentView = findContentView(handlerType); + if (contentView != null) { + int viewId = contentView.value(); + if (viewId > 0) { + activity.setUIContent(viewId); + } + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + + injectObject(activity, handlerType, new ViewFinder(activity)); + } + + @Override + public void inject(Object handler, Component view) { + injectObject(handler, handler.getClass(), new ViewFinder(view)); + } + + private static ContentView findContentView(Class thisCls) { + ContentView contentView = thisCls.getAnnotation(ContentView.class); + if (contentView == null) { + return findContentView(thisCls.getSuperclass()); + } + return contentView; + } + + /** + * injectObject + * @param handler + * @param handlerType + * @param finder + */ + private static void injectObject(Object handler, Class handlerType, ViewFinder finder) { + + // 从父类到子类递归 + injectObject(handler, handlerType.getSuperclass(), finder); + + // inject view + Field[] fields = handlerType.getDeclaredFields(); + if (fields != null && fields.length > 0) { + for (Field field : fields) { + Class fieldType = field.getType(); + if (Modifier.isStatic(field.getModifiers()) || + Modifier.isFinal(field.getModifiers()) || + fieldType.isPrimitive() || + fieldType.isArray()) { + continue; + } + + ViewInject viewInject = field.getAnnotation(ViewInject.class); + if (viewInject != null) { + try { + Component view = finder.findViewById(viewInject.value(), viewInject.parentId()); + if (view != null) { + field.setAccessible(true); + field.set(handler, view); + } else { + throw new RuntimeException("Invalid @ViewInject for " + + handlerType.getSimpleName() + "." + field.getName()); + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + } + } + + Method[] methods = handlerType.getDeclaredMethods(); + if (methods != null && methods.length > 0) { + for (Method method : methods) { + if (Modifier.isStatic(method.getModifiers()) + || !Modifier.isPrivate(method.getModifiers())) { + continue; + } + Event event = method.getAnnotation(Event.class); + if (event != null) { + try { + int[] values = event.value(); + int[] parentIds = event.parentId(); + int parentIdsLen = parentIds == null ? 0 : parentIds.length; + for (int i = 0; i < values.length; i++) { + int value = values[i]; + if (value > 0) { + ViewInfo info = new ViewInfo(); + info.value = value; + info.parentId = parentIdsLen > i ? parentIds[i] : 0; + method.setAccessible(true); + EventListenerManager.addEventMethod(finder, info, event, handler, method); + } + } + } catch (Throwable ex) { + LogUtil.e(ex.getMessage(), ex); + } + } + } + } + } +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/view/annotation/ContentView.java b/entry/src/main/java/com/wordplat/quickstart/xutils/view/annotation/ContentView.java new file mode 100644 index 0000000..04402b8 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/view/annotation/ContentView.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.view.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * ContentView + * + * @since 2021-05-09 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface ContentView { + /** + * value + * + * @return int + */ + int value(); +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/view/annotation/Event.java b/entry/src/main/java/com/wordplat/quickstart/xutils/view/annotation/Event.java new file mode 100644 index 0000000..230184d --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/view/annotation/Event.java @@ -0,0 +1,57 @@ +package com.wordplat.quickstart.xutils.view.annotation; + +import ohos.agp.components.Component; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 事件注解. + * 被注解的方法必须具备以下形式: + * 1. private 修饰 + * 2. 返回值类型没有要求 + * 3. 参数签名和type的接口要求的参数签名一致. + * Author: wyouflf + * Date: 13-9-9 + * Time: 下午12:43 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Event { + /** + * 控件的id集合, id小于1时不执行ui事件绑定. + * + * @return int[] + */ + int[] value(); + + /** + * 控件的parent控件的id集合, 组合为(value[i], parentId[i] or 0). + * + * @return int[] + */ + int[] parentId() default 0; + + /** + * 事件的listener, 默认为点击事件. + * + * @return Class + */ + Class type() default Component.ClickedListener.class; + + /** + * 事件的setter方法名, 默认为set+type#simpleName. + * + * @return String + */ + String setter() default ""; + + /** + * 如果type的接口类型提供多个方法, 需要使用此参数指定方法名. + * + * @return String + */ + String method() default ""; +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/view/annotation/ViewInject.java b/entry/src/main/java/com/wordplat/quickstart/xutils/view/annotation/ViewInject.java new file mode 100644 index 0000000..bae27ba --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/view/annotation/ViewInject.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2013. wyouflf (wyouflf@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.quickstart.xutils.view.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * ViewInject + * + * @since 2021-05-09 + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface ViewInject { + /** + * value + * + * @return int + */ + int value(); + + /** + * parentId + * + * @return int + */ + int parentId() default 0; +} diff --git a/entry/src/main/java/com/wordplat/quickstart/xutils/x.java b/entry/src/main/java/com/wordplat/quickstart/xutils/x.java new file mode 100644 index 0000000..b18e4b8 --- /dev/null +++ b/entry/src/main/java/com/wordplat/quickstart/xutils/x.java @@ -0,0 +1,160 @@ +package com.wordplat.quickstart.xutils; + +import com.wordplat.quickstart.xutils.common.TaskController; +import com.wordplat.quickstart.xutils.common.task.TaskControllerImpl; +import com.wordplat.quickstart.xutils.db.DbManagerImpl; +import com.wordplat.quickstart.xutils.ex.DbException; +import com.wordplat.quickstart.xutils.http.HttpManagerImpl; +import com.wordplat.quickstart.xutils.image.ImageManagerImpl; +import com.wordplat.quickstart.xutils.view.ViewInjectorImpl; + +import ohos.aafwk.ability.Ability; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; + +/** + * Created by wyouflf on 15/6/10. + * 任务控制中心, http, image, db, view注入等接口的入口. + * 需要在在application的onCreate中初始化: x.Ext.init(this); + * + * @since 2021-05-09 + */ +public final class x { + private x() { + } + + public static boolean isDebug() { + return Ext.debug; + } + + /** + * app + * + * @return Ability + */ + public static Ability app() { + return Ext.app; + } + + /** + * task + * + * @return TaskController + */ + public static TaskController task() { + return Ext.taskController; + } + + /** + * http + * + * @return HttpManager + */ + public static HttpManager http() { + if (Ext.httpManager == null) { + HttpManagerImpl.registerInstance(); + } + return Ext.httpManager; + } + + /** + * image + * + * @return ImageManager + */ + public static ImageManager image() { + if (Ext.imageManager == null) { + ImageManagerImpl.registerInstance(); + } + return Ext.imageManager; + } + + /** + * view + * + * @return ViewInjector + */ + public static ViewInjector view() { + if (Ext.viewInjector == null) { + ViewInjectorImpl.registerInstance(); + } + return Ext.viewInjector; + } + + /** + * getDb + * + * @param daoConfig + * @return DbManager + * @throws DbException + */ + public static DbManager getDb(DbManager.DaoConfig daoConfig) throws DbException { + return DbManagerImpl.getInstance(daoConfig); + } + + /** + * Ext + * + * @since 2021-05-09 + */ + public static class Ext { + private static boolean debug; + private static Ability app; + private static TaskController taskController; + private static HttpManager httpManager; + private static ImageManager imageManager; + private static ViewInjector viewInjector; + + private Ext() { + } + + /** + * init + * + * @param ability + */ + public static void init(Ability ability) { + TaskControllerImpl.registerInstance(); + if (Ext.app == null) { + Ext.app = ability; + } + } + + public static void setDebug(boolean debug) { + Ext.debug = debug; + } + + /** + * setTaskController + * + * @param taskController + */ + public static void setTaskController(TaskController taskController) { + if (Ext.taskController == null) { + Ext.taskController = taskController; + } + } + + public static void setHttpManager(HttpManager httpManager) { + Ext.httpManager = httpManager; + } + + public static void setImageManager(ImageManager imageManager) { + Ext.imageManager = imageManager; + } + + public static void setViewInjector(ViewInjector viewInjector) { + Ext.viewInjector = viewInjector; + } + + /** + * setDefaultHostnameVerifier + * + * @param hostnameVerifier + */ + public static void setDefaultHostnameVerifier(HostnameVerifier hostnameVerifier) { + HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); + } + } +} diff --git a/entry/src/main/resources/base/animation/loading_rotation.xml b/entry/src/main/resources/base/animation/loading_rotation.xml new file mode 100644 index 0000000..dfdf3b5 --- /dev/null +++ b/entry/src/main/resources/base/animation/loading_rotation.xml @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/entry/src/main/resources/base/element/color.json b/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000..3232b02 --- /dev/null +++ b/entry/src/main/resources/base/element/color.json @@ -0,0 +1,201 @@ +{ + "color": [ + { + "name": "ic_advertise", + "value": "#FFFFFF" + }, + { + "name": "colorCg", + "value": "#d3d7d4" + }, + { + "name": "layer_grid_line", + "value": "#000000" + }, + { + "name": "app_mainclolr", + "value": "#FB6A8F" + },{ + "name": "app_qing2", + "value": "#31C453" + },{ + "name": "color_1", + "value": "#AAA3DB" + },{ + "name": "color_2", + "value": "#86ACE9" + },{ + "name": "color_4", + "value": "#80D8A3" + },{ + "name": "color_5", + "value": "#F1C672" + },{ + "name": "color_6", + "value": "#FDAD8B" + },{ + "name": "color_7", + "value": "#ADBEFF" + },{ + "name": "color_8", + "value": "#94D6FA" + },{ + "name": "color_9", + "value": "#C3B5F6" + },{ + "name": "color_10", + "value": "#99CCFF" + },{ + "name": "color_11", + "value": "#FBA6ED" + },{ + "name": "color_30", + "value": "#EE8262" + },{ + "name": "bg_color", + "value":"#F0F0F0" + },{ + "name": "color_31", + "value": "#EE6363" + },{ + "name": "color_32", + "value": "#EEB4B4" + },{ + "name": "color_33", + "value": "#D2B48C" + },{ + "name": "color_34", + "value": "#CD9B9B" + },{ + "name": "color_35", + "value": "#5F9EA0" + }, + { + "name": "app_course_chooseweek_bg", + "value": "#E2F7F6" + }, + { + "name": "app_white", + "value": "#ffffff" + }, + { + "name": "app_course_chooseweek_bg2", + "value": "#F1FFFE" + }, + { + "name":"test", + "value":"#3FCAB8" + }, + { + "name":"app_red", + "value":"#d81e06" + }, + { + "name":"color_3", + "value":"#92D261" + }, + { + "name":"app_white_slight", + "value":"#FBFBFB" + }, + { + "name":"app_course_textcolor_blue", + "value":"#13B0F1" + }, + { + "name":"app_gray", + "value":"#999999" + }, + { + "name":"app_gold", + "value":"#FF7A59" + }, + { + "name": "colorAccent", + "value": "#FF4081" + }, + { + "name": "colorPrimary", + "value": "#dc7e2c" + }, + { + "name": "colorSecondary", + "value": "#99000000" + }, + { + "name": "colorAppbarTitle", + "value": "#000000" + }, + { + "name": "colorAppbarBg", + "value": "#ffffff" + }, + { + "name": "colorAppbarSubBg", + "value": "#ffffff" + }, + { + "name": "textColorPrimary", + "value": "#E6000000" + }, + { + "name": "textColorSecondary", + "value": "#99000000" + }, + { + "name": "colorCardViewBg", + "value": "#ffffff" + }, + { + "name": "colorAppBackground", + "value": "#f1f3f5" + }, + { + "name": "colorSearchBarBackground", + "value": "#0C000000" + }, + { + "name": "colorListDivider", + "value": "#33000000" + }, + { + "name": "divider", + "value": "#dddddd" + }, + { + "name": "colorListHeadBackground", + "value": "#77787b" + }, + { + "name": "white", + "value": "#ffffff" + }, + { + "name": "colorPrimaryDark", + "value": "#1e82d2" + }, + { + "name": "black", + "value": "#000000" + }, + { + "name": "green", + "value": "#45b97c" + }, + { + "name": "brown", + "value": "#843900" + },{ + "name":"bb_inActiveBottomBarItemColor", + "value":"#747474" + }, + { + "name":"bb_darkBackgroundColor", + "value":"#212121" + }, + { + "name":"bb_tabletRightBorderDark", + "value":"#505050" + } + ] +} \ No newline at end of file diff --git a/entry/src/main/resources/base/element/string.json b/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..7717872 --- /dev/null +++ b/entry/src/main/resources/base/element/string.json @@ -0,0 +1,28 @@ +{ + "string": [ + { + "name": "app_name", + "value": "ikvStockChart" + }, + { + "name": "mainability_description", + "value": "Java_Phone_Empty Feature Ability" + }, + { + "name": "HelloWorld", + "value": "Hello World" + }, + { + "name": "Warning_Unknow", + "value": "程序发生了错误" + }, + { + "name": "Warning_No_Network", + "value": "当前网络不给力,请检查您的网络设置" + }, + { + "name": "Warning_Network_Timeout", + "value": "当前网络不给力,请稍后重试" + } + ] +} \ No newline at end of file diff --git a/entry/src/main/resources/base/graphic/background_ability_main.xml b/entry/src/main/resources/base/graphic/background_ability_main.xml new file mode 100644 index 0000000..015ce26 --- /dev/null +++ b/entry/src/main/resources/base/graphic/background_ability_main.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/entry/src/main/resources/base/graphic/background_change.xml b/entry/src/main/resources/base/graphic/background_change.xml new file mode 100644 index 0000000..96280bc --- /dev/null +++ b/entry/src/main/resources/base/graphic/background_change.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/entry/src/main/resources/base/graphic/background_shape.xml b/entry/src/main/resources/base/graphic/background_shape.xml new file mode 100644 index 0000000..2840d4b --- /dev/null +++ b/entry/src/main/resources/base/graphic/background_shape.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/entry/src/main/resources/base/graphic/toast_background_shape.xml b/entry/src/main/resources/base/graphic/toast_background_shape.xml new file mode 100644 index 0000000..39c4272 --- /dev/null +++ b/entry/src/main/resources/base/graphic/toast_background_shape.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/entry/src/main/resources/base/graphic/vector_drawable_loading2.xml b/entry/src/main/resources/base/graphic/vector_drawable_loading2.xml new file mode 100644 index 0000000..e7d9ee7 --- /dev/null +++ b/entry/src/main/resources/base/graphic/vector_drawable_loading2.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/resources/base/graphic/vector_drawable_loading2_anim.xml b/entry/src/main/resources/base/graphic/vector_drawable_loading2_anim.xml new file mode 100644 index 0000000..21b52f1 --- /dev/null +++ b/entry/src/main/resources/base/graphic/vector_drawable_loading2_anim.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/entry/src/main/resources/base/graphic/vector_drawable_loading_anim.xml b/entry/src/main/resources/base/graphic/vector_drawable_loading_anim.xml new file mode 100644 index 0000000..21b52f1 --- /dev/null +++ b/entry/src/main/resources/base/graphic/vector_drawable_loading_anim.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/entry/src/main/resources/base/layout/Header.xml b/entry/src/main/resources/base/layout/Header.xml new file mode 100644 index 0000000..cef832f --- /dev/null +++ b/entry/src/main/resources/base/layout/Header.xml @@ -0,0 +1,24 @@ + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/resources/base/layout/head_default_layout.xml b/entry/src/main/resources/base/layout/head_default_layout.xml new file mode 100644 index 0000000..740ed94 --- /dev/null +++ b/entry/src/main/resources/base/layout/head_default_layout.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/resources/base/layout/item_text.xml b/entry/src/main/resources/base/layout/item_text.xml new file mode 100644 index 0000000..ec37720 --- /dev/null +++ b/entry/src/main/resources/base/layout/item_text.xml @@ -0,0 +1,30 @@ + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/resources/base/layout/slice_left_and_right_refresh.xml b/entry/src/main/resources/base/layout/slice_left_and_right_refresh.xml new file mode 100644 index 0000000..5d3146b --- /dev/null +++ b/entry/src/main/resources/base/layout/slice_left_and_right_refresh.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_macd_rsi_kdj_show_together.xml b/entry/src/main/resources/base/layout/slice_macd_rsi_kdj_show_together.xml similarity index 37% rename from app/src/main/res/layout/activity_macd_rsi_kdj_show_together.xml rename to entry/src/main/resources/base/layout/slice_macd_rsi_kdj_show_together.xml index b5b9ad2..90a26d8 100644 --- a/app/src/main/res/layout/activity_macd_rsi_kdj_show_together.xml +++ b/entry/src/main/resources/base/layout/slice_macd_rsi_kdj_show_together.xml @@ -1,18 +1,18 @@ - + - \ No newline at end of file + \ No newline at end of file diff --git a/entry/src/main/resources/base/layout/slice_main.xml b/entry/src/main/resources/base/layout/slice_main.xml new file mode 100644 index 0000000..f676705 --- /dev/null +++ b/entry/src/main/resources/base/layout/slice_main.xml @@ -0,0 +1,25 @@ + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/resources/base/layout/slice_simple_timeline.xml b/entry/src/main/resources/base/layout/slice_simple_timeline.xml new file mode 100644 index 0000000..09b95e3 --- /dev/null +++ b/entry/src/main/resources/base/layout/slice_simple_timeline.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/entry/src/main/resources/base/layout/slice_with_fragment_and_tablayout_switcher.xml b/entry/src/main/resources/base/layout/slice_with_fragment_and_tablayout_switcher.xml new file mode 100644 index 0000000..a7016e7 --- /dev/null +++ b/entry/src/main/resources/base/layout/slice_with_fragment_and_tablayout_switcher.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/resources/base/layout/slice_with_pull_to_refresh.xml b/entry/src/main/resources/base/layout/slice_with_pull_to_refresh.xml new file mode 100644 index 0000000..56e02a7 --- /dev/null +++ b/entry/src/main/resources/base/layout/slice_with_pull_to_refresh.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/resources/base/layout/slider_kline.xml b/entry/src/main/resources/base/layout/slider_kline.xml new file mode 100644 index 0000000..4e5a20d --- /dev/null +++ b/entry/src/main/resources/base/layout/slider_kline.xml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/resources/base/layout/toast_dialog_layout.xml b/entry/src/main/resources/base/layout/toast_dialog_layout.xml new file mode 100644 index 0000000..1864056 --- /dev/null +++ b/entry/src/main/resources/base/layout/toast_dialog_layout.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/entry/src/main/resources/base/media/icon.png b/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 delta 48558 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�kSa#TH1 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 G_5T3orVFkB diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8542cb0..f59159e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Tue Jan 24 17:01:14 CST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://repo.huaweicloud.com/gradle/gradle-6.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.2-all.zip diff --git a/ikvStockChart/build.gradle b/ikvStockChart/build.gradle index 82ee32c..25ddf0c 100644 --- a/ikvStockChart/build.gradle +++ b/ikvStockChart/build.gradle @@ -1,25 +1,21 @@ -apply plugin: 'com.android.library' - -android { - compileSdkVersion 25 - buildToolsVersion "25.0.2" - +apply plugin: 'com.huawei.ohos.library' +ohos { + compileSdkVersion 5 defaultConfig { - minSdkVersion 14 - targetSdkVersion 25 - versionCode LIB_VERSION_CODE as int - versionName LIB_VERSION_NAME as String + compatibleSdkVersion 5 } buildTypes { release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } } } + } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - testCompile 'junit:junit:4.12' - compile 'com.android.support:support-v4:25.1.0' + implementation fileTree(dir: 'libs', include: ['*.jar']) + testImplementation 'junit:junit:4.13' } diff --git a/ikvStockChart/proguard-rules.pro b/ikvStockChart/proguard-rules.pro index 0b96725..f7666e4 100644 --- a/ikvStockChart/proguard-rules.pro +++ b/ikvStockChart/proguard-rules.pro @@ -1,25 +1 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /Users/afon/Share/android-sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile +# config module specific ProGuard rules here. \ No newline at end of file diff --git a/ikvStockChart/src/main/AndroidManifest.xml b/ikvStockChart/src/main/AndroidManifest.xml deleted file mode 100644 index 64b7601..0000000 --- a/ikvStockChart/src/main/AndroidManifest.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - diff --git a/ikvStockChart/src/main/config.json b/ikvStockChart/src/main/config.json new file mode 100644 index 0000000..ebec6d4 --- /dev/null +++ b/ikvStockChart/src/main/config.json @@ -0,0 +1,27 @@ +{ + "app": { + "bundleName": "com.wordplat.quickstart", + "vendor": "wordplat", + "version": { + "code": 6, + "name": "0.1.5" + }, + "apiVersion": { + "compatible": 5, + "target": 5, + "releaseType": "Beta1" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.wordplat.ikvstockchart", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "ikvstockchart", + "moduleType": "har" + } + } +} \ No newline at end of file diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/InteractiveKLineLayout.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/InteractiveKLineLayout.java index 60c49fb..5239eec 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/InteractiveKLineLayout.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/InteractiveKLineLayout.java @@ -18,45 +18,29 @@ package com.wordplat.ikvstockchart; -import android.content.Context; -import android.graphics.RectF; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.RadioButton; -import android.widget.RadioGroup; - import com.wordplat.ikvstockchart.compat.ViewUtils; -import com.wordplat.ikvstockchart.drawing.BOLLDrawing; -import com.wordplat.ikvstockchart.drawing.HighlightDrawing; -import com.wordplat.ikvstockchart.drawing.KDJDrawing; -import com.wordplat.ikvstockchart.drawing.KLineVolumeDrawing; -import com.wordplat.ikvstockchart.drawing.KLineVolumeHighlightDrawing; -import com.wordplat.ikvstockchart.drawing.MACDDrawing; -import com.wordplat.ikvstockchart.drawing.RSIDrawing; -import com.wordplat.ikvstockchart.drawing.StockIndexYLabelDrawing; -import com.wordplat.ikvstockchart.entry.Entry; -import com.wordplat.ikvstockchart.entry.StockBOLLIndex; -import com.wordplat.ikvstockchart.entry.StockKDJIndex; -import com.wordplat.ikvstockchart.entry.StockKLineVolumeIndex; -import com.wordplat.ikvstockchart.entry.StockMACDIndex; -import com.wordplat.ikvstockchart.entry.StockRSIIndex; +import com.wordplat.ikvstockchart.drawing.*; +import com.wordplat.ikvstockchart.entry.*; import com.wordplat.ikvstockchart.marker.XAxisTextMarkerView; import com.wordplat.ikvstockchart.marker.YAxisTextMarkerView; import com.wordplat.ikvstockchart.render.KLineRender; +import ohos.agp.components.*; +import ohos.agp.utils.Color; +import ohos.agp.utils.RectFloat; +import ohos.app.Context; +import ohos.multimodalinput.event.TouchEvent; + /** *

InteractiveKLineLayout

*

Date: 2017/3/22

* - * @deprecated 这是一个含有股票技术指标的K线图示例,建议不要使用这个类用于真实项目中,此示例对如何编写自己的自定义布局提供参考。 * @author afon + * @deprecated 这是一个含有股票技术指标的K线图示例,建议不要使用这个类用于真实项目中,此示例对如何编写自己的自定义布局提供参考。 */ @Deprecated -public class InteractiveKLineLayout extends FrameLayout implements View.OnClickListener { - private static final String TAG = "InteractiveKLineLayout"; +public class InteractiveKLineLayout extends StackLayout implements Component.ClickedListener { private Context context; @@ -72,36 +56,37 @@ public class InteractiveKLineLayout extends FrameLayout implements View.OnClickL private int stockMarkerViewHeight; private int stockIndexViewHeight; private int stockIndexTabHeight; - private RectF currentRect; + private RectFloat currentRect; - private RadioGroup But_Group; + private RadioContainer But_Group; private RadioButton MACD_But; private RadioButton RSI_But; private RadioButton KDJ_But; private RadioButton BOLL_But; + private boolean isOnClickButton; public InteractiveKLineLayout(Context context) { this(context, null); } - public InteractiveKLineLayout(Context context, AttributeSet attrs) { + public InteractiveKLineLayout(Context context, AttrSet attrs) { this(context, attrs, 0); } - public InteractiveKLineLayout(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); + public InteractiveKLineLayout(Context context, AttrSet attrs, int defStyleAttr) { + super(context, attrs, ""); this.context = context; - stockMarkerViewHeight = context.getResources().getDimensionPixelOffset(R.dimen.stock_marker_view_height); - stockIndexViewHeight = context.getResources().getDimensionPixelOffset(R.dimen.stock_index_view_height); - stockIndexTabHeight = context.getResources().getDimensionPixelOffset(R.dimen.stock_index_tab_height); + stockMarkerViewHeight = ViewUtils.vpToPx(context,15);; + stockIndexViewHeight = ViewUtils.vpToPx(context,100); + stockIndexTabHeight = ViewUtils.vpToPx(context,20);; initUI(context, attrs, defStyleAttr); } - private void initUI(Context context, AttributeSet attrs, int defStyleAttr) { - kLineView = new InteractiveKLineView(context); + private void initUI(Context context, AttrSet attrs, int defStyleAttr) { + kLineView = new InteractiveKLineView(context,attrs); kLineRender = (KLineRender) kLineView.getRender(); kLineRender.setSizeColor(ViewUtils.getSizeColor(context, attrs, defStyleAttr)); @@ -122,16 +107,15 @@ public class InteractiveKLineLayout extends FrameLayout implements View.OnClickL } @Override - public void onSingleTap(MotionEvent e, float x, float y) { + public void onSingleTap(TouchEvent e, float x, float y) { if (kLineHandler != null) { kLineHandler.onSingleTap(e, x, y); } - onTabClick(x, y); } @Override - public void onDoubleTap(MotionEvent e, float x, float y) { + public void onDoubleTap(TouchEvent e, float x, float y) { if (kLineHandler != null) { kLineHandler.onDoubleTap(e, x, y); } @@ -152,13 +136,17 @@ public class InteractiveKLineLayout extends FrameLayout implements View.OnClickL } }); - // 成交量 + /** + * 成交量 + */ StockKLineVolumeIndex kLineVolumeIndex = new StockKLineVolumeIndex(stockIndexViewHeight); kLineVolumeIndex.addDrawing(new KLineVolumeDrawing()); kLineVolumeIndex.addDrawing(new KLineVolumeHighlightDrawing()); kLineRender.addStockIndex(kLineVolumeIndex); - // MACD + /** + * MACD + */ HighlightDrawing macdHighlightDrawing = new HighlightDrawing(); macdHighlightDrawing.addMarkerView(new YAxisTextMarkerView(stockMarkerViewHeight)); @@ -169,7 +157,9 @@ public class InteractiveKLineLayout extends FrameLayout implements View.OnClickL macdIndex.setPaddingTop(stockIndexTabHeight); kLineRender.addStockIndex(macdIndex); - // RSI + /** + * RSI + */ HighlightDrawing rsiHighlightDrawing = new HighlightDrawing(); rsiHighlightDrawing.addMarkerView(new YAxisTextMarkerView(stockMarkerViewHeight)); @@ -180,7 +170,9 @@ public class InteractiveKLineLayout extends FrameLayout implements View.OnClickL rsiIndex.setPaddingTop(stockIndexTabHeight); kLineRender.addStockIndex(rsiIndex); - // KDJ + /** + * KDJ + */ HighlightDrawing kdjHighlightDrawing = new HighlightDrawing(); kdjHighlightDrawing.addMarkerView(new YAxisTextMarkerView(stockMarkerViewHeight)); @@ -191,7 +183,9 @@ public class InteractiveKLineLayout extends FrameLayout implements View.OnClickL kdjIndex.setPaddingTop(stockIndexTabHeight); kLineRender.addStockIndex(kdjIndex); - // BOLL + /** + * BOLL + */ HighlightDrawing bollHighlightDrawing = new HighlightDrawing(); bollHighlightDrawing.addMarkerView(new YAxisTextMarkerView(stockMarkerViewHeight)); @@ -205,23 +199,20 @@ public class InteractiveKLineLayout extends FrameLayout implements View.OnClickL kLineRender.addMarkerView(new YAxisTextMarkerView(stockMarkerViewHeight)); kLineRender.addMarkerView(new XAxisTextMarkerView(stockMarkerViewHeight)); - addView(kLineView); + addComponent(kLineView); } - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - - But_Group = (RadioGroup) findViewById(R.id.But_Group); - MACD_But = (RadioButton) findViewById(R.id.MACD_But); - RSI_But = (RadioButton) findViewById(R.id.RSI_But); - KDJ_But = (RadioButton) findViewById(R.id.KDJ_But); - BOLL_But = (RadioButton) findViewById(R.id.BOLL_But); + public void setClick(RadioContainer but_Group, RadioButton MACD_But, RadioButton RSI_But, RadioButton KDJ_But, RadioButton BOLL_But) { + this.But_Group = but_Group; + this.MACD_But = MACD_But; + this.RSI_But = RSI_But; + this.KDJ_But = KDJ_But; + this.BOLL_But = BOLL_But; - MACD_But.setOnClickListener(this); - RSI_But.setOnClickListener(this); - KDJ_But.setOnClickListener(this); - BOLL_But.setOnClickListener(this); + MACD_But.setClickedListener(this); + RSI_But.setClickedListener(this); + KDJ_But.setClickedListener(this); + BOLL_But.setClickedListener(this); showMACD(); } @@ -230,12 +221,24 @@ public class InteractiveKLineLayout extends FrameLayout implements View.OnClickL return kLineView; } + /** + * setKLineHandler + * + * @param kLineHandler + */ public void setKLineHandler(KLineHandler kLineHandler) { this.kLineHandler = kLineHandler; } private void onTabClick(float x, float y) { - if (currentRect.contains(x, y)) { + if (isOnClickButton) { + isOnClickButton = false; + return; + } + if (currentRect == null) { + return; + } + if (currentRect.isInclude(x, y)) { if (macdIndex.isEnable()) { showRSI(); } else if (rsiIndex.isEnable()) { @@ -254,76 +257,91 @@ public class InteractiveKLineLayout extends FrameLayout implements View.OnClickL } } - @Override - public void onClick(View v) { - final int id = v.getId(); - - if (id == R.id.MACD_But) { - showMACD(); - - } else if (id == R.id.RSI_But) { - showRSI(); - - } else if (id == R.id.KDJ_But) { - showKDJ(); - - } else if (id == R.id.BOLL_But) { - showBOLL(); - - } - - if (kLineHandler != null) { - kLineHandler.onCancelHighlight(); - } - - kLineView.notifyDataSetChanged(); - } - + /** + * showMACD + */ public void showMACD() { macdIndex.setEnable(true); rsiIndex.setEnable(false); kdjIndex.setEnable(false); bollIndex.setEnable(false); - But_Group.clearCheck(); MACD_But.setChecked(true); + RSI_But.setChecked(false); + KDJ_But.setChecked(false); + BOLL_But.setChecked(false); + + MACD_But.setTextColor(new Color(Color.rgb(30,130,210))); + RSI_But.setTextColor(new Color(Color.rgb(136,136,136))); + KDJ_But.setTextColor(new Color(Color.rgb(136,136,136))); + BOLL_But.setTextColor(new Color(Color.rgb(136,136,136))); currentRect = macdIndex.getRect(); } + /** + * showRSI + */ public void showRSI() { macdIndex.setEnable(false); rsiIndex.setEnable(true); kdjIndex.setEnable(false); bollIndex.setEnable(false); - But_Group.clearCheck(); + MACD_But.setChecked(false); RSI_But.setChecked(true); + KDJ_But.setChecked(false); + BOLL_But.setChecked(false); + + MACD_But.setTextColor(new Color(Color.rgb(136,136,136))); + RSI_But.setTextColor(new Color(Color.rgb(30,130,210))); + KDJ_But.setTextColor(new Color(Color.rgb(136,136,136))); + BOLL_But.setTextColor(new Color(Color.rgb(136,136,136))); currentRect = rsiIndex.getRect(); } + /** + * showKDJ + */ public void showKDJ() { macdIndex.setEnable(false); rsiIndex.setEnable(false); kdjIndex.setEnable(true); bollIndex.setEnable(false); - But_Group.clearCheck(); + MACD_But.setChecked(false); + RSI_But.setChecked(false); KDJ_But.setChecked(true); + BOLL_But.setChecked(false); + + MACD_But.setTextColor(new Color(Color.rgb(136,136,136))); + RSI_But.setTextColor(new Color(Color.rgb(136,136,136))); + KDJ_But.setTextColor(new Color(Color.rgb(30,130,210))); + BOLL_But.setTextColor(new Color(Color.rgb(136,136,136))); currentRect = kdjIndex.getRect(); } + /** + * showBOLL + */ public void showBOLL() { macdIndex.setEnable(false); rsiIndex.setEnable(false); kdjIndex.setEnable(false); bollIndex.setEnable(true); - But_Group.clearCheck(); + MACD_But.setChecked(false); + RSI_But.setChecked(false); + KDJ_But.setChecked(false); BOLL_But.setChecked(true); + MACD_But.setTextColor(new Color(Color.rgb(136,136,136))); + RSI_But.setTextColor(new Color(Color.rgb(136,136,136))); + KDJ_But.setTextColor(new Color(Color.rgb(136,136,136))); + BOLL_But.setTextColor(new Color(Color.rgb(30,130,210))); + currentRect = bollIndex.getRect(); } @@ -342,4 +360,25 @@ public class InteractiveKLineLayout extends FrameLayout implements View.OnClickL public boolean isShownBOLL() { return bollIndex.isEnable(); } + + @Override + public void onClick(Component component) { + final int id = component.getId(); + isOnClickButton = true; + if (id == ResourceTable.Id_MACD_But) { + showMACD(); + } else if (id == ResourceTable.Id_RSI_But) { + showRSI(); + } else if (id == ResourceTable.Id_KDJ_But) { + showKDJ(); + } else if (id == ResourceTable.Id_BOLL_But) { + showBOLL(); + } + + if (kLineHandler != null) { + kLineHandler.onCancelHighlight(); + } + + kLineView.notifyDataSetChanged(); + } } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/InteractiveKLineView.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/InteractiveKLineView.java index bc3379b..aff1b5d 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/InteractiveKLineView.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/InteractiveKLineView.java @@ -18,64 +18,118 @@ package com.wordplat.ikvstockchart; -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.RectF; -import android.support.v4.view.MotionEventCompat; -import android.support.v4.view.ViewCompat; -import android.support.v4.widget.ScrollerCompat; -import android.util.AttributeSet; -import android.util.Log; -import android.view.GestureDetector; -import android.view.MotionEvent; -import android.view.ScaleGestureDetector; -import android.view.View; -import android.view.ViewConfiguration; -import android.view.animation.Interpolator; +import com.wordplat.ikvstockchart.compat.GestureMoveActionCompat; import com.wordplat.ikvstockchart.compat.ViewUtils; +import com.wordplat.ikvstockchart.detector.GestureDetector; +import com.wordplat.ikvstockchart.detector.ScaleGestureDetector; +import com.wordplat.ikvstockchart.detector.ViewConfiguration; import com.wordplat.ikvstockchart.entry.Entry; import com.wordplat.ikvstockchart.entry.EntrySet; import com.wordplat.ikvstockchart.entry.StockDataTest; -import com.wordplat.ikvstockchart.compat.GestureMoveActionCompat; import com.wordplat.ikvstockchart.render.AbstractRender; import com.wordplat.ikvstockchart.render.KLineRender; +import ohos.agp.components.AttrSet; +import ohos.agp.components.Component; +import ohos.agp.components.ScrollHelper; +import ohos.agp.render.Canvas; +import ohos.agp.utils.RectFloat; +import ohos.agp.window.dialog.ToastDialog; +import ohos.app.Context; +import ohos.app.dispatcher.TaskDispatcher; +import ohos.eventhandler.EventHandler; +import ohos.hiviewdfx.HiLog; +import ohos.hiviewdfx.HiLogLabel; +import ohos.multimodalinput.event.MmiPoint; +import ohos.multimodalinput.event.TouchEvent; /** *

交互式 K 线图

*

Date: 2017/3/10

* * @author afon + * @since 2021-05-09 */ +public class InteractiveKLineView extends Component implements Component.DrawTask { + static final HiLogLabel LOG_LABEL = new HiLogLabel(HiLog.LOG_APP, 0x00201, "AbstractRender"); + private static final boolean DEBUG = true; + + /** + * 控制是否可以进行下拉刷新 + */ + private boolean isRefresh; + /** + * 与滚动控制、滑动加载数据相关的属性 + */ + /** + * dragging 松手之后回中的时间,单位:毫秒 + */ + private static final int OVERSCROLL_DURATION = 500; + /** + * dragging 的偏移量大于此值时即是一个有效的滑动加载 + */ + private static final int OVERSCROLL_THRESHOLD = 50; + /** + * 空闲 + */ + private static final int KLINE_STATUS_IDLE = 0; + /** + * 放手,回弹到 loading 位置 + */ + private static final int KLINE_STATUS_RELEASE_BACK = 2; + /** + * 加载中 + */ + private static final int KLINE_STATUS_LOADING = 3; + /** + * 加载结束,回弹到初始位置 + */ + private static final int KLINE_STATUS_SPRING_BACK = 4; + private final ScaleGestureDetector scaleDetector = new ScaleGestureDetector(getContext(), new ScaleGestureDetector.SimpleOnScaleGestureListener() { + @Override + public void onScaleEnd(ScaleGestureDetector detector) { + float f = detector.getScaleFactor(); -public class InteractiveKLineView extends View { - private static final String TAG = "InteractiveKLineView"; - private static final boolean DEBUG = false; + if (f < 1.0f) { + render.zoomOut(detector.getFocusX(), detector.getFocusY()); + } else if (f > 1.0f) { + render.zoomIn(detector.getFocusX(), detector.getFocusY()); + } + notifyDataSetChanged(); + } + }); - // 与视图大小相关的属性 - private final RectF viewRect; + private GestureMoveActionCompat gestureCompat = new GestureMoveActionCompat(null); + /** + * 与视图大小相关的属性 + */ + private final RectFloat viewRect; private final float viewPadding; - // 与数据加载、渲染相关的属性 + /** + * 与数据加载、渲染相关的属性 + */ private AbstractRender render; private EntrySet entrySet; private KLineHandler kLineHandler; - // 与滚动控制、滑动加载数据相关的属性 - private static final int OVERSCROLL_DURATION = 500; // dragging 松手之后回中的时间,单位:毫秒 - private static final int OVERSCROLL_THRESHOLD = 220; // dragging 的偏移量大于此值时即是一个有效的滑动加载 - private static final int KLINE_STATUS_IDLE = 0; // 空闲 - private static final int KLINE_STATUS_RELEASE_BACK = 2; // 放手,回弹到 loading 位置 - private static final int KLINE_STATUS_LOADING = 3; // 加载中 - private static final int KLINE_STATUS_SPRING_BACK = 4; // 加载结束,回弹到初始位置 + private int kLineStatus = KLINE_STATUS_IDLE; private int lastFlingX = 0; private int lastScrollDx = 0; - private int lastEntrySize = 0; // 上一次的 entry 列表大小,用于判断是否成功加载了数据 - private int lastHighlightIndex = -1; // 上一次高亮的 entry 索引,用于减少回调 - private final ScrollerCompat scroller; + /** + * 上一次的 entry 列表大小,用于判断是否成功加载了数据 + */ + private int lastEntrySize = 0; + /** + * 上一次高亮的 entry 索引,用于减少回调 + */ + private int lastHighlightIndex = -1; + private final ScrollHelper scroller; - // 与手势控制相关的属性 + /** + * 与手势控制相关的属性 + */ private boolean onTouch = false; private boolean onLongPress = false; private boolean onDoubleFingerPress = false; @@ -83,48 +137,89 @@ public class InteractiveKLineView extends View { private boolean onDragging = false; private boolean enableLeftRefresh = true; private boolean enableRightRefresh = true; + private long INVALIDATE_TIME_INTERVAL = 2000; + private boolean isEmpty; + /** + * InteractiveKLineView + * + * @param context + */ public InteractiveKLineView(Context context) { this(context, null); } - public InteractiveKLineView(Context context, AttributeSet attrs) { + /** + * InteractiveKLineView + * + * @param context + * @param attrs + */ + public InteractiveKLineView(Context context, AttrSet attrs) { this(context, attrs, 0); } - public InteractiveKLineView(Context context, AttributeSet attrs, int defStyleAttr) { + /** + * InteractiveKLineView + * + * @param context + * @param attrs + * @param defStyleAttr + */ + public InteractiveKLineView(Context context, AttrSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); - viewRect = new RectF(); - viewPadding = ViewUtils.dpTopx(context, 10); + viewRect = new RectFloat(); + viewPadding = ViewUtils.vpToPx(context, 10); render = new KLineRender(context); gestureDetector.setIsLongpressEnabled(true); - int touchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); + int touchSlop = ViewConfiguration.getScaledTouchSlop(); gestureCompat.setTouchSlop(touchSlop); - final Interpolator interpolator = new Interpolator() { - public float getInterpolation(float t) { - t -= 1.0f; - return t * t * t * t * t + 1.0f; - } - }; - - scroller = ScrollerCompat.create(context, interpolator); + scroller = new ScrollHelper(); render.setSizeColor(ViewUtils.getSizeColor(context, attrs, defStyleAttr)); + + setListener(); + } + + /** + * 获取是否可以下拉刷新 + * + * @return true + */ + public boolean isRefresh() { + return isRefresh; + } + + /** + * 设置是否可以下拉刷新 + * + * @param refresh + */ + public void setRefresh(boolean refresh) { + isRefresh = refresh; } public void setEntrySet(EntrySet set) { entrySet = set; } + /** + * notifyDataSetChanged + */ public void notifyDataSetChanged() { notifyDataSetChanged(true); } + /** + * notifyDataSetChanged + * + * @param invalidate + */ public void notifyDataSetChanged(boolean invalidate) { render.setViewRect(viewRect); render.onViewRect(viewRect); @@ -135,6 +230,11 @@ public class InteractiveKLineView extends View { } } + /** + * setRender + * + * @param render + */ public void setRender(AbstractRender render) { render.setSizeColor(this.render.getSizeColor()); this.render = render; @@ -148,50 +248,52 @@ public class InteractiveKLineView extends View { this.kLineHandler = kLineHandler; } - public RectF getViewRect() { + public RectFloat getViewRect() { return viewRect; } private final GestureDetector gestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() { + @Override - public void onLongPress(MotionEvent e) { + public void onLongPress(TouchEvent e) { if (onTouch) { onLongPress = true; - highlight(e.getX(), e.getY()); + MmiPoint point = e.getPointerPosition(e.getIndex()); + highlight(point.getX(), point.getY()); } } @Override - public boolean onDoubleTap(MotionEvent e) { + public boolean onDoubleTap(TouchEvent e) { if (kLineHandler != null) { - kLineHandler.onDoubleTap(e, e.getX(), e.getY()); + kLineHandler.onDoubleTap(e, e.getPointerPosition(e.getIndex()).getX(), e.getPointerPosition(e.getIndex()).getY()); } return true; } @Override - public boolean onSingleTapConfirmed(MotionEvent e) { + public boolean onSingleTapConfirmed(TouchEvent e) { if (kLineHandler != null) { - kLineHandler.onSingleTap(e, e.getX(), e.getY()); + kLineHandler.onSingleTap(e, e.getPointerPosition(e.getIndex()).getX(), e.getPointerPosition(e.getIndex()).getY()); } return true; } @Override - public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { + public boolean onScroll(TouchEvent e1, TouchEvent e2, float distanceX, float distanceY) { if (!onLongPress && !onDoubleFingerPress && !onVerticalMove) { if (onDragging && !render.canScroll(distanceX) && render.canDragging(distanceX)) { dragging((int) distanceX); if (DEBUG) { - Log.v(TAG, "##d dragging: -------> " + distanceX + ", maxScrollOffset = " + HiLog.info(LOG_LABEL, "##d dragging: -------> " + distanceX + ", maxScrollOffset = " + render.getMaxScrollOffset() + ", tranX = " + render.getCurrentTransX()); } } else { scroll((int) distanceX); if (DEBUG) { - Log.v(TAG, "##d scroll: -------> " + distanceX + ", maxScrollOffset = " + HiLog.info(LOG_LABEL, "##d scroll: -------> " + distanceX + ", maxScrollOffset = " + render.getMaxScrollOffset() + ", tranX = " + render.getCurrentTransX()); } } @@ -202,14 +304,14 @@ public class InteractiveKLineView extends View { } @Override - public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { + public boolean onFling(TouchEvent e1, TouchEvent e2, float velocityX, float velocityY, float scrollY0, float scrollY1) { lastFlingX = 0; if (!onLongPress && !onDoubleFingerPress && !onVerticalMove && render.canScroll(0)) { if (DEBUG) { - Log.d(TAG, "##d onFling: ------->"); + HiLog.info(LOG_LABEL, "##d onFling: ------->"); } - scroller.fling(0, 0, (int) -velocityX, 0, + scroller.doFling(0, 0, (int) -velocityX, 0, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE); return true; } else { @@ -218,23 +320,9 @@ public class InteractiveKLineView extends View { } }); - private final ScaleGestureDetector scaleDetector = new ScaleGestureDetector(getContext(), new ScaleGestureDetector.SimpleOnScaleGestureListener() { - @Override - public void onScaleEnd(ScaleGestureDetector detector) { - float f = detector.getScaleFactor(); - - if (f < 1.0f) { - render.zoomOut(detector.getFocusX(), detector.getFocusY()); - } else if (f > 1.0f) { - render.zoomIn(detector.getFocusX(), detector.getFocusY()); - } - } - }); - - private GestureMoveActionCompat gestureCompat = new GestureMoveActionCompat(null); private void highlight(float x, float y) { - render.onHighlight(x, y); + render.onHighlight(x, y - 128); invalidate(); int highlightIndex = render.getEntrySet().getHighlightIndex(); @@ -265,7 +353,14 @@ public class InteractiveKLineView extends View { */ public void scroll(float dx) { render.scroll(dx); - invalidate(); + notifyDataSetChanged(); + /** + * invalidate(); + */ + } + + public void isEmpty(boolean isEmpty) { + this.isEmpty = isEmpty; } /** @@ -274,10 +369,85 @@ public class InteractiveKLineView extends View { * @param dx 变化量 */ private void dragging(float dx) { - if (render.getMaxScrollOffset() < 0 || dx < 0) { - render.updateCurrentTransX(dx); - render.updateOverScrollOffset(dx); - invalidate(); + if (isEmpty) { + if (dx < 0) { + render.updateCurrentTransX(dx); + render.updateOverScrollOffset(dx); + notifyDataSetChanged(); + if (Math.abs(dx) > OVERSCROLL_THRESHOLD) { + if (enableLeftRefresh && dx > 0) { + lastScrollDx = (int) dx - OVERSCROLL_THRESHOLD; + } + if (enableRightRefresh && dx < 0) { + lastScrollDx = (int) dx + OVERSCROLL_THRESHOLD; + } + } + kLineStatus = KLINE_STATUS_LOADING; + if (kLineHandler != null) { + lastEntrySize = entrySet.getEntryList().size(); + if (lastScrollDx > 0) { + kLineHandler.onRightRefresh(); + } else if (lastScrollDx < 0) { + kLineHandler.onLeftRefresh(); + } + } else { + refreshComplete(); + } + notifyDataSetChanged(); + } else if (dx > 0){ + render.updateCurrentTransX(dx); + render.updateOverScrollOffset(dx); + notifyDataSetChanged(); + if (Math.abs(dx) > OVERSCROLL_THRESHOLD) { + if (enableLeftRefresh && dx > 0) { + lastScrollDx = (int) dx - OVERSCROLL_THRESHOLD; + } + if (enableRightRefresh && dx < 0) { + lastScrollDx = (int) dx + OVERSCROLL_THRESHOLD; + } + } + kLineStatus = KLINE_STATUS_LOADING; + if (kLineHandler != null) { + lastEntrySize = entrySet.getEntryList().size(); + if (lastScrollDx > 0) { + kLineHandler.onRightRefresh(); + } else if (lastScrollDx < 0) { + kLineHandler.onLeftRefresh(); + } + } else { + refreshComplete(); + } + notifyDataSetChanged(); + } + } else { + if (render.getMaxScrollOffset() < 0 || dx < 0) { + render.updateCurrentTransX(dx); + render.updateOverScrollOffset(dx); + notifyDataSetChanged(); + if (Math.abs(dx) > OVERSCROLL_THRESHOLD) { + if (enableLeftRefresh && dx > 0) { + lastScrollDx = (int) dx - OVERSCROLL_THRESHOLD; + } + if (enableRightRefresh && dx < 0) { + lastScrollDx = (int) dx + OVERSCROLL_THRESHOLD; + } + } + kLineStatus = KLINE_STATUS_LOADING; + if (kLineHandler != null) { + lastEntrySize = entrySet.getEntryList().size(); + if (lastScrollDx > 0) { + kLineHandler.onRightRefresh(); + } else if (lastScrollDx < 0) { + kLineHandler.onLeftRefresh(); + } + } else { + refreshComplete(); + } + notifyDataSetChanged(); + } + /** + * invalidate(); + */ } } @@ -305,115 +475,6 @@ public class InteractiveKLineView extends View { } } - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) { - viewRect.set(viewPadding, viewPadding, w - viewPadding, h - viewPadding); - - if (DEBUG) { - Log.i(TAG, "##d onSizeChanged: " + viewRect); - } - - // 在 Android Studio 预览模式下,添加一些测试数据,可以把 K 线图预览出来 - if (isInEditMode()) { - EntrySet entrySet = StockDataTest.parseKLineData(StockDataTest.KLINE); - if (entrySet != null) { - entrySet.computeStockIndex(); - } - - setEntrySet(entrySet); - } - if (entrySet == null) { - entrySet = new EntrySet(); - } - - notifyDataSetChanged(); - } - - @Override - public void computeScroll() { - if (onVerticalMove) { - return ; - } - - if (scroller.computeScrollOffset()) { - final int x = scroller.getCurrX(); - final int dx = x - lastFlingX; - lastFlingX = x; - - if (onTouch) { - scroller.abortAnimation(); - } else { - if (kLineStatus == KLINE_STATUS_RELEASE_BACK) { - releaseBack(dx); - } else if (kLineStatus == KLINE_STATUS_SPRING_BACK) { - springBack(dx); - } else { - scroll(dx); - } - - if (render.canScroll(dx) && !scroller.isFinished()) { - ViewCompat.postInvalidateOnAnimation(this); - } - } - - if (DEBUG) { - Log.i(TAG, "##d computeScrollOffset: canScroll = " + render.canScroll(dx) - + ", overScrollOffset = " + render.getOverScrollOffset() - + ", dx = " + dx + ", tranX = " + render.getCurrentTransX()); - } - } else { - final float overScrollOffset = render.getOverScrollOffset(); - if (DEBUG) { - Log.d(TAG, "##d overScrollOffset: canScroll = " + render.canScroll(0) - + ", overScrollOffset = " + overScrollOffset); - } - - if (!onTouch && overScrollOffset != 0 && kLineStatus == KLINE_STATUS_IDLE) { - lastScrollDx = 0; - float dx = overScrollOffset; - - if (Math.abs(overScrollOffset) > OVERSCROLL_THRESHOLD) { - if (enableLeftRefresh && overScrollOffset > 0) { - lastScrollDx = (int) overScrollOffset - OVERSCROLL_THRESHOLD; - - dx = lastScrollDx; - } - - if (enableRightRefresh && overScrollOffset < 0) { - lastScrollDx = (int) overScrollOffset + OVERSCROLL_THRESHOLD; - - dx = lastScrollDx; - } - } - - if (DEBUG) { - Log.d(TAG, "##d startScroll: LOADING... dx = " + dx); - } - - kLineStatus = KLINE_STATUS_RELEASE_BACK; - lastFlingX = 0; - scroller.startScroll(0, 0, (int) dx, 0, OVERSCROLL_DURATION); - ViewCompat.postInvalidateOnAnimation(this); - - } else if (kLineStatus == KLINE_STATUS_RELEASE_BACK) { - kLineStatus = KLINE_STATUS_LOADING; - - if (kLineHandler != null) { - lastEntrySize = entrySet.getEntryList().size(); - if (lastScrollDx > 0) { - kLineHandler.onLeftRefresh(); - } else if (lastScrollDx < 0) { - kLineHandler.onRightRefresh(); - } - } else { - refreshComplete(); - } - } else { - kLineStatus = KLINE_STATUS_IDLE; - } - } - } - /** * 加载完成 */ @@ -430,14 +491,21 @@ public class InteractiveKLineView extends View { final int overScrollOffset = (int) render.getOverScrollOffset(); if (DEBUG) { - Log.i(TAG, "##d refreshComplete: refreshComplete... overScrollOffset = " + overScrollOffset); + HiLog.info(LOG_LABEL, "##d refreshComplete: refreshComplete... overScrollOffset = " + overScrollOffset); } if (overScrollOffset != 0) { kLineStatus = KLINE_STATUS_SPRING_BACK; lastFlingX = 0; - scroller.startScroll(0, 0, reverse ? -overScrollOffset : overScrollOffset, 0, OVERSCROLL_DURATION); - ViewCompat.postInvalidateOnAnimation(this); + scroller.startScroll(0, 0, reverse ? -overScrollOffset : overScrollOffset, 0); + TaskDispatcher globalTaskDispatcher = mContext.getUITaskDispatcher(); + Runnable runnable = new Runnable() { + @Override + public void run() { + notifyDataSetChanged(); + } + }; + globalTaskDispatcher.delayDispatch(runnable, INVALIDATE_TIME_INTERVAL); } } @@ -457,70 +525,266 @@ public class InteractiveKLineView extends View { return render.isHighlight(); } - @Override - public boolean dispatchTouchEvent(MotionEvent event) { - boolean onHorizontalMove = gestureCompat.onTouchEvent(event, event.getX(), event.getY()); - final int action = MotionEventCompat.getActionMasked(event); + private void setListener() { + gestureCompat = new GestureMoveActionCompat(new GestureMoveActionCompat.OnGestureMoveListener() { + @Override + public void onHorizontalMove(TouchEvent e, float x, float y) { - onVerticalMove = false; + } - if (action == MotionEvent.ACTION_MOVE) { - if (!onHorizontalMove && !onLongPress && !onDoubleFingerPress && gestureCompat.isDragging()) { - onTouch = false; - onVerticalMove = true; + @Override + public void onVerticalMove(TouchEvent e, float x, float y) { + final int action = e.getAction(); + final boolean pointerUp = e.getAction() == TouchEvent.OTHER_POINT_UP; + final int skipIndex = pointerUp ? e.getIndex() : -1; + + float sumX = 0, sumY = 0; + final int count = e.getPointerCount(); + /** + * 把所有还在触摸的手指的位置x,y加起来,后面求平均数,算出中心焦点 + */ + for (int i = 0; i < count; i++) { + if (skipIndex == i) { + /** + * 跳过非主要指针的抬起动作 + */ + continue; + } + sumY += e.getPointerPosition(i).getY(); + } + final int div = pointerUp ? count - 1 : count; + /** + * 求平均值,算出中心焦点 + */ + final float endUpY = sumY / div; + + if (viewOnTouchInterface != null && !onLongPress) { + viewOnTouchInterface.touch(action, endUpY); + } } - } - getParent().requestDisallowInterceptTouchEvent(!onVerticalMove); + @Override + public void onClick(TouchEvent e, float x, float y) { - return super.dispatchTouchEvent(event); - } + } + }); + setLayoutRefreshedListener(new LayoutRefreshedListener() { + @Override + public void onRefreshed(Component component) { + viewRect.left = viewPadding; + viewRect.top = viewPadding; + viewRect.right = component.getWidth() - viewPadding; + viewRect.bottom = component.getHeight() - viewPadding; - @Override - public boolean onTouchEvent(MotionEvent e) { - final int action = MotionEventCompat.getActionMasked(e); - gestureDetector.onTouchEvent(e); - scaleDetector.onTouchEvent(e); + if (DEBUG) { + HiLog.info(LOG_LABEL, "##d onSizeChanged: " + viewRect); + } - switch (action) { - case MotionEvent.ACTION_DOWN: { - onTouch = true; - onDragging = false; - break; - } - case MotionEvent.ACTION_POINTER_DOWN: { - onDoubleFingerPress = true; - break; + if (entrySet == null) { + entrySet = new EntrySet(); + } + notifyDataSetChanged(); } - - case MotionEvent.ACTION_MOVE: { - onDragging = true; - if (onLongPress) { - highlight(e.getX(), e.getY()); + }); + setTouchEventListener(new TouchEventListener() { + @Override + public boolean onTouchEvent(Component component, TouchEvent touchEvent) { + final int action = touchEvent.getAction(); + final boolean pointerUp = touchEvent.getAction() == TouchEvent.OTHER_POINT_UP; + final int skipIndex = pointerUp ? touchEvent.getIndex() : -1; + + float sumX = 0, sumY = 0; + final int count = touchEvent.getPointerCount(); + /** + * 把所有还在触摸的手指的位置x,y加起来,后面求平均数,算出中心焦点 + */ + for (int i = 0; i < count; i++) { + if (skipIndex == i) { + /** + * 跳过非主要指针的抬起动作 + */ + continue; + } + sumY += touchEvent.getPointerPosition(i).getY(); + } + final int div = pointerUp ? count - 1 : count; + /** + * 求平均值,算出中心焦点 + */ + final float endUpY = sumY / div; + boolean onHorizontalMove = gestureCompat.onTouchEvent(touchEvent, touchEvent.getPointerPosition(touchEvent.getIndex()).getX(), touchEvent.getPointerPosition(touchEvent.getIndex()).getY()); + + onVerticalMove = false; + + gestureDetector.onTouchEvent(touchEvent); + scaleDetector.onTouchEvent(touchEvent); + + switch (action) { + case TouchEvent.PRIMARY_POINT_DOWN: { + onTouch = true; + onDragging = false; + viewOnTouchInterface.touch(action,endUpY); + break; + } + case TouchEvent.OTHER_POINT_DOWN: { + onDoubleFingerPress = true; + break; + } + case TouchEvent.POINT_MOVE: { + onDragging = true; + if (onLongPress) { + highlight(touchEvent.getPointerPosition(touchEvent.getIndex()).getX(), touchEvent.getPointerPosition(touchEvent.getIndex()).getY()); + } + if (!onHorizontalMove && !onLongPress && !onDoubleFingerPress && gestureCompat.isDragging()) { + onTouch = false; + onVerticalMove = true; + } + break; + } + case TouchEvent.PRIMARY_POINT_UP: + if (viewOnTouchInterface != null) { + viewOnTouchInterface.touch(action,0); + } + viewOnTouchInterface.touch(action,endUpY); + case TouchEvent.CANCEL: { + onLongPress = false; + onDoubleFingerPress = false; + onTouch = false; + onDragging = false; + cancelHighlight(); + break; + } + default: + break; } - break; + return true; } + }); + addDrawTask(this); + setScrolledListener(new ScrolledListener() { + @Override + public void onContentScrolled(Component component, int i, int i1, int i2, int i3) { + if (onVerticalMove) { + return; + } - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: { - onLongPress = false; - onDoubleFingerPress = false; - onTouch = false; - onDragging = false; + if (scroller.isFinished()) { + final int x = scroller.getCurrValue(VERTICAL); + final int dx = x - lastFlingX; + lastFlingX = x; + + if (onTouch) { + scroller.abortAnimation(); + } else { + if (kLineStatus == KLINE_STATUS_RELEASE_BACK) { + releaseBack(dx); + } else if (kLineStatus == KLINE_STATUS_SPRING_BACK) { + springBack(dx); + } else { + scroll(dx); + } + + if (render.canScroll(dx) && !scroller.isFinished()) { + EventHandler.current().postTask(new Runnable() { + @Override + public void run() { + invalidate(); + } + }, INVALIDATE_TIME_INTERVAL); + } + } - cancelHighlight(); + if (DEBUG) { + HiLog.info(LOG_LABEL, "##d computeScrollOffset: canScroll = " + render.canScroll(dx) + + ", overScrollOffset = " + render.getOverScrollOffset() + + ", dx = " + dx + ", tranX = " + render.getCurrentTransX()); + } + } else { + final float overScrollOffset = render.getOverScrollOffset(); + if (DEBUG) { + HiLog.info(LOG_LABEL, "##d overScrollOffset: canScroll = " + render.canScroll(0) + + ", overScrollOffset = " + overScrollOffset); + } - break; + if (!onTouch && overScrollOffset != 0 && kLineStatus == KLINE_STATUS_IDLE) { + lastScrollDx = 0; + float dx = overScrollOffset; + + if (Math.abs(overScrollOffset) > OVERSCROLL_THRESHOLD) { + if (enableLeftRefresh && overScrollOffset > 0) { + lastScrollDx = (int) overScrollOffset - OVERSCROLL_THRESHOLD; + + dx = lastScrollDx; + } + + if (enableRightRefresh && overScrollOffset < 0) { + lastScrollDx = (int) overScrollOffset + OVERSCROLL_THRESHOLD; + + dx = lastScrollDx; + } + } + + if (DEBUG) { + HiLog.debug(LOG_LABEL, "##d startScroll: LOADING... dx = " + dx); + } + + kLineStatus = KLINE_STATUS_RELEASE_BACK; + lastFlingX = 0; + scroller.startScroll(0, 0, (int) dx, 0); + EventHandler.current().postTask(new Runnable() { + @Override + public void run() { + invalidate(); + } + }, INVALIDATE_TIME_INTERVAL); + + } else if (kLineStatus == KLINE_STATUS_RELEASE_BACK) { + kLineStatus = KLINE_STATUS_LOADING; + + if (kLineHandler != null) { + lastEntrySize = entrySet.getEntryList().size(); + if (lastScrollDx > 0) { + kLineHandler.onLeftRefresh(); + } else if (lastScrollDx < 0) { + kLineHandler.onRightRefresh(); + } + } else { + refreshComplete(); + } + } else { + kLineStatus = KLINE_STATUS_IDLE; + } + } } - } - return true; + @Override + public void scrolledStageUpdate(Component component, int newStage) { + + } + }); } + @Override - protected void onDraw(Canvas canvas) { + public void onDraw(Component component, Canvas canvas) { render.render(canvas); + postLayout(); + } + + public ViewOnTouchInterface viewOnTouchInterface; + + /** + * 定义回调方法 + * + * @param viewOnTouchInterface + */ + public void setOnTouchInterface(ViewOnTouchInterface viewOnTouchInterface) { + this.viewOnTouchInterface = viewOnTouchInterface; + } + + public interface ViewOnTouchInterface { + boolean touch(int getAction, float endUpY); } } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/KLineHandler.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/KLineHandler.java index 689de73..b95c0e7 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/KLineHandler.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/KLineHandler.java @@ -18,28 +18,58 @@ package com.wordplat.ikvstockchart; -import android.view.MotionEvent; import com.wordplat.ikvstockchart.entry.Entry; +import ohos.multimodalinput.event.TouchEvent; /** *

KLineHandler

*

Date: 2017/3/22

* * @author afon + * @since 2021-05-09 */ - public interface KLineHandler { - + /** + * onLeftRefresh + */ void onLeftRefresh(); + /** + * onRightRefresh + */ void onRightRefresh(); - void onSingleTap(MotionEvent e, float x, float y); + /** + * onSingleTap + * + * @param e + * @param x + * @param y + */ + void onSingleTap(TouchEvent e, float x, float y); - void onDoubleTap(MotionEvent e, float x, float y); + /** + * onDoubleTap + * + * @param e + * @param x + * @param y + */ + void onDoubleTap(TouchEvent e, float x, float y); + /** + * onHighlight + * + * @param entry + * @param entryIndex + * @param x + * @param y + */ void onHighlight(Entry entry, int entryIndex, float x, float y); + /** + * onCancelHighlight + */ void onCancelHighlight(); } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/SimpleKLineHandler.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/SimpleKLineHandler.java index e3a5b90..c71be92 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/SimpleKLineHandler.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/SimpleKLineHandler.java @@ -18,32 +18,50 @@ package com.wordplat.ikvstockchart; -import android.view.MotionEvent; - import com.wordplat.ikvstockchart.entry.Entry; +import ohos.multimodalinput.event.TouchEvent; /** *

SimpleKLineHandler

*

Date: 2017/3/22

* * @author afon + * @since 2021-05-09 */ - public class SimpleKLineHandler implements KLineHandler { - + /** + * onLeftRefresh + */ public void onLeftRefresh() { } + /** + * onRightRefresh + */ public void onRightRefresh() { } - public void onSingleTap(MotionEvent e, float x, float y) { + /** + * onSingleTap + * + * @param e + * @param x + * @param y + */ + public void onSingleTap(TouchEvent e, float x, float y) { } - public void onDoubleTap(MotionEvent e, float x, float y) { + /** + * onDoubleTap + * + * @param e + * @param x + * @param y + */ + public void onDoubleTap(TouchEvent e, float x, float y) { } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/align/XMarkerAlign.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/align/XMarkerAlign.java index e0fb42f..49c2af1 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/align/XMarkerAlign.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/align/XMarkerAlign.java @@ -5,13 +5,11 @@ package com.wordplat.ikvstockchart.align; *

Date: 2017/4/25

* * @author afon + * @since 2021-05-09 */ - public enum XMarkerAlign { - - TOP, - - BOTTOM, - - AUTO, + /** + * TOP BOTTOM AUTO + */ + TOP, BOTTOM, AUTO, } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/align/YLabelAlign.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/align/YLabelAlign.java index 49934bd..483216e 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/align/YLabelAlign.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/align/YLabelAlign.java @@ -5,11 +5,11 @@ package com.wordplat.ikvstockchart.align; *

Date: 2017/4/25

* * @author afon + * @since 2021-05-09 */ - public enum YLabelAlign { - - LEFT, - - RIGHT, + /** + * LEFT RIGHT + */ + LEFT, RIGHT, } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/align/YMarkerAlign.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/align/YMarkerAlign.java index 7b7049f..e004048 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/align/YMarkerAlign.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/align/YMarkerAlign.java @@ -5,13 +5,11 @@ package com.wordplat.ikvstockchart.align; *

Date: 2017/4/25

* * @author afon + * @since 2021-05-09 */ - public enum YMarkerAlign { - - LEFT, - - RIGHT, - - AUTO, + /** + * LEFT, RIGHT AUTO + */ + LEFT, RIGHT, AUTO, } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/compat/GestureMoveActionCompat.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/compat/GestureMoveActionCompat.java index d6a0fc9..590c98d 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/compat/GestureMoveActionCompat.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/compat/GestureMoveActionCompat.java @@ -18,15 +18,16 @@ package com.wordplat.ikvstockchart.compat; -import android.view.MotionEvent; + +import ohos.multimodalinput.event.TouchEvent; /** *

横向移动、垂直移动 识别,解决滑动冲突用的

*

Date: 2017/1/22

* * @author afon + * @since 2021-05-09 */ - public class GestureMoveActionCompat { private OnGestureMoveListener gestureMoveListener; @@ -47,16 +48,16 @@ public class GestureMoveActionCompat { /** * 是否响应点击事件 - * + *

* 因为有手指抖动的影响,有时候会产生少量的 ACTION_MOVE 事件,造成程序识别错误。 - * 如果需要减少识别错误的几率,使用 {@link GestureMoveDetectorCompat} 这个类。 + * 如果需要减少识别错误的几率,使用 {@link com.wordplat.ikvstockchart.detector.GestureDetector} 这个类。 */ private boolean mEnableClick = true; /** * 避免程序识别错误的一个阀值。只有触摸移动的距离大于这个阀值时,才认为是一个有效的移动。 */ - private int touchSlop = 20; + private int touchSlop = 300; private boolean dragging = false; @@ -80,19 +81,18 @@ public class GestureMoveActionCompat { * @param e 事件 e * @param x 本次事件的坐标 x。可以是 e.getRawX() 或是 e.getX(),具体看情况 * @param y 本次事件的坐标 y。可以是 e.getRawY() 或是 e.getY(),具体看情况 - * * @return 事件是否是横向滑动 */ - public boolean onTouchEvent(MotionEvent e, float x, float y) { + public boolean onTouchEvent(TouchEvent e, float x, float y) { switch (e.getAction()) { - case MotionEvent.ACTION_DOWN: + case TouchEvent.PRIMARY_POINT_DOWN: lastMotionY = y; lastMotionX = x; interceptStatus = 0; dragging = false; break; - case MotionEvent.ACTION_MOVE: + case TouchEvent.POINT_MOVE: float deltaY = Math.abs(y - lastMotionY); float deltaX = Math.abs(x - lastMotionX); @@ -120,7 +120,7 @@ public class GestureMoveActionCompat { } break; - case MotionEvent.ACTION_UP: + case TouchEvent.PRIMARY_POINT_UP: if (interceptStatus == 0) { if (mEnableClick && gestureMoveListener != null) { gestureMoveListener.onClick(e, x, y); @@ -129,25 +129,44 @@ public class GestureMoveActionCompat { interceptStatus = 0; dragging = false; break; + default: + break; } return interceptStatus == 2; } + /** + * OnGestureMoveListener + * + * @since 2021-05-09 + */ public interface OnGestureMoveListener { /** * 横向移动 + * + * @param e + * @param x + * @param y */ - void onHorizontalMove(MotionEvent e, float x, float y); + void onHorizontalMove(TouchEvent e, float x, float y); /** * 垂直移动 + * + * @param e + * @param x + * @param y */ - void onVerticalMove(MotionEvent e, float x, float y); + void onVerticalMove(TouchEvent e, float x, float y); /** * 点击事件 + * + * @param e + * @param x + * @param y */ - void onClick(MotionEvent e, float x, float y); + void onClick(TouchEvent e, float x, float y); } } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/compat/PerformenceAnalyser.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/compat/PerformenceAnalyser.java index 9321290..7bd5f02 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/compat/PerformenceAnalyser.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/compat/PerformenceAnalyser.java @@ -18,7 +18,8 @@ package com.wordplat.ikvstockchart.compat; -import android.util.Log; +import ohos.hiviewdfx.HiLog; +import ohos.hiviewdfx.HiLogLabel; import java.util.HashMap; import java.util.Map; @@ -31,6 +32,11 @@ import java.util.Map; */ public class PerformenceAnalyser { + /** + * HiLogLabel + */ + static final HiLogLabel LABEL = new HiLogLabel(HiLog.LOG_APP, 0x00201, "PerformenceAnalyser"); + private static final String TAG = "PerformenceAnalyser"; private static volatile PerformenceAnalyser instance; @@ -45,7 +51,7 @@ public class PerformenceAnalyser { analyserCallback = new AnalyserCallback() { @Override public void onWatcherFinish(String key, int item, long ns, long ms) { - Log.d(TAG, "##d onWatcherFinish: " + key + "[" + item + "][" + ms + "ms]"); + HiLog.info(LABEL, "##d onWatcherFinish: " + key + "[" + item + "][" + ms + "ms]"); } }; } @@ -97,20 +103,30 @@ public class PerformenceAnalyser { } } + /** + * CountStops + * + * @since 2021-05-09 + */ private static class CountStops { int stops; long time; } + /** + * AnalyserCallback + * + * @since 2021-05-09 + */ public interface AnalyserCallback { /** * 观察完成 * - * @param key key + * @param key key * @param item 第几项 - * @param ns 纳秒 - * @param ms 毫秒 + * @param ns 纳秒 + * @param ms 毫秒 */ void onWatcherFinish(String key, int item, long ns, long ms); } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/compat/ViewUtils.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/compat/ViewUtils.java index efc9bba..d47ce5e 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/compat/ViewUtils.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/compat/ViewUtils.java @@ -18,43 +18,50 @@ package com.wordplat.ikvstockchart.compat; -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Paint; -import android.text.TextUtils; -import android.util.AttributeSet; -import com.wordplat.ikvstockchart.R; import com.wordplat.ikvstockchart.align.XMarkerAlign; import com.wordplat.ikvstockchart.align.YLabelAlign; import com.wordplat.ikvstockchart.align.YMarkerAlign; import com.wordplat.ikvstockchart.entry.Entry; import com.wordplat.ikvstockchart.entry.EntrySet; import com.wordplat.ikvstockchart.entry.SizeColor; +import com.wordplat.ikvstockchart.utils.TypedAttrUtils; +import ohos.agp.components.AttrHelper; +import ohos.agp.components.AttrSet; +import ohos.agp.render.Paint; +import ohos.agp.utils.Color; +import ohos.app.Context; + +import static ohos.agp.components.AttrHelper.getDensity; /** *

ViewUtils

*

Date: 2017/3/29

* - * @author afon + * @author + * @since 2021-05-09 */ - public class ViewUtils { - /** - * 根据手机的分辨率从 dp 的单位 转成为 px(像素) + * 根据手机的分辨率从 vp 的单位 转成为 px(像素) + * + * @param context + * @param vp + * @return int */ - public static int dpTopx(Context context, float dpValue) { - final float scale = context.getResources().getDisplayMetrics().density; - return (int) (dpValue * scale + 0.5f); + public static int vpToPx(final Context context, final float vp) { + return AttrHelper.vp2px(vp, getDensity(context)); } /** - * 根据手机的分辨率从 px(像素) 的单位 转成为 dp + * 根据手机的分辨率从 px(像素) 的单位 转成为 vp + * + * @param context + * @param px + * @return int */ - public static int pxTodp(Context context, float pxValue) { - final float scale = context.getResources().getDisplayMetrics().density; - return (int) (pxValue / scale + 0.5f); + public static int pxTovp(final Context context, final float px) { + return Math.round(px / getDensity(context) + 0.5f); } /** @@ -65,40 +72,40 @@ public class ViewUtils { // 设置 涨、跌的颜色 if (entry.getClose() > entry.getOpen()) { // 今日收盘价大于今日开盘价为涨 - candlePaint.setColor(sizeColor.getIncreasingColor()); + candlePaint.setColor(new Color(sizeColor.getIncreasingColor())); } else if (entry.getClose() == entry.getOpen()) { // 今日收盘价等于今日开盘价有涨停、跌停、不涨不跌三种情况 if (currentEntryIndex > 0) { if (entry.getOpen() > entrySet.getEntryList().get(currentEntryIndex - 1).getClose()) { // 今日开盘价大于昨日收盘价为涨停 - candlePaint.setColor(sizeColor.getIncreasingColor()); + candlePaint.setColor(new Color(sizeColor.getIncreasingColor())); } else if (entry.getOpen() == entrySet.getEntryList().get(currentEntryIndex - 1).getClose()) { // 不涨不跌 - candlePaint.setColor(sizeColor.getNeutralColor()); + candlePaint.setColor(new Color(sizeColor.getNeutralColor())); } else { // 否则为跌停 - candlePaint.setColor(sizeColor.getDecreasingColor()); + candlePaint.setColor(new Color(sizeColor.getDecreasingColor())); } } else { if (entry.getOpen() > entrySet.getPreClose()) { - candlePaint.setColor(sizeColor.getIncreasingColor()); + candlePaint.setColor(new Color(sizeColor.getIncreasingColor())); } else if (entry.getOpen() == entrySet.getPreClose()) { - candlePaint.setColor(sizeColor.getNeutralColor()); + candlePaint.setColor(new Color(sizeColor.getNeutralColor())); } else { - candlePaint.setColor(sizeColor.getDecreasingColor()); + candlePaint.setColor(new Color(sizeColor.getDecreasingColor())); } } } else { // 今日收盘价小于今日开盘价为跌 - candlePaint.setColor(sizeColor.getDecreasingColor()); + candlePaint.setColor(new Color(sizeColor.getDecreasingColor())); } - if (candlePaint.getColor() == sizeColor.getIncreasingColor()) { - if (sizeColor.getIncreasingStyle() == Paint.Style.STROKE) { - candlePaint.setStyle(Paint.Style.STROKE); + if (candlePaint.getColor().getValue() == sizeColor.getIncreasingColor()) { + if (sizeColor.getIncreasingStyle() == Paint.Style.STROKE_STYLE) { + candlePaint.setStyle(Paint.Style.STROKE_STYLE); } else { - candlePaint.setStyle(Paint.Style.FILL_AND_STROKE); + candlePaint.setStyle(Paint.Style.FILLANDSTROKE_STYLE); } } else { - if (sizeColor.getDecreasingStyle() == Paint.Style.STROKE) { - candlePaint.setStyle(Paint.Style.STROKE); + if (sizeColor.getDecreasingStyle() == Paint.Style.STROKE_STYLE) { + candlePaint.setStyle(Paint.Style.STROKE_STYLE); } else { - candlePaint.setStyle(Paint.Style.FILL_AND_STROKE); + candlePaint.setStyle(Paint.Style.FILLANDSTROKE_STYLE); } } @@ -108,234 +115,162 @@ public class ViewUtils { /** * 初始化 SizeColor */ - public static SizeColor getSizeColor(Context context, AttributeSet attrs, int defStyleAttr) { - final TypedArray a = context.getTheme().obtainStyledAttributes( - attrs, R.styleable.InteractiveKLineView, defStyleAttr, defStyleAttr); + public static SizeColor getSizeColor(Context context, AttrSet attrs, int defStyleAttr) { final SizeColor sizeColor = new SizeColor(); try { - // 与轴、网格有关的属性 - sizeColor.setXLabelSize(a.getDimension(R.styleable.InteractiveKLineView_xLabelSize, - sizeColor.getXLabelSize())); - - sizeColor.setXLabelColor(a.getColor(R.styleable.InteractiveKLineView_xLabelColor, - sizeColor.getXLabelColor())); - - sizeColor.setXLabelViewHeight(a.getDimension(R.styleable.InteractiveKLineView_xLabelViewHeight, - sizeColor.getXLabelViewHeight())); - - sizeColor.setYLabelSize(a.getDimension(R.styleable.InteractiveKLineView_yLabelSize, - sizeColor.getYLabelSize())); - - sizeColor.setYLabelColor(a.getColor(R.styleable.InteractiveKLineView_yLabelColor, - sizeColor.getYLabelColor())); - - int align = a.getInteger(R.styleable.InteractiveKLineView_yLabelAlign, YLabelAlign.LEFT.ordinal()); - sizeColor.setYLabelAlign(YLabelAlign.values()[align]); - - sizeColor.setAxisSize(a.getDimension(R.styleable.InteractiveKLineView_axisSize, - sizeColor.getAxisSize())); - - sizeColor.setAxisColor(a.getColor(R.styleable.InteractiveKLineView_axisColor, - sizeColor.getAxisColor())); - - sizeColor.setGridSize(a.getDimension(R.styleable.InteractiveKLineView_gridSize, - sizeColor.getGridSize())); - - sizeColor.setGridColor(a.getColor(R.styleable.InteractiveKLineView_gridColor, - sizeColor.getGridColor())); - - // 与高亮、MarkerView 有关的属性 - sizeColor.setHighlightSize(a.getDimension(R.styleable.InteractiveKLineView_highlightSize, - sizeColor.getHighlightSize())); - - sizeColor.setHighlightColor(a.getColor(R.styleable.InteractiveKLineView_highlightColor, - sizeColor.getHighlightColor())); - - sizeColor.setMarkerBorderSize(a.getDimension(R.styleable.InteractiveKLineView_markerBorderSize, - sizeColor.getMarkerBorderSize())); - - sizeColor.setMarkerBorderColor(a.getColor(R.styleable.InteractiveKLineView_markerBorderColor, - sizeColor.getMarkerBorderColor())); - - sizeColor.setMarkerTextSize(a.getDimension(R.styleable.InteractiveKLineView_markerTextSize, - sizeColor.getMarkerTextSize())); - - sizeColor.setMarkerTextColor(a.getColor(R.styleable.InteractiveKLineView_markerTextColor, - sizeColor.getMarkerTextColor())); - - align = a.getInteger(R.styleable.InteractiveKLineView_xMarkerAlign, XMarkerAlign.AUTO.ordinal()); - sizeColor.setXMarkerAlign(XMarkerAlign.values()[align]); - - align = a.getInteger(R.styleable.InteractiveKLineView_yMarkerAlign, YMarkerAlign.AUTO.ordinal()); - sizeColor.setYMarkerAlign(YMarkerAlign.values()[align]); - - // 与分时图有关的属性 - sizeColor.setTimeLineSize(a.getDimension(R.styleable.InteractiveKLineView_timeLineSize, - sizeColor.getTimeLineSize())); - - sizeColor.setTimeLineColor(a.getColor(R.styleable.InteractiveKLineView_timeLineColor, - sizeColor.getTimeLineColor())); - - sizeColor.setTimeLineMaxCount(a.getInteger(R.styleable.InteractiveKLineView_timeLineMaxCount, - sizeColor.getTimeLineMaxCount())); - - // 与蜡烛图有关的属性 - sizeColor.setCandleBorderSize(a.getDimension(R.styleable.InteractiveKLineView_candleBorderSize, - sizeColor.getCandleBorderSize())); - - sizeColor.setCandleExtremumLabelSize(a.getDimension(R.styleable.InteractiveKLineView_candleExtremumLabelSize, - sizeColor.getCandleExtremumLabelSize())); - - sizeColor.setCandleExtremumLableColor(a.getColor(R.styleable.InteractiveKLineView_candleExtremumLableColor, - sizeColor.getCandleExtremumLableColor())); - - sizeColor.setShadowSize(a.getDimension(R.styleable.InteractiveKLineView_shadowSize, - sizeColor.getShadowSize())); - - sizeColor.setIncreasingColor(a.getColor(R.styleable.InteractiveKLineView_increasingColor, - sizeColor.getIncreasingColor())); - - sizeColor.setDecreasingColor(a.getColor(R.styleable.InteractiveKLineView_decreasingColor, - sizeColor.getDecreasingColor())); - - sizeColor.setNeutralColor(a.getColor(R.styleable.InteractiveKLineView_neutralColor, - sizeColor.getNeutralColor())); - - sizeColor.setPortraitDefaultVisibleCount(a.getInteger(R.styleable.InteractiveKLineView_portraitDefaultVisibleCount, - sizeColor.getPortraitDefaultVisibleCount())); - - sizeColor.setZoomInTimes(a.getInteger(R.styleable.InteractiveKLineView_zoomInTimes, - sizeColor.getZoomInTimes())); - - sizeColor.setZoomOutTimes(a.getInteger(R.styleable.InteractiveKLineView_zoomOutTimes, - sizeColor.getZoomOutTimes())); - - int style = a.getInteger(R.styleable.InteractiveKLineView_increasingStyle, Paint.Style.FILL.ordinal()); - sizeColor.setIncreasingStyle(Paint.Style.values()[style]); - - style = a.getInteger(R.styleable.InteractiveKLineView_decreasingStyle, Paint.Style.FILL.ordinal()); - sizeColor.setDecreasingStyle(Paint.Style.values()[style]); - - // 与股票指标有关的属性 - sizeColor.setMaLineSize(a.getDimension(R.styleable.InteractiveKLineView_maLineSize, - sizeColor.getMaLineSize())); - - sizeColor.setMa5Color(a.getColor(R.styleable.InteractiveKLineView_ma5Color, - sizeColor.getMa5Color())); - - sizeColor.setMa10Color(a.getColor(R.styleable.InteractiveKLineView_ma10Color, - sizeColor.getMa10Color())); - - sizeColor.setMa20Color(a.getColor(R.styleable.InteractiveKLineView_ma20Color, - sizeColor.getMa20Color())); - - sizeColor.setBollLineSize(a.getDimension(R.styleable.InteractiveKLineView_bollLineSize, - sizeColor.getBollLineSize())); - - sizeColor.setBollMidLineColor(a.getColor(R.styleable.InteractiveKLineView_bollMidLineColor, - sizeColor.getBollMidLineColor())); - - sizeColor.setBollUpperLineColor(a.getColor(R.styleable.InteractiveKLineView_bollUpperLineColor, - sizeColor.getBollUpperLineColor())); - - sizeColor.setBollLowerLineColor(a.getColor(R.styleable.InteractiveKLineView_bollLowerLineColor, - sizeColor.getBollLowerLineColor())); - - sizeColor.setKdjLineSize(a.getDimension(R.styleable.InteractiveKLineView_kdjLineSize, - sizeColor.getKdjLineSize())); - - sizeColor.setKdjKLineColor(a.getColor(R.styleable.InteractiveKLineView_kdjKLineColor, - sizeColor.getKdjKLineColor())); - - sizeColor.setKdjDLineColor(a.getColor(R.styleable.InteractiveKLineView_kdjDLineColor, - sizeColor.getKdjDLineColor())); - - sizeColor.setKdjJLineColor(a.getColor(R.styleable.InteractiveKLineView_kdjJLineColor, - sizeColor.getKdjJLineColor())); - - sizeColor.setMacdLineSize(a.getDimension(R.styleable.InteractiveKLineView_macdLineSize, - sizeColor.getMacdLineSize())); - - sizeColor.setMacdHighlightTextColor(a.getColor(R.styleable.InteractiveKLineView_macdHighlightTextColor, - sizeColor.getMacdHighlightTextColor())); - - sizeColor.setDeaLineColor(a.getColor(R.styleable.InteractiveKLineView_deaLineColor, - sizeColor.getDeaLineColor())); - - sizeColor.setDiffLineColor(a.getColor(R.styleable.InteractiveKLineView_diffLineColor, - sizeColor.getDiffLineColor())); - - sizeColor.setRsiLineSize(a.getDimension(R.styleable.InteractiveKLineView_rsiLineSize, - sizeColor.getRsiLineSize())); - - sizeColor.setRsi1LineColor(a.getColor(R.styleable.InteractiveKLineView_rsi1LineColor, - sizeColor.getRsi1LineColor())); - - sizeColor.setRsi2LineColor(a.getColor(R.styleable.InteractiveKLineView_rsi2LineColor, - sizeColor.getRsi2LineColor())); - - sizeColor.setRsi3LineColor(a.getColor(R.styleable.InteractiveKLineView_rsi3LineColor, - sizeColor.getRsi3LineColor())); - - sizeColor.setMaTextSize(a.getDimension(R.styleable.InteractiveKLineView_maTextSize, - sizeColor.getMaTextSize())); - - sizeColor.setMaTextColor(a.getColor(R.styleable.InteractiveKLineView_maTextColor, - sizeColor.getMaTextColor())); - - sizeColor.setBollTextSize(a.getDimension(R.styleable.InteractiveKLineView_bollTextSize, - sizeColor.getBollTextSize())); - - sizeColor.setBollTextColor(a.getColor(R.styleable.InteractiveKLineView_bollTextColor, - sizeColor.getBollTextColor())); - - sizeColor.setKdjTextSize(a.getDimension(R.styleable.InteractiveKLineView_kdjTextSize, - sizeColor.getKdjTextSize())); - - sizeColor.setKdjTextColor(a.getColor(R.styleable.InteractiveKLineView_kdjTextColor, - sizeColor.getKdjTextColor())); - - sizeColor.setMacdTextSize(a.getDimension(R.styleable.InteractiveKLineView_macdTextSize, - sizeColor.getMacdTextSize())); - - sizeColor.setMacdTextColor(a.getColor(R.styleable.InteractiveKLineView_macdTextColor, - sizeColor.getMacdTextColor())); - - sizeColor.setRsiTextSize(a.getDimension(R.styleable.InteractiveKLineView_rsiTextSize, - sizeColor.getRsiTextSize())); - - sizeColor.setRsiTextColor(a.getColor(R.styleable.InteractiveKLineView_rsiTextColor, - sizeColor.getRsiTextColor())); - - // 其它 - sizeColor.setLoadingTextSize(a.getDimension(R.styleable.InteractiveKLineView_loadingTextSize, - sizeColor.getLoadingTextSize())); + /** + * 与轴、网格有关的属性 + */ + sizeColor.setXLabelSize(TypedAttrUtils.getFloat(attrs, "xLabelSize", sizeColor.getXLabelSize())); + sizeColor.setXLabelColor(TypedAttrUtils.getIntColor(attrs, "xLabelColor", sizeColor.getXLabelColor())); + sizeColor.setXLabelViewHeight(TypedAttrUtils.getFloat(attrs, "xLabelViewHeight", sizeColor.getXLabelViewHeight())); + sizeColor.setYLabelSize(TypedAttrUtils.getFloat(attrs, "yLabelSize", sizeColor.getYLabelSize())); + sizeColor.setYLabelColor(TypedAttrUtils.getIntColor(attrs, "yLabelColor", sizeColor.getYLabelColor())); + + String align = TypedAttrUtils.getString(attrs, "yLabelAlign", YLabelAlign.LEFT.toString()); + align = align.toUpperCase(); + int alignIndex = 0; + if (align.equals(YLabelAlign.LEFT.toString())) { + alignIndex = 0; + } else if (align.equals(YLabelAlign.RIGHT.toString())) { + alignIndex = 1; + } - sizeColor.setLoadingTextColor(a.getColor(R.styleable.InteractiveKLineView_loadingTextColor, - sizeColor.getLoadingTextColor())); + sizeColor.setYLabelAlign(YLabelAlign.values()[alignIndex]); + sizeColor.setAxisSize(TypedAttrUtils.getFloat(attrs, "axisSize", sizeColor.getAxisSize())); + sizeColor.setAxisColor(TypedAttrUtils.getIntColor(attrs, "axisColor", sizeColor.getAxisColor())); + sizeColor.setGridSize(TypedAttrUtils.getFloat(attrs, "gridSize", sizeColor.getGridSize())); + sizeColor.setGridColor(TypedAttrUtils.getIntColor(attrs, "gridColor", sizeColor.getGridColor())); + + /** + * 与高亮、MarkerView 有关的属性 + */ + sizeColor.setHighlightSize(TypedAttrUtils.getFloat(attrs, "highlightSize", sizeColor.getHighlightSize())); + sizeColor.setHighlightColor(TypedAttrUtils.getIntColor(attrs, "highlightColor", sizeColor.getHighlightColor())); + sizeColor.setMarkerBorderSize(TypedAttrUtils.getFloat(attrs, "markerBorderSize", sizeColor.getMarkerBorderSize())); + sizeColor.setMarkerBorderColor(TypedAttrUtils.getIntColor(attrs, "markerBorderColor", sizeColor.getMarkerBorderColor())); + sizeColor.setMarkerTextSize(TypedAttrUtils.getFloat(attrs, "markerTextSize", sizeColor.getMarkerTextSize())); + sizeColor.setMarkerTextColor(TypedAttrUtils.getIntColor(attrs, "markerTextColor", sizeColor.getMarkerTextColor())); + + align = TypedAttrUtils.getString(attrs, "xMarkerAlign", XMarkerAlign.AUTO.toString()); + align = align.toUpperCase(); + if (align.equals(XMarkerAlign.TOP.toString())) { + alignIndex = 0; + } else if (align.equals(XMarkerAlign.BOTTOM.toString())) { + alignIndex = 1; + } else if (align.equals(XMarkerAlign.AUTO.toString())) { + alignIndex = 2; + } + sizeColor.setXMarkerAlign(XMarkerAlign.values()[alignIndex]); + + align = TypedAttrUtils.getString(attrs, "yMarkerAlign", YMarkerAlign.AUTO.toString()); + align = align.toUpperCase(); + if (align.equals(YMarkerAlign.LEFT.toString())) { + alignIndex = 0; + } else if (align.equals(YMarkerAlign.RIGHT.toString())) { + alignIndex = 1; + } else if (align.equals(YMarkerAlign.AUTO.toString())) { + alignIndex = 2; + } + sizeColor.setYMarkerAlign(YMarkerAlign.values()[alignIndex]); + + /** + * 与分时图有关的属性 + */ + sizeColor.setTimeLineSize(TypedAttrUtils.getFloat(attrs, "timeLineSize", sizeColor.getTimeLineSize())); + sizeColor.setTimeLineColor(TypedAttrUtils.getIntColor(attrs, "timeLineColor", sizeColor.getTimeLineColor())); + sizeColor.setTimeLineMaxCount(TypedAttrUtils.getInteger(attrs, "timeLineMaxCount", sizeColor.getTimeLineMaxCount())); + + /** + * 与蜡烛图有关的属性 + */ + sizeColor.setCandleBorderSize(TypedAttrUtils.getFloat(attrs, "candleBorderSize", sizeColor.getCandleBorderSize())); + sizeColor.setCandleExtremumLabelSize(TypedAttrUtils.getFloat(attrs, "candleExtremumLabelSize", sizeColor.getCandleExtremumLabelSize())); + sizeColor.setCandleExtremumLableColor(TypedAttrUtils.getIntColor(attrs, "candleExtremumLableColor", sizeColor.getCandleExtremumLableColor())); + sizeColor.setShadowSize(TypedAttrUtils.getFloat(attrs, "shadowSize", sizeColor.getShadowSize())); + sizeColor.setIncreasingColor(TypedAttrUtils.getIntColor(attrs, "increasingColor", sizeColor.getIncreasingColor())); + sizeColor.setDecreasingColor(TypedAttrUtils.getIntColor(attrs, "decreasingColor", sizeColor.getDecreasingColor())); + sizeColor.setNeutralColor(TypedAttrUtils.getIntColor(attrs, "neutralColor", sizeColor.getNeutralColor())); + sizeColor.setPortraitDefaultVisibleCount(TypedAttrUtils.getInteger(attrs, "portraitDefaultVisibleCount", sizeColor.getPortraitDefaultVisibleCount())); + sizeColor.setZoomInTimes(TypedAttrUtils.getInteger(attrs, "zoomInTimes", sizeColor.getZoomInTimes())); + sizeColor.setZoomOutTimes(TypedAttrUtils.getInteger(attrs, "zoomOutTimes", sizeColor.getZoomOutTimes())); + + align = TypedAttrUtils.getString(attrs, "increasingStyle", "fill"); + if ("fill".equals(align)) { + alignIndex = 0; + } else if ("stroke".equals(align)) { + alignIndex = 1; + } + sizeColor.setIncreasingStyle(Paint.Style.values()[alignIndex]); - String loadingText = a.getString(R.styleable.InteractiveKLineView_loadingText); - if (!TextUtils.isEmpty(loadingText)) { + align = TypedAttrUtils.getString(attrs, "decreasingStyle", "fill"); + if ("fill".equals(align)) { + alignIndex = 0; + } else if ("stroke".equals(align)) { + alignIndex = 1; + } + sizeColor.setDecreasingStyle(Paint.Style.values()[alignIndex]); + + /** + * 与股票指标有关的属性 + */ + sizeColor.setMaLineSize(TypedAttrUtils.getFloat(attrs, "maLineSize", sizeColor.getMaLineSize())); + sizeColor.setMa5Color(TypedAttrUtils.getIntColor(attrs, "ma5Color", sizeColor.getMa5Color())); + sizeColor.setMa10Color(TypedAttrUtils.getIntColor(attrs, "ma10Color", sizeColor.getMa10Color())); + sizeColor.setMa20Color(TypedAttrUtils.getIntColor(attrs, "ma20Color", sizeColor.getMa20Color())); + sizeColor.setBollLineSize(TypedAttrUtils.getFloat(attrs, "bollLineSize", sizeColor.getBollLineSize())); + sizeColor.setBollMidLineColor(TypedAttrUtils.getIntColor(attrs, "bollMidLineColor", sizeColor.getBollMidLineColor())); + sizeColor.setBollUpperLineColor(TypedAttrUtils.getIntColor(attrs, "bollUpperLineColor", sizeColor.getBollUpperLineColor())); + sizeColor.setBollLowerLineColor(TypedAttrUtils.getIntColor(attrs, "bollLowerLineColor", sizeColor.getBollLowerLineColor())); + sizeColor.setKdjLineSize(TypedAttrUtils.getFloat(attrs, "kdjLineSize", sizeColor.getKdjLineSize())); + sizeColor.setKdjKLineColor(TypedAttrUtils.getIntColor(attrs, "kdjKLineColor", sizeColor.getKdjKLineColor())); + sizeColor.setKdjDLineColor(TypedAttrUtils.getIntColor(attrs, "kdjDLineColor", sizeColor.getKdjDLineColor())); + sizeColor.setKdjJLineColor(TypedAttrUtils.getIntColor(attrs, "kdjJLineColor", sizeColor.getKdjJLineColor())); + sizeColor.setMacdLineSize(TypedAttrUtils.getFloat(attrs, "macdLineSize", sizeColor.getMacdLineSize())); + sizeColor.setMacdHighlightTextColor(TypedAttrUtils.getIntColor(attrs, "macdHighlightTextColor", sizeColor.getMacdHighlightTextColor())); + sizeColor.setDeaLineColor(TypedAttrUtils.getIntColor(attrs, "deaLineColor", sizeColor.getDeaLineColor())); + sizeColor.setDiffLineColor(TypedAttrUtils.getIntColor(attrs, "diffLineColor", sizeColor.getDiffLineColor())); + sizeColor.setRsiLineSize(TypedAttrUtils.getFloat(attrs, "rsiLineSize", sizeColor.getRsiLineSize())); + sizeColor.setRsi1LineColor(TypedAttrUtils.getIntColor(attrs, "rsi1LineColor", sizeColor.getRsi1LineColor())); + sizeColor.setRsi2LineColor(TypedAttrUtils.getIntColor(attrs, "rsi2LineColor", sizeColor.getRsi2LineColor())); + sizeColor.setRsi3LineColor(TypedAttrUtils.getIntColor(attrs, "rsi3LineColor", sizeColor.getRsi3LineColor())); + + sizeColor.setMaTextSize(TypedAttrUtils.getFloat(attrs, "maTextSize", sizeColor.getMaTextSize())); + sizeColor.setMaTextColor(TypedAttrUtils.getIntColor(attrs, "maTextColor", sizeColor.getMaTextColor())); + + sizeColor.setBollTextSize(TypedAttrUtils.getFloat(attrs, "bollTextSize", sizeColor.getBollTextSize())); + sizeColor.setBollTextColor(TypedAttrUtils.getIntColor(attrs, "bollTextColor", sizeColor.getBollTextColor())); + + sizeColor.setKdjTextSize(TypedAttrUtils.getFloat(attrs, "kdjTextSize", sizeColor.getKdjTextSize())); + sizeColor.setKdjTextColor(TypedAttrUtils.getIntColor(attrs, "kdjTextColor", sizeColor.getKdjTextColor())); + + sizeColor.setMacdTextSize(TypedAttrUtils.getFloat(attrs, "macdTextSize", sizeColor.getMacdTextSize())); + sizeColor.setMacdTextColor(TypedAttrUtils.getIntColor(attrs, "macdTextColor", sizeColor.getMacdTextColor())); + + sizeColor.setRsiTextSize(TypedAttrUtils.getFloat(attrs, "rsiTextSize", sizeColor.getRsiTextSize())); + sizeColor.setRsiTextColor(TypedAttrUtils.getIntColor(attrs, "rsiTextColor", sizeColor.getRsiTextColor())); + + /** + * 其它 + */ + sizeColor.setLoadingTextSize(TypedAttrUtils.getFloat(attrs, "loadingTextSize", sizeColor.getLoadingTextSize())); + sizeColor.setLoadingTextColor(TypedAttrUtils.getIntColor(attrs, "loadingTextColor", sizeColor.getLoadingTextColor())); + String loadingText = TypedAttrUtils.getString(attrs, "loadingText", ""); + if (!"".equals(loadingText)) { sizeColor.setLoadingText(loadingText); } - sizeColor.setErrorTextSize(a.getDimension(R.styleable.InteractiveKLineView_errorTextSize, - sizeColor.getErrorTextSize())); - - sizeColor.setErrorTextColor(a.getColor(R.styleable.InteractiveKLineView_errorTextColor, - sizeColor.getErrorTextColor())); - - String errorText = a.getString(R.styleable.InteractiveKLineView_errorText); - if (!TextUtils.isEmpty(errorText)) { + sizeColor.setErrorTextSize(TypedAttrUtils.getFloat(attrs, "errorTextSize", sizeColor.getErrorTextSize())); + sizeColor.setErrorTextColor(TypedAttrUtils.getIntColor(attrs, "errorTextColor", sizeColor.getErrorTextColor())); + String errorText = TypedAttrUtils.getString(attrs, "errorText", ""); + if (!"".equals(errorText)) { sizeColor.setErrorText(errorText); } } finally { - a.recycle(); } - return sizeColor; } } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/detector/GestureDetector.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/detector/GestureDetector.java new file mode 100644 index 0000000..e50b8ca --- /dev/null +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/detector/GestureDetector.java @@ -0,0 +1,675 @@ +package com.wordplat.ikvstockchart.detector; + +import ohos.app.Context; +import ohos.eventhandler.EventHandler; +import ohos.eventhandler.EventRunner; +import ohos.eventhandler.InnerEvent; +import ohos.hiviewdfx.HiLog; +import ohos.hiviewdfx.HiLogLabel; +import ohos.multimodalinput.event.MmiPoint; +import ohos.multimodalinput.event.TouchEvent; + +/** + * GestureDetector + * + * @since 2021-05-09 + */ +public class GestureDetector { + /** + * HiLogLabel + */ + static final HiLogLabel LABEL = new HiLogLabel(HiLog.LOG_APP, 0x00201, "GestureDetector"); + + /** + * GestureDetector + * + * @since 2021-05-09 + */ + public interface OnGestureListener { + /** + * onDown + * + * @param e + * @return boolean + */ + boolean onDown(TouchEvent e); + + /** + * onShowPress + * + * @param e + */ + void onShowPress(TouchEvent e); + + /** + * onSingleTapUp + * + * @param e + * @return boolean + */ + boolean onSingleTapUp(TouchEvent e); + + /** + * onScroll + * + * @param e1 + * @param e2 + * @param distanceX + * @param distanceY + * @return boolean + */ + boolean onScroll(TouchEvent e1, TouchEvent e2, float distanceX, float distanceY); + + /** + * onLongPress + * + * @param e + */ + void onLongPress(TouchEvent e); + + /** + * onFling + * + * @param e1 + * @param e2 + * @param velocityX + * @param velocityY + * @param scrollY0 + * @param scrollY1 + * @return boolean + */ + boolean onFling(TouchEvent e1, TouchEvent e2, float velocityX, float velocityY, float scrollY0, float scrollY1); + } + + /** + * OnDoubleTapListener + * + * @since 2021-05-09 + */ + public interface OnDoubleTapListener { + /** + * onSingleTapConfirmed + * + * @param e + * @return boolean + */ + boolean onSingleTapConfirmed(TouchEvent e); + + /** + * onDoubleTap + * + * @param e + * @return boolean + */ + boolean onDoubleTap(TouchEvent e); + + /** + * onDoubleTapEvent + * + * @param e + * @return boolean + */ + boolean onDoubleTapEvent(TouchEvent e); + } + + /** + * OnContextClickListener + * + * @since 2021-05-09 + */ + public interface OnContextClickListener { + /** + * onContextClick + * + * @param e + * @return boolean + */ + boolean onContextClick(TouchEvent e); + } + + /** + * SimpleOnGestureListener + * + * @since 2021-05-09 + */ + public static class SimpleOnGestureListener implements OnGestureListener, OnDoubleTapListener, + OnContextClickListener { + /** + * onSingleTapUp + * + * @param e + * @return boolean + */ + public boolean onSingleTapUp(TouchEvent e) { + return false; + } + + /** + * onLongPress + * + * @param e + */ + public void onLongPress(TouchEvent e) { + } + + /** + * onScroll + * + * @param e1 + * @param e2 + * @param distanceX + * @param distanceY + * @return boolean + */ + public boolean onScroll(TouchEvent e1, TouchEvent e2, + float distanceX, float distanceY) { + return false; + } + + /** + * onFling + * + * @param e1 + * @param e2 + * @param velocityX + * @param velocityY + * @return boolean + */ + public boolean onFling(TouchEvent e1, TouchEvent e2, float velocityX, + float velocityY, float scrollY0, float scrollY1) { + return false; + } + + /** + * onShowPress + * + * @param e + */ + public void onShowPress(TouchEvent e) { + } + + /** + * onDown + * + * @param e + * @return boolean + */ + public boolean onDown(TouchEvent e) { + return false; + } + + /** + * onDoubleTap + * + * @param e + * @return boolean + */ + public boolean onDoubleTap(TouchEvent e) { + return false; + } + + /** + * onDoubleTapEvent + * + * @param e + * @return boolean + */ + public boolean onDoubleTapEvent(TouchEvent e) { + return false; + } + + /** + * onSingleTapConfirmed + * + * @param e + * @return boolean + */ + public boolean onSingleTapConfirmed(TouchEvent e) { + return false; + } + + /** + * onContextClick + * + * @param e + * @return boolean + */ + public boolean onContextClick(TouchEvent e) { + return false; + } + } + + private static final int LONGPRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout(); + private static final int TAP_TIMEOUT = ViewConfiguration.getTapTimeout(); + private static final int DOUBLE_TAP_TIMEOUT = ViewConfiguration.getDoubleTapTimeout(); + private static final int DOUBLE_TAP_MIN_TIME = ViewConfiguration.getDoubleTapMinTime(); + + // constants for Message.what used by GestureHandler below + private static final int SHOW_PRESS = 1; + private static final int LONG_PRESS = 2; + private static final int TAP = 3; + private int mTouchSlopSquare; + private int mDoubleTapTouchSlopSquare; + private int mDoubleTapSlopSquare; + private int mMinimumFlingVelocity; + private int mMaximumFlingVelocity; + + + private final EventHandler mHandler; + private final OnGestureListener mListener; + private OnDoubleTapListener mDoubleTapListener; + private OnContextClickListener mContextClickListener; + + private boolean mStillDown; + private boolean mDeferConfirmSingleTap; + private boolean mInLongPress; + private boolean mInContextClick; + private boolean mAlwaysInTapRegion; + private boolean mAlwaysInBiggerTapRegion; + private boolean mIgnoreNextUpEvent; + + private TouchEvent mCurrentDownEvent; + private TouchEvent mPreviousUpEvent; + private long mPreviousUpOccuredTime; + + private boolean mIsDoubleTapping; + + private float mLastFocusX; + private float mLastFocusY; + private float mDownFocusX; + private float mDownFocusY; + + private boolean mIsLongpressEnabled; + + private VelocityTracker mVelocityTracker; + + private class GestureHandler extends EventHandler { + GestureHandler() { + super(EventRunner.getMainEventRunner()); + } + + GestureHandler(EventHandler handler) { + super(handler.getEventRunner()); + } + + @Override + protected void processEvent(InnerEvent event) { + switch (event.eventId) { + case SHOW_PRESS: + mListener.onShowPress(mCurrentDownEvent); + break; + + case LONG_PRESS: + dispatchLongPress(); + break; + + case TAP: + // If the user's finger is still down, do not count it as a tap + if (mDoubleTapListener != null) { + if (!mStillDown) { + mDoubleTapListener.onSingleTapConfirmed(mCurrentDownEvent); + } else { + mDeferConfirmSingleTap = true; + } + } + break; + + default: + throw new RuntimeException("Unknown message " + event); //never + } + } + } + + /** + * GestureDetector + * + * @param listener + * @param handler + */ + public GestureDetector(OnGestureListener listener, EventHandler handler) { + this(null, listener, handler); + } + + /** + * GestureDetector + * + * @param listener + */ + public GestureDetector(OnGestureListener listener) { + this(null, listener, null); + } + + /** + * GestureDetector + * + * @param context + * @param listener + */ + public GestureDetector(Context context, OnGestureListener listener) { + this(context, listener, null); + } + + /** + * GestureDetector + * + * @param context + * @param listener + * @param handler + */ + public GestureDetector(Context context, OnGestureListener listener, EventHandler handler) { + if (handler != null) { + mHandler = new GestureHandler(handler); + } else { + mHandler = new GestureHandler(); + } + mListener = listener; + if (listener instanceof OnDoubleTapListener) { + setOnDoubleTapListener((OnDoubleTapListener) listener); + } + if (listener instanceof OnContextClickListener) { + setContextClickListener((OnContextClickListener) listener); + } + init(context); + } + + /** + * GestureDetector + * + * @param context + * @param listener + * @param handler + * @param unused + */ + public GestureDetector(Context context, OnGestureListener listener, EventHandler handler, + boolean unused) { + this(context, listener, handler); + } + + private void init(Context context) { + if (mListener == null) { + throw new NullPointerException("OnGestureListener must not be null"); + } + mIsLongpressEnabled = true; + + // Fallback to support pre-donuts releases + int touchSlop, doubleTapSlop, doubleTapTouchSlop; + //noinspection deprecation + touchSlop = ViewConfiguration.getTouchSlop(); + doubleTapTouchSlop = touchSlop; // Hack rather than adding a hiden method for this + doubleTapSlop = ViewConfiguration.getDoubleTapSlop(); + //noinspection deprecation + mMinimumFlingVelocity = ViewConfiguration.getMinimumFlingVelocity(); + mMaximumFlingVelocity = ViewConfiguration.getMaximumFlingVelocity(); + + mTouchSlopSquare = touchSlop * touchSlop; + mDoubleTapTouchSlopSquare = doubleTapTouchSlop * doubleTapTouchSlop; + mDoubleTapSlopSquare = doubleTapSlop * doubleTapSlop; + } + + public void setOnDoubleTapListener(OnDoubleTapListener onDoubleTapListener) { + mDoubleTapListener = onDoubleTapListener; + } + + public void setContextClickListener(OnContextClickListener onContextClickListener) { + mContextClickListener = onContextClickListener; + } + + public void setIsLongpressEnabled(boolean isLongpressEnabled) { + mIsLongpressEnabled = isLongpressEnabled; + } + + public boolean isLongpressEnabled() { + return mIsLongpressEnabled; + } + + /** + * onTouchEvent + * + * @param ev + * @return boolean + */ + public boolean onTouchEvent(TouchEvent ev) { + + final int action = ev.getAction(); + + if (mVelocityTracker == null) { + mVelocityTracker = new VelocityTracker(); + } + mVelocityTracker.addMovement(ev); + + final boolean pointerUp = action == TouchEvent.OTHER_POINT_UP; + final int skipIndex = pointerUp ? ev.getIndex() : -1; + final boolean isGeneratedGesture = false; + + // Determine focal point + float sumX = 0, sumY = 0; + final int count = ev.getPointerCount(); + for (int i = 0; i < count; i++) { + if (skipIndex == i) { + continue; + } + MmiPoint point = ev.getPointerPosition(i); + sumX += point.getX(); + sumY += point.getY(); + } + final int div = pointerUp ? count - 1 : count; + final float focusX = sumX / div; + final float focusY = sumY / div; + + boolean handled = false; + + switch (action) { + case TouchEvent.OTHER_POINT_DOWN: + mDownFocusX = mLastFocusX = focusX; + mDownFocusY = mLastFocusY = focusY; + // Cancel long press and taps + cancelTaps(); + break; + + case TouchEvent.OTHER_POINT_UP: + mDownFocusX = mLastFocusX = focusX; + mDownFocusY = mLastFocusY = focusY; + + // Check the dot product of current velocities. + // If the pointer that left was opposing another velocity vector, clear. + mVelocityTracker.calculateCurrentVelocity(1000, mMaximumFlingVelocity); + final int upIndex = ev.getIndex(); + final int id1 = ev.getPointerId(upIndex); + final float x1 = mVelocityTracker.getXVelocity(id1); + final float y1 = mVelocityTracker.getYVelocity(id1); + for (int i = 0; i < count; i++) { + if (i == upIndex) { + continue; + } + + final int id2 = ev.getPointerId(i); + final float x = x1 * mVelocityTracker.getXVelocity(id2); + final float y = y1 * mVelocityTracker.getYVelocity(id2); + + final float dot = x + y; + if (dot < 0) { + mVelocityTracker.clear(); + break; + } + } + + break; + + case TouchEvent.PRIMARY_POINT_DOWN: + if (mDoubleTapListener != null) { + boolean hadTapMessage = mHandler.hasInnerEvent(TAP); + if (hadTapMessage) mHandler.removeEvent(TAP); + if ((ev != null) && (mPreviousUpEvent != null) + && hadTapMessage + && isConsideredDoubleTap(ev, mPreviousUpEvent, ev)) { + // This is a second tap + mIsDoubleTapping = true; + // Give a callback with the first tap of the double-tap + handled |= mDoubleTapListener.onDoubleTap(mCurrentDownEvent); + // Give a callback with down event of the double-tap + handled |= mDoubleTapListener.onDoubleTapEvent(ev); + } else { + // This is a first tap + // EventHandler 的hasInnerEvent只能通过param过滤 不能通过eventId过滤 所以得设置param + InnerEvent tapEvent = InnerEvent.get(TAP, TAP); + mHandler.sendEvent(tapEvent, DOUBLE_TAP_TIMEOUT, EventHandler.Priority.IMMEDIATE); + } + } + + mDownFocusX = mLastFocusX = focusX; + mDownFocusY = mLastFocusY = focusY; + if (mCurrentDownEvent != null) { + } + mCurrentDownEvent = ev; + mAlwaysInTapRegion = true; + mAlwaysInBiggerTapRegion = true; + mStillDown = true; + mInLongPress = false; + mDeferConfirmSingleTap = false; + + if (mIsLongpressEnabled) { + + mHandler.removeEvent(LONG_PRESS); + mHandler.sendTimingEvent(LONG_PRESS, mCurrentDownEvent.getStartTime() + LONGPRESS_TIMEOUT, EventHandler.Priority.IMMEDIATE); + } + mHandler.sendTimingEvent(SHOW_PRESS, + mCurrentDownEvent.getStartTime() + TAP_TIMEOUT, EventHandler.Priority.IMMEDIATE); + handled |= mListener.onDown(ev); + break; + + case TouchEvent.POINT_MOVE: + if (mInLongPress || mInContextClick) { + break; + } + final float scrollX = mLastFocusX - focusX; + final float scrollY = mLastFocusY - focusY; + if (mIsDoubleTapping) { + // Give the move events of the double-tap + handled |= mDoubleTapListener.onDoubleTapEvent(ev); + } else if (mAlwaysInTapRegion) { + final int deltaX = (int) (focusX - mDownFocusX); + final int deltaY = (int) (focusY - mDownFocusY); + int distance = (deltaX * deltaX) + (deltaY * deltaY); + int slopSquare = isGeneratedGesture ? 0 : mTouchSlopSquare; + if (distance > slopSquare) { + handled = mListener.onScroll(mCurrentDownEvent, ev, scrollX, scrollY); + mLastFocusX = focusX; + mLastFocusY = focusY; + mAlwaysInTapRegion = false; + mHandler.removeEvent(TAP); + mHandler.removeEvent(SHOW_PRESS); + mHandler.removeEvent(LONG_PRESS); + } + int doubleTapSlopSquare = isGeneratedGesture ? 0 : mDoubleTapTouchSlopSquare; + if (distance > doubleTapSlopSquare) { + mAlwaysInBiggerTapRegion = false; + } + } else if ((Math.abs(scrollX) >= 1) || (Math.abs(scrollY) >= 1)) { + handled = mListener.onScroll(mCurrentDownEvent, ev, scrollX, scrollY); + mLastFocusX = focusX; + mLastFocusY = focusY; + } + break; + + case TouchEvent.PRIMARY_POINT_UP: + mStillDown = false; + + TouchEvent currentUpEvent = ev; + if (mIsDoubleTapping) { + handled |= mDoubleTapListener.onDoubleTapEvent(ev); + } else if (mInLongPress) { + mHandler.removeEvent(TAP); + mInLongPress = false; + } else if (mAlwaysInTapRegion && !mIgnoreNextUpEvent) { + handled = mListener.onSingleTapUp(ev); + if (mDeferConfirmSingleTap && mDoubleTapListener != null) { + mDoubleTapListener.onSingleTapConfirmed(ev); + } + } else if (!mIgnoreNextUpEvent) { + + final VelocityTracker velocityTracker = mVelocityTracker; + final int pointerId = ev.getPointerId(0); + velocityTracker.calculateCurrentVelocity(1000, mMaximumFlingVelocity); + final float velocityY = velocityTracker.getYVelocity(pointerId); + final float velocityX = velocityTracker.getXVelocity(pointerId); + + if ((Math.abs(velocityY) > mMinimumFlingVelocity) + || (Math.abs(velocityX) > mMinimumFlingVelocity)) { + handled = mListener.onFling(mCurrentDownEvent, ev, velocityX, velocityY, mDownFocusY, mLastFocusY); + } + } + mPreviousUpEvent = currentUpEvent; + mPreviousUpOccuredTime = currentUpEvent.getOccurredTime(); + if (mVelocityTracker != null) { + mVelocityTracker.recycle(); + mVelocityTracker = null; + } + mIsDoubleTapping = false; + mDeferConfirmSingleTap = false; + mIgnoreNextUpEvent = false; + mHandler.removeEvent(SHOW_PRESS); + mHandler.removeEvent(LONG_PRESS); + break; + + case TouchEvent.CANCEL: + cancel(); + break; + } + return handled; + } + + private void cancel() { + mHandler.removeEvent(SHOW_PRESS); + mHandler.removeEvent(LONG_PRESS); + mHandler.removeEvent(TAP); + mVelocityTracker.recycle(); + mVelocityTracker = null; + mIsDoubleTapping = false; + mStillDown = false; + mAlwaysInTapRegion = false; + mAlwaysInBiggerTapRegion = false; + mDeferConfirmSingleTap = false; + mInLongPress = false; + mInContextClick = false; + mIgnoreNextUpEvent = false; + } + + private void cancelTaps() { + mHandler.removeEvent(SHOW_PRESS); + mHandler.removeEvent(LONG_PRESS); + mHandler.removeEvent(TAP); + mIsDoubleTapping = false; + mAlwaysInTapRegion = false; + mAlwaysInBiggerTapRegion = false; + mDeferConfirmSingleTap = false; + mInLongPress = false; + mInContextClick = false; + mIgnoreNextUpEvent = false; + } + + private boolean isConsideredDoubleTap(TouchEvent firstDown, TouchEvent firstUp, + TouchEvent secondDown) { + if (!mAlwaysInBiggerTapRegion) { + return false; + } + + final long deltaTime = secondDown.getOccurredTime() - mPreviousUpOccuredTime; + if (deltaTime > DOUBLE_TAP_TIMEOUT || deltaTime < DOUBLE_TAP_MIN_TIME) { + return false; + } + + MmiPoint firstDownPoint = firstDown.getPointerPosition(firstDown.getIndex()); + MmiPoint secondDownPoint = secondDown.getPointerPosition(secondDown.getIndex()); + int deltaX = (int) firstDownPoint.getX() - (int) secondDownPoint.getX(); + int deltaY = (int) firstDownPoint.getY() - (int) secondDownPoint.getY(); + int slopSquare = mDoubleTapSlopSquare; + return (deltaX * deltaX + deltaY * deltaY < slopSquare); + } + + private void dispatchLongPress() { + mHandler.removeEvent(TAP); + mDeferConfirmSingleTap = false; + mInLongPress = true; + mListener.onLongPress(mCurrentDownEvent); + } +} diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/detector/ScaleGestureDetector.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/detector/ScaleGestureDetector.java new file mode 100644 index 0000000..7b0c202 --- /dev/null +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/detector/ScaleGestureDetector.java @@ -0,0 +1,538 @@ +package com.wordplat.ikvstockchart.detector; + +import ohos.app.Context; +import ohos.eventhandler.EventHandler; +import ohos.multimodalinput.event.MmiPoint; +import ohos.multimodalinput.event.TouchEvent; + +/** + * \ + * ScaleGestureDetector + * + * @since 2021-05-09 + */ +public class ScaleGestureDetector { + private static final String TAG = "ScaleGestureDetector"; + + /** + * The listener for receiving notifications when gestures occur. + * If you want to listen for all the different gestures then implement + * this interface. If you only want to listen for a subset it might + * be easier to extend {@link SimpleOnScaleGestureListener}. + *

+ * An application will receive events in the following order: + *

    + *
  • One {@link OnScaleGestureListener#onScaleBegin(ScaleGestureDetector)} + *
  • Zero or more {@link OnScaleGestureListener#onScale(ScaleGestureDetector)} + *
  • One {@link OnScaleGestureListener#onScaleEnd(ScaleGestureDetector)} + *
+ */ + public interface OnScaleGestureListener { + + /** + * Responds to scaling events for a gesture in progress. + * Reported by pointer motion. + * + * @param detector The detector reporting the event - use this to + * retrieve extended info about event state. + * @return Whether or not the detector should consider this event + * as handled. If an event was not handled, the detector + * will continue to accumulate movement until an event is + * handled. This can be useful if an application, for example, + * only wants to update scaling factors if the change is + * greater than 0.01. + */ + + public boolean onScale(ScaleGestureDetector detector); + + /** + * Responds to the beginning of a scaling gesture. Reported by + * new pointers going down. + * + * @param detector The detector reporting the event - use this to + * retrieve extended info about event state. + * @return Whether or not the detector should continue recognizing + * this gesture. For example, if a gesture is beginning + * with a focal point outside of a region where it makes + * sense, onScaleBegin() may return false to ignore the + * rest of the gesture. + */ + public boolean onScaleBegin(ScaleGestureDetector detector); + + /** + * Responds to the end of a scale gesture. Reported by existing + * pointers going up. + *

+ * Once a scale has ended, {@link ScaleGestureDetector#getFocusX()} + * and {@link ScaleGestureDetector#getFocusY()} will return focal point + * of the pointers remaining on the screen. + * + * @param detector The detector reporting the event - use this to + * retrieve extended info about event state. + */ + public void onScaleEnd(ScaleGestureDetector detector); + } + + /** + * A convenience class to extend when you only want to listen for a subset + * of scaling-related events. This implements all methods in + * {@link OnScaleGestureListener} but does nothing. + * {@link OnScaleGestureListener#onScale(ScaleGestureDetector)} returns + * {@code false} so that a subclass can retrieve the accumulated scale + * factor in an overridden onScaleEnd. + * {@link OnScaleGestureListener#onScaleBegin(ScaleGestureDetector)} returns + * {@code true}. + */ + public static class SimpleOnScaleGestureListener implements OnScaleGestureListener { + + public boolean onScale(ScaleGestureDetector detector) { + return false; + } + + public boolean onScaleBegin(ScaleGestureDetector detector) { + return true; + } + + public void onScaleEnd(ScaleGestureDetector detector) { + // Intentionally empty + } + } + + private final Context mContext; + private final OnScaleGestureListener mListener; + + private float mFocusX; + private float mFocusY; + + private boolean mQuickScaleEnabled; + private boolean mStylusScaleEnabled; + + private float mCurrSpan; + private float mPrevSpan; + private float mInitialSpan; + private float mCurrSpanX; + private float mCurrSpanY; + private float mPrevSpanX; + private float mPrevSpanY; + private long mCurrTime; + private long mPrevTime; + private boolean mInProgress; + private int mSpanSlop; + private int mMinSpan; + + private final EventHandler mHandler; + + private float mAnchoredScaleStartX; + private float mAnchoredScaleStartY; + private int mAnchoredScaleMode = ANCHORED_SCALE_MODE_NONE; + + private static final long TOUCH_STABILIZE_TIME = 128; // ms + private static final float SCALE_FACTOR = .5f; + private static final int ANCHORED_SCALE_MODE_NONE = 0; + private static final int ANCHORED_SCALE_MODE_DOUBLE_TAP = 1; + private static final int ANCHORED_SCALE_MODE_STYLUS = 2; + + + /** + * Consistency verifier for debugging purposes. + */ + private GestureDetector mGestureDetector; + + private boolean mEventBeforeOrAboveStartingGestureEvent; + + /** + * Creates a ScaleGestureDetector with the supplied listener. + * + * @param context the application's context + * @param listener the listener invoked for all the callbacks, this must + * not be null. + * @throws NullPointerException if {@code listener} is null. + */ + public ScaleGestureDetector(Context context, OnScaleGestureListener listener) { + this(context, listener, null); + } + + /** + * Creates a ScaleGestureDetector with the supplied listener. + * + * @param context the application's context + * @param listener the listener invoked for all the callbacks, this must + * not be null. + * @param handler the handler to use for running deferred listener events. + * @throws NullPointerException if {@code listener} is null. + */ + public ScaleGestureDetector(Context context, OnScaleGestureListener listener, + EventHandler handler) { + mContext = context; + mListener = listener; + mSpanSlop = ViewConfiguration.getScaledTouchSlop() * 2; + mMinSpan = ViewConfiguration.getMinimumFlingVelocity(); + mHandler = handler; + + setQuickScaleEnabled(true); + + } + + /** + * Accepts MotionEvents and dispatches events to a {@link OnScaleGestureListener} + * when appropriate. + * + *

Applications should pass a complete and consistent event stream to this method. + * A complete and consistent event stream involves all MotionEvents from the initial + * ACTION_DOWN to the final ACTION_UP or ACTION_CANCEL.

+ * + * @param event The event to process + * @return true if the event was processed and the detector wants to receive the + * rest of the MotionEvents in this event stream. + */ + public boolean onTouchEvent(TouchEvent event) { + + mCurrTime = event.getOccurredTime(); + + final int action = event.getAction(); + + // Forward the event to check for double tap gesture + if (mQuickScaleEnabled) { + mGestureDetector.onTouchEvent(event); + } + + final int count = event.getPointerCount(); + final boolean isStylusButtonDown = + (TouchEvent.POINT_MOVE) != 0; + + final boolean anchoredScaleCancelled = + mAnchoredScaleMode == ANCHORED_SCALE_MODE_STYLUS && !isStylusButtonDown; + final boolean streamComplete = action == TouchEvent.PRIMARY_POINT_UP || + action == TouchEvent.CANCEL || anchoredScaleCancelled; + + if (action == TouchEvent.PRIMARY_POINT_DOWN || streamComplete) { + // Reset any scale in progress with the listener. + // If it's an ACTION_DOWN we're beginning a new event stream. + // This means the app probably didn't give us all the events. Shame on it. + if (mInProgress) { + mListener.onScaleEnd(this); + mInProgress = false; + mInitialSpan = 0; + mAnchoredScaleMode = ANCHORED_SCALE_MODE_NONE; + } else if (inAnchoredScaleMode() && streamComplete) { + mInProgress = false; + mInitialSpan = 0; + mAnchoredScaleMode = ANCHORED_SCALE_MODE_NONE; + } + + if (streamComplete) { + return true; + } + } + + if (!mInProgress && mStylusScaleEnabled && !inAnchoredScaleMode() + && !streamComplete && isStylusButtonDown) { + // Start of a button scale gesture + MmiPoint point = event.getPointerPosition(event.getIndex()); + mAnchoredScaleStartX = point.getX(); + mAnchoredScaleStartY = point.getY(); + mAnchoredScaleMode = ANCHORED_SCALE_MODE_STYLUS; + mInitialSpan = 0; + } + + final boolean configChanged = action == TouchEvent.PRIMARY_POINT_DOWN || + action == TouchEvent.PRIMARY_POINT_UP || + action == TouchEvent.PRIMARY_POINT_DOWN || anchoredScaleCancelled; + + final boolean pointerUp = action == TouchEvent.PRIMARY_POINT_UP; + final int skipIndex = pointerUp ? event.getIndex() : -1; + + // Determine focal point + float sumX = 0, sumY = 0; + final int div = pointerUp ? count - 1 : count; + final float focusX; + final float focusY; + if (inAnchoredScaleMode()) { + // In anchored scale mode, the focal pt is always where the double tap + // or button down gesture started + focusX = mAnchoredScaleStartX; + focusY = mAnchoredScaleStartY; + MmiPoint point = event.getPointerPosition(event.getIndex()); + if (point.getY() < focusY) { + mEventBeforeOrAboveStartingGestureEvent = true; + } else { + mEventBeforeOrAboveStartingGestureEvent = false; + } + } else { + for (int i = 0; i < count; i++) { + if (skipIndex == i) continue; + MmiPoint point = event.getPointerPosition(i); + sumX += point.getX(); + sumY += point.getY(); + } + + focusX = sumX / div; + focusY = sumY / div; + } + + // Determine average deviation from focal point + float devSumX = 0, devSumY = 0; + for (int i = 0; i < count; i++) { + if (skipIndex == i) { + continue; + } + + // Convert the resulting diameter into a radius. + MmiPoint point = event.getPointerPosition(i); + devSumX += Math.abs(point.getX() - focusX); + devSumY += Math.abs(point.getY() - focusY); + } + final float devX = devSumX / div; + final float devY = devSumY / div; + + + final float spanX = devX * 2; + final float spanY = devY * 2; + final float span; + if (inAnchoredScaleMode()) { + span = spanY; + } else { + span = (float) Math.hypot(spanX, spanY); + } + + // Dispatch begin/end events as needed. + // If the configuration changes, notify the app to reset its current state by beginning + // a fresh scale event stream. + final boolean wasInProgress = mInProgress; + mFocusX = focusX; + mFocusY = focusY; + if (!inAnchoredScaleMode() && mInProgress && (span < mMinSpan || configChanged)) { + mListener.onScaleEnd(this); + mInProgress = false; + mInitialSpan = span; + } + if (configChanged) { + mPrevSpanX = mCurrSpanX = spanX; + mPrevSpanY = mCurrSpanY = spanY; + mInitialSpan = mPrevSpan = mCurrSpan = span; + } + + final int minSpan = inAnchoredScaleMode() ? mSpanSlop : mMinSpan; + if (!mInProgress && span >= minSpan && + (wasInProgress || Math.abs(span - mInitialSpan) > mSpanSlop)) { + mPrevSpanX = mCurrSpanX = spanX; + mPrevSpanY = mCurrSpanY = spanY; + mPrevSpan = mCurrSpan = span; + mPrevTime = mCurrTime; + mInProgress = mListener.onScaleBegin(this); + } + + // Handle motion; focal point and span/scale factor are changing. + if (action == TouchEvent.POINT_MOVE) { + mCurrSpanX = spanX; + mCurrSpanY = spanY; + mCurrSpan = span; + + boolean updatePrev = true; + + if (mInProgress) { + updatePrev = mListener.onScale(this); + } + + if (updatePrev) { + mPrevSpanX = mCurrSpanX; + mPrevSpanY = mCurrSpanY; + mPrevSpan = mCurrSpan; + mPrevTime = mCurrTime; + } + } + + return true; + } + + private boolean inAnchoredScaleMode() { + return mAnchoredScaleMode != ANCHORED_SCALE_MODE_NONE; + } + + /** + * Set whether the associated {@link OnScaleGestureListener} should receive onScale callbacks + * when the user performs a doubleTap followed by a swipe. Note that this is enabled by default + * if the app targets API 19 and newer. + * + * @param scales true to enable quick scaling, false to disable + */ + public void setQuickScaleEnabled(boolean scales) { + mQuickScaleEnabled = scales; + if (mQuickScaleEnabled && mGestureDetector == null) { + GestureDetector.SimpleOnGestureListener gestureListener = + new GestureDetector.SimpleOnGestureListener() { + @Override + public boolean onDoubleTap(TouchEvent e) { + MmiPoint point = e.getPointerPosition(e.getIndex()); + mAnchoredScaleStartX = point.getX(); + mAnchoredScaleStartY = point.getY(); + mAnchoredScaleMode = ANCHORED_SCALE_MODE_DOUBLE_TAP; + return true; + } + }; + mGestureDetector = new GestureDetector(mContext, gestureListener, mHandler); + } + } + + /** + * Return whether the quick scale gesture, in which the user performs a double tap followed by a + * swipe, should perform scaling. {@see #setQuickScaleEnabled(boolean)}. + */ + public boolean isQuickScaleEnabled() { + return mQuickScaleEnabled; + } + + /** + * Sets whether the associates {@link OnScaleGestureListener} should receive + * onScale callbacks when the user uses a stylus and presses the button. + * Note that this is enabled by default if the app targets API 23 and newer. + * + * @param scales true to enable stylus scaling, false to disable. + */ + public void setStylusScaleEnabled(boolean scales) { + mStylusScaleEnabled = scales; + } + + /** + * Return whether the stylus scale gesture, in which the user uses a stylus and presses the + * button, should perform scaling. {@see #setStylusScaleEnabled(boolean)} + */ + public boolean isStylusScaleEnabled() { + return mStylusScaleEnabled; + } + + /** + * Returns {@code true} if a scale gesture is in progress. + */ + public boolean isInProgress() { + return mInProgress; + } + + /** + * Get the X coordinate of the current gesture's focal point. + * If a gesture is in progress, the focal point is between + * each of the pointers forming the gesture. + *

+ * If {@link #isInProgress()} would return false, the result of this + * function is undefined. + * + * @return X coordinate of the focal point in pixels. + */ + public float getFocusX() { + return mFocusX; + } + + /** + * Get the Y coordinate of the current gesture's focal point. + * If a gesture is in progress, the focal point is between + * each of the pointers forming the gesture. + *

+ * If {@link #isInProgress()} would return false, the result of this + * function is undefined. + * + * @return Y coordinate of the focal point in pixels. + */ + public float getFocusY() { + return mFocusY; + } + + /** + * Return the average distance between each of the pointers forming the + * gesture in progress through the focal point. + * + * @return Distance between pointers in pixels. + */ + public float getCurrentSpan() { + return mCurrSpan; + } + + /** + * Return the average X distance between each of the pointers forming the + * gesture in progress through the focal point. + * + * @return Distance between pointers in pixels. + */ + public float getCurrentSpanX() { + return mCurrSpanX; + } + + /** + * Return the average Y distance between each of the pointers forming the + * gesture in progress through the focal point. + * + * @return Distance between pointers in pixels. + */ + public float getCurrentSpanY() { + return mCurrSpanY; + } + + /** + * Return the previous average distance between each of the pointers forming the + * gesture in progress through the focal point. + * + * @return Previous distance between pointers in pixels. + */ + public float getPreviousSpan() { + return mPrevSpan; + } + + /** + * Return the previous average X distance between each of the pointers forming the + * gesture in progress through the focal point. + * + * @return Previous distance between pointers in pixels. + */ + public float getPreviousSpanX() { + return mPrevSpanX; + } + + /** + * Return the previous average Y distance between each of the pointers forming the + * gesture in progress through the focal point. + * + * @return Previous distance between pointers in pixels. + */ + public float getPreviousSpanY() { + return mPrevSpanY; + } + + /** + * Return the scaling factor from the previous scale event to the current + * event. This value is defined as + * ({@link #getCurrentSpan()} / {@link #getPreviousSpan()}). + * + * @return The current scaling factor. + */ + public float getScaleFactor() { + if (inAnchoredScaleMode()) { + // Drag is moving up; the further away from the gesture + // start, the smaller the span should be, the closer, + // the larger the span, and therefore the larger the scale + final boolean scaleUp = + (mEventBeforeOrAboveStartingGestureEvent && (mCurrSpan < mPrevSpan)) || + (!mEventBeforeOrAboveStartingGestureEvent && (mCurrSpan > mPrevSpan)); + final float spanDiff = (Math.abs(1 - (mCurrSpan / mPrevSpan)) * SCALE_FACTOR); + return mPrevSpan <= mSpanSlop ? 1 : scaleUp ? (1 + spanDiff) : (1 - spanDiff); + } + return mPrevSpan > 0 ? mCurrSpan / mPrevSpan : 1; + } + + /** + * Return the time difference in milliseconds between the previous + * accepted scaling event and the current scaling event. + * + * @return Time difference since the last scaling event in milliseconds. + */ + public long getTimeDelta() { + return mCurrTime - mPrevTime; + } + + /** + * Return the event time of the current event being processed. + * + * @return Current event time in milliseconds. + */ + public long getEventTime() { + return mCurrTime; + } +} diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/detector/VelocityTracker.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/detector/VelocityTracker.java new file mode 100644 index 0000000..78b0474 --- /dev/null +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/detector/VelocityTracker.java @@ -0,0 +1,215 @@ +package com.wordplat.ikvstockchart.detector; + +import ohos.agp.components.VelocityDetector; +import ohos.multimodalinput.event.TouchEvent; +import ohos.utils.PlainArray; + +/** + * VelocityTracker + * + * @since 2021-05-09 + */ +public class VelocityTracker { + PlainArray mMap = new PlainArray<>(); + private int mActivePointerId = 0; + private boolean needScale = false; + private float mMaxVelocity = Float.MAX_VALUE; + + /*** + * addMovement + * @param velocityDetector + * @param touchEvent + */ + private void addMovement(VelocityDetector velocityDetector, TouchEvent touchEvent) { + velocityDetector.addEvent(touchEvent); + } + + private float getXVelocity(VelocityDetector velocityDetector) { + return velocityDetector.getHorizontalVelocity(); + } + + private float getYVelocity(VelocityDetector velocityDetector) { + return velocityDetector.getVerticalVelocity(); + } + + /** + * VelocityTracker + */ + public VelocityTracker() { + mMap.put(0, obtainVelocityDetector()); + } + + /** + * addMovement + * + * @param ev + */ + public void addMovement(TouchEvent ev) { + int index = ev.getIndex(); + int id = ev.getPointerId(index); + VelocityDetector detector = mMap.get(id, null); + if (detector == null) { + detector = obtainVelocityDetector(); + mMap.put(id, detector); + } + addMovement(detector, ev); + switch (ev.getAction()) { + case TouchEvent.PRIMARY_POINT_DOWN: + mActivePointerId = id; + break; + case TouchEvent.OTHER_POINT_UP: + if (id == mActivePointerId) { + mActivePointerId = (id == 0) ? 1 : 0; + } + break; + default: + break; + } + } + + /** + * calculateCurrentVelocity + * + * @param units + * @param maxVxVelocity + * @param maxVyVelocity + */ + public void calculateCurrentVelocity(int units, float maxVxVelocity, float maxVyVelocity) { + needScale = false; + mMaxVelocity = Float.MAX_VALUE; + for (int i = 0; i < mMap.size(); i++) { + VelocityDetector vd = mMap.valueAt(i); + if (vd != null) { + vd.calculateCurrentVelocity(units, maxVxVelocity, maxVyVelocity); + } + } + } + + /** + * calculateCurrentVelocity + * + * @param units + * @param maxVelocity + */ + public void calculateCurrentVelocity(int units, float maxVelocity) { + needScale = true; + mMaxVelocity = maxVelocity; + for (int i = 0; i < mMap.size(); i++) { + VelocityDetector vd = mMap.valueAt(i); + if (vd != null) { + vd.calculateCurrentVelocity(units); + } + } + } + + /** + * calculateCurrentVelocity + * + * @param units + */ + public void calculateCurrentVelocity(int units) { + needScale = false; + mMaxVelocity = Float.MAX_VALUE; + for (int i = 0; i < mMap.size(); i++) { + VelocityDetector vd = mMap.valueAt(i); + if (vd != null) { + vd.calculateCurrentVelocity(units); + } + } + } + + public float getXVelocity() { + return getXVelocity(mActivePointerId); + } + + public float getYVelocity() { + return getYVelocity(mActivePointerId); + } + + /** + * getXVelocity + * + * @param id + * @return + */ + public float getXVelocity(int id) { + VelocityDetector vd = mMap.get(id, null); + if (vd == null) { + return 0; + } + return getXVelocityWithScale(vd); + } + + /** + * getYVelocity + * + * @param id + * @return + */ + public float getYVelocity(int id) { + VelocityDetector vd = mMap.get(id, null); + if (vd == null) { + return 0; + } + return getYVelocityWithScale(vd); + } + + /** + * clear + */ + public void clear() { + needScale = false; + mMaxVelocity = Float.MAX_VALUE; + for (int i = 0; i < mMap.size(); i++) { + VelocityDetector vd = mMap.valueAt(i); + if (vd != null) { + velocityclear(vd); + } + } + } + + /** + * recycle + */ + public void recycle() { + clear(); + mMap.clear(); + } + + private VelocityDetector obtainVelocityDetector() { + return VelocityDetector.obtainInstance(); + } + + + private void velocityclear(VelocityDetector velocityDetector) { + velocityDetector.clear(); + } + + private float getXVelocityWithScale(VelocityDetector velocityDetector) { + if (!needScale) { + return getXVelocity(velocityDetector); + } else { + float xVelocity = getXVelocity(velocityDetector); + float yVelocity = getYVelocity(velocityDetector); + if (xVelocity * xVelocity + yVelocity * yVelocity > mMaxVelocity * mMaxVelocity) { + xVelocity /= Math.sqrt((xVelocity * xVelocity + yVelocity * yVelocity) / (mMaxVelocity * mMaxVelocity)); + } + return xVelocity; + } + } + + private float getYVelocityWithScale(VelocityDetector velocityDetector) { + if (!needScale) { + return getYVelocity(velocityDetector); + } else { + float xVelocity = getXVelocity(velocityDetector); + float yVelocity = getYVelocity(velocityDetector); + if (xVelocity * xVelocity + yVelocity * yVelocity > mMaxVelocity * mMaxVelocity) { + yVelocity /= Math.sqrt((xVelocity * xVelocity + yVelocity * yVelocity) / (mMaxVelocity * mMaxVelocity)); + } + return yVelocity; + } + } + + +} diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/detector/ViewConfiguration.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/detector/ViewConfiguration.java new file mode 100644 index 0000000..ba65ff5 --- /dev/null +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/detector/ViewConfiguration.java @@ -0,0 +1,64 @@ +package com.wordplat.ikvstockchart.detector; + +/** + * ViewConfiguration + * + * @since 2021-05-09 + */ +public class ViewConfiguration { + + + private static final int DEFAULT_LONG_PRESS_TIMEOUT = 500; + + private static final int TAP_TIMEOUT = 100; + + private static final int DOUBLE_TAP_TIMEOUT = 300; + + private static final int DOUBLE_TAP_MIN_TIME = 40; + + private static final int TOUCH_SLOP = 100; + + private static final int DOUBLE_TAP_SLOP = 100; + + private static final int MINIMUM_FLING_VELOCITY = 50; + + private static final int MAXIMUM_FLING_VELOCITY = 8000; + + private ViewConfiguration() { + } + + public static int getLongPressTimeout() { + return DEFAULT_LONG_PRESS_TIMEOUT; + } + + public static int getTapTimeout() { + return TAP_TIMEOUT; + } + + public static int getDoubleTapTimeout() { + return DOUBLE_TAP_TIMEOUT; + } + + public static int getDoubleTapMinTime() { + return DOUBLE_TAP_MIN_TIME; + } + + public static int getTouchSlop() { + return TOUCH_SLOP; + } + + public static int getDoubleTapSlop() { + return DOUBLE_TAP_SLOP; + } + + public static int getMinimumFlingVelocity() { + return MINIMUM_FLING_VELOCITY; + } + + public static int getMaximumFlingVelocity() { + return MAXIMUM_FLING_VELOCITY; + } + public static int getScaledTouchSlop() { + return TOUCH_SLOP; + } +} diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/BOLLDrawing.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/BOLLDrawing.java index fc86100..ee8e895 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/BOLLDrawing.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/BOLLDrawing.java @@ -18,30 +18,30 @@ package com.wordplat.ikvstockchart.drawing; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.RectF; - import com.wordplat.ikvstockchart.entry.Entry; import com.wordplat.ikvstockchart.entry.EntrySet; import com.wordplat.ikvstockchart.entry.SizeColor; import com.wordplat.ikvstockchart.render.AbstractRender; +import ohos.agp.render.Canvas; +import ohos.agp.render.Paint; +import ohos.agp.utils.Color; +import ohos.agp.utils.Rect; +import ohos.agp.utils.RectFloat; /** *

BOLLDrawing

*

Date: 2017/3/15

* * @author afon + * @since 2021-05-09 */ - -public class BOLLDrawing implements IDrawing{ - +public class BOLLDrawing implements IDrawing { private Paint axisPaint; // X 轴和 Y 轴的画笔 private Paint r1Paint; private Paint r2Paint; private Paint r3Paint; - private final RectF indexRect = new RectF(); + private final RectFloat indexRect = new RectFloat(); private AbstractRender render; private float[] xPointBuffer = new float[4]; @@ -52,41 +52,48 @@ public class BOLLDrawing implements IDrawing{ private float[] gridBuffer = new float[2]; @Override - public void onInit(RectF contentRect, AbstractRender render) { + public void onInit(RectFloat contentRect, AbstractRender render) { this.render = render; final SizeColor sizeColor = render.getSizeColor(); if (axisPaint == null) { - axisPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - axisPaint.setStyle(Paint.Style.STROKE); + axisPaint = new Paint(); + axisPaint.setAntiAlias(true); + axisPaint.setStyle(Paint.Style.STROKE_STYLE); } axisPaint.setStrokeWidth(sizeColor.getAxisSize()); - axisPaint.setColor(sizeColor.getAxisColor()); + axisPaint.setColor(new Color(sizeColor.getAxisColor())); if (r1Paint == null) { - r1Paint = new Paint(Paint.ANTI_ALIAS_FLAG); - r1Paint.setStyle(Paint.Style.STROKE); + r1Paint = new Paint(); + r1Paint.setAntiAlias(true); + r1Paint.setStyle(Paint.Style.STROKE_STYLE); } if (r2Paint == null) { - r2Paint = new Paint(Paint.ANTI_ALIAS_FLAG); - r2Paint.setStyle(Paint.Style.STROKE); + r2Paint = new Paint(); + r2Paint.setAntiAlias(true); + r2Paint.setStyle(Paint.Style.STROKE_STYLE); } if (r3Paint == null) { - r3Paint = new Paint(Paint.ANTI_ALIAS_FLAG); - r3Paint.setStyle(Paint.Style.STROKE); + r3Paint = new Paint(); + r3Paint.setAntiAlias(true); + r3Paint.setStyle(Paint.Style.STROKE_STYLE); } r1Paint.setStrokeWidth(sizeColor.getBollLineSize()); r2Paint.setStrokeWidth(sizeColor.getBollLineSize()); r3Paint.setStrokeWidth(sizeColor.getBollLineSize()); - r1Paint.setColor(sizeColor.getBollMidLineColor()); - r2Paint.setColor(sizeColor.getBollUpperLineColor()); - r3Paint.setColor(sizeColor.getBollLowerLineColor()); + r1Paint.setColor(new Color(sizeColor.getBollMidLineColor())); + r2Paint.setColor(new Color(sizeColor.getBollUpperLineColor())); + r3Paint.setColor(new Color(sizeColor.getBollLowerLineColor())); - indexRect.set(contentRect); + indexRect.left = contentRect.left; + indexRect.top = contentRect.top; + indexRect.bottom = contentRect.bottom; + indexRect.right = contentRect.right; } @Override @@ -146,7 +153,7 @@ public class BOLLDrawing implements IDrawing{ final int count = (maxIndex - minIndex) * 4; - for (int i = 0 ; i < count ; i = i + 4) { + for (int i = 0; i < count; i = i + 4) { r1Buffer[i + 0] = xPointBuffer[i + 0]; r1Buffer[i + 2] = xPointBuffer[i + 2]; diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/CandleDrawing.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/CandleDrawing.java index 70ae0d6..7fe5d1e 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/CandleDrawing.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/CandleDrawing.java @@ -18,16 +18,20 @@ package com.wordplat.ikvstockchart.drawing; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.RectF; -import android.util.Log; import com.wordplat.ikvstockchart.compat.ViewUtils; import com.wordplat.ikvstockchart.entry.Entry; import com.wordplat.ikvstockchart.entry.EntrySet; import com.wordplat.ikvstockchart.entry.SizeColor; import com.wordplat.ikvstockchart.render.AbstractRender; +import com.wordplat.ikvstockchart.utils.StringUtils; +import ohos.agp.render.Canvas; +import ohos.agp.render.Paint; +import ohos.agp.utils.Color; +import ohos.agp.utils.RectFloat; +import ohos.agp.utils.TextAlignment; +import ohos.hiviewdfx.HiLog; +import ohos.hiviewdfx.HiLogLabel; import java.text.DecimalFormat; @@ -36,42 +40,67 @@ import java.text.DecimalFormat; *

Date: 2017/3/9

* * @author afon + * @since 2021-05-09 */ - public class CandleDrawing implements IDrawing { + /** + * HiLogLabel + */ + static final HiLogLabel LABEL = new HiLogLabel(HiLog.LOG_APP, 0x00201, "CandleDrawing"); + private static final String TAG = "CandleDrawing"; private static final boolean DEBUG = false; - - private Paint candlePaint; // 蜡烛图画笔 - private Paint extremumPaint; // 当前可见区域内的极值画笔 + /** + * 蜡烛图画笔 + */ + private Paint candlePaint; + /** + * 当前可见区域内的极值画笔 + */ + private Paint extremumPaint; private final DecimalFormat decimalFormatter = new DecimalFormat("0.00"); - - private final RectF kLineRect = new RectF(); // K 线图显示区域 + /** + * K 线图显示区域 + */ + private final RectFloat kLineRect = new RectFloat(); private AbstractRender render; - - private float candleSpace = 0.1f; // entry 与 entry 之间的间隙,默认 0.1f (10%) + /** + * entry 与 entry 之间的间隙,默认 0.1f (10%) + */ + private float candleSpace = 0.1f; private float extremumToRight; - private float[] candleLineBuffer = new float[8]; // 计算 2 根线坐标用的 - private float[] candleRectBuffer = new float[4]; // 计算 1 个矩形坐标用的 + /** + * 计算 2 根线坐标用的 + */ + private float[] candleLineBuffer = new float[8]; + /** + * 计算 1 个矩形坐标用的 + */ + private float[] candleRectBuffer = new float[4]; @Override - public void onInit(RectF contentRect, AbstractRender render) { + public void onInit(RectFloat contentRect, AbstractRender render) { this.render = render; final SizeColor sizeColor = render.getSizeColor(); if (candlePaint == null) { - candlePaint = new Paint(Paint.ANTI_ALIAS_FLAG); - candlePaint.setStyle(Paint.Style.FILL); + candlePaint = new Paint(); + candlePaint.setAntiAlias(true); + candlePaint.setStyle(Paint.Style.FILL_STYLE); candlePaint.setStrokeWidth(sizeColor.getCandleBorderSize()); } if (extremumPaint == null) { - extremumPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + extremumPaint = new Paint(); + extremumPaint.setAntiAlias(true); } - extremumPaint.setTextSize(sizeColor.getCandleExtremumLabelSize()); - extremumPaint.setColor(sizeColor.getCandleExtremumLableColor()); + extremumPaint.setTextSize(StringUtils.floatToInt(sizeColor.getCandleExtremumLabelSize())); + extremumPaint.setColor(new Color(sizeColor.getCandleExtremumLableColor())); - kLineRect.set(contentRect); + kLineRect.left = contentRect.left; + kLineRect.top = contentRect.top; + kLineRect.bottom = contentRect.bottom; + kLineRect.right = contentRect.right; extremumToRight = kLineRect.right - 150; } @@ -89,19 +118,14 @@ public class CandleDrawing implements IDrawing { canvas.save(); canvas.clipRect(kLineRect); -// if (DEBUG) { -// Log.i(TAG, "##d onComputeOver: minIndex = " + minIndex + ", maxIndex = " + maxIndex -// + ", minYIndex = " + entrySet.getMinYIndex() + ", maxYIndex = " + entrySet.getMaxYIndex()); -// } - - for (int i = minIndex; i < maxIndex; i++) { - Entry entry = ViewUtils.setUpCandlePaint(candlePaint, entrySet, i, sizeColor); + for (int iindex = minIndex; iindex < maxIndex; iindex++) { + Entry entry = ViewUtils.setUpCandlePaint(candlePaint, entrySet, iindex, sizeColor); // 绘制 影线 - candleLineBuffer[0] = i + 0.5f; - candleLineBuffer[2] = i + 0.5f; - candleLineBuffer[4] = i + 0.5f; - candleLineBuffer[6] = i + 0.5f; + candleLineBuffer[0] = iindex + 0.5f; + candleLineBuffer[2] = iindex + 0.5f; + candleLineBuffer[4] = iindex + 0.5f; + candleLineBuffer[6] = iindex + 0.5f; if (entry.getOpen() > entry.getClose()) { candleLineBuffer[1] = entry.getHigh(); candleLineBuffer[3] = entry.getOpen(); @@ -116,45 +140,45 @@ public class CandleDrawing implements IDrawing { render.mapPoints(candleLineBuffer); canvas.drawLines(candleLineBuffer, candlePaint); - // 绘制 当前显示区域的"最小"与"最大"两个值 - if (i == entrySet.getMinYIndex()) { + /** + * 绘制 当前显示区域的"最小"与"最大"两个值 + */ + if (iindex == entrySet.getMinYIndex()) { if (candleLineBuffer[6] > extremumToRight) { - extremumPaint.setTextAlign(Paint.Align.RIGHT); + extremumPaint.setTextAlign(TextAlignment.RIGHT); - canvas.drawText(decimalFormatter.format(entry.getLow()) + " →", + canvas.drawText(extremumPaint, decimalFormatter.format(entry.getLow()) + " →", candleLineBuffer[6], - candleLineBuffer[7] + 20, - extremumPaint); + candleLineBuffer[7] + 20); } else { - extremumPaint.setTextAlign(Paint.Align.LEFT); + extremumPaint.setTextAlign(TextAlignment.LEFT); - canvas.drawText("← " + decimalFormatter.format(entry.getLow()), + canvas.drawText(extremumPaint, "← " + decimalFormatter.format(entry.getLow()), candleLineBuffer[6], - candleLineBuffer[7] + 20, - extremumPaint); + candleLineBuffer[7] + 20); } } - if (i == entrySet.getMaxYIndex()) { + if (iindex == entrySet.getMaxYIndex()) { if (candleLineBuffer[0] > extremumToRight) { - extremumPaint.setTextAlign(Paint.Align.RIGHT); + extremumPaint.setTextAlign(TextAlignment.RIGHT); - canvas.drawText(decimalFormatter.format(entry.getHigh()) + " →", + canvas.drawText(extremumPaint, decimalFormatter.format(entry.getHigh()) + " →", candleLineBuffer[0], - candleLineBuffer[1] - 5, - extremumPaint); + candleLineBuffer[1] - 5); } else { - extremumPaint.setTextAlign(Paint.Align.LEFT); + extremumPaint.setTextAlign(TextAlignment.LEFT); - canvas.drawText("← " + decimalFormatter.format(entry.getHigh()), + canvas.drawText(extremumPaint, "← " + decimalFormatter.format(entry.getHigh()), candleLineBuffer[0], - candleLineBuffer[1] - 5, - extremumPaint); + candleLineBuffer[1] - 5); } } - // 绘制 蜡烛图的矩形 - candleRectBuffer[0] = i + candleSpace; - candleRectBuffer[2] = i + 1 - candleSpace; + /** + * 绘制 蜡烛图的矩形 + */ + candleRectBuffer[0] = iindex + candleSpace; + candleRectBuffer[2] = iindex + 1 - candleSpace; if (entry.getOpen() > entry.getClose()) { candleRectBuffer[1] = entry.getOpen(); @@ -166,25 +190,28 @@ public class CandleDrawing implements IDrawing { render.mapPoints(candleRectBuffer); if (DEBUG) { - if (i == minIndex || i == maxIndex - 1) { - Log.i(TAG, "##d onComputeOver: i = " + i + ", candleRectBuffer = " + candleRectBuffer[0] + " - " + candleRectBuffer[2]); + if (iindex == minIndex || iindex == maxIndex - 1) { + HiLog.info(LABEL, "##d onComputeOver: iindex = " + iindex + ", candleRectBuffer = " + candleRectBuffer[0] + " - " + candleRectBuffer[2]); } } - - if (Math.abs(candleRectBuffer[1] - candleRectBuffer[3]) < 1.f) { // 涨停、跌停、或不涨不跌的一字板 + /** + * 涨停、跌停、或不涨不跌的一字板 + */ + if (Math.abs(candleRectBuffer[1] - candleRectBuffer[3]) < 1.f) { canvas.drawRect(candleRectBuffer[0], candleRectBuffer[1], candleRectBuffer[2], candleRectBuffer[3] + 2, candlePaint); } else { canvas.drawRect(candleRectBuffer[0], candleRectBuffer[1], candleRectBuffer[2], candleRectBuffer[3], candlePaint); } - // 计算高亮坐标 + /** + * 计算高亮坐标 + */ if (render.isHighlight()) { final float[] highlightPoint = render.getHighlightPoint(); if (candleRectBuffer[0] <= highlightPoint[0] && highlightPoint[0] <= candleRectBuffer[2]) { highlightPoint[0] = candleLineBuffer[0]; -// highlightPoint[1] = (candleRectBuffer[1] + candleRectBuffer[3]) / 2; - entrySet.setHighlightIndex(i); + entrySet.setHighlightIndex(iindex); } } } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/EmptyDataDrawing.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/EmptyDataDrawing.java index 20f23ae..f109c56 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/EmptyDataDrawing.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/EmptyDataDrawing.java @@ -18,39 +18,47 @@ package com.wordplat.ikvstockchart.drawing; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.RectF; import com.wordplat.ikvstockchart.entry.SizeColor; import com.wordplat.ikvstockchart.render.AbstractRender; +import com.wordplat.ikvstockchart.utils.StringUtils; +import ohos.agp.render.Canvas; +import ohos.agp.render.Paint; +import ohos.agp.utils.Color; +import ohos.agp.utils.RectFloat; +import ohos.agp.utils.TextAlignment; /** *

EmptyDataDrawing

*

Date: 2017/3/21

* * @author afon + * @since 2021-05-09 */ - public class EmptyDataDrawing implements IDrawing { - private Paint textPaint; - private final Paint.FontMetrics fontMetrics = new Paint.FontMetrics(); + private final Paint.FontMetrics fontMetrics = new Paint.FontMetrics(0, 0, 0, 0, 0); private AbstractRender render; private SizeColor sizeColor; - private final RectF contentRect = new RectF(); + private final RectFloat contentRect = new RectFloat(); @Override - public void onInit(RectF contentRect, AbstractRender render) { - this.render = render; - this.contentRect.set(contentRect); - this.sizeColor = render.getSizeColor(); + public void onInit(RectFloat rectFloat, AbstractRender abstractRender) { + this.render = abstractRender; + + this.contentRect.left = rectFloat.left; + this.contentRect.top = rectFloat.top; + this.contentRect.bottom = rectFloat.bottom; + this.contentRect.right = rectFloat.right; + + this.sizeColor = abstractRender.getSizeColor(); if (textPaint == null) { - textPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + textPaint = new Paint(); + textPaint.setAntiAlias(true); } - textPaint.setTextAlign(Paint.Align.CENTER); + textPaint.setTextAlign(TextAlignment.CENTER); } @Override @@ -68,21 +76,20 @@ public class EmptyDataDrawing implements IDrawing { if (render.getEntrySet().getEntryList().size() == 0) { final String drawText; if (render.getEntrySet().isLoadingStatus()) { - textPaint.setTextSize(sizeColor.getLoadingTextSize()); - textPaint.setColor(sizeColor.getLoadingTextColor()); + textPaint.setTextSize(StringUtils.floatToInt(sizeColor.getLoadingTextSize())); + textPaint.setColor(new Color(sizeColor.getLoadingTextColor())); drawText = sizeColor.getLoadingText(); } else { - textPaint.setTextSize(sizeColor.getErrorTextSize()); - textPaint.setColor(sizeColor.getErrorTextColor()); + + textPaint.setTextSize(StringUtils.floatToInt(sizeColor.getErrorTextSize())); + textPaint.setColor(new Color(sizeColor.getErrorTextColor())); drawText = sizeColor.getErrorText(); } + textPaint.getFontMetrics(); - textPaint.getFontMetrics(fontMetrics); - - canvas.drawText(drawText, - contentRect.width() / 2, - (contentRect.top + contentRect.bottom - fontMetrics.top - fontMetrics.bottom) / 2, - textPaint); + canvas.drawText(textPaint, drawText, + contentRect.getWidth() / 2, + (contentRect.top + contentRect.bottom - fontMetrics.top - fontMetrics.bottom) / 2); } } } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/HighlightDrawing.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/HighlightDrawing.java index 9b514b5..08a7b44 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/HighlightDrawing.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/HighlightDrawing.java @@ -18,14 +18,14 @@ package com.wordplat.ikvstockchart.drawing; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.RectF; -import android.text.TextPaint; import com.wordplat.ikvstockchart.entry.SizeColor; import com.wordplat.ikvstockchart.marker.IMarkerView; import com.wordplat.ikvstockchart.render.AbstractRender; +import ohos.agp.render.Canvas; +import ohos.agp.render.Paint; +import ohos.agp.utils.Color; +import ohos.agp.utils.RectFloat; import java.util.ArrayList; import java.util.List; @@ -35,44 +35,63 @@ import java.util.List; *

Date: 2017/3/23

* * @author afon + * @since 2021-05-09 */ - public class HighlightDrawing implements IDrawing { - - protected Paint highlightPaint; // 高亮线条画笔 - - protected final RectF contentRect = new RectF(); // 绘图区域 + /** + * 高亮线条画笔 + */ + protected Paint highlightPaint; + /** + * 绘图区域 + */ + protected final RectFloat contentRect = new RectFloat(); protected AbstractRender render; private List markerViewList = new ArrayList<>(); + /** + * HighlightDrawing + */ public HighlightDrawing() { } + /** + * HighlightDrawing + * @param markerViews + */ public HighlightDrawing(IMarkerView... markerViews) { for (IMarkerView markerView : markerViews) { addMarkerView(markerView); } } + /** + * addMarkerView + * @param markerView + */ public void addMarkerView(IMarkerView markerView) { markerViewList.add(markerView); } @Override - public void onInit(RectF contentRect, AbstractRender render) { + public void onInit(RectFloat contentRect, AbstractRender render) { this.render = render; final SizeColor sizeColor = render.getSizeColor(); if (highlightPaint == null) { - highlightPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - highlightPaint.setStyle(Paint.Style.STROKE); + highlightPaint = new Paint(); + highlightPaint.setAntiAlias(true); + highlightPaint.setStyle(Paint.Style.STROKE_STYLE); } highlightPaint.setStrokeWidth(sizeColor.getHighlightSize()); - highlightPaint.setColor(sizeColor.getHighlightColor()); + highlightPaint.setColor(new Color(sizeColor.getHighlightColor())); - this.contentRect.set(contentRect); + this.contentRect.left = contentRect.left; + this.contentRect.top = contentRect.top; + this.contentRect.bottom = contentRect.bottom; + this.contentRect.right = contentRect.right; if (markerViewList.size() > 0) { for (IMarkerView markerView : markerViewList) { @@ -93,7 +112,9 @@ public class HighlightDrawing implements IDrawing { @Override public void onDrawOver(Canvas canvas) { - // 绘制高亮 + /** + * 绘制高亮 + */ if (render.isHighlight()) { final float[] highlightPoint = render.getHighlightPoint(); diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/IDrawing.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/IDrawing.java index 7c7470f..a56947f 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/IDrawing.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/IDrawing.java @@ -18,18 +18,18 @@ package com.wordplat.ikvstockchart.drawing; -import android.graphics.Canvas; -import android.graphics.RectF; import com.wordplat.ikvstockchart.render.AbstractRender; +import ohos.agp.render.Canvas; +import ohos.agp.utils.RectFloat; /** *

IDrawing

*

Date: 2017/3/9

* * @author afon + * @since 2021-05-09 */ - public interface IDrawing { /** @@ -38,7 +38,7 @@ public interface IDrawing { * @param contentRect 视图区域 * @param render render */ - void onInit(RectF contentRect, AbstractRender render); + void onInit(RectFloat contentRect, AbstractRender render); /** * 计算预绘制的坐标 diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/KDJDrawing.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/KDJDrawing.java index 12a7822..4b12a94 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/KDJDrawing.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/KDJDrawing.java @@ -18,30 +18,33 @@ package com.wordplat.ikvstockchart.drawing; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.RectF; - import com.wordplat.ikvstockchart.entry.Entry; import com.wordplat.ikvstockchart.entry.EntrySet; import com.wordplat.ikvstockchart.entry.SizeColor; import com.wordplat.ikvstockchart.render.AbstractRender; +import ohos.agp.render.Canvas; +import ohos.agp.render.Paint; +import ohos.agp.utils.Color; +import ohos.agp.utils.RectFloat; + /** *

KDJDrawing

*

Date: 2017/3/15

* * @author afon + * @since 2021-05-09 */ - public class KDJDrawing implements IDrawing { - - private Paint axisPaint; // X 轴和 Y 轴的画笔 + /** + * X 轴和 Y 轴的画笔 + */ + private Paint axisPaint; private Paint kPaint; private Paint dPaint; private Paint jPaint; - private final RectF indexRect = new RectF(); + private final RectFloat indexRect = new RectFloat(); private AbstractRender render; private float[] xPointBuffer = new float[4]; @@ -52,41 +55,48 @@ public class KDJDrawing implements IDrawing { private float[] gridBuffer = new float[2]; @Override - public void onInit(RectF contentRect, AbstractRender render) { + public void onInit(RectFloat contentRect, AbstractRender render) { this.render = render; final SizeColor sizeColor = render.getSizeColor(); if (axisPaint == null) { - axisPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - axisPaint.setStyle(Paint.Style.STROKE); + axisPaint = new Paint(); + axisPaint.setAntiAlias(true); + axisPaint.setStyle(Paint.Style.STROKE_STYLE); } axisPaint.setStrokeWidth(sizeColor.getAxisSize()); - axisPaint.setColor(sizeColor.getAxisColor()); + axisPaint.setColor(new Color(sizeColor.getAxisColor())); if (kPaint == null) { - kPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - kPaint.setStyle(Paint.Style.STROKE); + kPaint = new Paint(); + kPaint.setAntiAlias(true); + kPaint.setStyle(Paint.Style.STROKE_STYLE); } if (dPaint == null) { - dPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - dPaint.setStyle(Paint.Style.STROKE); + dPaint = new Paint(); + dPaint.setAntiAlias(true); + dPaint.setStyle(Paint.Style.STROKE_STYLE); } if (jPaint == null) { - jPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - jPaint.setStyle(Paint.Style.STROKE); + jPaint = new Paint(); + jPaint.setAntiAlias(true); + jPaint.setStyle(Paint.Style.STROKE_STYLE); } kPaint.setStrokeWidth(sizeColor.getKdjLineSize()); dPaint.setStrokeWidth(sizeColor.getKdjLineSize()); jPaint.setStrokeWidth(sizeColor.getKdjLineSize()); - kPaint.setColor(sizeColor.getKdjKLineColor()); - dPaint.setColor(sizeColor.getKdjDLineColor()); - jPaint.setColor(sizeColor.getKdjJLineColor()); + kPaint.setColor(new Color(sizeColor.getKdjKLineColor())); + dPaint.setColor(new Color(sizeColor.getKdjDLineColor())); + jPaint.setColor(new Color(sizeColor.getKdjJLineColor())); - indexRect.set(contentRect); + indexRect.left = contentRect.left; + indexRect.top = contentRect.top; + indexRect.bottom = contentRect.bottom; + indexRect.right = contentRect.right; } @Override @@ -146,7 +156,7 @@ public class KDJDrawing implements IDrawing { final int count = (maxIndex - minIndex) * 4; - for (int i = 0 ; i < count ; i = i + 4) { + for (int i = 0; i < count; i = i + 4) { kBuffer[i + 0] = xPointBuffer[i + 0]; kBuffer[i + 2] = xPointBuffer[i + 2]; diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/KLineGridAxisDrawing.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/KLineGridAxisDrawing.java index ec83c4e..0a447c0 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/KLineGridAxisDrawing.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/KLineGridAxisDrawing.java @@ -18,15 +18,18 @@ package com.wordplat.ikvstockchart.drawing; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.RectF; import com.wordplat.ikvstockchart.align.YLabelAlign; import com.wordplat.ikvstockchart.entry.EntrySet; import com.wordplat.ikvstockchart.entry.SizeColor; import com.wordplat.ikvstockchart.render.AbstractRender; import com.wordplat.ikvstockchart.render.KLineRender; +import com.wordplat.ikvstockchart.utils.StringUtils; +import ohos.agp.render.Canvas; +import ohos.agp.render.Paint; +import ohos.agp.utils.Color; +import ohos.agp.utils.RectFloat; +import ohos.agp.utils.TextAlignment; import java.text.DecimalFormat; @@ -35,67 +38,92 @@ import java.text.DecimalFormat; *

Date: 2017/3/9

* * @author afon + * @since 2021-05-09 */ - public class KLineGridAxisDrawing implements IDrawing { - - private Paint xLabelPaint; // X 轴标签的画笔 - private Paint yLabelPaint; // Y 轴标签的画笔 - private Paint axisPaint; // X 轴和 Y 轴的画笔 - private Paint gridPaint; // k线图网格线画笔 - private final Paint.FontMetrics fontMetrics = new Paint.FontMetrics(); // 用于 labelPaint 计算文字位置 + /** + * X 轴标签的画笔 + */ + private Paint xLabelPaint; + /** + * Y 轴标签的画笔 + */ + private Paint yLabelPaint; + /** + * X 轴和 Y 轴的画笔 + */ + private Paint axisPaint; + /** + * k线图网格线画笔 + */ + private Paint gridPaint; + /** + * 用于 labelPaint 计算文字位置 + */ + private final Paint.FontMetrics fontMetrics = new Paint.FontMetrics(0, 0, 0, 0, 0); private final DecimalFormat decimalFormatter = new DecimalFormat("0.00"); - - private final RectF kLineRect = new RectF(); // K 线图显示区域 + /** + * K 线图显示区域 + */ + private final RectFloat kLineRect = new RectFloat(); private KLineRender render; private final float[] pointCache = new float[2]; private float lineHeight; - - private YLabelAlign yLabelAlign; // Y 轴标签对齐方向 + /** + * Y 轴标签对齐方向 + */ + private YLabelAlign yLabelAlign; @Override - public void onInit(RectF contentRect, AbstractRender render) { + public void onInit(RectFloat contentRect, AbstractRender render) { this.render = (KLineRender) render; final SizeColor sizeColor = render.getSizeColor(); if (xLabelPaint == null) { - xLabelPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + xLabelPaint = new Paint(); + xLabelPaint.setAntiAlias(true); } - xLabelPaint.setTextSize(sizeColor.getXLabelSize()); - xLabelPaint.setColor(sizeColor.getXLabelColor()); - xLabelPaint.setTextAlign(Paint.Align.CENTER); - xLabelPaint.getFontMetrics(fontMetrics); + xLabelPaint.setTextSize(StringUtils.floatToInt(sizeColor.getXLabelSize())); + xLabelPaint.setColor(new Color(sizeColor.getXLabelColor())); + xLabelPaint.setTextAlign(TextAlignment.CENTER); + xLabelPaint.getFontMetrics(); if (yLabelPaint == null) { - yLabelPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + yLabelPaint = new Paint(); + yLabelPaint.setAntiAlias(true); } - yLabelPaint.setTextSize(sizeColor.getYLabelSize()); - yLabelPaint.setColor(sizeColor.getYLabelColor()); + yLabelPaint.setTextSize(StringUtils.floatToInt(sizeColor.getYLabelSize())); + yLabelPaint.setColor(new Color(sizeColor.getYLabelColor())); yLabelAlign = sizeColor.getYLabelAlign(); if (yLabelAlign == YLabelAlign.RIGHT) { - yLabelPaint.setTextAlign(Paint.Align.RIGHT); + yLabelPaint.setTextAlign(TextAlignment.RIGHT); } if (axisPaint == null) { - axisPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - axisPaint.setStyle(Paint.Style.STROKE); + axisPaint = new Paint(); + axisPaint.setAntiAlias(true); + axisPaint.setStyle(Paint.Style.STROKE_STYLE); } if (gridPaint == null) { - gridPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - gridPaint.setStyle(Paint.Style.STROKE); + gridPaint = new Paint(); + gridPaint.setAntiAlias(true); + gridPaint.setStyle(Paint.Style.STROKE_STYLE); } axisPaint.setStrokeWidth(sizeColor.getAxisSize()); - axisPaint.setColor(sizeColor.getAxisColor()); + axisPaint.setColor(new Color(sizeColor.getAxisColor())); gridPaint.setStrokeWidth(sizeColor.getGridSize()); - gridPaint.setColor(sizeColor.getGridColor()); + gridPaint.setColor(new Color(sizeColor.getGridColor())); - kLineRect.set(contentRect); + kLineRect.left = contentRect.left; + kLineRect.top = contentRect.top; + kLineRect.bottom = contentRect.bottom; + kLineRect.right = contentRect.right; - lineHeight = kLineRect.height() / 4; + lineHeight = kLineRect.getHeight() / 4; } @Override @@ -107,11 +135,15 @@ public class KLineGridAxisDrawing implements IDrawing { public void onComputeOver(Canvas canvas, int minIndex, int maxIndex, float minY, float maxY) { final EntrySet entrySet = render.getEntrySet(); final SizeColor sizeColor = render.getSizeColor(); - // 绘制 最外层大框框 + /** + * 绘制 最外层大框框 + */ canvas.drawRect(kLineRect, axisPaint); - // 绘制 三条横向网格线 - for (int i = 0 ; i < 3 ; i++) { + /** + * 绘制 三条横向网格线 + */ + for (int i = 0; i < 3; i++) { float lineTop = kLineRect.top + (i + 1) * lineHeight; canvas.drawLine(kLineRect.left, lineTop, kLineRect.right, lineTop, gridPaint); } @@ -119,11 +151,15 @@ public class KLineGridAxisDrawing implements IDrawing { canvas.save(); canvas.clipRect(kLineRect.left, kLineRect.top, kLineRect.right, kLineRect.bottom + sizeColor.getXLabelViewHeight()); - // 每隔特定个 entry,绘制一条竖向网格线和 X 轴 label + /** + * 每隔特定个 entry,绘制一条竖向网格线和 X 轴 label + */ final int count = render.getZoomTimes() < 0 ? Math.abs(7 * render.getZoomTimes()) + 2 : 7; final int lastIndex = entrySet.getEntryList().size() - 1; for (int i = minIndex; i < maxIndex; i++) { - // 跳过首个 entry 和最后一个 entry,因为画出来不好看 + /** + * 跳过首个 entry 和最后一个 entry,因为画出来不好看 + */ if (i == 0 || i == lastIndex) { continue; } @@ -131,13 +167,14 @@ public class KLineGridAxisDrawing implements IDrawing { pointCache[0] = i + 0.5f; render.mapPoints(pointCache); - canvas.drawText( + canvas.drawText(xLabelPaint, entrySet.getEntryList().get(i).getXLabel(), pointCache[0], - kLineRect.bottom + render.getSizeColor().getXLabelSize(), - xLabelPaint); + kLineRect.bottom + render.getSizeColor().getXLabelSize()); - // 跳过超出显示区域的线 + /** + * 跳过超出显示区域的线 + */ if (pointCache[0] < kLineRect.left || pointCache[0] > kLineRect.right) { continue; } @@ -150,8 +187,10 @@ public class KLineGridAxisDrawing implements IDrawing { @Override public void onDrawOver(Canvas canvas) { - // 绘制 Y 轴 label - for (int i = 0 ; i < 5 ; i++) { + /** + * 绘制 Y 轴 label + */ + for (int i = 0; i < 5; i++) { float lineTop = kLineRect.top + i * lineHeight; pointCache[1] = lineTop; render.invertMapPoints(pointCache); @@ -167,7 +206,7 @@ public class KLineGridAxisDrawing implements IDrawing { float labelX = yLabelAlign == YLabelAlign.LEFT ? kLineRect.left + 5 : kLineRect.right - 5; - canvas.drawText(value, labelX, pointCache[0], yLabelPaint); + canvas.drawText(yLabelPaint, value, labelX, pointCache[0]); } } } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/KLineVolumeDrawing.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/KLineVolumeDrawing.java index 4176c55..8054d9e 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/KLineVolumeDrawing.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/KLineVolumeDrawing.java @@ -1,78 +1,102 @@ package com.wordplat.ikvstockchart.drawing; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.RectF; -import android.util.Log; import com.wordplat.ikvstockchart.compat.ViewUtils; import com.wordplat.ikvstockchart.entry.Entry; import com.wordplat.ikvstockchart.entry.EntrySet; import com.wordplat.ikvstockchart.entry.SizeColor; import com.wordplat.ikvstockchart.render.AbstractRender; +import ohos.agp.render.Canvas; +import ohos.agp.render.Paint; +import ohos.agp.utils.Color; +import ohos.agp.utils.RectFloat; /** *

KLineVolumeDrawing K线成交量的绘制

*

Date: 2017/6/28

* * @author afon + * @since 2021-05-09 */ - public class KLineVolumeDrawing implements IDrawing { private static final String TAG = "KLineVolumeDrawing"; - - private Paint axisPaint; // X 轴和 Y 轴的画笔 - private Paint ma5Paint; // 成交量的5日平均线画笔 - private Paint ma10Paint; // 成交量的10日平均线画笔 - private Paint candlePaint; // 成交量画笔 - - private final RectF candleRect = new RectF(); // 绘图区域 + /** + * X 轴和 Y 轴的画笔 + */ + private Paint axisPaint; + /** + * 成交量的5日平均线画笔 + */ + private Paint ma5Paint; + /** + * 成交量的10日平均线画笔 + */ + private Paint ma10Paint; + /** + * 成交量画笔 + */ + private Paint candlePaint; + /** + * 绘图区域 + */ + private final RectFloat candleRect = new RectFloat(); private AbstractRender render; - // 计算 MA(5, 10) 线条坐标用的 + /** + * 计算 MA(5, 10) 线条坐标用的 + */ private float[] xPointBuffer = new float[4]; private float[] ma5Buffer = new float[4]; private float[] ma10Buffer = new float[4]; - - private float candleSpace = 0.1f; // entry 与 entry 之间的间隙,默认 0.1f (10%) + /** + * entry 与 entry 之间的间隙,默认 0.1f (10%) + */ + private float candleSpace = 0.1f; private float[] xRectBuffer = new float[4]; private float[] candleBuffer = new float[4]; @Override - public void onInit(RectF contentRect, AbstractRender render) { + public void onInit(RectFloat contentRect, AbstractRender render) { this.render = render; final SizeColor sizeColor = render.getSizeColor(); if (axisPaint == null) { - axisPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - axisPaint.setStyle(Paint.Style.STROKE); + axisPaint = new Paint(); + axisPaint.setAntiAlias(true); + axisPaint.setStyle(Paint.Style.STROKE_STYLE); } axisPaint.setStrokeWidth(sizeColor.getAxisSize()); - axisPaint.setColor(sizeColor.getAxisColor()); + axisPaint.setColor(new Color(sizeColor.getAxisColor())); if (ma5Paint == null) { - ma5Paint = new Paint(Paint.ANTI_ALIAS_FLAG); - ma5Paint.setStyle(Paint.Style.STROKE); + ma5Paint = new Paint(); + ma5Paint.setAntiAlias(true); + ma5Paint.setStyle(Paint.Style.STROKE_STYLE); } if (ma10Paint == null) { - ma10Paint = new Paint(Paint.ANTI_ALIAS_FLAG); - ma10Paint.setStyle(Paint.Style.STROKE); + ma10Paint = new Paint(); + ma10Paint.setAntiAlias(true); + ma10Paint.setStyle(Paint.Style.STROKE_STYLE); } if (candlePaint == null) { - candlePaint = new Paint(Paint.ANTI_ALIAS_FLAG); - candlePaint.setStyle(Paint.Style.FILL); + candlePaint = new Paint(); + candlePaint.setAntiAlias(true); + candlePaint.setStyle(Paint.Style.FILL_STYLE); candlePaint.setStrokeWidth(sizeColor.getCandleBorderSize()); } ma5Paint.setStrokeWidth(sizeColor.getMaLineSize()); ma10Paint.setStrokeWidth(sizeColor.getMaLineSize()); - ma5Paint.setColor(sizeColor.getMa5Color()); - ma10Paint.setColor(sizeColor.getMa10Color()); + ma5Paint.setColor(new Color(sizeColor.getMa5Color())); + ma10Paint.setColor(new Color(sizeColor.getMa10Color())); - candleRect.set(contentRect); + candleRect.left = contentRect.left; + candleRect.top = contentRect.top; + candleRect.bottom = contentRect.bottom; + candleRect.right = contentRect.right; } @Override @@ -117,10 +141,14 @@ public class KLineVolumeDrawing implements IDrawing { canvas.drawRect(candleRect, axisPaint); for (int i = minIndex; i < maxIndex; i++) { - // 设置画笔颜色 + /** + * 设置画笔颜色 + */ Entry entry = ViewUtils.setUpCandlePaint(candlePaint, entrySet, i, sizeColor); - // 计算 成交量的矩形卓坐标 + /** + * 计算 成交量的矩形卓坐标 + */ xRectBuffer[0] = i + candleSpace; xRectBuffer[1] = 0; xRectBuffer[2] = i + 1 - candleSpace; @@ -133,22 +161,26 @@ public class KLineVolumeDrawing implements IDrawing { candleBuffer[3] = minY; render.mapPoints(null, candleBuffer); - - if (Math.abs(candleBuffer[1] - candleBuffer[3]) < 1.f) { // 成交量非常小画一条直线 + /** + * 成交量非常小画一条直线 + */ + if (Math.abs(candleBuffer[1] - candleBuffer[3]) < 1.f) { canvas.drawRect(xRectBuffer[0], candleBuffer[1] - 2, xRectBuffer[2], candleBuffer[1], candlePaint); } else { canvas.drawRect(xRectBuffer[0], candleBuffer[1], xRectBuffer[2], candleBuffer[3] - axisPaint.getStrokeWidth(), candlePaint); } } - // 映射坐标,绘制成交量的5日平均线和10日平均线 + /** + * 映射坐标,绘制成交量的5日平均线和10日平均线 + */ render.mapPoints(xPointBuffer); render.mapPoints(null, ma5Buffer); render.mapPoints(null, ma10Buffer); final int count = (maxIndex - minIndex) * 4; - for (int i = 0 ; i < count ; i = i + 4) { + for (int i = 0; i < count; i = i + 4) { ma5Buffer[i + 0] = xPointBuffer[i + 0]; ma5Buffer[i + 2] = xPointBuffer[i + 2]; @@ -156,7 +188,9 @@ public class KLineVolumeDrawing implements IDrawing { ma10Buffer[i + 2] = xPointBuffer[i + 2]; } - // 使用 drawLines 方法比依次调用 drawLine 方法要快 + /** + * 使用 drawLines 方法比依次调用 drawLine 方法要快 + */ canvas.drawLines(ma5Buffer, 0, count, ma5Paint); canvas.drawLines(ma10Buffer, 0, count, ma10Paint); diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/KLineVolumeHighlightDrawing.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/KLineVolumeHighlightDrawing.java index cfd8ff8..78fe5ff 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/KLineVolumeHighlightDrawing.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/KLineVolumeHighlightDrawing.java @@ -1,19 +1,22 @@ package com.wordplat.ikvstockchart.drawing; -import android.graphics.Canvas; + +import ohos.agp.render.Canvas; /** *

KLineVolumeHighlightDrawing K线成交量的高亮绘制

*

Date: 2017/6/28

* * @author afon + * @since 2021-05-09 */ - public class KLineVolumeHighlightDrawing extends HighlightDrawing { @Override public void onDrawOver(Canvas canvas) { - // 绘制高亮 成交量的高亮线条不需要垂直移动 + /** + * 绘制高亮 成交量的高亮线条不需要垂直移动 + */ if (render.isHighlight()) { final float[] highlightPoint = render.getHighlightPoint(); diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/MACDDrawing.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/MACDDrawing.java index e27ea42..3b37c58 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/MACDDrawing.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/MACDDrawing.java @@ -18,22 +18,24 @@ package com.wordplat.ikvstockchart.drawing; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.RectF; import com.wordplat.ikvstockchart.entry.Entry; import com.wordplat.ikvstockchart.entry.EntrySet; import com.wordplat.ikvstockchart.entry.SizeColor; import com.wordplat.ikvstockchart.render.AbstractRender; +import ohos.agp.render.Canvas; +import ohos.agp.render.Paint; +import ohos.agp.utils.Color; +import ohos.agp.utils.RectFloat; + /** *

MACDDrawing

*

Date: 2017/3/14

* * @author afon + * @since 2021-05-09 */ - public class MACDDrawing implements IDrawing { private static final String TAG = "MACDDrawing"; @@ -42,7 +44,7 @@ public class MACDDrawing implements IDrawing { private Paint difPaint; private Paint macdPaint; - private final RectF indexRect = new RectF(); + private final RectFloat indexRect = new RectFloat(); private AbstractRender render; private float candleSpace = 0.1f; @@ -57,41 +59,48 @@ public class MACDDrawing implements IDrawing { private float[] macdBuffer = new float[4]; @Override - public void onInit(RectF contentRect, AbstractRender render) { + public void onInit(RectFloat contentRect, AbstractRender render) { this.render = render; final SizeColor sizeColor = render.getSizeColor(); if (axisPaint == null) { - axisPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - axisPaint.setStyle(Paint.Style.STROKE); + axisPaint = new Paint(); + axisPaint.setAntiAlias(true); + axisPaint.setStyle(Paint.Style.STROKE_STYLE); } axisPaint.setStrokeWidth(sizeColor.getAxisSize()); - axisPaint.setColor(sizeColor.getAxisColor()); + axisPaint.setColor(new Color(sizeColor.getAxisColor())); if (deaPaint == null) { - deaPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - deaPaint.setStyle(Paint.Style.STROKE); + deaPaint = new Paint(); + deaPaint.setAntiAlias(true); + deaPaint.setStyle(Paint.Style.STROKE_STYLE); } if (difPaint == null) { - difPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - difPaint.setStyle(Paint.Style.STROKE); + difPaint = new Paint(); + difPaint.setAntiAlias(true); + difPaint.setStyle(Paint.Style.STROKE_STYLE); } if (macdPaint == null) { - macdPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - macdPaint.setStyle(Paint.Style.FILL); + macdPaint = new Paint(); + macdPaint.setAntiAlias(true); + macdPaint.setStyle(Paint.Style.FILL_STYLE); macdPaint.setStrokeWidth(sizeColor.getMacdLineSize()); } - macdPaint.setColor(sizeColor.getIncreasingColor()); + macdPaint.setColor(new Color(sizeColor.getIncreasingColor())); deaPaint.setStrokeWidth(sizeColor.getMacdLineSize()); difPaint.setStrokeWidth(sizeColor.getMacdLineSize()); - deaPaint.setColor(sizeColor.getDeaLineColor()); - difPaint.setColor(sizeColor.getDiffLineColor()); + deaPaint.setColor(new Color(sizeColor.getDeaLineColor())); + difPaint.setColor(new Color(sizeColor.getDiffLineColor())); - indexRect.set(contentRect); + indexRect.left = contentRect.left; + indexRect.top = contentRect.top; + indexRect.bottom = contentRect.bottom; + indexRect.right = contentRect.right; } @Override @@ -167,9 +176,9 @@ public class MACDDrawing implements IDrawing { render.mapPoints(null, macdBuffer); if (macdBuffer[3] <= gridBuffer[1]) { - macdPaint.setColor(sizeColor.getIncreasingColor()); + macdPaint.setColor(new Color(sizeColor.getIncreasingColor())); } else { - macdPaint.setColor(sizeColor.getDecreasingColor()); + macdPaint.setColor(new Color(sizeColor.getDecreasingColor())); } canvas.drawRect(xRectBuffer[0], macdBuffer[1], xRectBuffer[2], macdBuffer[3], macdPaint); diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/MADrawing.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/MADrawing.java index 7d7f6d7..8bce6c6 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/MADrawing.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/MADrawing.java @@ -18,65 +18,77 @@ package com.wordplat.ikvstockchart.drawing; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.RectF; import com.wordplat.ikvstockchart.entry.Entry; import com.wordplat.ikvstockchart.entry.EntrySet; import com.wordplat.ikvstockchart.entry.SizeColor; import com.wordplat.ikvstockchart.render.AbstractRender; +import ohos.agp.render.Canvas; +import ohos.agp.render.Paint; +import ohos.agp.utils.Color; +import ohos.agp.utils.RectFloat; + /** *

MADrawing

*

Date: 2017/3/9

* * @author afon + * @since 2021-05-09 */ - public class MADrawing implements IDrawing { private Paint ma5Paint; private Paint ma10Paint; private Paint ma20Paint; - - private final RectF candleRect = new RectF(); // K 线图显示区域 + /** + * K 线图显示区域 + */ + private final RectFloat candleRect = new RectFloat(); private AbstractRender render; - // 计算 MA(5, 10, 20) 线条坐标用的 + /** + * 计算 MA(5, 10, 20) 线条坐标用的 + */ private float[] ma5Buffer = new float[4]; private float[] ma10Buffer = new float[4]; private float[] ma20Buffer = new float[4]; @Override - public void onInit(RectF contentRect, AbstractRender render) { + public void onInit(RectFloat contentRect, AbstractRender render) { this.render = render; final SizeColor sizeColor = render.getSizeColor(); if (ma5Paint == null) { - ma5Paint = new Paint(Paint.ANTI_ALIAS_FLAG); - ma5Paint.setStyle(Paint.Style.STROKE); + ma5Paint = new Paint(); + ma5Paint.setAntiAlias(true); + ma5Paint.setStyle(Paint.Style.STROKE_STYLE); } if (ma10Paint == null) { - ma10Paint = new Paint(Paint.ANTI_ALIAS_FLAG); - ma10Paint.setStyle(Paint.Style.STROKE); + ma10Paint = new Paint(); + ma10Paint.setAntiAlias(true); + ma10Paint.setStyle(Paint.Style.STROKE_STYLE); } if (ma20Paint == null) { - ma20Paint = new Paint(Paint.ANTI_ALIAS_FLAG); - ma20Paint.setStyle(Paint.Style.STROKE); + ma20Paint = new Paint(); + ma20Paint.setAntiAlias(true); + ma20Paint.setStyle(Paint.Style.STROKE_STYLE); } ma5Paint.setStrokeWidth(sizeColor.getMaLineSize()); ma10Paint.setStrokeWidth(sizeColor.getMaLineSize()); ma20Paint.setStrokeWidth(sizeColor.getMaLineSize()); - ma5Paint.setColor(sizeColor.getMa5Color()); - ma10Paint.setColor(sizeColor.getMa10Color()); - ma20Paint.setColor(sizeColor.getMa20Color()); + ma5Paint.setColor(new Color(sizeColor.getMa5Color())); + ma10Paint.setColor(new Color(sizeColor.getMa10Color())); + ma20Paint.setColor(new Color(sizeColor.getMa20Color())); - candleRect.set(contentRect); + candleRect.left = contentRect.left; + candleRect.top = contentRect.top; + candleRect.bottom = contentRect.bottom; + candleRect.right = contentRect.right; } @Override @@ -121,7 +133,9 @@ public class MADrawing implements IDrawing { final int count = (maxIndex - minIndex) * 4; - // 使用 drawLines 方法比依次调用 drawLine 方法要快 + /** + * 使用 drawLines 方法比依次调用 drawLine 方法要快 + */ canvas.drawLines(ma5Buffer, 0, count, ma5Paint); canvas.drawLines(ma10Buffer, 0, count, ma10Paint); canvas.drawLines(ma20Buffer, 0, count, ma20Paint); diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/RSIDrawing.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/RSIDrawing.java index 0d84fe2..66ddae0 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/RSIDrawing.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/RSIDrawing.java @@ -18,30 +18,34 @@ package com.wordplat.ikvstockchart.drawing; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.RectF; import com.wordplat.ikvstockchart.entry.Entry; import com.wordplat.ikvstockchart.entry.EntrySet; import com.wordplat.ikvstockchart.entry.SizeColor; import com.wordplat.ikvstockchart.render.AbstractRender; +import ohos.agp.render.Canvas; +import ohos.agp.render.Paint; +import ohos.agp.utils.Color; +import ohos.agp.utils.RectFloat; + /** *

RSIDrawing

*

Date: 2017/3/15

* * @author afon + * @since 2021-05-09 */ - public class RSIDrawing implements IDrawing { - - private Paint axisPaint; // X 轴和 Y 轴的画笔 + /** + * X 轴和 Y 轴的画笔 + */ + private Paint axisPaint; private Paint r1Paint; private Paint r2Paint; private Paint r3Paint; - private final RectF indexRect = new RectF(); + private final RectFloat indexRect = new RectFloat(); private AbstractRender render; private float[] xPointBuffer = new float[4]; @@ -52,41 +56,48 @@ public class RSIDrawing implements IDrawing { private float[] gridBuffer = new float[2]; @Override - public void onInit(RectF contentRect, AbstractRender render) { + public void onInit(RectFloat contentRect, AbstractRender render) { this.render = render; final SizeColor sizeColor = render.getSizeColor(); if (axisPaint == null) { - axisPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - axisPaint.setStyle(Paint.Style.STROKE); + axisPaint = new Paint(); + axisPaint.setAntiAlias(true); + axisPaint.setStyle(Paint.Style.STROKE_STYLE); } axisPaint.setStrokeWidth(sizeColor.getAxisSize()); - axisPaint.setColor(sizeColor.getAxisColor()); + axisPaint.setColor(new Color(sizeColor.getAxisColor())); if (r1Paint == null) { - r1Paint = new Paint(Paint.ANTI_ALIAS_FLAG); - r1Paint.setStyle(Paint.Style.STROKE); + r1Paint = new Paint(); + r1Paint.setAntiAlias(true); + r1Paint.setStyle(Paint.Style.STROKE_STYLE); } if (r2Paint == null) { - r2Paint = new Paint(Paint.ANTI_ALIAS_FLAG); - r2Paint.setStyle(Paint.Style.STROKE); + r2Paint = new Paint(); + r2Paint.setAntiAlias(true); + r2Paint.setStyle(Paint.Style.STROKE_STYLE); } if (r3Paint == null) { - r3Paint = new Paint(Paint.ANTI_ALIAS_FLAG); - r3Paint.setStyle(Paint.Style.STROKE); + r3Paint = new Paint(); + r3Paint.setAntiAlias(true); + r3Paint.setStyle(Paint.Style.STROKE_STYLE); } r1Paint.setStrokeWidth(sizeColor.getRsiLineSize()); r2Paint.setStrokeWidth(sizeColor.getRsiLineSize()); r3Paint.setStrokeWidth(sizeColor.getRsiLineSize()); - r1Paint.setColor(sizeColor.getRsi1LineColor()); - r2Paint.setColor(sizeColor.getRsi2LineColor()); - r3Paint.setColor(sizeColor.getRsi3LineColor()); + r1Paint.setColor(new Color(sizeColor.getRsi1LineColor())); + r2Paint.setColor(new Color(sizeColor.getRsi2LineColor())); + r3Paint.setColor(new Color(sizeColor.getRsi3LineColor())); - indexRect.set(contentRect); + indexRect.left = contentRect.left; + indexRect.top = contentRect.top; + indexRect.bottom = contentRect.bottom; + indexRect.right = contentRect.right; } @Override diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/StockIndexYLabelDrawing.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/StockIndexYLabelDrawing.java index e2906c7..829d4d3 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/StockIndexYLabelDrawing.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/StockIndexYLabelDrawing.java @@ -18,13 +18,16 @@ package com.wordplat.ikvstockchart.drawing; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.RectF; import com.wordplat.ikvstockchart.align.YLabelAlign; import com.wordplat.ikvstockchart.entry.SizeColor; import com.wordplat.ikvstockchart.render.AbstractRender; +import com.wordplat.ikvstockchart.utils.StringUtils; +import ohos.agp.render.Canvas; +import ohos.agp.render.Paint; +import ohos.agp.utils.Color; +import ohos.agp.utils.RectFloat; +import ohos.agp.utils.TextAlignment; import java.text.DecimalFormat; @@ -33,34 +36,45 @@ import java.text.DecimalFormat; *

Date: 2017/3/28

* * @author afon + * @since 2021-05-09 */ - public class StockIndexYLabelDrawing implements IDrawing { - - private Paint yLabelPaint; // Y 轴标签的画笔 - private final Paint.FontMetrics fontMetrics = new Paint.FontMetrics(); // 用于 labelPaint 计算文字位置 + /** + * Y 轴标签的画笔 + */ + private Paint yLabelPaint; + /** + * 用于 labelPaint 计算文字位置 + */ + private final Paint.FontMetrics fontMetrics = new Paint.FontMetrics(0, 0, 0, 0, 0); private final DecimalFormat decimalFormatter = new DecimalFormat("0.00"); - private final RectF indexRect = new RectF(); - - private YLabelAlign yLabelAlign; // Y 轴标签对齐方向 + private final RectFloat indexRect = new RectFloat(); + /** + * Y 轴标签对齐方向 + */ + private YLabelAlign yLabelAlign; @Override - public void onInit(RectF contentRect, AbstractRender render) { + public void onInit(RectFloat contentRect, AbstractRender render) { final SizeColor sizeColor = render.getSizeColor(); if (yLabelPaint == null) { - yLabelPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - yLabelPaint.setTextSize(sizeColor.getYLabelSize()); + yLabelPaint = new Paint(); + yLabelPaint.setAntiAlias(true); + yLabelPaint.setTextSize(StringUtils.floatToInt(sizeColor.getYLabelSize())); } - yLabelPaint.setColor(sizeColor.getYLabelColor()); - yLabelPaint.getFontMetrics(fontMetrics); + yLabelPaint.setColor(new Color(sizeColor.getYLabelColor())); + yLabelPaint.getFontMetrics(); yLabelAlign = sizeColor.getYLabelAlign(); if (yLabelAlign == YLabelAlign.RIGHT) { - yLabelPaint.setTextAlign(Paint.Align.RIGHT); + yLabelPaint.setTextAlign(TextAlignment.RIGHT); } - indexRect.set(contentRect); + indexRect.left = contentRect.left; + indexRect.top = contentRect.top; + indexRect.bottom = contentRect.bottom; + indexRect.right = contentRect.right; } @Override @@ -72,17 +86,8 @@ public class StockIndexYLabelDrawing implements IDrawing { public void onComputeOver(Canvas canvas, int minIndex, int maxIndex, float minY, float maxY) { float labelX = yLabelAlign == YLabelAlign.LEFT ? indexRect.left + 5 : indexRect.right - 5; - canvas.drawText( - decimalFormatter.format(maxY), - labelX, - indexRect.top - fontMetrics.top, - yLabelPaint); - - canvas.drawText( - decimalFormatter.format(minY), - labelX, - indexRect.bottom - fontMetrics.bottom, - yLabelPaint); + canvas.drawText(yLabelPaint, decimalFormatter.format(maxY), labelX, indexRect.top - fontMetrics.top); + canvas.drawText(yLabelPaint, decimalFormatter.format(minY), labelX, indexRect.bottom - fontMetrics.bottom); } @Override diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/TimeLineDrawing.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/TimeLineDrawing.java index 5b1478e..339d358 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/TimeLineDrawing.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/TimeLineDrawing.java @@ -18,45 +18,53 @@ package com.wordplat.ikvstockchart.drawing; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.RectF; import com.wordplat.ikvstockchart.entry.Entry; import com.wordplat.ikvstockchart.entry.EntrySet; import com.wordplat.ikvstockchart.entry.SizeColor; import com.wordplat.ikvstockchart.render.AbstractRender; +import ohos.agp.render.Canvas; +import ohos.agp.render.Paint; +import ohos.agp.utils.Color; +import ohos.agp.utils.RectFloat; + /** *

TimeLineDrawing

*

Date: 2017/3/9

* * @author afon + * @since 2021-05-09 */ - public class TimeLineDrawing implements IDrawing { private Paint linePaint; - - private final RectF chartRect = new RectF(); // 分时图显示区域 + /** + * 分时图显示区域 + */ + private final RectFloat chartRect = new RectFloat(); private AbstractRender render; private float[] lineBuffer = new float[4]; private float[] pointBuffer = new float[2]; @Override - public void onInit(RectF contentRect, AbstractRender render) { + public void onInit(RectFloat contentRect, AbstractRender render) { this.render = render; final SizeColor sizeColor = render.getSizeColor(); if (linePaint == null) { - linePaint = new Paint(Paint.ANTI_ALIAS_FLAG); - linePaint.setStyle(Paint.Style.FILL); + linePaint = new Paint(); + linePaint.setAntiAlias(true); + linePaint.setStyle(Paint.Style.FILL_STYLE); } linePaint.setStrokeWidth(sizeColor.getTimeLineSize()); - linePaint.setColor(sizeColor.getTimeLineColor()); + linePaint.setColor(new Color(sizeColor.getTimeLineColor())); - chartRect.set(contentRect); + chartRect.left = contentRect.left; + chartRect.top = contentRect.top; + chartRect.bottom = contentRect.bottom; + chartRect.right = contentRect.right; } @Override @@ -92,7 +100,9 @@ public class TimeLineDrawing implements IDrawing { canvas.drawLines(lineBuffer, 0, count, linePaint); } - // 计算高亮坐标 + /** + * 计算高亮坐标 + */ if (render.isHighlight()) { final EntrySet entrySet = render.getEntrySet(); final int lastEntryIndex = entrySet.getEntryList().size() - 2; @@ -101,10 +111,10 @@ public class TimeLineDrawing implements IDrawing { render.invertMapPoints(pointBuffer); final int highlightIndex = pointBuffer[0] < 0 ? 0 : (int) pointBuffer[0]; final int i = highlightIndex - minIndex; - highlightPoint[0] = highlightIndex < lastEntryIndex ? - lineBuffer[i * 4 + 0] : lineBuffer[lastEntryIndex * 4 + 2]; - highlightPoint[1] = highlightIndex < lastEntryIndex ? - lineBuffer[i * 4 + 1] : lineBuffer[lastEntryIndex * 4 + 3]; + highlightPoint[0] = highlightIndex < lastEntryIndex + ? lineBuffer[i * 4 + 0] : lineBuffer[lastEntryIndex * 4 + 2]; + highlightPoint[1] = highlightIndex < lastEntryIndex + ? lineBuffer[i * 4 + 1] : lineBuffer[lastEntryIndex * 4 + 3]; } canvas.restore(); diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/TimeLineGridAxisDrawing.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/TimeLineGridAxisDrawing.java index 8b48f1f..978f6f7 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/TimeLineGridAxisDrawing.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/drawing/TimeLineGridAxisDrawing.java @@ -18,13 +18,17 @@ package com.wordplat.ikvstockchart.drawing; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.RectF; import com.wordplat.ikvstockchart.entry.EntrySet; import com.wordplat.ikvstockchart.entry.SizeColor; import com.wordplat.ikvstockchart.render.AbstractRender; +import com.wordplat.ikvstockchart.utils.StringUtils; + +import ohos.agp.render.Canvas; +import ohos.agp.render.Paint; +import ohos.agp.utils.Color; +import ohos.agp.utils.RectFloat; +import ohos.agp.utils.TextAlignment; import java.text.DecimalFormat; @@ -33,18 +37,34 @@ import java.text.DecimalFormat; *

Date: 2017/3/10

* * @author afon + * @since 2021-05-09 */ - public class TimeLineGridAxisDrawing implements IDrawing { - - private Paint xLabelPaint; // X 轴标签的画笔 - private Paint yLabelPaint; // Y 轴标签的画笔 - private Paint axisPaint; // X 轴和 Y 轴的画笔 - private Paint gridPaint; // k线图网格线画笔 - private final Paint.FontMetrics fontMetrics = new Paint.FontMetrics(); // 用于 labelPaint 计算文字位置 + /** + * X 轴标签的画笔 + */ + private Paint xLabelPaint; + /** + * Y 轴标签的画笔 + */ + private Paint yLabelPaint; + /** + * X 轴和 Y 轴的画笔 + */ + private Paint axisPaint; + /** + * k线图网格线画笔 + */ + private Paint gridPaint; + /** + * 用于 labelPaint 计算文字位置 + */ + private final Paint.FontMetrics fontMetrics = new Paint.FontMetrics(0, 0, 0, 0, 0); private final DecimalFormat decimalFormatter = new DecimalFormat("0.00"); - - private final RectF chartRect = new RectF(); // 分时图显示区域 + /** + * 分时图显示区域 + */ + private final RectFloat chartRect = new RectFloat(); private AbstractRender render; private SizeColor sizeColor; @@ -54,44 +74,51 @@ public class TimeLineGridAxisDrawing implements IDrawing { private float lineWidth; private int entrySetSize; - + @Override - public void onInit(RectF contentRect, AbstractRender render) { + public void onInit(RectFloat contentRect, AbstractRender render) { this.render = render; this.sizeColor = render.getSizeColor(); if (xLabelPaint == null) { - xLabelPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + xLabelPaint = new Paint(); + xLabelPaint.setAntiAlias(true); } - xLabelPaint.setTextSize(sizeColor.getXLabelSize()); - xLabelPaint.setColor(sizeColor.getXLabelColor()); - xLabelPaint.getFontMetrics(fontMetrics); + xLabelPaint.setTextSize(StringUtils.floatToInt(sizeColor.getXLabelSize())); + xLabelPaint.setColor(new Color(sizeColor.getXLabelColor())); + xLabelPaint.getFontMetrics(); if (yLabelPaint == null) { - yLabelPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + yLabelPaint = new Paint(); + yLabelPaint.setAntiAlias(true); } - yLabelPaint.setTextSize(sizeColor.getYLabelSize()); + yLabelPaint.setTextSize(StringUtils.floatToInt(sizeColor.getYLabelSize())); if (axisPaint == null) { - axisPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - axisPaint.setStyle(Paint.Style.STROKE); + axisPaint = new Paint(); + axisPaint.setAntiAlias(true); + axisPaint.setStyle(Paint.Style.STROKE_STYLE); } if (gridPaint == null) { - gridPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - gridPaint.setStyle(Paint.Style.STROKE); + gridPaint = new Paint(); + gridPaint.setAntiAlias(true); + gridPaint.setStyle(Paint.Style.STROKE_STYLE); } axisPaint.setStrokeWidth(sizeColor.getAxisSize()); - axisPaint.setColor(sizeColor.getAxisColor()); + axisPaint.setColor(new Color(sizeColor.getAxisColor())); gridPaint.setStrokeWidth(sizeColor.getGridSize()); - gridPaint.setColor(sizeColor.getGridColor()); + gridPaint.setColor(new Color(sizeColor.getGridColor())); - chartRect.set(contentRect); + chartRect.left = contentRect.left; + chartRect.top = contentRect.top; + chartRect.bottom = contentRect.bottom; + chartRect.right = contentRect.right; - lineHeight = chartRect.height() / 4; - lineWidth = chartRect.width() / 4; + lineHeight = chartRect.getHeight() / 4; + lineWidth = chartRect.getWidth() / 4; } @Override @@ -103,35 +130,42 @@ public class TimeLineGridAxisDrawing implements IDrawing { public void onComputeOver(Canvas canvas, int minIndex, int maxIndex, float minY, float maxY) { final EntrySet entrySet = render.getEntrySet(); entrySetSize = entrySet.getEntryList().size(); - // 绘制 最外层大框框 + /** + * 绘制 最外层大框框 + */ canvas.drawRect(chartRect, axisPaint); - // 绘制 三条横向网格线 - for (int i = 0 ; i < 3 ; i++) { + /** + * 绘制 三条横向网格线 + */ + for (int i = 0; i < 3; i++) { float lineTop = chartRect.top + (i + 1) * lineHeight; canvas.drawLine(chartRect.left, lineTop, chartRect.right, lineTop, gridPaint); } - for (int i = 0 ; i < 5 ; i++) { + for (int i = 0; i < 5; i++) { float lineLeft = chartRect.left + i * lineWidth; if (i != 0 && i != 4) { - // 绘制 三条竖向网格线 + /** + * 绘制 三条竖向网格线 + */ canvas.drawLine(lineLeft, chartRect.top, lineLeft, chartRect.bottom, gridPaint); - xLabelPaint.setTextAlign(Paint.Align.CENTER); + xLabelPaint.setTextAlign(TextAlignment.CENTER); } else if (i == 0) { - xLabelPaint.setTextAlign(Paint.Align.LEFT); + xLabelPaint.setTextAlign(TextAlignment.LEFT); } else { - xLabelPaint.setTextAlign(Paint.Align.RIGHT); + xLabelPaint.setTextAlign(TextAlignment.RIGHT); } - // 绘制 X 轴 label + /** + * 绘制 X 轴 label + */ if (entrySetSize > 0) { - canvas.drawText( + canvas.drawText(xLabelPaint, entrySet.getEntryList().get(i).getXLabel(), lineLeft, - chartRect.bottom + render.getSizeColor().getXLabelSize(), - xLabelPaint); + chartRect.bottom + render.getSizeColor().getXLabelSize()); } } } @@ -139,10 +173,12 @@ public class TimeLineGridAxisDrawing implements IDrawing { @Override public void onDrawOver(Canvas canvas) { if (entrySetSize < 1) { - return ; + return; } - // 绘制 Y 轴左边 label - for (int i = 0 ; i < 5 ; i++) { + /** + * 绘制 Y 轴左边 label + */ + for (int i = 0; i < 5; i++) { float lineTop = chartRect.top + i * lineHeight; pointCache[1] = lineTop; render.invertMapPoints(pointCache); @@ -157,21 +193,23 @@ public class TimeLineGridAxisDrawing implements IDrawing { } if (i == 2) { - yLabelPaint.setColor(sizeColor.getNeutralColor()); + yLabelPaint.setColor(new Color(sizeColor.getNeutralColor())); } else if (i > 2) { - yLabelPaint.setColor(sizeColor.getDecreasingColor()); + yLabelPaint.setColor(new Color(sizeColor.getNeutralColor())); } else { - yLabelPaint.setColor(sizeColor.getIncreasingColor()); + yLabelPaint.setColor(new Color(sizeColor.getIncreasingColor())); } - yLabelPaint.setTextAlign(Paint.Align.LEFT); + yLabelPaint.setTextAlign(TextAlignment.LEFT); - canvas.drawText(value, chartRect.left + 5, pointCache[0], yLabelPaint); + canvas.drawText(yLabelPaint, value, chartRect.left + 5, pointCache[0]); valueCache[i] = pointCache[1]; } - // 绘制 Y 轴右边 label - for (int i = 0 ; i < 5 ; i++) { + /** + * 绘制 Y 轴右边 label + */ + for (int i = 0; i < 5; i++) { float percent = (valueCache[i] - valueCache[2]) / valueCache[2] * 100; String value = decimalFormatter.format(percent); float lineTop = chartRect.top + i * lineHeight; @@ -185,15 +223,15 @@ public class TimeLineGridAxisDrawing implements IDrawing { } if (i == 2) { - yLabelPaint.setColor(sizeColor.getNeutralColor()); + yLabelPaint.setColor(new Color(sizeColor.getNeutralColor())); } else if (i > 2) { - yLabelPaint.setColor(sizeColor.getDecreasingColor()); + yLabelPaint.setColor(new Color(sizeColor.getDecreasingColor())); } else { - yLabelPaint.setColor(sizeColor.getIncreasingColor()); + yLabelPaint.setColor(new Color(sizeColor.getIncreasingColor())); } - yLabelPaint.setTextAlign(Paint.Align.RIGHT); + yLabelPaint.setTextAlign(TextAlignment.RIGHT); - canvas.drawText(value + "%", chartRect.right - 5, pointCache[0], yLabelPaint); + canvas.drawText(yLabelPaint, value + "%", chartRect.right - 5, pointCache[0]); } } } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/Entry.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/Entry.java index 5ccd7d2..4478cd1 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/Entry.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/Entry.java @@ -23,51 +23,92 @@ package com.wordplat.ikvstockchart.entry; *

Date: 2017/3/1

* * @author afon + * @since 2021-05-09 */ - public class Entry { - // 初始需全部赋值的属性 - private final float open; // 开盘价 - private final float high; // 最高价 - private final float low; // 最低价 - private final float close; // 收盘价 - private final int volume; // 量 - private String xLabel; // X 轴标签 + /** + * 初始需全部赋值的属性 + */ + /** + * 开盘价 + */ + private final float open; + /** + * 最高价 + */ + private final float high; + /** + * 最低价 + */ + private final float low; + /** + * 收盘价 + */ + private final float close; + /** + * 量 + */ + private final int volume; + /** + * X 轴标签 + */ + private String xLabel; - // MA 指标的三个属性 + /** + * MA 指标的三个属性 + */ private float ma5; private float ma10; private float ma20; - // 量的5日平均和10日平均 + /** + * 量的5日平均和10日平均 + */ private double volumeMa5; private double volumeMa10; - // MACD 指标的三个属性 + /** + * MACD 指标的三个属性 + */ private float dea; private float diff; private float macd; - // KDJ 指标的三个属性 + /** + * KDJ 指标的三个属性 + */ private float k; private float d; private float j; - // RSI 指标的三个属性 + /** + * RSI 指标的三个属性 + */ private float rsi1; private float rsi2; private float rsi3; - // BOLL 指标的三个属性 - private float up; // 上轨线 - private float mb; // 中轨线 - private float dn; // 下轨线 + /** + * BOLL 指标的三个属性 + */ + /** + * 上轨线 + */ + private float up; + /** + * 中轨线 + */ + private float mb; + /** + * 下轨线 + */ + private float dn; /** * 自定义分时图用的数据 * - * @param close 收盘价 + * @param close 收盘价 * @param volume 量 * @param xLabel X 轴标签 */ @@ -83,10 +124,10 @@ public class Entry { /** * 自定义 K 线图用的数据 * - * @param open 开盘价 - * @param high 最高价 - * @param low 最低价 - * @param close 收盘价 + * @param open 开盘价 + * @param high 最高价 + * @param low 最低价 + * @param close 收盘价 * @param volume 量 * @param xLabel X 轴标签 */ @@ -265,11 +306,7 @@ public class Entry { @Override public String toString() { - return "Entry{" + - "open=" + open + - ", high=" + high + - ", low=" + low + - ", close=" + close + - '}'; + return "Entry{" + + "open=" + open + ", high=" + high + ", low=" + low + ", close=" + close + '}'; } } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/EntryAdapter.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/EntryAdapter.java deleted file mode 100644 index 2da40d3..0000000 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/EntryAdapter.java +++ /dev/null @@ -1,273 +0,0 @@ -package com.wordplat.ikvstockchart.entry; - -import android.database.Observable; - -/** - *

EntryAdapter,未完成的代码

- *

Date: 2017/6/7

- * - * @author afon - */ - -public class EntryAdapter { - - private final AdapterDataObservable observable = new AdapterDataObservable(); - - /** - * Returns the total number of items in the data set held by the adapter. - * - * @return The total number of items in this adapter. - */ - public int getItemCount() { - return 0; - } - - /** - * Returns true if one or more observers are attached to this adapter. - * - * @return true if this adapter has observers - */ - public final boolean hasObservers() { - return observable.hasObservers(); - } - - /** - * Register a new observer to listen for data changes. - * - * @param observer Observer to register - */ - public void registerAdapterDataObserver(AdapterDataObserver observer) { - observable.registerObserver(observer); - } - - /** - * Unregister an observer currently listening for data changes. - * - * @param observer Observer to unregister - * - * @see #registerAdapterDataObserver - */ - public void unregisterAdapterDataObserver(AdapterDataObserver observer) { - observable.unregisterObserver(observer); - } - - /** - * Notify any registered observers that the data set has changed. - * - * @see #notifyItemChanged(int) - * @see #notifyItemInserted(int) - * @see #notifyItemRemoved(int) - * @see #notifyItemRangeChanged(int, int) - * @see #notifyItemRangeInserted(int, int) - * @see #notifyItemRangeRemoved(int, int) - */ - public final void notifyDataSetChanged() { - observable.notifyChanged(); - } - - /** - * Notify any registered observers that the item at position has changed. - * Equivalent to calling notifyItemChanged(position, null);. - * - * @param position Position of the item that has changed - * - * @see #notifyItemRangeChanged(int, int) - */ - public final void notifyItemChanged(int position) { - observable.notifyItemRangeChanged(position, 1); - } - - /** - * Notify any registered observers that the item at position has changed with an - * optional payload object. - * - * @param position Position of the item that has changed - * @param payload Optional parameter, use null to identify a "full" update - * - * @see #notifyItemRangeChanged(int, int) - */ - public final void notifyItemChanged(int position, Object payload) { - observable.notifyItemRangeChanged(position, 1, payload); - } - - /** - * Notify any registered observers that the itemCount items starting at - * position positionStart have changed. - * Equivalent to calling notifyItemRangeChanged(position, itemCount, null);. - * - * @param positionStart Position of the first item that has changed - * @param itemCount Number of items that have changed - * - * @see #notifyItemChanged(int) - */ - public final void notifyItemRangeChanged(int positionStart, int itemCount) { - observable.notifyItemRangeChanged(positionStart, itemCount); - } - - /** - * Notify any registered observers that the itemCount items starting at - * position positionStart have changed. An optional payload can be - * passed to each changed item. - * - * @param positionStart Position of the first item that has changed - * @param itemCount Number of items that have changed - * @param payload Optional parameter, use null to identify a "full" update - * - * @see #notifyItemChanged(int) - */ - public final void notifyItemRangeChanged(int positionStart, int itemCount, Object payload) { - observable.notifyItemRangeChanged(positionStart, itemCount, payload); - } - - /** - * Notify any registered observers that the item reflected at position - * has been newly inserted. The item previously at position is now at - * position position + 1. - * - * @param position Position of the newly inserted item in the data set - * - * @see #notifyItemRangeInserted(int, int) - */ - public final void notifyItemInserted(int position) { - observable.notifyItemRangeInserted(position, 1); - } - - /** - * Notify any registered observers that the item reflected at fromPosition - * has been moved to toPosition. - * - * @param fromPosition Previous position of the item. - * @param toPosition New position of the item. - */ - public final void notifyItemMoved(int fromPosition, int toPosition) { - observable.notifyItemMoved(fromPosition, toPosition); - } - - /** - * Notify any registered observers that the currently reflected itemCount - * items starting at positionStart have been newly inserted. The items - * previously located at positionStart and beyond can now be found starting - * at position positionStart + itemCount. - * - * @param positionStart Position of the first item that was inserted - * @param itemCount Number of items inserted - * - * @see #notifyItemInserted(int) - */ - public final void notifyItemRangeInserted(int positionStart, int itemCount) { - observable.notifyItemRangeInserted(positionStart, itemCount); - } - - /** - * Notify any registered observers that the item previously located at position - * has been removed from the data set. The items previously located at and after - * position may now be found at oldPosition - 1. - * - * @param position Position of the item that has now been removed - * - * @see #notifyItemRangeRemoved(int, int) - */ - public final void notifyItemRemoved(int position) { - observable.notifyItemRangeRemoved(position, 1); - } - - /** - * Notify any registered observers that the itemCount items previously - * located at positionStart have been removed from the data set. The items - * previously located at and after positionStart + itemCount may now be found - * at oldPosition - itemCount. - * - * @param positionStart Previous position of the first item that was removed - * @param itemCount Number of items removed from the data set - */ - public final void notifyItemRangeRemoved(int positionStart, int itemCount) { - observable.notifyItemRangeRemoved(positionStart, itemCount); - } - - /** - * Observer base class for watching changes to an adapter. - */ - public static abstract class AdapterDataObserver { - public void onChanged() { - // Do nothing - } - - public void onItemRangeChanged(int positionStart, int itemCount) { - // do nothing - } - - public void onItemRangeChanged(int positionStart, int itemCount, Object payload) { - // fallback to onItemRangeChanged(positionStart, itemCount) if app - // does not override this method. - onItemRangeChanged(positionStart, itemCount); - } - - public void onItemRangeInserted(int positionStart, int itemCount) { - // do nothing - } - - public void onItemRangeRemoved(int positionStart, int itemCount) { - // do nothing - } - - public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { - // do nothing - } - } - - static class AdapterDataObservable extends Observable { - public boolean hasObservers() { - return !mObservers.isEmpty(); - } - - public void notifyChanged() { - // since onChanged() is implemented by the app, it could do anything, including - // removing itself from {@link mObservers} - and that could cause problems if - // an iterator is used on the ArrayList {@link mObservers}. - // to avoid such problems, just march thru the list in the reverse order. - for (int i = mObservers.size() - 1; i >= 0; i--) { - mObservers.get(i).onChanged(); - } - } - - public void notifyItemRangeChanged(int positionStart, int itemCount) { - notifyItemRangeChanged(positionStart, itemCount, null); - } - - public void notifyItemRangeChanged(int positionStart, int itemCount, Object payload) { - // since onItemRangeChanged() is implemented by the app, it could do anything, including - // removing itself from {@link mObservers} - and that could cause problems if - // an iterator is used on the ArrayList {@link mObservers}. - // to avoid such problems, just march thru the list in the reverse order. - for (int i = mObservers.size() - 1; i >= 0; i--) { - mObservers.get(i).onItemRangeChanged(positionStart, itemCount, payload); - } - } - - public void notifyItemRangeInserted(int positionStart, int itemCount) { - // since onItemRangeInserted() is implemented by the app, it could do anything, - // including removing itself from {@link mObservers} - and that could cause problems if - // an iterator is used on the ArrayList {@link mObservers}. - // to avoid such problems, just march thru the list in the reverse order. - for (int i = mObservers.size() - 1; i >= 0; i--) { - mObservers.get(i).onItemRangeInserted(positionStart, itemCount); - } - } - - public void notifyItemRangeRemoved(int positionStart, int itemCount) { - // since onItemRangeRemoved() is implemented by the app, it could do anything, including - // removing itself from {@link mObservers} - and that could cause problems if - // an iterator is used on the ArrayList {@link mObservers}. - // to avoid such problems, just march thru the list in the reverse order. - for (int i = mObservers.size() - 1; i >= 0; i--) { - mObservers.get(i).onItemRangeRemoved(positionStart, itemCount); - } - } - - public void notifyItemMoved(int fromPosition, int toPosition) { - for (int i = mObservers.size() - 1; i >= 0; i--) { - mObservers.get(i).onItemRangeMoved(fromPosition, toPosition, 1); - } - } - } -} diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/EntrySet.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/EntrySet.java index fcd4014..d333a9a 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/EntrySet.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/EntrySet.java @@ -26,8 +26,8 @@ import java.util.List; *

Date: 2017/3/1

* * @author afon + * @since 2021-05-09 */ - public class EntrySet { /** @@ -131,6 +131,11 @@ public class EntrySet { this.highlightIndex = highlightIndex; } + /** + * getHighlightEntry + * + * @return Entry + */ public Entry getHighlightEntry() { if (0 < highlightIndex && highlightIndex < entries.size()) { return entries.get(highlightIndex); @@ -194,7 +199,10 @@ public class EntrySet { if (end < 2 || end >= entries.size()) { endValue = entries.size() - 1; } else { - endValue = end - 1; // 减去 1 是为了把边缘的 entry 排除 + /** + * 减去 1 是为了把边缘的 entry 排除 + */ + endValue = end - 1; } minY = Float.MAX_VALUE; @@ -318,15 +326,19 @@ public class EntrySet { ema12 = entry.getClose(); ema26 = entry.getClose(); } else { - // EMA(12) = 前一日EMA(12) X 11/13 + 今日收盘价 X 2/13 - // EMA(26) = 前一日EMA(26) X 25/27 + 今日收盘价 X 2/27 + /** + * EMA(12) = 前一日EMA(12) X 11/13 + 今日收盘价 X 2/13 + * EMA(26) = 前一日EMA(26) X 25/27 + 今日收盘价 X 2/27 + */ ema12 = ema12 * 11f / 13f + entry.getClose() * 2f / 13f; ema26 = ema26 * 25f / 27f + entry.getClose() * 2f / 27f; } - // DIF = EMA(12) - EMA(26) 。 - // 今日DEA = (前一日DEA X 8/10 + 今日DIF X 2/10) - // 用(DIF-DEA)*2 即为 MACD 柱状图。 + /** + * // DIF = EMA(12) - EMA(26) 。 + * 今日DEA = (前一日DEA X 8/10 + 今日DIF X 2/10) + * 用(DIF-DEA)*2 即为 MACD 柱状图。 + */ diff = ema12 - ema26; dea = dea * 8f / 10f + diff * 2f / 10f; macd = (diff - dea) * 2f; diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/SizeColor.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/SizeColor.java index e323ba8..53f7eb3 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/SizeColor.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/SizeColor.java @@ -18,36 +18,188 @@ package com.wordplat.ikvstockchart.entry; -import android.graphics.Paint; import com.wordplat.ikvstockchart.align.XMarkerAlign; import com.wordplat.ikvstockchart.align.YLabelAlign; import com.wordplat.ikvstockchart.align.YMarkerAlign; +import ohos.agp.render.Paint; /** *

线条大小、颜色配置类

*

Date: 2017/3/8

* * @author afon + * @since 2021-05-09 */ - public class SizeColor { - - /////////////////////////////////////////////////////////////////////////// - // 与轴、网格有关的属性和方法 - /////////////////////////////////////////////////////////////////////////// - - private float xLabelSize = 21; // X 轴标签字符大小 - private int xLabelColor = 0xff282b34; // X 轴标签字符颜色 - private float xLabelViewHeight = 50; // X 轴 Label 区域的高度 - private float yLabelSize = 21; // Y 轴标签字符大小 - private int yLabelColor = 0xff282b34; // Y 轴标签字符颜色 - private YLabelAlign yLabelAlign = YLabelAlign.LEFT; // Y 轴标签对齐方向 - - private float axisSize = 2f; // 轴线条大小 - private int axisColor = 0xffdddddd; // 轴线条颜色 - private float gridSize = 2f; // 网格线大小 - private int gridColor = 0xffdddddd; // 网格线颜色 + /** + * 与股票指标有关的属性和方法 + */ + /** + * MA 平均线大小 + */ + private float maLineSize = 2f; + /** + * MA5 平均线颜色 + */ + private int ma5Color = 0xff82b1ff; + /** + * MA10 平均线颜色 + */ + private int ma10Color = 0xffffab40; + /** + * MA20 平均线颜色 + */ + private int ma20Color = 0xfff06292; + /** + * BOLL 线条大小 + */ + private float bollLineSize = 2f; + /** + * BOLL MID 线条颜色 + */ + private int bollMidLineColor = 0xff82b1ff; + /** + * BOLL UPPER 线条颜色 + */ + private int bollUpperLineColor = 0xffffab40; + /** + * BOLL LOWER 线条颜色 + */ + private int bollLowerLineColor = 0xfff06292; + /** + * KDJ 线条大小 + */ + private float kdjLineSize = 2f; + /** + * KDJ K 线条颜色 + */ + private int kdjKLineColor = 0xff82b1ff; + /** + * KDJ D 线条颜色 + */ + private int kdjDLineColor = 0xffffab40; + /** + * KDJ J 线条颜色 + */ + private int kdjJLineColor = 0xfff06292; + /** + * MACD 两条线大小 + */ + private float macdLineSize = 2f; + /** + * 高亮的 MACD 字符颜色,此值与 macdTextColor 不同 + */ + private int macdHighlightTextColor = 0xfff06292; + /** + * DEA 线条颜色 + */ + private int deaLineColor = 0xff82b1ff; + /** + * DIFF 线条颜色 + */ + private int diffLineColor = 0xffffab40; + /** + * RSI 线条大小 + */ + private float rsiLineSize = 2f; + /** + * RSI 第一条线颜色 + */ + private int rsi1LineColor = 0xff82b1ff; + /** + * RSI 第二条线颜色 + */ + private int rsi2LineColor = 0xffffab40; + /** + * RSI 第三条线颜色 + */ + private int rsi3LineColor = 0xfff06292; + /** + * MA 字符大小 + */ + private float maTextSize = 21; + /** + * MA 字符颜色 + */ + private int maTextColor = 0xff282b34; + /** + * BOLL 字符大小 + */ + private float bollTextSize = 21; + /** + * BOLL 字符颜色 + */ + private int bollTextColor = 0xff282b34; + /** + * KDJ 字符大小 + */ + private float kdjTextSize = 21; + /** + * KDJ 字符颜色 + */ + private int kdjTextColor = 0xff282b34; + /** + * MACD 字符大小 + */ + private float macdTextSize = 21; + /** + * MACD 字符颜色 + */ + private int macdTextColor = 0xff282b34; + /** + * RSI 字符大小 + */ + private float rsiTextSize = 21; + /** + * RSI 字符颜色 + */ + private int rsiTextColor = 0xff282b34; + /** + * 与轴、网格有关的属性和方法 + */ + + /** + * X 轴标签字符大小 + */ + private float xLabelSize = 21; + /** + * X 轴标签字符颜色 + */ + private int xLabelColor = 0xff282b34; + /** + * X 轴 Label 区域的高度 + */ + private float xLabelViewHeight = 100; + /** + * Y 轴标签字符大小 + */ + private float yLabelSize = 21; + /** + * Y 轴标签字符颜色 + */ + private int yLabelColor = 0xff282b34; + /** + * Y 轴标签对齐方向 + */ + private YLabelAlign yLabelAlign = YLabelAlign.LEFT; + + /** + * 轴线条大小 + */ + private float axisSize = 2f; + /** + * 轴线条颜色 + */ + private int axisColor = 0xffdddddd; + /** + * 网格线大小 + */ + private float gridSize = 2f; + /** + * 网格线颜色 + */ + private int gridColor = 0xffdddddd; public float getXLabelSize() { return xLabelSize; @@ -129,19 +281,41 @@ public class SizeColor { this.gridColor = gridColor; } - /////////////////////////////////////////////////////////////////////////// - // 与高亮、MarkerView 有关的属性和方法 - /////////////////////////////////////////////////////////////////////////// - - private float highlightSize = 2f; // 高亮线条大小 - private int highlightColor = 0xff282b34; // 高亮线条颜色 0xff1c232e - - private float markerBorderSize = 2f; // MarkerView 边框大小 - private int markerBorderColor = 0xff282b34; // MarkerView 边框颜色 - private float markerTextSize = 21; // MarkerView 字符大小 - private int markerTextColor = 0xff282b34; // MarkerView 字符颜色 - private XMarkerAlign xMarkerAlign = XMarkerAlign.AUTO; // X 轴 MarkerView 对齐方向 - private YMarkerAlign yMarkerAlign = YMarkerAlign.AUTO; // Y 轴 MarkerView 对齐方向 + /** + * 与高亮、MarkerView 有关的属性和方法 + */ + /** + * 高亮线条大小 + */ + private float highlightSize = 2f; + /** + * 高亮线条颜色 0xff1c232e + */ + private int highlightColor = 0xff282b34; + /** + * MarkerView 边框大小 + */ + private float markerBorderSize = 2f; + /** + * MarkerView 边框颜色 + */ + private int markerBorderColor = 0xff282b34; + /** + * MarkerView 字符大小 + */ + private float markerTextSize = 21; + /** + * MarkerView 字符颜色 + */ + private int markerTextColor = 0xff282b34; + /** + * X 轴 MarkerView 对齐方向 + */ + private XMarkerAlign xMarkerAlign = XMarkerAlign.AUTO; + /** + * Y 轴 MarkerView 对齐方向 + */ + private YMarkerAlign yMarkerAlign = YMarkerAlign.AUTO; public float getHighlightSize() { return highlightSize; @@ -207,13 +381,21 @@ public class SizeColor { this.yMarkerAlign = yMarkerAlign; } - /////////////////////////////////////////////////////////////////////////// - // 与分时图有关的属性和方法 - /////////////////////////////////////////////////////////////////////////// - - private float timeLineSize = 2f; // 分时线大小 - private int timeLineColor = 0xff82b1ff; // 分时线颜色 - private int timeLineMaxCount = 240; // 分时图 entry 最多个数。注:此值与 entrySet 里的 entries.size() 意义不同,这里指 X 轴上最多能容纳多少个 entry + /** + * 与分时图有关的属性和方法 + */ + /** + * 分时线大小 + */ + private float timeLineSize = 2f; + /** + * 分时线颜色 + */ + private int timeLineColor = 0xff82b1ff; + /** + * 分时图 entry 最多个数。注:此值与 entrySet 里的 entries.size() 意义不同,这里指 X 轴上最多能容纳多少个 entry + */ + private int timeLineMaxCount = 240; public float getTimeLineSize() { return timeLineSize; @@ -239,25 +421,57 @@ public class SizeColor { this.timeLineMaxCount = timeLineMaxCount; } - /////////////////////////////////////////////////////////////////////////// - // 与蜡烛图有关的属性和方法 - /////////////////////////////////////////////////////////////////////////// - - private float candleBorderSize = 3f; // 蜡烛图矩形边框大小 - private float candleExtremumLabelSize = 21; // 蜡烛图极值字符大小 - private int candleExtremumLableColor = 0xff282b34; // 蜡烛图极值字符颜色 - - private float shadowSize = 4f; // 影线大小 - private int increasingColor = 0xffe05959; // 上涨颜色 - private int decreasingColor = 0xff4fb86a; // 下跌颜色 - private int neutralColor = 0xff282b34; // 不涨不跌颜色 - - private int portraitDefaultVisibleCount = 50; // 竖屏状态下的默认缩放倍数下显示多少个蜡烛图。注:横屏时会自动根据视图宽高变化比例计算,不需要手工设置 - private int zoomInTimes = 3; // 最多放大次数 - private int zoomOutTimes = 3; // 最多缩小次数 - - private Paint.Style increasingStyle = Paint.Style.FILL; // 上涨蜡烛图填充样式。默认实心 - private Paint.Style decreasingStyle = Paint.Style.STROKE; // 下跌蜡烛图填充样式,默认实心 + /** + * 与蜡烛图有关的属性和方法 + */ + /** + * 蜡烛图矩形边框大小 + */ + private float candleBorderSize = 3f; + /** + * 蜡烛图极值字符大小 + */ + private float candleExtremumLabelSize = 21; + /** + * 蜡烛图极值字符颜色 + */ + private int candleExtremumLableColor = 0xff282b34; + /** + * 影线大小 + */ + private float shadowSize = 4f; + /** + * 上涨颜色 + */ + private int increasingColor = 0xffe05959; + /** + * 下跌颜色 + */ + private int decreasingColor = 0xff4fb86a; + /** + * 不涨不跌颜色 + */ + private int neutralColor = 0xff282b34; + /** + * 竖屏状态下的默认缩放倍数下显示多少个蜡烛图。注:横屏时会自动根据视图宽高变化比例计算,不需要手工设置 + */ + private int portraitDefaultVisibleCount = 50; + /** + * 最多放大次数 + */ + private int zoomInTimes = 3; + /** + * 最多缩小次数 + */ + private int zoomOutTimes = 3; + /** + * 上涨蜡烛图填充样式。默认实心 + */ + private Paint.Style increasingStyle = Paint.Style.FILL_STYLE; + /** + * 下跌蜡烛图填充样式,默认实心 + */ + private Paint.Style decreasingStyle = Paint.Style.STROKE_STYLE; public float getCandleBorderSize() { return candleBorderSize; @@ -355,49 +569,7 @@ public class SizeColor { this.decreasingStyle = decreasingStyle; } - /////////////////////////////////////////////////////////////////////////// - // 与股票指标有关的属性和方法 - /////////////////////////////////////////////////////////////////////////// - private float maLineSize = 2f; // MA 平均线大小 - private int ma5Color = 0xff82b1ff; // MA5 平均线颜色 - private int ma10Color = 0xffffab40; // MA10 平均线颜色 - private int ma20Color = 0xfff06292; // MA20 平均线颜色 - - private float bollLineSize = 2f; // BOLL 线条大小 - private int bollMidLineColor = 0xff82b1ff; // BOLL MID 线条颜色 - private int bollUpperLineColor = 0xffffab40; // BOLL UPPER 线条颜色 - private int bollLowerLineColor = 0xfff06292; // BOLL LOWER 线条颜色 - - private float kdjLineSize = 2f; // KDJ 线条大小 - private int kdjKLineColor = 0xff82b1ff; // KDJ K 线条颜色 - private int kdjDLineColor = 0xffffab40; // KDJ D 线条颜色 - private int kdjJLineColor = 0xfff06292; // KDJ J 线条颜色 - - private float macdLineSize = 2f; // MACD 两条线大小 - private int macdHighlightTextColor = 0xfff06292; // 高亮的 MACD 字符颜色,此值与 macdTextColor 不同 - private int deaLineColor = 0xff82b1ff; // DEA 线条颜色 - private int diffLineColor = 0xffffab40; // DIFF 线条颜色 - - private float rsiLineSize = 2f; // RSI 线条大小 - private int rsi1LineColor = 0xff82b1ff; // RSI 第一条线颜色 - private int rsi2LineColor = 0xffffab40; // RSI 第二条线颜色 - private int rsi3LineColor = 0xfff06292; // RSI 第三条线颜色 - - private float maTextSize = 21; // MA 字符大小 - private int maTextColor = 0xff282b34; // MA 字符颜色 - - private float bollTextSize = 21; // BOLL 字符大小 - private int bollTextColor = 0xff282b34; // BOLL 字符颜色 - - private float kdjTextSize = 21; // KDJ 字符大小 - private int kdjTextColor = 0xff282b34; // KDJ 字符颜色 - - private float macdTextSize = 21; // MACD 字符大小 - private int macdTextColor = 0xff282b34; // MACD 字符颜色 - - private float rsiTextSize = 21; // RSI 字符大小 - private int rsiTextColor = 0xff282b34; // RSI 字符颜色 public float getMaLineSize() { return maLineSize; @@ -639,10 +811,9 @@ public class SizeColor { this.rsiTextColor = rsiTextColor; } - /////////////////////////////////////////////////////////////////////////// - // 其它 - /////////////////////////////////////////////////////////////////////////// - + /** + * 其它 + */ private float loadingTextSize = 21; private int loadingTextColor = 0xff282b34; private String loadingText = "Loading..."; diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockBOLLIndex.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockBOLLIndex.java index 31669bb..66b7b10 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockBOLLIndex.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockBOLLIndex.java @@ -23,14 +23,20 @@ package com.wordplat.ikvstockchart.entry; *

Date: 2017/3/16

* * @author afon + * @since 2021-05-09 */ - public class StockBOLLIndex extends StockIndex { - + /** + * StockBOLLIndex + */ public StockBOLLIndex() { super(STANDARD_HEIGHT); } + /** + * StockBOLLIndex + * @param height + */ public StockBOLLIndex(int height) { super(height); } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockDataTest.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockDataTest.java index 5e1ef8d..1bb370e 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockDataTest.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockDataTest.java @@ -23,14 +23,23 @@ package com.wordplat.ikvstockchart.entry; *

Date: 2017/3/2

* * @author afon + * @since 2021-05-09 */ - public class StockDataTest { + /** + * KLINE + */ + public static final String KLINE = "15.6|15.6|15.6|15.6|1|2015/10/10,17.16|17.16|17.16|17.16|1|2015/10/11,18.88|18.88|18.88|18.88|1|2015/10/12,20.77|20.77|20.77|20.77|1|2015/10/13,22.85|22.85|22.85|22.85|1|2015/10/14,25.14|25.14|25.14|25.14|1|2015/10/15,27.65|27.65|27.65|27.65|1|2015/10/16,30.42|30.42|30.42|30.42|1|2015/10/17,33.46|33.46|33.46|33.46|1|2015/10/18,36.81|36.81|36.81|36.81|31|2015/10/19,40.49|40.49|40.49|40.49|42|2015/10/20,44.54|44.54|44.54|44.54|4|2015/10/21,48.99|48.99|48.99|48.99|2|2015/10/22,53.89|53.89|53.89|53.89|2|2015/10/23,59.28|59.28|59.28|59.28|2|2015/10/24,65.21|65.21|65.21|65.21|29|2015/10/25,71.73|71.73|71.73|71.73|192|2015/10/26,78.9|78.9|78.9|78.9|100|2015/10/27,86.79|86.79|86.79|86.79|74|2015/10/28,95.47|95.47|95.47|95.47|48|2015/10/29,105.02|105.02|105.02|105.02|90|2015/10/30,115.52|115.52|115.52|115.52|99|2015/10/31,127.07|127.07|127.07|127.07|38|2015/11/1,139.78|139.78|139.78|139.78|39|2015/11/2,153.76|153.76|153.76|153.76|615|2015/11/3,169.14|169.14|169.14|169.14|35|2015/11/4,186.05|186.05|186.05|186.05|66330|2015/11/5,204.66|204.66|175.0|204.66|4339|2015/11/6,186.05|186.05|184.19|184.19|750|2015/11/9,165.77|165.77|165.77|165.77|378|2015/11/10,149.19|165.77|149.19|150.7|9940|2015/11/11,137.0|149.0|135.63|135.63|1764|2015/11/12,122.07|139.0|122.07|135.49|4834|2015/11/13,138.0|139.0|121.94|121.94|2193|2015/11/14,129.96|134.13|110.1|134.13|21002|2015/11/16,134.8|147.54|134.8|147.54|321|2015/11/17,161.99|162.29|147.01|162.29|30087|2015/11/18,178.0|178.52|146.06|174.02|44307|2015/11/19,157.45|191.42|157.45|191.42|33700|2015/11/20,210.5|210.56|210.5|210.56|234|2015/11/21,210.48|231.62|210.48|231.62|1015|2015/11/23,254.78|254.78|254.78|254.78|758|2015/11/24,280.26|280.26|230.0|280.26|36243|2015/11/25,308.29|308.29|253.23|289.67|93637|2015/11/27,265.0|290.5|264.0|289.0|35870|2015/11/28,266.0|306.0|265.0|274.27|17528|2015/11/29,258.0|301.7|252.0|301.7|7754|2015/11/30,331.87|331.87|279.0|331.87|9287|2015/12/1,365.06|365.06|340.0|365.06|1233|2015/12/2,401.57|401.57|401.57|401.57|18|2015/12/6,441.73|441.73|441.73|441.73|23|2015/12/7,485.9|485.9|485.9|485.9|89|2015/12/8,501.0|528.0|501.0|525.01|15909|2015/12/9,500.0|539.0|500.0|536.39|15616|2015/12/10,510.0|548.0|510.0|544.92|17517|2015/12/11,521.0|537.0|490.43|490.43|10533|2015/12/12,516.0|518.0|441.39|441.39|2359|2015/12/14,400.0|446.0|397.25|445.0|7275|2015/12/15,415.0|431.0|414.0|426.85|5851|2015/12/16,426.0|446.0|426.0|441.9|6047|2015/12/17,431.0|447.0|431.0|443.6|6594|2015/12/18,443.0|459.0|438.0|445.26|6284|2015/12/19,444.0|453.0|439.0|444.8|6322|2015/12/21,445.0|469.0|437.0|463.33|9732|2015/12/22,463.0|478.0|457.0|464.88|9967|2015/12/23,462.0|482.0|462.0|480.55|8664|2015/12/24,479.0|501.0|478.0|491.92|12688|2015/12/25,491.0|498.0|442.73|442.97|26530|2015/12/26,460.0|460.0|398.67|398.67|128|2015/12/28,399.0|438.0|358.8|411.79|24309|2015/12/29,410.0|428.0|370.61|397.29|10939|2015/12/30,397.0|437.02|359.01|435.59|10678|2015/12/31,430.0|479.15|429.01|479.0|8944|2016/1/4,489.99|500.0|432.8|440.05|8979|2016/1/5,441.0|460.0|400.0|435.0|8162|2016/1/6,430.0|440.0|418.0|435.78|7358|2016/1/7,440.0|479.36|437.0|479.36|4628|2016/1/8,480.0|527.3|476.0|527.3|3381|2016/1/9,540.0|580.03|512.0|580.03|1961|2016/1/11,570.0|638.03|570.0|638.03|363|2016/1/12,638.0|701.83|638.0|701.83|198|2016/1/13,772.01|772.01|772.01|772.01|130|2016/1/14,849.21|849.21|849.21|849.21|92|2016/1/15,934.13|934.13|934.12|934.13|659|2016/1/16,1027.54|1027.54|1026.0|1027.46|5332|2016/1/18,1129.0|1130.21|1129.0|1130.21|2743|2016/1/19,1243.23|1243.23|1017.19|1243.23|4401|2016/1/20,1367.55|1367.55|1200.0|1367.55|715|2016/1/21,1290.0|1504.31|1230.79|1504.31|2421|2016/1/22,1370.0|1581.69|1360.0|1427.06|4391|2016/1/23,1284.35|1569.0|1284.35|1293.25|4222|2016/1/25,1200.0|1422.58|1163.92|1419.99|10552|2016/1/26,1278.0|1450.0|1277.99|1277.99|2478|2016/1/27,1150.19|1150.19|1150.19|1150.19|24|2016/1/28,1035.17|1265.21|1035.17|1265.21|597|2016/1/29,1155.0|1155.0|1148.0|1148.31|204|2016/1/30,1159.0|1166.0|1043.0|1166.0|34|2016/2/1,1088.01|1282.0|1088.01|1160.0|7|2016/2/2,1050.0|1276.0|1050.0|1276.0|8|2016/2/3,1403.0|1403.0|1180.1|1180.1|121|2016/2/4,1290.0|1290.0|1290.0|1290.0|1|2016/2/5,1419.0|1419.0|1419.0|1419.0|3|2016/2/15,1560.9|1560.9|1560.9|1560.9|6|2016/2/16,1716.99|1716.99|1716.99|1716.99|1|2016/2/17,1888.69|1888.69|1730.0|1888.69|2489|2016/2/18,2077.56|2077.56|1888.9|2077.5|179|2016/2/19,2285.25|2285.25|2285.25|2285.25|2|2016/2/20,2513.78|2513.78|2513.78|2513.78|1|2016/2/22,2765.16|2765.16|2262.4|2681.24|11969|2016/2/23,2940.0|2949.36|2796.0|2949.36|2594|2016/2/24,3200.0|3244.3|2654.42|3244.3|18336|2016/2/25,3568.73|3568.73|3568.73|3568.73|1|2016/2/26,3300.01|3925.6|3300.0|3925.6|211|2016/2/27,4318.16|4318.16|4318.16|4318.16|2|2016/2/29,4749.98|4749.98|4749.98|4749.98|2|2016/3/1,5224.98|5224.98|4380.0|5222.83|2847|2016/3/2,5000.0|5745.11|5000.0|5560.93|6699|2016/3/3,5200.0|5500.0|5200.0|5247.02|2588|2016/3/4,4999.0|5700.0|4865.0|5100.0|1304|2016/3/5,4800.0|5610.0|4590.0|4993.67|5186|2016/3/7,4725.0|5031.0|4720.0|4974.43|4277|2016/3/8,4680.0|5253.0|4660.0|4937.77|2812|2016/3/9,4690.0|5431.55|4678.0|5431.55|704|2016/3/10,5974.71|5974.71|5974.71|5974.71|19|2016/3/11,6572.18|6572.18|6572.18|6572.18|1|2016/3/12,5914.96|7229.4|5914.96|7229.4|2|2016/3/14,7952.34|7952.34|7952.34|7952.34|51|2016/3/15,8747.57|8747.57|8747.57|8747.57|1|2016/3/16,9622.33|9622.33|9073.0|9180.0|10797|2016/3/17,8262.0|9599.0|8262.0|9060.0|12696|2016/3/18,8154.0|9966.0|8154.0|9966.0|1523|2016/3/19,8969.4|10962.6|8969.4|10962.6|7800|2016/3/21,10000.0|12058.86|9866.34|12058.86|22749|2016/3/22,11000.0|11000.09|10852.97|10852.97|7554|2016/3/23,9767.67|9767.67|9767.67|9767.67|9760|2016/3/24,8790.9|10744.44|8790.9|10744.44|21621|2016/3/25,9673.92|11818.88|9673.92|11818.88|8981|2016/3/26,13000.77|13000.77|13000.77|13000.77|8898|2016/3/28,11700.69|14300.85|11700.69|14300.85|8591|2016/3/29,12880.7|15730.94|12880.7|15730.94|989|2016/3/30,14300.0|16000.0|14157.85|14157.85|8555|2016/3/31,12742.06|14999.0|12742.06|12742.06|8451|2016/4/1,11467.85|12742.06|11467.85|11467.85|7638|2016/4/2,12614.64|12614.64|12600.0|12614.64|9282|2016/4/5,13876.0|13876.1|13876.0|13876.1|6155|2016/4/6,15263.71|15263.71|13877.0|15263.71|7010|2016/4/8,15265.0|16790.08|15263.1|16790.0|1686|2016/4/9,18469.0|18469.0|16791.0|18469.0|6263|2016/4/11,20314.99|20314.99|17140.0|17140.0|9121|2016/4/12,18854.0|18854.0|15426.0|15426.0|6350|2016/4/13,16968.0|16968.0|13883.4|16190.0|5811|2016/4/14,16200.0|16870.0|16200.0|16475.0|6172|2016/4/15,16480.0|16500.0|16480.0|16499.0|1482|2016/4/16,16505.0|16560.0|16350.0|16534.49|17921|2016/4/18,16540.0|16585.0|16000.0|16585.0|12586|2016/4/19,16590.0|17750.0|14926.6|16100.0|6813|2016/4/20,16150.0|16500.0|15900.0|15900.0|6288|2016/4/21,15000.0|15109.0|14310.0|14310.0|847|2016/4/22,14311.0|14311.0|12879.0|12879.0|1711|2016/4/23,11591.1|11591.1|11591.1|11591.1|2|2016/4/25,10431.99|10431.99|10431.99|10431.99|2|2016/4/26,9388.79|9388.79|9388.79|9388.79|227|2016/4/27,10089.0|10327.67|8449.91|10327.67|29609|2016/4/28,9510.0|11200.0|9294.9|9294.9|11540|2016/4/29,8365.41|8365.41|8365.41|8365.41|5362|2016/4/30,7528.87|7528.87|7528.87|7528.87|4|2016/5/3,6775.98|6775.98|6775.98|6775.98|1|2016/5/4,6098.38|7453.58|6098.38|7453.58|13|2016/5/5,6708.32|7221.0|6708.22|6708.22|169|2016/5/6,6666.0|6901.34|6037.4|6888.0|1515|2016/5/7,7499.88|7576.8|6200.0|7576.8|118919|2016/5/9,7500.0|8334.48|7500.0|8334.48|98763|2016/5/10,9167.93|9167.93|7501.03|7501.03|93618|2016/5/11,7425.0|7425.0|6750.93|6750.93|8956|2016/5/12,6682.0|6740.0|6075.84|6690.41|10877|2016/5/13,6700.0|6760.0|6700.0|6760.0|10144|2016/5/14,6800.0|7436.0|6732.0|7436.0|13706|2016/5/16,7441.0|8179.6|7441.0|8179.6|6733|2016/5/17,8015.0|8997.56|8014.0|8995.0|9218|2016/5/18,8815.0|9894.5|8815.0|9893.0|3589|2016/5/19,9898.0|10882.3|9898.0|10874.0|390|2016/5/20,10880.0|11961.4|10877.0|11961.0|824|2016/5/21,11965.0|13157.1|11962.0|13157.0|269|2016/5/23,13025.0|14472.7|13000.0|14472.7|590|2016/5/24,15919.97|15919.97|15919.96|15919.96|2|2016/5/25,17510.99|17510.99|17510.99|17510.99|1|2016/5/26"; + /** + * TIME_LINE + */ + public static final String TIME_LINE = ""; - public final static String KLINE = "15.6|15.6|15.6|15.6|1|2015/10/10,17.16|17.16|17.16|17.16|1|2015/10/11,18.88|18.88|18.88|18.88|1|2015/10/12,20.77|20.77|20.77|20.77|1|2015/10/13,22.85|22.85|22.85|22.85|1|2015/10/14,25.14|25.14|25.14|25.14|1|2015/10/15,27.65|27.65|27.65|27.65|1|2015/10/16,30.42|30.42|30.42|30.42|1|2015/10/17,33.46|33.46|33.46|33.46|1|2015/10/18,36.81|36.81|36.81|36.81|31|2015/10/19,40.49|40.49|40.49|40.49|42|2015/10/20,44.54|44.54|44.54|44.54|4|2015/10/21,48.99|48.99|48.99|48.99|2|2015/10/22,53.89|53.89|53.89|53.89|2|2015/10/23,59.28|59.28|59.28|59.28|2|2015/10/24,65.21|65.21|65.21|65.21|29|2015/10/25,71.73|71.73|71.73|71.73|192|2015/10/26,78.9|78.9|78.9|78.9|100|2015/10/27,86.79|86.79|86.79|86.79|74|2015/10/28,95.47|95.47|95.47|95.47|48|2015/10/29,105.02|105.02|105.02|105.02|90|2015/10/30,115.52|115.52|115.52|115.52|99|2015/10/31,127.07|127.07|127.07|127.07|38|2015/11/1,139.78|139.78|139.78|139.78|39|2015/11/2,153.76|153.76|153.76|153.76|615|2015/11/3,169.14|169.14|169.14|169.14|35|2015/11/4,186.05|186.05|186.05|186.05|66330|2015/11/5,204.66|204.66|175.0|204.66|4339|2015/11/6,186.05|186.05|184.19|184.19|750|2015/11/9,165.77|165.77|165.77|165.77|378|2015/11/10,149.19|165.77|149.19|150.7|9940|2015/11/11,137.0|149.0|135.63|135.63|1764|2015/11/12,122.07|139.0|122.07|135.49|4834|2015/11/13,138.0|139.0|121.94|121.94|2193|2015/11/14,129.96|134.13|110.1|134.13|21002|2015/11/16,134.8|147.54|134.8|147.54|321|2015/11/17,161.99|162.29|147.01|162.29|30087|2015/11/18,178.0|178.52|146.06|174.02|44307|2015/11/19,157.45|191.42|157.45|191.42|33700|2015/11/20,210.5|210.56|210.5|210.56|234|2015/11/21,210.48|231.62|210.48|231.62|1015|2015/11/23,254.78|254.78|254.78|254.78|758|2015/11/24,280.26|280.26|230.0|280.26|36243|2015/11/25,308.29|308.29|253.23|289.67|93637|2015/11/27,265.0|290.5|264.0|289.0|35870|2015/11/28,266.0|306.0|265.0|274.27|17528|2015/11/29,258.0|301.7|252.0|301.7|7754|2015/11/30,331.87|331.87|279.0|331.87|9287|2015/12/1,365.06|365.06|340.0|365.06|1233|2015/12/2,401.57|401.57|401.57|401.57|18|2015/12/6,441.73|441.73|441.73|441.73|23|2015/12/7,485.9|485.9|485.9|485.9|89|2015/12/8,501.0|528.0|501.0|525.01|15909|2015/12/9,500.0|539.0|500.0|536.39|15616|2015/12/10,510.0|548.0|510.0|544.92|17517|2015/12/11,521.0|537.0|490.43|490.43|10533|2015/12/12,516.0|518.0|441.39|441.39|2359|2015/12/14,400.0|446.0|397.25|445.0|7275|2015/12/15,415.0|431.0|414.0|426.85|5851|2015/12/16,426.0|446.0|426.0|441.9|6047|2015/12/17,431.0|447.0|431.0|443.6|6594|2015/12/18,443.0|459.0|438.0|445.26|6284|2015/12/19,444.0|453.0|439.0|444.8|6322|2015/12/21,445.0|469.0|437.0|463.33|9732|2015/12/22,463.0|478.0|457.0|464.88|9967|2015/12/23,462.0|482.0|462.0|480.55|8664|2015/12/24,479.0|501.0|478.0|491.92|12688|2015/12/25,491.0|498.0|442.73|442.97|26530|2015/12/26,460.0|460.0|398.67|398.67|128|2015/12/28,399.0|438.0|358.8|411.79|24309|2015/12/29,410.0|428.0|370.61|397.29|10939|2015/12/30,397.0|437.02|359.01|435.59|10678|2015/12/31,430.0|479.15|429.01|479.0|8944|2016/1/4,489.99|500.0|432.8|440.05|8979|2016/1/5,441.0|460.0|400.0|435.0|8162|2016/1/6,430.0|440.0|418.0|435.78|7358|2016/1/7,440.0|479.36|437.0|479.36|4628|2016/1/8,480.0|527.3|476.0|527.3|3381|2016/1/9,540.0|580.03|512.0|580.03|1961|2016/1/11,570.0|638.03|570.0|638.03|363|2016/1/12,638.0|701.83|638.0|701.83|198|2016/1/13,772.01|772.01|772.01|772.01|130|2016/1/14,849.21|849.21|849.21|849.21|92|2016/1/15,934.13|934.13|934.12|934.13|659|2016/1/16,1027.54|1027.54|1026.0|1027.46|5332|2016/1/18,1129.0|1130.21|1129.0|1130.21|2743|2016/1/19,1243.23|1243.23|1017.19|1243.23|4401|2016/1/20,1367.55|1367.55|1200.0|1367.55|715|2016/1/21,1290.0|1504.31|1230.79|1504.31|2421|2016/1/22,1370.0|1581.69|1360.0|1427.06|4391|2016/1/23,1284.35|1569.0|1284.35|1293.25|4222|2016/1/25,1200.0|1422.58|1163.92|1419.99|10552|2016/1/26,1278.0|1450.0|1277.99|1277.99|2478|2016/1/27,1150.19|1150.19|1150.19|1150.19|24|2016/1/28,1035.17|1265.21|1035.17|1265.21|597|2016/1/29,1155.0|1155.0|1148.0|1148.31|204|2016/1/30,1159.0|1166.0|1043.0|1166.0|34|2016/2/1,1088.01|1282.0|1088.01|1160.0|7|2016/2/2,1050.0|1276.0|1050.0|1276.0|8|2016/2/3,1403.0|1403.0|1180.1|1180.1|121|2016/2/4,1290.0|1290.0|1290.0|1290.0|1|2016/2/5,1419.0|1419.0|1419.0|1419.0|3|2016/2/15,1560.9|1560.9|1560.9|1560.9|6|2016/2/16,1716.99|1716.99|1716.99|1716.99|1|2016/2/17,1888.69|1888.69|1730.0|1888.69|2489|2016/2/18,2077.56|2077.56|1888.9|2077.5|179|2016/2/19,2285.25|2285.25|2285.25|2285.25|2|2016/2/20,2513.78|2513.78|2513.78|2513.78|1|2016/2/22,2765.16|2765.16|2262.4|2681.24|11969|2016/2/23,2940.0|2949.36|2796.0|2949.36|2594|2016/2/24,3200.0|3244.3|2654.42|3244.3|18336|2016/2/25,3568.73|3568.73|3568.73|3568.73|1|2016/2/26,3300.01|3925.6|3300.0|3925.6|211|2016/2/27,4318.16|4318.16|4318.16|4318.16|2|2016/2/29,4749.98|4749.98|4749.98|4749.98|2|2016/3/1,5224.98|5224.98|4380.0|5222.83|2847|2016/3/2,5000.0|5745.11|5000.0|5560.93|6699|2016/3/3,5200.0|5500.0|5200.0|5247.02|2588|2016/3/4,4999.0|5700.0|4865.0|5100.0|1304|2016/3/5,4800.0|5610.0|4590.0|4993.67|5186|2016/3/7,4725.0|5031.0|4720.0|4974.43|4277|2016/3/8,4680.0|5253.0|4660.0|4937.77|2812|2016/3/9,4690.0|5431.55|4678.0|5431.55|704|2016/3/10,5974.71|5974.71|5974.71|5974.71|19|2016/3/11,6572.18|6572.18|6572.18|6572.18|1|2016/3/12,5914.96|7229.4|5914.96|7229.4|2|2016/3/14,7952.34|7952.34|7952.34|7952.34|51|2016/3/15,8747.57|8747.57|8747.57|8747.57|1|2016/3/16,9622.33|9622.33|9073.0|9180.0|10797|2016/3/17,8262.0|9599.0|8262.0|9060.0|12696|2016/3/18,8154.0|9966.0|8154.0|9966.0|1523|2016/3/19,8969.4|10962.6|8969.4|10962.6|7800|2016/3/21,10000.0|12058.86|9866.34|12058.86|22749|2016/3/22,11000.0|11000.09|10852.97|10852.97|7554|2016/3/23,9767.67|9767.67|9767.67|9767.67|9760|2016/3/24,8790.9|10744.44|8790.9|10744.44|21621|2016/3/25,9673.92|11818.88|9673.92|11818.88|8981|2016/3/26,13000.77|13000.77|13000.77|13000.77|8898|2016/3/28,11700.69|14300.85|11700.69|14300.85|8591|2016/3/29,12880.7|15730.94|12880.7|15730.94|989|2016/3/30,14300.0|16000.0|14157.85|14157.85|8555|2016/3/31,12742.06|14999.0|12742.06|12742.06|8451|2016/4/1,11467.85|12742.06|11467.85|11467.85|7638|2016/4/2,12614.64|12614.64|12600.0|12614.64|9282|2016/4/5,13876.0|13876.1|13876.0|13876.1|6155|2016/4/6,15263.71|15263.71|13877.0|15263.71|7010|2016/4/8,15265.0|16790.08|15263.1|16790.0|1686|2016/4/9,18469.0|18469.0|16791.0|18469.0|6263|2016/4/11,20314.99|20314.99|17140.0|17140.0|9121|2016/4/12,18854.0|18854.0|15426.0|15426.0|6350|2016/4/13,16968.0|16968.0|13883.4|16190.0|5811|2016/4/14,16200.0|16870.0|16200.0|16475.0|6172|2016/4/15,16480.0|16500.0|16480.0|16499.0|1482|2016/4/16,16505.0|16560.0|16350.0|16534.49|17921|2016/4/18,16540.0|16585.0|16000.0|16585.0|12586|2016/4/19,16590.0|17750.0|14926.6|16100.0|6813|2016/4/20,16150.0|16500.0|15900.0|15900.0|6288|2016/4/21,15000.0|15109.0|14310.0|14310.0|847|2016/4/22,14311.0|14311.0|12879.0|12879.0|1711|2016/4/23,11591.1|11591.1|11591.1|11591.1|2|2016/4/25,10431.99|10431.99|10431.99|10431.99|2|2016/4/26,9388.79|9388.79|9388.79|9388.79|227|2016/4/27,10089.0|10327.67|8449.91|10327.67|29609|2016/4/28,9510.0|11200.0|9294.9|9294.9|11540|2016/4/29,8365.41|8365.41|8365.41|8365.41|5362|2016/4/30,7528.87|7528.87|7528.87|7528.87|4|2016/5/3,6775.98|6775.98|6775.98|6775.98|1|2016/5/4,6098.38|7453.58|6098.38|7453.58|13|2016/5/5,6708.32|7221.0|6708.22|6708.22|169|2016/5/6,6666.0|6901.34|6037.4|6888.0|1515|2016/5/7,7499.88|7576.8|6200.0|7576.8|118919|2016/5/9,7500.0|8334.48|7500.0|8334.48|98763|2016/5/10,9167.93|9167.93|7501.03|7501.03|93618|2016/5/11,7425.0|7425.0|6750.93|6750.93|8956|2016/5/12,6682.0|6740.0|6075.84|6690.41|10877|2016/5/13,6700.0|6760.0|6700.0|6760.0|10144|2016/5/14,6800.0|7436.0|6732.0|7436.0|13706|2016/5/16,7441.0|8179.6|7441.0|8179.6|6733|2016/5/17,8015.0|8997.56|8014.0|8995.0|9218|2016/5/18,8815.0|9894.5|8815.0|9893.0|3589|2016/5/19,9898.0|10882.3|9898.0|10874.0|390|2016/5/20,10880.0|11961.4|10877.0|11961.0|824|2016/5/21,11965.0|13157.1|11962.0|13157.0|269|2016/5/23,13025.0|14472.7|13000.0|14472.7|590|2016/5/24,15919.97|15919.97|15919.96|15919.96|2|2016/5/25,17510.99|17510.99|17510.99|17510.99|1|2016/5/26"; - - public final static String TIME_LINE = ""; - + /** + * parseKLineData + * @param data + * @return + */ public static EntrySet parseKLineData(String data) { final EntrySet entrySet = new EntrySet(); @@ -52,6 +61,11 @@ public class StockDataTest { return entrySet; } + /** + * parseTimeLine + * @param data + * @return + */ public static EntrySet parseTimeLine(String data) { final EntrySet entrySet = new EntrySet(); diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockIndex.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockIndex.java index 9930d54..8f8728f 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockIndex.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockIndex.java @@ -1,13 +1,13 @@ /* * Copyright (C) 2017 WordPlat Open Source Project * - * https://wordplat.com/InteractiveKLineView/ + * https:wordplat.com/InteractiveKLineView/ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http:www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -18,10 +18,10 @@ package com.wordplat.ikvstockchart.entry; -import android.graphics.Matrix; -import android.graphics.RectF; import com.wordplat.ikvstockchart.drawing.IDrawing; +import ohos.agp.utils.Matrix; +import ohos.agp.utils.RectFloat; import java.util.ArrayList; import java.util.List; @@ -31,17 +31,23 @@ import java.util.List; *

Date: 2017/3/14

* * @author afon + * @since 2021-05-09 */ - public abstract class StockIndex { + /** + * 股票指标视图预设高度,单位:像素 + */ + static final int STANDARD_HEIGHT = 300; + /** + * 把值映射到屏幕像素的矩阵 + */ + private final Matrix matrix = new Matrix(); + /** + * 股票指标视图高度,单位:像素 + */ + private final int height; - static final int STANDARD_HEIGHT = 300; // 股票指标视图预设高度,单位:像素 - - private final Matrix matrix = new Matrix(); // 把值映射到屏幕像素的矩阵 - - private final int height; // 股票指标视图高度,单位:像素 - - private final RectF rect = new RectF(); + private final RectFloat rect = new RectFloat(); private final List drawingList = new ArrayList<>(); @@ -75,12 +81,26 @@ public abstract class StockIndex { */ private float extremumYDelta = 0; + /** + * StockIndex + * + * @param height + */ public StockIndex(int height) { this.height = height; } + /** + * computeMinMax + * + * @param currentIndex + * @param entry + */ public abstract void computeMinMax(int currentIndex, Entry entry); + /** + * resetMinMax + */ public void resetMinMax() { minY = Float.MAX_VALUE; maxY = -Float.MAX_VALUE; @@ -94,22 +114,43 @@ public abstract class StockIndex { return height; } - public RectF getRect() { + public RectFloat getRect() { return rect; } + /** + * setRect + * + * @param left + * @param top + * @param right + * @param bottom + */ public void setRect(float left, float top, float right, float bottom) { - rect.set(left, top, right, bottom); + rect.left = left; + rect.top = top; + rect.right = right; + rect.bottom = bottom; } public List getDrawingList() { return drawingList; } + /** + * addDrawing + * + * @param drawing + */ public void addDrawing(IDrawing drawing) { drawingList.add(drawing); } + /** + * removeDrawing + * + * @param drawing + */ public void removeDrawing(IDrawing drawing) { drawingList.remove(drawing); } @@ -146,6 +187,14 @@ public abstract class StockIndex { this.paddingRight = paddingRight; } + /** + * setPadding + * + * @param paddingLeft + * @param paddingTop + * @param paddingRight + * @param paddingBottom + */ public void setPadding(int paddingLeft, int paddingTop, int paddingRight, int paddingBottom) { this.paddingLeft = paddingLeft; this.paddingTop = paddingTop; diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockKDJIndex.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockKDJIndex.java index b935a8f..d65e946 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockKDJIndex.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockKDJIndex.java @@ -23,14 +23,21 @@ package com.wordplat.ikvstockchart.entry; *

Date: 2017/3/16

* * @author afon + * @since 2021-05-09 */ - public class StockKDJIndex extends StockIndex { - + /** + * StockKDJIndex + */ public StockKDJIndex() { super(STANDARD_HEIGHT); } + /** + * StockKDJIndex + * + * @param height + */ public StockKDJIndex(int height) { super(height); } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockKLineVolumeIndex.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockKLineVolumeIndex.java index 6f1b766..968d5d9 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockKLineVolumeIndex.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockKLineVolumeIndex.java @@ -5,14 +5,20 @@ package com.wordplat.ikvstockchart.entry; *

Date: 2017/6/28

* * @author afon + * @since 2021-05-09 */ - public class StockKLineVolumeIndex extends StockIndex { - + /** + * StockKLineVolumeIndex + */ public StockKLineVolumeIndex() { super(STANDARD_HEIGHT); } + /** + * StockKLineVolumeIndex + * @param height + */ public StockKLineVolumeIndex(int height) { super(height); diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockMACDIndex.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockMACDIndex.java index cc96563..87c2cc8 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockMACDIndex.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockMACDIndex.java @@ -23,14 +23,21 @@ package com.wordplat.ikvstockchart.entry; *

Date: 2017/3/16

* * @author afon + * @since 2021-05-09 */ - public class StockMACDIndex extends StockIndex { - + /** + * StockMACDIndex + */ public StockMACDIndex() { super(STANDARD_HEIGHT); } + /** + * StockMACDIndex + * + * @param height + */ public StockMACDIndex(int height) { super(height); } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockRSIIndex.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockRSIIndex.java index be2da5c..ebe5c42 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockRSIIndex.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/entry/StockRSIIndex.java @@ -23,14 +23,21 @@ package com.wordplat.ikvstockchart.entry; *

Date: 2017/3/16

* * @author afon + * @since 2021-05-09 */ - public class StockRSIIndex extends StockIndex { - + /** + * StockRSIIndex + */ public StockRSIIndex() { super(STANDARD_HEIGHT); } + /** + * StockRSIIndex + * + * @param height + */ public StockRSIIndex(int height) { super(height); } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/marker/IMarkerView.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/marker/IMarkerView.java index cbe7c07..61bca72 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/marker/IMarkerView.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/marker/IMarkerView.java @@ -18,32 +18,33 @@ package com.wordplat.ikvstockchart.marker; -import android.graphics.Canvas; -import android.graphics.RectF; import com.wordplat.ikvstockchart.render.AbstractRender; +import ohos.agp.render.Canvas; +import ohos.agp.utils.RectFloat; + /** *

IMarkerView

*

Date: 2017/3/23

* * @author afon + * @since 2021-05-09 */ - public interface IMarkerView { /** * 初始化 MarkerView * * @param contentRect 视图区域 - * @param render render + * @param render render */ - void onInitMarkerView(RectF contentRect, AbstractRender render); + void onInitMarkerView(RectFloat contentRect, AbstractRender render); /** * onDrawMarkerView * - * @param canvas canvas + * @param canvas canvas * @param highlightPointX 高亮中心坐标 x * @param highlightPointY 高亮中心坐标 y */ diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/marker/XAxisTextMarkerView.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/marker/XAxisTextMarkerView.java index 411e59b..51472b9 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/marker/XAxisTextMarkerView.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/marker/XAxisTextMarkerView.java @@ -18,64 +18,75 @@ package com.wordplat.ikvstockchart.marker; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.RectF; -import android.graphics.Region; import com.wordplat.ikvstockchart.align.XMarkerAlign; import com.wordplat.ikvstockchart.entry.Entry; import com.wordplat.ikvstockchart.entry.SizeColor; import com.wordplat.ikvstockchart.render.AbstractRender; +import com.wordplat.ikvstockchart.utils.StringUtils; +import ohos.agp.render.Canvas; +import ohos.agp.render.Paint; +import ohos.agp.utils.Color; +import ohos.agp.utils.RectFloat; +import ohos.agp.utils.TextAlignment; /** *

YAxisTextMarkerView

*

Date: 2017/3/23

* * @author afon + * @since 2021-05-09 */ - public class XAxisTextMarkerView implements IMarkerView { private static final String TAG = "XAxisTextMarkerView"; private Paint markerTextPaint; private Paint markerBorderPaint; - private final RectF contentRect = new RectF(); + private final RectFloat contentRect = new RectFloat(); private AbstractRender render; - private final Paint.FontMetrics fontMetrics = new Paint.FontMetrics(); + private final Paint.FontMetrics fontMetrics = new Paint.FontMetrics(0,0,0,0,0); private final int height; - private final RectF markerInsets = new RectF(0, 0, 0, 0); + private final RectFloat markerInsets = new RectFloat(0, 0, 0, 0); private float inset = 0; private XMarkerAlign xMarkerAlign; + /** + * XAxisTextMarkerView + * @param height + */ public XAxisTextMarkerView(int height) { this.height = height; } @Override - public void onInitMarkerView(RectF contentRect, AbstractRender render) { - this.contentRect.set(contentRect); + public void onInitMarkerView(RectFloat contentRect, AbstractRender render) { + this.contentRect.left = contentRect.left; + this.contentRect.right = contentRect.right; + this.contentRect.top = contentRect.top; + this.contentRect.bottom = contentRect.bottom; this.render = render; final SizeColor sizeColor = render.getSizeColor(); if (markerTextPaint == null) { - markerTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - markerTextPaint.setTextAlign(Paint.Align.CENTER); + markerTextPaint = new Paint(); + markerTextPaint.setAntiAlias(true); + markerTextPaint.setTextAlign(TextAlignment.CENTER); } - markerTextPaint.setColor(sizeColor.getMarkerTextColor()); - markerTextPaint.setTextSize(sizeColor.getMarkerTextSize()); - markerTextPaint.getFontMetrics(fontMetrics); + markerTextPaint.setColor(new Color(sizeColor.getMarkerTextColor())); + markerTextPaint.setTextSize(StringUtils.floatToInt(sizeColor.getMarkerTextSize())); + markerTextPaint.getFontMetrics(); if (markerBorderPaint == null) { - markerBorderPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - markerBorderPaint.setStyle(Paint.Style.STROKE); + markerBorderPaint = new Paint(); + markerBorderPaint.setAntiAlias(true); + markerBorderPaint.setStyle(Paint.Style.STROKE_STYLE); } markerBorderPaint.setStrokeWidth(sizeColor.getMarkerBorderSize()); - markerBorderPaint.setColor(sizeColor.getMarkerBorderColor()); + markerBorderPaint.setColor(new Color(sizeColor.getMarkerBorderColor())); inset = markerBorderPaint.getStrokeWidth() / 2; xMarkerAlign = sizeColor.getXMarkerAlign(); @@ -105,7 +116,7 @@ public class XAxisTextMarkerView implements IMarkerView { } else if (xMarkerAlign == XMarkerAlign.BOTTOM) { markerInsets.top = contentRect.bottom - height + inset; - } else if (highlightPointY < contentRect.top + contentRect.height() / 3) { + } else if (highlightPointY < contentRect.top + contentRect.getHeight() / 3) { markerInsets.top = contentRect.bottom - height + inset; } else { @@ -115,14 +126,16 @@ public class XAxisTextMarkerView implements IMarkerView { markerInsets.right = markerInsets.left + width - inset * 2; markerInsets.bottom = markerInsets.top + height - inset * 2; - canvas.drawText(highlightEntry.getXLabel(), - markerInsets.left + markerInsets.width() / 2, - (markerInsets.top + markerInsets.bottom - fontMetrics.top - fontMetrics.bottom) / 2, - markerTextPaint); + canvas.drawText(markerTextPaint, + highlightEntry.getXLabel(), + markerInsets.left + markerInsets.getWidth() / 2, + (markerInsets.top + markerInsets.bottom - fontMetrics.top - fontMetrics.bottom) / 2); canvas.drawRect(markerInsets, markerBorderPaint); - - canvas.clipRect(markerInsets, Region.Op.XOR); + /** + * todo 交集方法暂无 + */ + canvas.clipRect(markerInsets, Canvas.ClipOp.DIFFERENCE); } } } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/marker/YAxisTextMarkerView.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/marker/YAxisTextMarkerView.java index ff543cf..51b630a 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/marker/YAxisTextMarkerView.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/marker/YAxisTextMarkerView.java @@ -18,14 +18,16 @@ package com.wordplat.ikvstockchart.marker; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.RectF; -import android.graphics.Region; import com.wordplat.ikvstockchart.align.YMarkerAlign; import com.wordplat.ikvstockchart.entry.SizeColor; import com.wordplat.ikvstockchart.render.AbstractRender; +import com.wordplat.ikvstockchart.utils.StringUtils; +import ohos.agp.render.Canvas; +import ohos.agp.render.Paint; +import ohos.agp.utils.Color; +import ohos.agp.utils.RectFloat; +import ohos.agp.utils.TextAlignment; import java.text.DecimalFormat; @@ -34,22 +36,22 @@ import java.text.DecimalFormat; *

Date: 2017/3/23

* * @author afon + * @since 2021-05-09 */ - public class YAxisTextMarkerView implements IMarkerView { private static final String TAG = "YAxisTextMarkerView"; private Paint markerTextPaint; private Paint markerBorderPaint; - private final RectF contentRect = new RectF(); + private final RectFloat contentRect = new RectFloat(); private AbstractRender render; - private final Paint.FontMetrics fontMetrics = new Paint.FontMetrics(); + private final Paint.FontMetrics fontMetrics = new Paint.FontMetrics(0, 0, 0, 0, 0); private final DecimalFormat decimalFormatter = new DecimalFormat("0.00"); private final float[] pointCache = new float[2]; private final int height; - private final RectF markerInsets = new RectF(0, 0, 0, 0); + private final RectFloat markerInsets = new RectFloat(0, 0, 0, 0); private float inset = 0; private YMarkerAlign yMarkerAlign; @@ -58,27 +60,32 @@ public class YAxisTextMarkerView implements IMarkerView { } @Override - public void onInitMarkerView(RectF contentRect, AbstractRender render) { - this.contentRect.set(contentRect); + public void onInitMarkerView(RectFloat contentRect, AbstractRender render) { + this.contentRect.left = contentRect.left; + this.contentRect.right = contentRect.right; + this.contentRect.top = contentRect.top; + this.contentRect.bottom = contentRect.bottom; this.render = render; final SizeColor sizeColor = render.getSizeColor(); if (markerTextPaint == null) { - markerTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - markerTextPaint.setTextAlign(Paint.Align.CENTER); + markerTextPaint = new Paint(); + markerTextPaint.setAntiAlias(true); + markerTextPaint.setTextAlign(TextAlignment.CENTER); } - markerTextPaint.setColor(sizeColor.getMarkerTextColor()); - markerTextPaint.setTextSize(sizeColor.getMarkerTextSize()); - markerTextPaint.getFontMetrics(fontMetrics); + markerTextPaint.setColor(new Color(sizeColor.getMarkerTextColor())); + markerTextPaint.setTextSize(StringUtils.floatToInt(sizeColor.getMarkerTextSize())); + markerTextPaint.getFontMetrics(); if (markerBorderPaint == null) { - markerBorderPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - markerBorderPaint.setStyle(Paint.Style.STROKE); + markerBorderPaint = new Paint(); + markerBorderPaint.setAntiAlias(true); + markerBorderPaint.setStyle(Paint.Style.STROKE_STYLE); } markerBorderPaint.setStrokeWidth(sizeColor.getMarkerBorderSize()); - markerBorderPaint.setColor(sizeColor.getMarkerBorderColor()); + markerBorderPaint.setColor(new Color(sizeColor.getMarkerBorderColor())); inset = markerBorderPaint.getStrokeWidth() / 2; yMarkerAlign = sizeColor.getYMarkerAlign(); @@ -109,7 +116,7 @@ public class YAxisTextMarkerView implements IMarkerView { } else if (yMarkerAlign == YMarkerAlign.RIGHT) { markerInsets.left = contentRect.right - width + inset; - } else if (highlightPointX < contentRect.left + contentRect.width() / 3) { + } else if (highlightPointX < contentRect.left + contentRect.getWidth() / 3) { markerInsets.left = contentRect.right - width + inset; } else { @@ -120,14 +127,16 @@ public class YAxisTextMarkerView implements IMarkerView { markerInsets.right = markerInsets.left + width - inset * 2; markerInsets.bottom = markerInsets.top + height - inset * 2; - canvas.drawText(value, - markerInsets.left + markerInsets.width() / 2, - (markerInsets.top + markerInsets.bottom - fontMetrics.top - fontMetrics.bottom) / 2, - markerTextPaint); + canvas.drawText(markerTextPaint, + value, + markerInsets.left + markerInsets.getWidth() / 2, + (markerInsets.top + markerInsets.bottom - fontMetrics.top - fontMetrics.bottom) / 2); canvas.drawRect(markerInsets, markerBorderPaint); - - canvas.clipRect(markerInsets, Region.Op.XOR); + /** + * todo 交集方法暂无 + */ + canvas.clipRect(markerInsets, Canvas.ClipOp.DIFFERENCE); } } } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/render/AbstractRender.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/render/AbstractRender.java index 8783922..29d1dc3 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/render/AbstractRender.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/render/AbstractRender.java @@ -18,56 +18,119 @@ package com.wordplat.ikvstockchart.render; -import android.graphics.Canvas; -import android.graphics.Matrix; -import android.graphics.RectF; -import android.util.Log; - import com.wordplat.ikvstockchart.entry.EntrySet; import com.wordplat.ikvstockchart.entry.SizeColor; +import ohos.agp.render.Canvas; +import ohos.agp.utils.Matrix; +import ohos.agp.utils.RectFloat; +import ohos.hiviewdfx.HiLog; +import ohos.hiviewdfx.HiLogLabel; + /** *

AbstractRender

*

Date: 2017/3/3

* * @author afon + * @since 2021-05-09 */ public abstract class AbstractRender { + static final HiLogLabel LOG_LABEL = new HiLogLabel(HiLog.LOG_APP, 0x00201, "AbstractRender"); + private static final String TAG = "AbstractRender"; private static final boolean DEBUG = false; + public static final int MSCALE_X = 0; - protected EntrySet entrySet; // entry 值 + public static final int MSKEW_X = 1; - protected SizeColor sizeColor = new SizeColor(); // 画笔大小和颜色配置 + public static final int MTRANS_X = 2; + public static final int MSKEW_Y = 3; + public static final int MSCALE_Y = 4; + public static final int MTRANS_Y = 5; + public static final int MPERSP_0 = 6; + public static final int MPERSP_1 = 7; + public static final int MPERSP_2 = 8; - protected final RectF viewRect = new RectF(); // 整个的视图区域大小 - protected boolean viewRectChange = false; // 视图区域是否发生变化 - - private final Matrix matrixValue = new Matrix(); // 把值映射到屏幕像素的矩阵 - private final Matrix matrixTouch = new Matrix(); // 缩放和平移矩阵 - private final Matrix matrixOffset = new Matrix(); // 偏移矩阵 - private final Matrix matrixSimple = new Matrix(); // 单一矩阵 - private final Matrix matrixInvert = new Matrix(); // 用于缓存反转矩阵 + /** + * entry 值 + */ + protected EntrySet entrySet; + /** + * 画笔大小和颜色配置 + */ + protected SizeColor sizeColor = new SizeColor(); + /** + * 整个的视图区域大小 + */ + protected final RectFloat viewRect = new RectFloat(); // + /** + * 视图区域是否发生变化 + */ + protected boolean viewRectChange = false; // + /** + * 把值映射到屏幕像素的矩阵 + */ + private final Matrix matrixValue = new Matrix(); // + /** + * 缩放和平移矩阵 + */ + private final Matrix matrixTouch = new Matrix(); // + /** + * 偏移矩阵 + */ + private final Matrix matrixOffset = new Matrix(); // + /** + * 单一矩阵 + */ + private final Matrix matrixSimple = new Matrix(); // + /** + * 用于缓存反转矩阵 + */ + private final Matrix matrixInvert = new Matrix(); // private final float[] touchPts = new float[2]; - private final float[] touchValues = new float[9]; // 存储缩放和平移信息 - private final float[] extremumY = new float[2]; // 当前显示区域内的 Y 轴范围 - private float extremumYScale = 1.3f; // Y 轴极值缩放因子 - private float extremumYDelta = 0; // Y 轴极值增量 + /** + * 存储缩放和平移信息 + */ + private final float[] touchValues = new float[9]; // + /** + * 当前显示区域内的 Y 轴范围 + */ + private final float[] extremumY = new float[2]; // + /** + * Y 轴极值缩放因子 + */ + private float extremumYScale = 1.3f; // + /** + * Y 轴极值增量 + */ + private float extremumYDelta = 0; // private boolean highlight = false; private final float[] highlightPoint = new float[2]; + /** + * 最小滚动量 + */ + private float minScrollOffset = 0; // + /** + * 最大滚动量 + */ + private float maxScrollOffset = 0; // + /** + * 上一次的最大滚动量 + */ + private float lastMaxScrollOffset = 0; // + /** + * 超出边界的滚动量 + */ + private float overScrollOffset = 0; // - private float minScrollOffset = 0; // 最小滚动量 - private float maxScrollOffset = 0; // 最大滚动量 - private float lastMaxScrollOffset = 0; // 上一次的最大滚动量 - private float overScrollOffset = 0; // 超出边界的滚动量 /** * 根据给出的 view 坐标信息,进行视图上的一些设置 */ - public abstract void onViewRect(RectF viewRect); + public abstract void onViewRect(RectFloat viewRect); /** * 放大 @@ -121,19 +184,22 @@ public abstract class AbstractRender { /** * 获取整个的视图区域大小 */ - public RectF getViewRect() { + public RectFloat getViewRect() { return viewRect; } /** * 设置整个的视图区域大小 */ - public void setViewRect(RectF viewRect) { - if (this.viewRect.height() > 0 && !this.viewRect.equals(viewRect)) { + public void setViewRect(RectFloat viewRect) { + if (this.viewRect.getHeight() > 0 && !this.viewRect.equals(viewRect)) { viewRectChange = true; } - this.viewRect.set(viewRect); + this.viewRect.left = viewRect.left; + this.viewRect.right = viewRect.right; + this.viewRect.top = viewRect.top; + this.viewRect.bottom = viewRect.bottom; } /** @@ -192,15 +258,14 @@ public abstract class AbstractRender { * 是否可以滚动 */ public boolean canScroll(float dx) { - final float offset = touchValues[Matrix.MTRANS_X] - dx; + final float offset = touchValues[MTRANS_X] - dx; - if (offset < -maxScrollOffset && touchValues[Matrix.MTRANS_X] <= -maxScrollOffset) { + if (offset < -maxScrollOffset && touchValues[MTRANS_X] <= -maxScrollOffset) { return false; } - if (offset > minScrollOffset && touchValues[Matrix.MTRANS_X] >= minScrollOffset) { + if (offset > minScrollOffset && touchValues[MTRANS_X] >= minScrollOffset) { return false; } - return true; } @@ -240,7 +305,7 @@ public abstract class AbstractRender { * 获取当前滚动量 */ public float getCurrentTransX() { - return touchValues[Matrix.MTRANS_X]; + return touchValues[MTRANS_X]; } /** @@ -249,11 +314,11 @@ public abstract class AbstractRender { * @param dx 变化量 */ public void updateCurrentTransX(float dx) { - matrixTouch.getValues(touchValues); + matrixTouch.getData(); - touchValues[Matrix.MTRANS_X] += -dx; + touchValues[MTRANS_X] += -dx; - matrixTouch.setValues(touchValues); + matrixTouch.setMatrix(new Matrix(touchValues)); } /** @@ -262,11 +327,11 @@ public abstract class AbstractRender { * @param transX 当前滚动位置。此值为正时将被程序视为负,因为这里的滚动量用负数表示。 */ public void setCurrentTransX(float transX) { - matrixTouch.getValues(touchValues); + matrixTouch.getData(); - touchValues[Matrix.MTRANS_X] = transX > 0 ? -transX : transX; + touchValues[MTRANS_X] = transX > 0 ? -transX : transX; - matrixTouch.setValues(touchValues); + matrixTouch.setMatrix(new Matrix(touchValues)); } /** @@ -281,9 +346,9 @@ public abstract class AbstractRender { matrixValue.mapPoints(touchPts); matrixTouch.mapPoints(touchPts); - matrixTouch.getValues(touchValues); + matrixTouch.getData(); - return touchValues[Matrix.MTRANS_X] + touchPts[0]; + return touchValues[MTRANS_X] + touchPts[0]; } /** @@ -292,30 +357,30 @@ public abstract class AbstractRender { * @param dx 变化量 */ public void scroll(float dx) { - matrixTouch.getValues(touchValues); + matrixTouch.getData(); - touchValues[Matrix.MTRANS_X] += -dx; + touchValues[MTRANS_X] += -dx; overScrollOffset = 0; - if (touchValues[Matrix.MTRANS_X] < -maxScrollOffset) { - touchValues[Matrix.MTRANS_X] = -maxScrollOffset; + if (touchValues[MTRANS_X] < -maxScrollOffset) { + touchValues[MTRANS_X] = -maxScrollOffset; } - if (touchValues[Matrix.MTRANS_X] > minScrollOffset) { - touchValues[Matrix.MTRANS_X] = minScrollOffset; + if (touchValues[MTRANS_X] > minScrollOffset) { + touchValues[MTRANS_X] = minScrollOffset; } - matrixTouch.setValues(touchValues); + matrixTouch.setMatrix(new Matrix(touchValues)); } /** * 缩放 * - * @param contentRect 当前显示区域 + * @param contentRect 当前显示区域 * @param visibleCount 当前显示区域的 X 轴方向上需要显示多少个 entry 值 - * @param x 在点(x, y)上缩放 - * @param y 在点(x, y)上缩放。由于 K 线图只会进行水平滚动,因此 y 值被忽略 + * @param x 在点(x, y)上缩放 + * @param y 在点(x, y)上缩放。由于 K 线图只会进行水平滚动,因此 y 值被忽略 */ - public void zoom(RectF contentRect, float visibleCount, float x, float y) { + public void zoom(RectFloat contentRect, float visibleCount, float x, float y) { if (x < contentRect.left) { x = contentRect.left; } @@ -323,10 +388,10 @@ public abstract class AbstractRender { x = contentRect.right; } - matrixTouch.getValues(touchValues); + matrixTouch.getData(); final int minVisibleIndex; - final int toMinVisibleIndex = (int) (visibleCount * (x - contentRect.left) / contentRect.width()); + final int toMinVisibleIndex = (int) (visibleCount * (x - contentRect.left) / contentRect.getWidth()); touchPts[0] = x; touchPts[1] = 0; @@ -338,17 +403,17 @@ public abstract class AbstractRender { minVisibleIndex = (int) Math.abs(touchPts[0] - toMinVisibleIndex); } - touchValues[Matrix.MSCALE_X] = entrySet.getEntryList().size() / visibleCount; + touchValues[MSCALE_X] = entrySet.getEntryList().size() / visibleCount; - computeScrollRange(contentRect.width(), touchValues[Matrix.MSCALE_X]); + computeScrollRange(contentRect.getWidth(), touchValues[MSCALE_X]); - touchValues[Matrix.MTRANS_X] = getTransX(visibleCount, minVisibleIndex); + touchValues[MTRANS_X] = getTransX(visibleCount, minVisibleIndex); - matrixTouch.setValues(touchValues); + matrixTouch.setMatrix(new Matrix(touchValues)); if (DEBUG) { - Log.i(TAG, "##d zoom: touchValues[Matrix.MSCALE_X] = " + touchValues[Matrix.MSCALE_X] - + ", touchValues[Matrix.MTRANS_X] = " + touchValues[Matrix.MTRANS_X] + HiLog.info(LOG_LABEL, "##d zoom: touchValues[Matrix.MSCALE_X] = " + touchValues[MSCALE_X] + + ", touchValues[Matrix.MTRANS_X] = " + touchValues[MTRANS_X] + ", visibleCount = " + visibleCount + ", minVisibleIndex = " + minVisibleIndex); } @@ -369,11 +434,11 @@ public abstract class AbstractRender { * 按给定矩阵将 entry 的值映射到屏幕像素上 * * @param matrix 矩阵 - * @param pts 浮点数序列 [x0, y0, x1, y1, ...] + * @param pts 浮点数序列 [x0, y0, x1, y1, ...] */ public void mapPoints(Matrix matrix, float[] pts) { if (matrix != null) { - matrixSimple.set(matrix); + matrixSimple.setMatrix(matrix); } if (matrixSimple.isIdentity()) { @@ -405,11 +470,11 @@ public abstract class AbstractRender { * 将基于屏幕像素的坐标按给定矩阵反转到值 * * @param matrix 矩阵 - * @param pts 浮点数序列 [x0, y0, x1, y1, ...] + * @param pts 浮点数序列 [x0, y0, x1, y1, ...] */ public void invertMapPoints(Matrix matrix, float[] pts) { if (matrix != null) { - matrixSimple.set(matrix); + matrixSimple.setMatrix(matrix); } if (matrixSimple.isIdentity()) { @@ -427,40 +492,40 @@ public abstract class AbstractRender { * 值矩阵运算 * * @param matrix 矩阵 matrix - * @param rect 视图 rect - * @param minY 较小的 Y 值 + * @param rect 视图 rect + * @param minY 较小的 Y 值 * @param deltaY Y 轴范围 */ - protected void postMatrixValue(Matrix matrix, RectF rect, float minY, float deltaY) { + protected void postMatrixValue(Matrix matrix, RectFloat rect, float minY, float deltaY) { final float maxY = minY + deltaY; if (maxY > 0) { if (minY >= 0) { matrix.reset(); matrix.postTranslate(0, -minY); - matrix.postScale(1, -(rect.height() / deltaY)); + matrix.postScale(1, -(rect.getHeight() / deltaY)); matrix.postTranslate(0, rect.bottom); } else { matrix.reset(); - matrix.postScale(1, -(rect.height() / deltaY)); - matrix.postTranslate(0, rect.top + maxY / deltaY * rect.height()); + matrix.postScale(1, -(rect.getHeight() / deltaY)); + matrix.postTranslate(0, rect.top + maxY / deltaY * rect.getHeight()); } } else { matrix.reset(); matrix.postTranslate(0, -maxY); - matrix.postScale(1, -(rect.height() / deltaY)); + matrix.postScale(1, -(rect.getHeight() / deltaY)); matrix.postTranslate(0, rect.top); } - matrixSimple.set(matrix); + matrixSimple.setMatrix(matrix); } /** * 值矩阵运算 * - * @param width 当前显示区域的宽 + * @param width 当前显示区域的宽 * @param height 当前显示区域的高 - * @param minY 显示区域内可见的 entry 的最小值 + * @param minY 显示区域内可见的 entry 的最小值 * @param deltaY 显示区域内可见的 entry 最大值与最小值之差 */ protected void postMatrixValue(float width, float height, float minY, float deltaY) { @@ -478,7 +543,7 @@ public abstract class AbstractRender { /** * 手势滑动缩放矩阵运算 * - * @param width 当前显示区域的宽 + * @param width 当前显示区域的宽 * @param visibleCount 当前显示区域的 X 轴方向上需要显示多少个 entry 值 */ protected void postMatrixTouch(float width, float visibleCount) { @@ -493,38 +558,48 @@ public abstract class AbstractRender { computeScrollRange(width, scaleX); if (DEBUG) { - Log.i(TAG, "##d postMatrixTouch: currentOffset = " + touchValues[Matrix.MTRANS_X] + HiLog.info(LOG_LABEL, "##d postMatrixTouch: currentOffset = " + touchValues[MTRANS_X] + ", maxScrollOffset = " + maxScrollOffset + ", lastMaxScrollOffset = " + lastMaxScrollOffset + ", overScrollOffset = " + overScrollOffset); } - // 数据不满一屏,不需要滚动定位 + /** + * 数据不满一屏,不需要滚动定位 + */ if (scaleX > 1) { - if (touchValues[Matrix.MTRANS_X] > 0) { - // 左滑加载完成之后定位到之前滚动的位置 - matrixTouch.postTranslate(touchValues[Matrix.MTRANS_X] - (maxScrollOffset - lastMaxScrollOffset), 0); + if (touchValues[MTRANS_X] > 0) { + /** + * 左滑加载完成之后定位到之前滚动的位置 + */ + matrixTouch.postTranslate(touchValues[MTRANS_X] - (maxScrollOffset - lastMaxScrollOffset), 0); - } else if (touchValues[Matrix.MTRANS_X] < 0) { + } else if (touchValues[MTRANS_X] < 0) { if (overScrollOffset != 0 && !viewRectChange) { - // 右滑加载完成之后定位到之前滚动的位置 - matrixTouch.postTranslate(touchValues[Matrix.MTRANS_X], 0); + /** + * 右滑加载完成之后定位到之前滚动的位置 + */ + matrixTouch.postTranslate(touchValues[MTRANS_X], 0); } else { // TODO 左滑、右滑加载中时转动屏幕方向,定位仍然有 BUG,我将花更多时间找到好的办法解决 - // 转动屏幕方向导致矩形变化,定位到之前相同比例的滚动位置 - touchValues[Matrix.MTRANS_X] = touchValues[Matrix.MTRANS_X] / lastMaxScrollOffset * maxScrollOffset; + /** + * 转动屏幕方向导致矩形变化,定位到之前相同比例的滚动位置 + */ + touchValues[MTRANS_X] = touchValues[MTRANS_X] / lastMaxScrollOffset * maxScrollOffset; if (DEBUG) { - Log.i(TAG, "##d postMatrixTouch: transX = " + touchValues[Matrix.MTRANS_X] + ", viewRectChange = " + viewRectChange); + HiLog.info(LOG_LABEL, "##d postMatrixTouch: transX = " + touchValues[MTRANS_X] + ", viewRectChange = " + viewRectChange); } - matrixTouch.postTranslate(touchValues[Matrix.MTRANS_X], 0); + matrixTouch.postTranslate(touchValues[MTRANS_X], 0); viewRectChange = false; } } else { - // 通常首次加载时定位到最末尾 + /** + * 通常首次加载时定位到最末尾 + */ setCurrentTransX(-maxScrollOffset); } } @@ -545,7 +620,7 @@ public abstract class AbstractRender { * 获取给定的 entryIndex 对应的滚动偏移量。在调用 {@link #computeScrollRange} 之后才能调用此方法 * * @param visibleCount 当前显示区域的 X 轴方向上需要显示多少个 entry 值 - * @param entryIndex entry 索引 + * @param entryIndex entry 索引 */ protected float getTransX(float visibleCount, int entryIndex) { final int entrySetSize = entrySet.getEntryList().size(); @@ -561,7 +636,7 @@ public abstract class AbstractRender { /** * 计算当前缩放下,X 轴方向的最小滚动值和最大滚动值 * - * @param width 当前显示区域的宽 + * @param width 当前显示区域的宽 * @param scaleX X 轴方向的缩放 */ protected void computeScrollRange(float width, float scaleX) { diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/render/KLineRender.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/render/KLineRender.java index 45cf84b..0936bad 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/render/KLineRender.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/render/KLineRender.java @@ -1,13 +1,13 @@ /* * Copyright (C) 2017 WordPlat Open Source Project * - * https://wordplat.com/InteractiveKLineView/ + * https:wordplat.com/InteractiveKLineView/ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http:www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -18,22 +18,18 @@ package com.wordplat.ikvstockchart.render; -import android.animation.ValueAnimator; -import android.content.Context; -import android.content.res.Configuration; -import android.graphics.Canvas; -import android.graphics.RectF; -import android.view.animation.LinearInterpolator; - -import com.wordplat.ikvstockchart.drawing.CandleDrawing; -import com.wordplat.ikvstockchart.drawing.EmptyDataDrawing; -import com.wordplat.ikvstockchart.drawing.HighlightDrawing; -import com.wordplat.ikvstockchart.drawing.IDrawing; -import com.wordplat.ikvstockchart.drawing.KLineGridAxisDrawing; -import com.wordplat.ikvstockchart.drawing.MADrawing; +import com.wordplat.ikvstockchart.drawing.*; import com.wordplat.ikvstockchart.entry.EntrySet; import com.wordplat.ikvstockchart.entry.StockIndex; import com.wordplat.ikvstockchart.marker.IMarkerView; +import com.wordplat.ikvstockchart.utils.StringUtils; + +import ohos.agp.animation.Animator; +import ohos.agp.animation.AnimatorValue; +import ohos.agp.render.Canvas; +import ohos.agp.utils.RectFloat; +import ohos.app.Context; +import ohos.global.configuration.Configuration; import java.util.ArrayList; import java.util.List; @@ -43,8 +39,8 @@ import java.util.List; *

Date: 2017/3/3

* * @author afon + * @since 2021-05-09 */ - public class KLineRender extends AbstractRender { private static final String TAG = "KLineRender"; @@ -55,7 +51,10 @@ public class KLineRender extends AbstractRender { private static final float LANDSCAPE_PORTRAIT_FACTOR = 1.8235294f; private final Context context; - private final RectF kLineRect = new RectF(); // K 线图显示区域 + /** + * K 线图显示区域 + */ + private final RectFloat kLineRect = new RectFloat(); private final float[] extremumY = new float[2]; private final float[] contentPts = new float[2]; @@ -95,7 +94,7 @@ public class KLineRender extends AbstractRender { /** * 缩放动画 */ - private final ValueAnimator zoomAnimator = new ValueAnimator(); + private final AnimatorValue zoomAnimator = new AnimatorValue(); private float zoomPivotX; private float zoomPivotY; @@ -108,9 +107,16 @@ public class KLineRender extends AbstractRender { private final MADrawing maDrawing = new MADrawing(); private final EmptyDataDrawing emptyDataDrawing = new EmptyDataDrawing(); private final HighlightDrawing highlightDrawing = new HighlightDrawing(); + /** + * 股票指标列表 + */ + private final List stockIndexList = new ArrayList<>(); - private final List stockIndexList = new ArrayList<>(); // 股票指标列表 - + /** + * KLineRender + * + * @param context + */ public KLineRender(Context context) { this.context = context; @@ -121,33 +127,54 @@ public class KLineRender extends AbstractRender { kLineDrawingList.add(highlightDrawing); zoomAnimator.setDuration(ZOOM_DURATION); - zoomAnimator.setInterpolator(new LinearInterpolator()); - zoomAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - int count = (int) animation.getAnimatedValue(); + zoomAnimator.setCurveType(Animator.CurveType.LINEAR); + zoomAnimator.setValueUpdateListener(new AnimatorValue.ValueUpdateListener() { + @Override + public void onUpdate(AnimatorValue animatorValue, float v) { + int count = StringUtils.floatToInt(v); zoom(kLineRect, count, zoomPivotX, zoomPivotY); } }); } + /** + * addDrawing + * + * @param drawing + */ public void addDrawing(IDrawing drawing) { kLineDrawingList.add(drawing); } + /** + * clearDrawing + */ public void clearDrawing() { kLineDrawingList.clear(); } + /** + * addStockIndex + * + * @param stockIndex + */ public void addStockIndex(StockIndex stockIndex) { stockIndexList.add(stockIndex); } + /** + * removeStockIndex + * + * @param stockIndex + */ public void removeStockIndex(StockIndex stockIndex) { stockIndexList.remove(stockIndex); } + /** + * clearStockIndex + */ public void clearStockIndex() { stockIndexList.clear(); } @@ -160,10 +187,15 @@ public class KLineRender extends AbstractRender { this.zoomTimes = zoomTimes; } - public RectF getKLineRect() { + public RectFloat getKLineRect() { return kLineRect; } + /** + * addMarkerView + * + * @param markerView + */ public void addMarkerView(IMarkerView markerView) { highlightDrawing.addMarkerView(markerView); } @@ -174,16 +206,16 @@ public class KLineRender extends AbstractRender { computeVisibleCount(); - postMatrixTouch(kLineRect.width(), currentVisibleCount); + postMatrixTouch(kLineRect.getWidth(), currentVisibleCount); computeExtremumValue(extremumY, entrySet.getMinY(), entrySet.getDeltaY()); - postMatrixValue(kLineRect.width(), kLineRect.height(), extremumY[0], extremumY[1]); + postMatrixValue(kLineRect.getWidth(), kLineRect.getHeight(), extremumY[0], extremumY[1]); postMatrixOffset(kLineRect.left, kLineRect.top); } @Override - public void onViewRect(RectF viewRect) { + public void onViewRect(RectFloat viewRect) { final float candleBottom = viewRect.bottom - sizeColor.getXLabelViewHeight(); final int remainHeight = (int) (candleBottom - viewRect.top); @@ -197,7 +229,7 @@ public class KLineRender extends AbstractRender { } } - kLineRect.set(viewRect.left, viewRect.top, viewRect.right, candleBottom - calculateHeight); + kLineRect.modify(viewRect.left, viewRect.top, viewRect.right, candleBottom - calculateHeight); initDrawingList(kLineRect, kLineDrawingList); @@ -206,7 +238,8 @@ public class KLineRender extends AbstractRender { if (stockIndex.isEnable()) { calculateHeight += stockIndex.getHeight(); - float top = kLineRect.bottom + sizeColor.getXLabelViewHeight() + calculateHeight - stockIndex.getHeight(); + float top = kLineRect.bottom + sizeColor.getXLabelViewHeight() + + calculateHeight - stockIndex.getHeight(); float bottom = kLineRect.bottom + sizeColor.getXLabelViewHeight() + calculateHeight; stockIndex.setRect( @@ -229,7 +262,7 @@ public class KLineRender extends AbstractRender { @Override public void zoomIn(float x, float y) { if (entrySet.getEntryList().size() == 0) { - return ; + return; } final int visibleCount = getCurrentVisibleCount(++zoomTimes); @@ -251,7 +284,7 @@ public class KLineRender extends AbstractRender { @Override public void zoomOut(float x, float y) { if (entrySet.getEntryList().size() == 0) { - return ; + return; } final int visibleCount = getCurrentVisibleCount(--zoomTimes); @@ -266,6 +299,9 @@ public class KLineRender extends AbstractRender { @Override public void render(Canvas canvas) { + if (entrySet == null) { + return; + } final int count = entrySet.getEntryList().size(); computeVisibleIndex(); @@ -297,24 +333,14 @@ public class KLineRender extends AbstractRender { } } - private void zoomAnimate(int visibleCount, float pivotX, float pivotY) { - zoomAnimator.setIntValues(currentVisibleCount, visibleCount); - zoomPivotX = pivotX; - zoomPivotY = pivotY; - - currentVisibleCount = visibleCount; - - zoomAnimator.start(); - } - - private void initDrawingList(RectF rect, List drawingList) { + private void initDrawingList(RectFloat rect, List drawingList) { for (IDrawing drawing : drawingList) { drawing.onInit(rect, this); } } private void renderDrawingList(Canvas canvas, List drawingList, float minY, float maxY) { - for (int i = minVisibleIndex ; i < maxVisibleIndex ; i++) { + for (int i = minVisibleIndex; i < maxVisibleIndex; i++) { for (IDrawing drawing : drawingList) { drawing.computePoint(minVisibleIndex, maxVisibleIndex, i); } @@ -345,22 +371,24 @@ public class KLineRender extends AbstractRender { currentVisibleCount = sizeColor.getPortraitDefaultVisibleCount(); portraitVisibleCountBuffer[zoomOutTimes] = currentVisibleCount; - for (int i = zoomInTimes ; i > 0 ; i--) { + for (int i = zoomInTimes; i > 0; i--) { portraitVisibleCountBuffer[zoomOutTimes - i] = getZoomOutVisibleCount(currentVisibleCount, i); } - for (int i = zoomOutTimes ; i > 0 ; i--) { + for (int i = zoomOutTimes; i > 0; i--) { portraitVisibleCountBuffer[zoomOutTimes + i] = getZoomInVisibleCount(currentVisibleCount, i); } } - // 横屏时应该改变显示的 entry 数量,否则蜡烛图太粗了,不好看 - if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { + /** + * 横屏时应该改变显示的 entry 数量,否则蜡烛图太粗了,不好看 + */ + if (context.getResourceManager().getConfiguration().direction == Configuration.DIRECTION_HORIZONTAL) { if (landscapeVisibleCountBuffer.length < maxZoomTimes) { landscapeVisibleCountBuffer = new int[maxZoomTimes]; } - for (int i = 0 ; i <= zoomOutTimes + zoomInTimes ; i++) { + for (int i = 0; i <= zoomOutTimes + zoomInTimes; i++) { landscapeVisibleCountBuffer[i] = (int) (portraitVisibleCountBuffer[i] * LANDSCAPE_PORTRAIT_FACTOR); } @@ -382,17 +410,19 @@ public class KLineRender extends AbstractRender { maxVisibleIndex = entrySet.getEntryList().size(); } - // 计算当前显示区域内 entry 在 Y 轴上的最小值和最大值 + /** + * 计算当前显示区域内 entry 在 Y 轴上的最小值和最大值 + */ entrySet.computeMinMax(minVisibleIndex, maxVisibleIndex, stockIndexList); computeExtremumValue(extremumY, entrySet.getMinY(), entrySet.getDeltaY()); - postMatrixValue(kLineRect.width(), kLineRect.height(), extremumY[0], extremumY[1]); + postMatrixValue(kLineRect.getWidth(), kLineRect.getHeight(), extremumY[0], extremumY[1]); } private int getCurrentVisibleCount(int zoomTimes) { final int index = zoomOutTimes + zoomTimes; if (0 <= index && index <= zoomOutTimes + zoomInTimes) { - if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { + if (context.getResourceManager().getConfiguration().direction == Configuration.DIRECTION_HORIZONTAL) { return landscapeVisibleCountBuffer[index]; } else { return portraitVisibleCountBuffer[index]; diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/render/TimeLineRender.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/render/TimeLineRender.java index dcd2cef..270eec7 100644 --- a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/render/TimeLineRender.java +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/render/TimeLineRender.java @@ -18,9 +18,6 @@ package com.wordplat.ikvstockchart.render; -import android.graphics.Canvas; -import android.graphics.RectF; - import com.wordplat.ikvstockchart.drawing.EmptyDataDrawing; import com.wordplat.ikvstockchart.drawing.HighlightDrawing; import com.wordplat.ikvstockchart.entry.EntrySet; @@ -28,6 +25,9 @@ import com.wordplat.ikvstockchart.drawing.IDrawing; import com.wordplat.ikvstockchart.drawing.TimeLineDrawing; import com.wordplat.ikvstockchart.drawing.TimeLineGridAxisDrawing; +import ohos.agp.render.Canvas; +import ohos.agp.utils.RectFloat; + import java.util.ArrayList; import java.util.List; @@ -36,16 +36,21 @@ import java.util.List; *

Date: 2017/3/9

* * @author afon + * @since 2021-05-09 */ - public class TimeLineRender extends AbstractRender { - - private final RectF chartRect = new RectF(); // 分时图显示区域 + /** + * 分时图显示区域 + */ + private final RectFloat chartRect = new RectFloat(); private final float[] extremumY = new float[2]; private final List drawingList = new ArrayList<>(); + /** + * TimeLineRender + */ public TimeLineRender() { drawingList.add(new TimeLineGridAxisDrawing()); drawingList.add(new TimeLineDrawing()); @@ -53,15 +58,28 @@ public class TimeLineRender extends AbstractRender { drawingList.add(new HighlightDrawing()); } + /** + * addDrawing + * + * @param drawing + */ public void addDrawing(IDrawing drawing) { drawingList.add(drawing); } + /** + * clearDrawing + */ public void clearDrawing() { drawingList.clear(); } - public RectF getChartRect() { + /** + * getChartRect + * + * @return RectFloat + */ + public RectFloat getChartRect() { return chartRect; } @@ -69,11 +87,11 @@ public class TimeLineRender extends AbstractRender { public void setEntrySet(EntrySet entrySet) { super.setEntrySet(entrySet); - postMatrixTouch(chartRect.width(), sizeColor.getTimeLineMaxCount()); + postMatrixTouch(chartRect.getWidth(), sizeColor.getTimeLineMaxCount()); entrySet.computeTimeLineMinMax(0, entrySet.getEntryList().size()); computeExtremumValue(extremumY, entrySet.getMinY(), entrySet.getDeltaY()); - postMatrixValue(chartRect.width(), chartRect.height(), extremumY[0], extremumY[1]); + postMatrixValue(chartRect.getWidth(), chartRect.getHeight(), extremumY[0], extremumY[1]); postMatrixOffset(chartRect.left, chartRect.top); scroll(0); @@ -90,8 +108,11 @@ public class TimeLineRender extends AbstractRender { } @Override - public void onViewRect(RectF viewRect) { - chartRect.set(viewRect); + public void onViewRect(RectFloat viewRect) { + chartRect.left = viewRect.left; + chartRect.right = viewRect.right; + chartRect.top = viewRect.top; + chartRect.bottom = viewRect.bottom; for (IDrawing drawing : drawingList) { drawing.onInit(chartRect, this); @@ -113,7 +134,7 @@ public class TimeLineRender extends AbstractRender { final int count = entrySet.getEntryList().size(); final int lastIndex = count - 1; - for (int i = 0 ; i < count ; i++) { + for (int i = 0; i < count; i++) { for (IDrawing drawing : drawingList) { drawing.computePoint(0, lastIndex, i); } diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/utils/ScreenUtils.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/utils/ScreenUtils.java new file mode 100644 index 0000000..24ef5c0 --- /dev/null +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/utils/ScreenUtils.java @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.wordplat.ikvstockchart.utils; + +import ohos.agp.colors.RgbColor; +import ohos.agp.components.AttrHelper; +import ohos.agp.utils.Color; +import ohos.agp.window.service.Display; +import ohos.agp.window.service.DisplayManager; +import ohos.app.Context; + +import java.util.Optional; + +import static ohos.agp.components.AttrHelper.getDensity; + +/** + * ScreenUtils + * + * @since 2021-03-29 + */ +public class ScreenUtils { + + /** + * 获取屏幕的高度Px + * + * @param context + * @return int + */ + public static final int getHeightInPx(Context context) { + final int height = context.getResourceManager().getDeviceCapability().height; + return height; + } + + /** + * 获取屏幕的宽度Px + * + * @param context + * @return int + */ + public static final int getWidthInPx(Context context) { + final int width = context.getResourceManager().getDeviceCapability().width; + return width; + } + + /** + * 获取屏幕的高度Dp + * + * @param context + * @return int + */ + public static final int getHeightInDp(Context context) { + final float height = context.getResourceManager().getDeviceCapability().height; + int heightInDp = pxToFp(context, height); + return heightInDp; + } + + /** + * 获取屏幕的宽度Dp + * + * @param context + * @return int + */ + public static final int getWidthInDp(Context context) { + final float width = context.getResourceManager().getDeviceCapability().width; + int widthInDp = fpToPx(context, width); + return widthInDp; + } + + /** + * fp 转 Px + * + * @param context + * @param fp + * @return int + */ + public static int fpToPx(final Context context, final float fp) { + + return AttrHelper.fp2px(fp, getDensity(context)); + } + + /** + * px 转 Fp + * + * @param context + * @param px + * @return int + */ + public static int pxToFp(final Context context, final float px) { + return Math.round(px * getDensity(context)); + } + + + /** + * 获取当前设备属性 + * + * @param context + * @return Display + */ + public static Display getDeviceAttr(Context context) { + Optional optional = DisplayManager.getInstance().getDefaultDisplay(context); + return optional.get(); + } + + /** + * 屏幕宽 + * + * @param context + * @return int + */ + public static int getDisplayWidth(Context context) { + return getDeviceAttr(context).getRealAttributes().width; + } + + /** + * 屏幕高 + * + * @param context + * @return int + */ + public static int getDisplayHeight(Context context) { + return getDeviceAttr(context).getRealAttributes().height; + } + + /** + * rgb颜色 + * + * @param color 色值 + * @return RgbColor + */ + private RgbColor getRgbColor(Color color) { + return RgbColor.fromArgbInt(color.getValue()); + } +} diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/utils/StringUtils.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/utils/StringUtils.java new file mode 100644 index 0000000..f413fce --- /dev/null +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/utils/StringUtils.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.ikvstockchart.utils; + +/** + * StringUtils + * + * @since 2021-04-26 + */ +public class StringUtils { + private StringUtils() { + } + + /** + * float转int + * + * @param floatnum + * @return int + */ + public static int floatToInt(float floatnum) { + return (int) floatnum; + } +} diff --git a/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/utils/TypedAttrUtils.java b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/utils/TypedAttrUtils.java new file mode 100644 index 0000000..56dd911 --- /dev/null +++ b/ikvStockChart/src/main/java/com/wordplat/ikvstockchart/utils/TypedAttrUtils.java @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.wordplat.ikvstockchart.utils; + + +import ohos.agp.components.Attr; +import ohos.agp.components.AttrSet; +import ohos.agp.utils.Color; +import ohos.hiviewdfx.HiLog; +import ohos.hiviewdfx.HiLogLabel; + +import java.util.NoSuchElementException; + +/** + * TypedAttrUtils + * + * @since 2021-03-29 + */ +public class TypedAttrUtils { + static final HiLogLabel LOG_LABEL = new HiLogLabel(HiLog.LOG_APP, 0x00201, "TypedAttrUtils"); + + private TypedAttrUtils() { + } + + /** + * getIntColor + * + * @param attrs + * @param attrName + * @param defValue + * @return int + */ + public static int getIntColor(AttrSet attrs, String attrName, int defValue) { + Attr attr = attrNoSuchElement(attrs, attrName); + if (attr == null) { + return defValue; + } else { + return attr.getColorValue().getValue(); + } + } + + /** + * getColor + * + * @param attrs + * @param attrName + * @param defValue + * @return Color + */ + public static Color getColor(AttrSet attrs, String attrName, Color defValue) { + Attr attr = attrNoSuchElement(attrs, attrName); + if (attr == null) { + return defValue; + } else { + return attr.getColorValue(); + } + } + + /** + * getBoolean + * + * @param attrs + * @param attrName + * @param defValue + * @return boolean + */ + public static boolean getBoolean(AttrSet attrs, String attrName, boolean defValue) { + Attr attr = attrNoSuchElement(attrs, attrName); + if (attr == null) { + return defValue; + } else { + return attr.getBoolValue(); + } + } + + /** + * getString + * + * @param attrs + * @param attrName + * @param defValue + * @return String + */ + public static String getString(AttrSet attrs, String attrName, String defValue) { + Attr attr = attrNoSuchElement(attrs, attrName); + if (attr == null) { + return defValue; + } else { + return attr.getStringValue(); + } + } + + /** + * getFloat + * + * @param attrs + * @param attrName + * @param defValue + * @return float + */ + public static float getFloat(AttrSet attrs, String attrName, float defValue) { + Attr attr = attrNoSuchElement(attrs, attrName); + if (attr == null) { + return defValue; + } else { + return attr.getFloatValue(); + } + } + + /** + * getInteger + * + * @param attrs + * @param attrName + * @param defValue + * @return getInteger + */ + public static int getInteger(AttrSet attrs, String attrName, int defValue) { + Attr attr = attrNoSuchElement(attrs, attrName); + if (attr == null) { + return defValue; + } else { + return attr.getIntegerValue(); + } + } + + /** + * getDimensionPixelSize + * + * @param attrs + * @param attrName + * @param defValue + * @return int + */ + public static int getDimensionPixelSize(AttrSet attrs, String attrName, int defValue) { + Attr attr = attrNoSuchElement(attrs, attrName); + if (attr == null) { + return defValue; + } else { + return attr.getIntegerValue(); + } + } + + /** + * getLayoutDimension + * + * @param attrs + * @param attrName + * @param defValue + * @return int + */ + public static int getLayoutDimension(AttrSet attrs, String attrName, int defValue) { + Attr attr = attrNoSuchElement(attrs, attrName); + if (attr == null) { + return defValue; + } else { + HiLog.info(LOG_LABEL, "attr.getDimensionValue() = " + attr.getDimensionValue()); + return attr.getDimensionValue(); + } + } + + private static Attr attrNoSuchElement(AttrSet attrs, String attrName) { + Attr attr = null; + try { + attr = attrs.getAttr(attrName).get(); + } catch (NoSuchElementException e) { + HiLog.info(LOG_LABEL, "Exception = " + e.toString()); + } + return attr; + } +} diff --git a/ikvStockChart/src/main/res/drawable/text_tab.xml b/ikvStockChart/src/main/res/drawable/text_tab.xml deleted file mode 100644 index b2cc0f0..0000000 --- a/ikvStockChart/src/main/res/drawable/text_tab.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/ikvStockChart/src/main/res/layout/tab_stockindex.xml b/ikvStockChart/src/main/res/layout/tab_stockindex.xml deleted file mode 100644 index dc885c5..0000000 --- a/ikvStockChart/src/main/res/layout/tab_stockindex.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/ikvStockChart/src/main/res/values/attrs.xml b/ikvStockChart/src/main/res/values/attrs.xml deleted file mode 100644 index 01cfba1..0000000 --- a/ikvStockChart/src/main/res/values/attrs.xml +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ikvStockChart/src/main/res/values/dimens.xml b/ikvStockChart/src/main/res/values/dimens.xml deleted file mode 100644 index f60edfd..0000000 --- a/ikvStockChart/src/main/res/values/dimens.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - 100dp - - - 20dp - - - 15dp - - diff --git a/ikvStockChart/src/main/res/values/strings.xml b/ikvStockChart/src/main/res/values/strings.xml deleted file mode 100644 index c0699c9..0000000 --- a/ikvStockChart/src/main/res/values/strings.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - MA(5, 10, 20) - ●MA5 %1$.2f ●MA10 %2$.2f ●MA20 %3$.2f - - MACD(12, 26, 9) - MACD(12, 26, 9) ●DIFF %1$.2f ●DEA %2$.2f ●MACD %3$.2f - - RSI(6, 12, 24) - RSI(6, 12, 24) ●RSI1 %1$.2f ●RSI2 %2$.2f ●RSI3 %3$.2f - - KDJ(9, 3, 3) - KDJ(9, 3, 3) ●K %1$.2f ●D %2$.2f ●J %3$.2f - - BOLL(20, 2) - BOLL(20, 2) ●MID %1$.2f ●UPPER %2$.2f ●LOWER %3$.2f - - ●MA5 %1$.2f ●MA10 %2$.2f - - \ No newline at end of file diff --git a/ikvStockChart/src/main/res/values/styles.xml b/ikvStockChart/src/main/res/values/styles.xml deleted file mode 100644 index 8a47a4c..0000000 --- a/ikvStockChart/src/main/res/values/styles.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/ikvStockChart/src/main/resources/base/element/color.json b/ikvStockChart/src/main/resources/base/element/color.json new file mode 100644 index 0000000..5c0f2aa --- /dev/null +++ b/ikvStockChart/src/main/resources/base/element/color.json @@ -0,0 +1,190 @@ +{ + "color": [ + { + "name": "ic_advertise", + "value": "#FFFFFF" + }, + { + "name": "colorCg", + "value": "#d3d7d4" + }, + { + "name": "layer_grid_line", + "value": "#000000" + }, + { + "name": "app_mainclolr", + "value": "#FB6A8F" + },{ + "name": "app_qing2", + "value": "#31C453" + },{ + "name": "color_1", + "value": "#AAA3DB" + },{ + "name": "color_2", + "value": "#86ACE9" + },{ + "name": "color_4", + "value": "#80D8A3" + },{ + "name": "color_5", + "value": "#F1C672" + },{ + "name": "color_6", + "value": "#FDAD8B" + },{ + "name": "color_7", + "value": "#ADBEFF" + },{ + "name": "color_8", + "value": "#94D6FA" + },{ + "name": "color_9", + "value": "#C3B5F6" + },{ + "name": "color_10", + "value": "#99CCFF" + },{ + "name": "color_11", + "value": "#FBA6ED" + },{ + "name": "color_30", + "value": "#EE8262" + },{ + "name": "bg_color", + "value":"#F0F0F0" + },{ + "name": "color_31", + "value": "#EE6363" + },{ + "name": "color_32", + "value": "#EEB4B4" + },{ + "name": "color_33", + "value": "#D2B48C" + },{ + "name": "color_34", + "value": "#CD9B9B" + },{ + "name": "color_35", + "value": "#5F9EA0" + }, + { + "name": "app_course_chooseweek_bg", + "value": "#E2F7F6" + }, + { + "name": "app_white", + "value": "#ffffff" + }, + { + "name": "app_course_chooseweek_bg2", + "value": "#F1FFFE" + }, + { + "name":"test", + "value":"#3FCAB8" + }, + { + "name":"app_red", + "value":"#d81e06" + }, + { + "name":"color_3", + "value":"#92D261" + }, + { + "name":"app_white_slight", + "value":"#FBFBFB" + }, + { + "name":"app_course_textcolor_blue", + "value":"#13B0F1" + }, + { + "name":"app_gray", + "value":"#999999" + }, + { + "name":"app_gold", + "value":"#FF7A59" + }, + { + "name": "colorAccent", + "value": "#FF4081" + }, + { + "name": "colorPrimary", + "value": "#dc7e2c" + }, + { + "name": "colorSecondary", + "value": "#99000000" + }, + { + "name": "colorAppbarTitle", + "value": "#000000" + }, + { + "name": "colorAppbarBg", + "value": "#ffffff" + }, + { + "name": "colorAppbarSubBg", + "value": "#ffffff" + }, + { + "name": "textColorPrimary", + "value": "#E6000000" + }, + { + "name": "textColorSecondary", + "value": "#99000000" + }, + { + "name": "colorCardViewBg", + "value": "#ffffff" + }, + { + "name": "colorAppBackground", + "value": "#f1f3f5" + }, + { + "name": "colorSearchBarBackground", + "value": "#0C000000" + }, + { + "name": "colorListDivider", + "value": "#33000000" + }, + { + "name": "divider", + "value": "#dddddd" + }, + { + "name": "colorListHeadBackground", + "value": "#77787b" + }, + { + "name": "white", + "value": "#ffffff" + }, + { + "name": "colorPrimaryDark", + "value": "#1e82d2" + }, + { + "name": "black", + "value": "#000000" + }, + { + "name": "green", + "value": "#45b97c" + }, + { + "name": "brown", + "value": "#843900" + } + ] +} \ No newline at end of file diff --git a/ikvStockChart/src/main/resources/base/element/string.json b/ikvStockChart/src/main/resources/base/element/string.json new file mode 100644 index 0000000..600773d --- /dev/null +++ b/ikvStockChart/src/main/resources/base/element/string.json @@ -0,0 +1,48 @@ +{ + "string": [ + { + "name": "ma_normal", + "value": "MA(5, 10, 20)" + }, + { + "name": "ma_highlight", + "value": "●MA5 %1$.2f ●MA10 %2$.2f ●MA20 %3$.2f" + }, + { + "name": "macd_normal", + "value": "MACD(12, 26, 9)" + }, + { + "name": "macd_highlight", + "value": "MACD(12, 26, 9) ●DIFF %1$.2f ●DEA %2$.2f ●MACD %3$.2f" + }, + { + "name": "rsi_normal", + "value": "RSI(6, 12, 24)" + }, + { + "name": "rsi_highlight", + "value": "RSI(6, 12, 24) ●RSI1 %1$.2f ●RSI2 %2$.2f ●RSI3 %3$.2f" + }, + { + "name": "kdj_normal", + "value": "KDJ(9, 3, 3)" + }, + { + "name": "kdj_highlight", + "value": "KDJ(9, 3, 3) ●K %1$.2f ●D %2$.2f ●J %3$.2f" + }, + { + "name": "boll_normal", + "value": "BOLL(20, 2)" + }, + { + "name": "boll_highlight", + "value": "BOLL(20, 2) ●MID %1$.2f ●UPPER %2$.2f ●LOWER %3$.2f" + }, + { + "name": "volume_highlight", + "value": "●MA5 %1$.2f ●MA10 %2$.2f" + } + ] +} diff --git a/ikvStockChart/src/main/resources/base/graphic/but_background.xml b/ikvStockChart/src/main/resources/base/graphic/but_background.xml new file mode 100644 index 0000000..7494ae4 --- /dev/null +++ b/ikvStockChart/src/main/resources/base/graphic/but_background.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ikvStockChart/src/main/resources/base/layout/tab_stockindex.xml b/ikvStockChart/src/main/resources/base/layout/tab_stockindex.xml new file mode 100644 index 0000000..57f08ca --- /dev/null +++ b/ikvStockChart/src/main/resources/base/layout/tab_stockindex.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/ikvStockChart/src/test/java/com/wordplat/ikvstockchart/ExampleTest.java b/ikvStockChart/src/test/java/com/wordplat/ikvstockchart/ExampleTest.java new file mode 100644 index 0000000..77f3676 --- /dev/null +++ b/ikvStockChart/src/test/java/com/wordplat/ikvstockchart/ExampleTest.java @@ -0,0 +1,9 @@ +package com.wordplat.ikvstockchart; + +import org.junit.Test; + +public class ExampleTest { + @Test + public void onStart() { + } +} diff --git a/ikvStockChart/src/test/java/com/wordplat/ikvstockchart/ExampleUnitTest.java b/ikvStockChart/src/test/java/com/wordplat/ikvstockchart/ExampleUnitTest.java deleted file mode 100644 index e915aa8..0000000 --- a/ikvStockChart/src/test/java/com/wordplat/ikvstockchart/ExampleUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.wordplat.ikvstockchart; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see
Testing documentation - */ -public class ExampleUnitTest { - @Test - public void addition_isCorrect() throws Exception { - assertEquals(4, 2 + 2); - } -} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 413ff88..28a54c1 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', ':ikvStockChart' +include ':entry', ':ikvstockchart' -- Gitee From 63c67676fceea7fa1f7ac8d05d2e75badf569a17 Mon Sep 17 00:00:00 2001 From: HYL123698745 <1252347619@qq.com> Date: Sat, 15 May 2021 15:44:58 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=E3=80=90=E4=BF=AE=E6=94=B9=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E3=80=91=EF=BC=9A=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Screenshots/screenshots0.PNG | Bin 0 -> 82743 bytes Screenshots/screenshots1.PNG | Bin 0 -> 154016 bytes Screenshots/screenshots2.PNG | Bin 0 -> 189839 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Screenshots/screenshots0.PNG create mode 100644 Screenshots/screenshots1.PNG create mode 100644 Screenshots/screenshots2.PNG diff --git a/Screenshots/screenshots0.PNG b/Screenshots/screenshots0.PNG new file mode 100644 index 0000000000000000000000000000000000000000..7a001510e8b236b4b1b564b822fff7f261db3035 GIT binary patch literal 82743 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 )8@OZFasiFP6|toWEFSqXSHU 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

C<2zio$dJq^ZMoZ$~fY%w!sIH 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 E0Hl>=nE(I) literal 0 HcmV?d00001 diff --git a/Screenshots/screenshots1.PNG b/Screenshots/screenshots1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..61a75c1f533e5c0bcf517b1e7bf16c429764649d GIT binary patch literal 154016 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