From 3623b43797a7162c99b677ea4fb60187846d7b35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AD=8F=E5=B0=91=E9=98=B3?= <786612630@qq.com> Date: Fri, 24 Nov 2023 14:23:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=E7=89=88=E6=9C=AC=E6=98=9F?= =?UTF-8?q?=E9=94=81=201.0.0.02(preRelease-20231124)=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=B7=B2=E7=9F=A5bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 6148 -> 6148 bytes .idea/.gitignore | 3 + .idea/modules.xml | 8 + .idea/starLock.iml | 259 +++++++++++++++ .idea/vcs.xml | 6 + .../res/drawable-v21/launch_background.xml | 8 +- .../main/res/drawable/launch_background.xml | 6 +- .../main/icon_lockDetail_messageReminding.png | Bin 2495 -> 4884 bytes .../images/main/icon_lockDetail_videoLog.png | Bin 1429 -> 3600 bytes .../images/main/icon_lockElectricLevel_1.png | Bin 0 -> 859 bytes .../images/main/icon_lockElectricLevel_2.png | Bin 0 -> 907 bytes .../images/main/icon_lockElectricLevel_3.png | Bin 0 -> 940 bytes .../images/main/icon_lockElectricLevel_4.png | Bin 0 -> 930 bytes .../images/main/icon_lockElectricLevel_5.png | Bin 0 -> 826 bytes star_lock/ios/Podfile | 2 +- star_lock/ios/Podfile.lock | 214 +++++++++++++ .../ios/Runner.xcodeproj/project.pbxproj | 16 + star_lock/ios/Runner/AppDelegate.m | 10 +- .../AppIcon.appiconset/Contents.json | 2 +- .../Icon-App-1024x1024@1x.png | Bin 10932 -> 0 bytes .../AppIcon.appiconset/icon-1024.png | Bin 0 -> 50642 bytes .../ios/Runner/Assets.xcassets/Contents.json | 6 + .../LaunchImage.imageset/Contents.json | 7 +- .../LaunchImage.imageset/LaunchImage.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 68 -> 0 bytes .../Runner/Base.lproj/LaunchScreen.storyboard | 22 +- .../ios/Runner/Base.lproj/Main.storyboard | 2 +- star_lock/ios/Runner/lcokStarMain.png | Bin 0 -> 68271 bytes star_lock/lib/appRouters.dart | 18 +- star_lock/lib/blue/blue_manage.dart | 19 +- .../lib/blue/io_protocol/io_openLock.dart | 11 + .../io_protocol/io_senderCustomPasswords.dart | 2 +- star_lock/lib/blue/sender_manage.dart | 2 + .../authorizedAdminDetail_page.dart | 18 -- .../sendElectronicKeyManage_tabbar.dart | 2 +- .../automaticBlocking_logic.dart | 2 +- .../adminOpenLockPassword_logic.dart | 2 +- .../burglarAlarm/burglarAlarm_logic.dart | 2 +- .../{ => catEyeSet}/catEyeSet_logic.dart | 3 +- .../{ => catEyeSet}/catEyeSet_page.dart | 10 +- .../{ => catEyeSet}/catEyeSet_state.dart | 0 .../catEyeWorkMode/catEyeWorkMode_page.dart | 5 +- .../configuringWifi_logic.dart | 2 +- .../lcokSet/faceUnlock/faceUnlock_page.dart | 1 + .../lcokSet/lockSet/lockSet_logic.dart | 38 ++- .../lcokSet/lockSet/lockSet_page.dart | 30 ++ .../lcokSet/lockSet/lockSet_state.dart | 1 + .../lockSoundSet/lockSoundSet_logic.dart | 2 +- .../lcokSet/lockTime/lockTime_logic.dart | 124 ++++---- .../lcokSet/motorPower/motorPower_logic.dart | 2 +- .../coerceFingerprint_logic.dart | 0 .../coerceFingerprint_page.dart | 4 +- .../coerceFingerprint_state.dart | 0 .../coerceFingerprintList_logic.dart | 0 .../coerceFingerprintList_page.dart | 9 +- .../coerceFingerprintList_state.dart | 0 .../coerceOpenDoor/coerceOpenDoor_logic.dart | 3 +- .../coerceOpenDoor/coerceOpenDoor_page.dart | 9 +- .../coerceOpenDoor/coerceOpenDoor_state.dart | 0 .../lowBatteryReminder_logic.dart | 3 +- .../lowBatteryReminder_page.dart | 2 +- .../lowBatteryReminder_state.dart | 0 .../msgNotification_logic.dart | 3 +- .../msgNotification_page.dart | 98 +++--- .../msgNotification_state.dart | 0 .../nDaysUnopened/nDaysUnopened_logic.dart | 3 +- .../nDaysUnopened/nDaysUnopened_page.dart | 2 +- .../nDaysUnopened/nDaysUnopened_state.dart | 0 .../openDoorNotify/openDoorNotify_logic.dart | 3 +- .../openDoorNotify/openDoorNotify_page.dart | 9 +- .../openDoorNotify/openDoorNotify_state.dart | 0 .../normallyOpenMode_logic.dart | 2 +- .../openDoorDirection_logic.dart | 2 +- .../resetButton/resetButton_logic.dart | 2 +- .../lcokSet/uploadData/uploadData_page.dart | 2 +- .../lockDetail/lockDetail_logic.dart | 299 ++++++++---------- .../lockDetail/lockDetail_page.dart | 66 ++-- .../lockDetail/lockDetail_state.dart | 6 + .../lockDetail/lockNetToken_entity.dart | 43 +++ .../lockOperatingRecord_logic.dart | 2 + .../otherTypeKeyList_logic.dart | 2 +- .../passwordKeyManage_tabbar.dart | 4 +- .../videoLog/videoLog/videoLog_page.dart | 18 +- .../demoModeLockDetail_page.dart | 7 +- .../demoModeLockSet/demoModeLockSet_page.dart | 6 + .../main/lockMian/lockList/lockList_page.dart | 17 +- .../lockMian/lockMain/lockMain_logic.dart | 2 + star_lock/lib/mine/about/about_page.dart | 2 +- .../gaode/lockAddressGaoDe_page.dart | 176 ++++++----- .../mine/addLock/saveLock/saveLock_logic.dart | 2 + .../lib/mine/mine/starLockMine_page.dart | 15 +- .../lib/mine/mine/starLockMine_state.dart | 8 + .../mineMultiLanguage_page.dart | 2 - .../minePersonGetUploadFileInfo_entity.dart | 89 ++++++ .../minePersonInfo_logic.dart | 83 ++++- .../minePersonInfo_page.dart | 23 +- .../mine/mineSet/mineSet/mineSet_page.dart | 8 + star_lock/lib/network/api.dart | 4 +- star_lock/lib/network/api_provider.dart | 39 ++- star_lock/lib/network/api_provider_base.dart | 3 +- star_lock/lib/network/api_repository.dart | 39 ++- .../lib/network/request_interceptor.dart | 2 +- star_lock/lib/tools/commonItem.dart | 4 +- star_lock/lib/tools/eventBusEventManage.dart | 7 + star_lock/lib/tools/showTFView.dart | 18 -- 106 files changed, 1437 insertions(+), 582 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/modules.xml create mode 100644 .idea/starLock.iml create mode 100644 .idea/vcs.xml create mode 100644 star_lock/images/main/icon_lockElectricLevel_1.png create mode 100644 star_lock/images/main/icon_lockElectricLevel_2.png create mode 100644 star_lock/images/main/icon_lockElectricLevel_3.png create mode 100644 star_lock/images/main/icon_lockElectricLevel_4.png create mode 100644 star_lock/images/main/icon_lockElectricLevel_5.png create mode 100644 star_lock/ios/Podfile.lock delete mode 100644 star_lock/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 star_lock/ios/Runner/Assets.xcassets/AppIcon.appiconset/icon-1024.png create mode 100644 star_lock/ios/Runner/Assets.xcassets/Contents.json delete mode 100644 star_lock/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png delete mode 100644 star_lock/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png delete mode 100644 star_lock/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 star_lock/ios/Runner/lcokStarMain.png rename star_lock/lib/main/lockDetail/lcokSet/catEyeSet/{ => catEyeSet}/catEyeSet_logic.dart (65%) rename star_lock/lib/main/lockDetail/lcokSet/catEyeSet/{ => catEyeSet}/catEyeSet_page.dart (93%) rename star_lock/lib/main/lockDetail/lcokSet/catEyeSet/{ => catEyeSet}/catEyeSet_state.dart (100%) rename star_lock/lib/main/lockDetail/lcokSet/{ => catEyeSet}/catEyeWorkMode/catEyeWorkMode_page.dart (97%) rename star_lock/lib/main/lockDetail/lcokSet/{ => msgNotification/coerceOpenDoor}/coerceFingerprint/coerceFingerprint_logic.dart (100%) rename star_lock/lib/main/lockDetail/lcokSet/{ => msgNotification/coerceOpenDoor}/coerceFingerprint/coerceFingerprint_page.dart (96%) rename star_lock/lib/main/lockDetail/lcokSet/{ => msgNotification/coerceOpenDoor}/coerceFingerprint/coerceFingerprint_state.dart (100%) rename star_lock/lib/main/lockDetail/lcokSet/{ => msgNotification/coerceOpenDoor}/coerceFingerprintList/coerceFingerprintList_logic.dart (100%) rename star_lock/lib/main/lockDetail/lcokSet/{ => msgNotification/coerceOpenDoor}/coerceFingerprintList/coerceFingerprintList_page.dart (95%) rename star_lock/lib/main/lockDetail/lcokSet/{ => msgNotification/coerceOpenDoor}/coerceFingerprintList/coerceFingerprintList_state.dart (100%) rename star_lock/lib/main/lockDetail/lcokSet/{ => msgNotification/coerceOpenDoor}/coerceOpenDoor/coerceOpenDoor_logic.dart (65%) rename star_lock/lib/main/lockDetail/lcokSet/{ => msgNotification/coerceOpenDoor}/coerceOpenDoor/coerceOpenDoor_page.dart (95%) rename star_lock/lib/main/lockDetail/lcokSet/{ => msgNotification/coerceOpenDoor}/coerceOpenDoor/coerceOpenDoor_state.dart (100%) rename star_lock/lib/main/lockDetail/lcokSet/{ => msgNotification}/lowBatteryReminder/lowBatteryReminder_logic.dart (64%) rename star_lock/lib/main/lockDetail/lcokSet/{ => msgNotification}/lowBatteryReminder/lowBatteryReminder_page.dart (97%) rename star_lock/lib/main/lockDetail/lcokSet/{ => msgNotification}/lowBatteryReminder/lowBatteryReminder_state.dart (100%) rename star_lock/lib/main/lockDetail/lcokSet/msgNotification/{ => msgNotification}/msgNotification_logic.dart (65%) rename star_lock/lib/main/lockDetail/lcokSet/msgNotification/{ => msgNotification}/msgNotification_page.dart (76%) rename star_lock/lib/main/lockDetail/lcokSet/msgNotification/{ => msgNotification}/msgNotification_state.dart (100%) rename star_lock/lib/main/lockDetail/lcokSet/{ => msgNotification}/nDaysUnopened/nDaysUnopened_logic.dart (64%) rename star_lock/lib/main/lockDetail/lcokSet/{ => msgNotification}/nDaysUnopened/nDaysUnopened_page.dart (98%) rename star_lock/lib/main/lockDetail/lcokSet/{ => msgNotification}/nDaysUnopened/nDaysUnopened_state.dart (100%) rename star_lock/lib/main/lockDetail/lcokSet/{ => msgNotification}/openDoorNotify/openDoorNotify_logic.dart (65%) rename star_lock/lib/main/lockDetail/lcokSet/{ => msgNotification}/openDoorNotify/openDoorNotify_page.dart (95%) rename star_lock/lib/main/lockDetail/lcokSet/{ => msgNotification}/openDoorNotify/openDoorNotify_state.dart (100%) create mode 100644 star_lock/lib/main/lockDetail/lockDetail/lockNetToken_entity.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonGetUploadFileInfo_entity.dart diff --git a/.DS_Store b/.DS_Store index d50c782ed7c14c2da312ed138fbff798eeb628af..c3deee4d65995d7a811ee7e009b64bf0a6d3cf17 100644 GIT binary patch delta 47 zcmZoMXffEJ%fz^IvK~_*w`6s-p@D&cj)Ixt= diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..26d33521 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..3ce5b9d9 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/starLock.iml b/.idea/starLock.iml new file mode 100644 index 00000000..5164eec4 --- /dev/null +++ b/.idea/starLock.iml @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/star_lock/android/app/src/main/res/drawable-v21/launch_background.xml b/star_lock/android/app/src/main/res/drawable-v21/launch_background.xml index f74085f3..dd2edc21 100644 --- a/star_lock/android/app/src/main/res/drawable-v21/launch_background.xml +++ b/star_lock/android/app/src/main/res/drawable-v21/launch_background.xml @@ -1,12 +1,12 @@ - + - + android:src="@mipmap/ic_logo" /> + diff --git a/star_lock/android/app/src/main/res/drawable/launch_background.xml b/star_lock/android/app/src/main/res/drawable/launch_background.xml index 304732f8..dd2edc21 100644 --- a/star_lock/android/app/src/main/res/drawable/launch_background.xml +++ b/star_lock/android/app/src/main/res/drawable/launch_background.xml @@ -4,9 +4,9 @@ - + android:src="@mipmap/ic_logo" /> + diff --git a/star_lock/images/main/icon_lockDetail_messageReminding.png b/star_lock/images/main/icon_lockDetail_messageReminding.png index 3c819abd51535c017b840a5eb23767dac5e28484..8f170aa53a4957f83d8a546787c5e35afd56e57b 100644 GIT binary patch literal 4884 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 literal 0 HcmV?d00001 diff --git a/star_lock/images/main/icon_lockElectricLevel_2.png b/star_lock/images/main/icon_lockElectricLevel_2.png new file mode 100644 index 0000000000000000000000000000000000000000..e9eb3622377cd86c8c4f96c1700ba01f5a82c8b3 GIT binary patch literal 907 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 BU~K>Z literal 0 HcmV?d00001 diff --git a/star_lock/ios/Podfile b/star_lock/ios/Podfile index daacc084..573ef8f2 100644 --- a/star_lock/ios/Podfile +++ b/star_lock/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project - platform :ios, '11.0' +# platform :ios, '11.0' #use_modular_headers! use_frameworks! :linkage => :static # CocoaPods analytics sends network stats synchronously affecting flutter build latency. diff --git a/star_lock/ios/Podfile.lock b/star_lock/ios/Podfile.lock new file mode 100644 index 00000000..8df8d446 --- /dev/null +++ b/star_lock/ios/Podfile.lock @@ -0,0 +1,214 @@ +PODS: + - aj_captcha_flutter (0.0.1): + - Flutter + - AlicloudPush (1.9.9.8): + - AlicloudSender + - AlicloudUT + - AlicloudUtils + - AlicloudSender (1.0.0.3): + - AlicloudUTDID + - EMASRest + - AlicloudUT (5.2.0.16): + - AlicloudUTDID + - AlicloudUTDID (1.5.0.94) + - AlicloudUtils (1.4.1): + - AlicloudUTDID + - aliyun_push (0.0.1): + - AlicloudPush + - Flutter + - AMap3DMap (9.7.0): + - AMapFoundation (>= 1.8.0) + - amap_flutter_location (0.0.1): + - AMapLocation + - Flutter + - amap_flutter_map (0.0.1): + - AMap3DMap + - Flutter + - AMapFoundation (1.8.2) + - AMapLocation (2.10.0): + - AMapFoundation (>= 1.8.0) + - auto_orientation (0.0.1): + - Flutter + - camera_avfoundation (0.0.1): + - Flutter + - device_info_plus (0.0.1): + - Flutter + - EMASRest (11.1.1.2) + - Flutter (1.0.0) + - flutter_native_contact_picker (0.0.1): + - Flutter + - fluttertoast (0.0.2): + - Flutter + - Toast + - FMDB (2.7.5): + - FMDB/standard (= 2.7.5) + - FMDB/standard (2.7.5) + - google_maps_flutter_ios (0.0.1): + - Flutter + - GoogleMaps (< 8.0) + - GoogleMaps (5.2.0): + - GoogleMaps/Maps (= 5.2.0) + - GoogleMaps/Base (5.2.0) + - GoogleMaps/Maps (5.2.0): + - GoogleMaps/Base + - image_picker_ios (0.0.1): + - Flutter + - network_info_plus (0.0.1): + - Flutter + - package_info_plus (0.4.5): + - Flutter + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - permission_handler_apple (9.1.1): + - Flutter + - Protobuf (3.25.1) + - reactive_ble_mobile (0.0.1): + - Flutter + - Protobuf (~> 3.5) + - SwiftProtobuf (~> 1.0) + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS + - sqflite (0.0.3): + - Flutter + - FMDB (>= 2.7.5) + - SwiftProtobuf (1.25.1) + - Toast (4.0.0) + - url_launcher_ios (0.0.1): + - Flutter + - video_player_avfoundation (0.0.1): + - Flutter + - webview_flutter_wkwebview (0.0.1): + - Flutter + +DEPENDENCIES: + - aj_captcha_flutter (from `.symlinks/plugins/aj_captcha_flutter/ios`) + - AlicloudPush (~> 1.9.9) + - aliyun_push (from `.symlinks/plugins/aliyun_push/ios`) + - amap_flutter_location (from `.symlinks/plugins/amap_flutter_location/ios`) + - amap_flutter_map (from `.symlinks/plugins/amap_flutter_map/ios`) + - auto_orientation (from `.symlinks/plugins/auto_orientation/ios`) + - camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`) + - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) + - Flutter (from `Flutter`) + - flutter_native_contact_picker (from `.symlinks/plugins/flutter_native_contact_picker/ios`) + - fluttertoast (from `.symlinks/plugins/fluttertoast/ios`) + - google_maps_flutter_ios (from `.symlinks/plugins/google_maps_flutter_ios/ios`) + - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) + - network_info_plus (from `.symlinks/plugins/network_info_plus/ios`) + - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) + - reactive_ble_mobile (from `.symlinks/plugins/reactive_ble_mobile/ios`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) + - sqflite (from `.symlinks/plugins/sqflite/ios`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + - video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/ios`) + - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`) + +SPEC REPOS: + https://github.com/aliyun/aliyun-specs.git: + - AlicloudPush + - AlicloudSender + - AlicloudUT + - AlicloudUTDID + - AlicloudUtils + - EMASRest + https://github.com/CocoaPods/Specs.git: + - AMap3DMap + - AMapFoundation + - AMapLocation + - FMDB + - GoogleMaps + - Protobuf + - SwiftProtobuf + - Toast + +EXTERNAL SOURCES: + aj_captcha_flutter: + :path: ".symlinks/plugins/aj_captcha_flutter/ios" + aliyun_push: + :path: ".symlinks/plugins/aliyun_push/ios" + amap_flutter_location: + :path: ".symlinks/plugins/amap_flutter_location/ios" + amap_flutter_map: + :path: ".symlinks/plugins/amap_flutter_map/ios" + auto_orientation: + :path: ".symlinks/plugins/auto_orientation/ios" + camera_avfoundation: + :path: ".symlinks/plugins/camera_avfoundation/ios" + device_info_plus: + :path: ".symlinks/plugins/device_info_plus/ios" + Flutter: + :path: Flutter + flutter_native_contact_picker: + :path: ".symlinks/plugins/flutter_native_contact_picker/ios" + fluttertoast: + :path: ".symlinks/plugins/fluttertoast/ios" + google_maps_flutter_ios: + :path: ".symlinks/plugins/google_maps_flutter_ios/ios" + image_picker_ios: + :path: ".symlinks/plugins/image_picker_ios/ios" + network_info_plus: + :path: ".symlinks/plugins/network_info_plus/ios" + package_info_plus: + :path: ".symlinks/plugins/package_info_plus/ios" + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/darwin" + permission_handler_apple: + :path: ".symlinks/plugins/permission_handler_apple/ios" + reactive_ble_mobile: + :path: ".symlinks/plugins/reactive_ble_mobile/ios" + shared_preferences_foundation: + :path: ".symlinks/plugins/shared_preferences_foundation/darwin" + sqflite: + :path: ".symlinks/plugins/sqflite/ios" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + video_player_avfoundation: + :path: ".symlinks/plugins/video_player_avfoundation/ios" + webview_flutter_wkwebview: + :path: ".symlinks/plugins/webview_flutter_wkwebview/ios" + +SPEC CHECKSUMS: + aj_captcha_flutter: dd7af1aa064bdd621ae335b819bab07309c3c023 + AlicloudPush: 88529c9b796e4ece0601de0867b30359f55b61f7 + AlicloudSender: 1f468b6bd962a099ffc19d45e3608b0fe98f259d + AlicloudUT: 6d1cf30d57d096b7e9bb4b069dd0ba6ad59a3338 + AlicloudUTDID: 7323c443dcdf9a73e2224dc6ce51703671d7a765 + AlicloudUtils: 873a76615bebcee8b1996f20820d366e433c3eab + aliyun_push: e92c2a8ca91b134bfabf7631816cce5f36e04a44 + AMap3DMap: dce25dd3e51e6b92109caa7d0c97fc6055830fb3 + amap_flutter_location: 44ff5beb64f42e0bf5feb402fe299dac0013af6f + amap_flutter_map: 979e54d227cedac6c7504a2151bfbf3bcf96760a + AMapFoundation: 9885c48fc3a78fdfb84a0299a2293e56ea3c9fec + AMapLocation: 5248aec2455ebb5d104b367813c946430a2ee033 + auto_orientation: 102ed811a5938d52c86520ddd7ecd3a126b5d39d + camera_avfoundation: 3125e8cd1a4387f6f31c6c63abb8a55892a9eeeb + device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed + EMASRest: 8df6f87836767a9415ad5cc4af739bc9d215b475 + Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + flutter_native_contact_picker: bd430ba0fbf82768bb50c2c52a69a65759a8f907 + fluttertoast: 31b00dabfa7fb7bacd9e7dbee580d7a2ff4bf265 + FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a + google_maps_flutter_ios: abdac20d6ce8931f6ebc5f46616df241bfaa2cfd + GoogleMaps: 025272d5876d3b32604e5c080dc25eaf68764693 + image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5 + network_info_plus: 122280582fe2fa2bbb8681a4269745cd5c3a9b32 + package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e + path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6 + Protobuf: d94761c33f1239c0a43a0817ca1a5f7f7c900241 + reactive_ble_mobile: 9ce6723d37ccf701dbffd202d487f23f5de03b4c + shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 + sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a + SwiftProtobuf: 69f02cd54fb03201c5e6bf8b76f687c5ef7541a3 + Toast: 91b396c56ee72a5790816f40d3a94dd357abc196 + url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4 + video_player_avfoundation: 81e49bb3d9fb63dccf9fa0f6d877dc3ddbeac126 + webview_flutter_wkwebview: 2e2d318f21a5e036e2c3f26171342e95908bd60a + +PODFILE CHECKSUM: adf6d8caf5faa9ea4ee2a2ea37f5aea37a6520d7 + +COCOAPODS: 1.14.3 diff --git a/star_lock/ios/Runner.xcodeproj/project.pbxproj b/star_lock/ios/Runner.xcodeproj/project.pbxproj index 8d5130c6..ce180cb5 100644 --- a/star_lock/ios/Runner.xcodeproj/project.pbxproj +++ b/star_lock/ios/Runner.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3364C3F42B0C902100AA5ABC /* lcokStarMain.png in Resources */ = {isa = PBXBuildFile; fileRef = 3364C3F32B0C902100AA5ABC /* lcokStarMain.png */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3EF1E85D6F1EE0C0DCF8449F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09D8B2FA2B26BA5BFF31AB2A /* Pods_Runner.framework */; }; 8297E4102AE75AC500E886FA /* XSFlutterManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E40E2AE75AC500E886FA /* XSFlutterManager.m */; }; @@ -143,6 +144,7 @@ 09D8B2FA2B26BA5BFF31AB2A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3364C3F32B0C902100AA5ABC /* lcokStarMain.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = lcokStarMain.png; sourceTree = ""; }; 33BF41252A96174D009D92E2 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; @@ -604,6 +606,7 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + 3364C3F32B0C902100AA5ABC /* lcokStarMain.png */, 82C026552AEB6C050011FE6A /* img */, 82C026532AE8AC6D0011FE6A /* AliyunEmasServices-Info.plist */, 8297E4992AE7974700E886FA /* AppDelegate.h */, @@ -733,6 +736,7 @@ 82C026D72AEB6C050011FE6A /* mic.png in Resources */, 82C026C32AEB6C050011FE6A /* call_menu_on.png in Resources */, 82C026B02AEB6C050011FE6A /* call_call_on.png in Resources */, + 3364C3F42B0C902100AA5ABC /* lcokStarMain.png in Resources */, 82C026C82AEB6C050011FE6A /* hf.png in Resources */, 82C026BE2AEB6C050011FE6A /* vcontacts2.png in Resources */, 82C026AC2AEB6C050011FE6A /* spk.png in Resources */, @@ -1102,8 +1106,12 @@ PRODUCT_BUNDLE_IDENTIFIER = "cn.star-lock.starLock"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; VERSIONING_SYSTEM = "apple-generic"; }; name = Profile; @@ -1347,9 +1355,13 @@ PRODUCT_BUNDLE_IDENTIFIER = "cn.star-lock.starLock"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; @@ -1486,8 +1498,12 @@ PRODUCT_BUNDLE_IDENTIFIER = "cn.star-lock.starLock"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; diff --git a/star_lock/ios/Runner/AppDelegate.m b/star_lock/ios/Runner/AppDelegate.m index ccb74648..a78a580a 100644 --- a/star_lock/ios/Runner/AppDelegate.m +++ b/star_lock/ios/Runner/AppDelegate.m @@ -37,12 +37,12 @@ [self.window makeKeyAndVisible]; //关闭可视对讲功能 需打开时再解注释 - [self initSound]; - _udp = [[UdpHelper alloc] init]; - [_udp Open]; - _talk = [[talk_Class alloc] init]; + //[self initSound]; + //_udp = [[UdpHelper alloc] init]; + //[_udp Open]; + //_talk = [[talk_Class alloc] init]; - sysinfo.launchtime = [Sformat timestamp]; + //sysinfo.launchtime = [Sformat timestamp]; return YES; diff --git a/star_lock/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/star_lock/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index 77cf5ba4..1d563436 100644 --- a/star_lock/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/star_lock/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -108,7 +108,7 @@ "size" : "83.5x83.5" }, { - "filename" : "Icon-App-1024x1024@1x.png", + "filename" : "icon-1024.png", "idiom" : "ios-marketing", "scale" : "1x", "size" : "1024x1024" diff --git a/star_lock/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/star_lock/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index dc9ada4725e9b0ddb1deab583e5b5102493aa332..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10932 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 K{kcfZR6 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 LgDb_C?mqr6xeZhp literal 0 HcmV?d00001 diff --git a/star_lock/ios/Runner/Assets.xcassets/Contents.json b/star_lock/ios/Runner/Assets.xcassets/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/star_lock/ios/Runner/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/star_lock/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/star_lock/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json index 0bedcf2f..a19a5492 100644 --- a/star_lock/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +++ b/star_lock/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -2,22 +2,19 @@ "images" : [ { "idiom" : "universal", - "filename" : "LaunchImage.png", "scale" : "1x" }, { "idiom" : "universal", - "filename" : "LaunchImage@2x.png", "scale" : "2x" }, { "idiom" : "universal", - "filename" : "LaunchImage@3x.png", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } } diff --git a/star_lock/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/star_lock/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/star_lock/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/star_lock/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/star_lock/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/star_lock/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/star_lock/ios/Runner/Base.lproj/LaunchScreen.storyboard b/star_lock/ios/Runner/Base.lproj/LaunchScreen.storyboard index f2e259c7..ceaf4276 100644 --- a/star_lock/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ b/star_lock/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -1,8 +1,10 @@ - - + + + - + + @@ -14,24 +16,28 @@ + - + + - - + + + + - + - + diff --git a/star_lock/ios/Runner/Base.lproj/Main.storyboard b/star_lock/ios/Runner/Base.lproj/Main.storyboard index 69ea5b4d..1fb38200 100644 --- a/star_lock/ios/Runner/Base.lproj/Main.storyboard +++ b/star_lock/ios/Runner/Base.lproj/Main.storyboard @@ -3,7 +3,7 @@ - + diff --git a/star_lock/ios/Runner/lcokStarMain.png b/star_lock/ios/Runner/lcokStarMain.png new file mode 100644 index 0000000000000000000000000000000000000000..1507862769e434343e86d124c072c475545ac5c5 GIT binary patch literal 68271 zcmeFa`#;n1_W+I*UEGo=*C;A7w+M476}c7_C6^Gn-><{yCds9g`!%<&RPJU*E~{LI z$uOH-XV?}S!_2;~>HT@Xzu*7h`$KwoY+je=^W4vQp65Bw60ces^X)sjkAs7Q?~2Jq zYYq-BG6%;VJKjCOl^<=!Uw{wJU~A(G9F=_%MBtA{_w25?TUc ze@}Cfi+26r_dRy(*QR5l7J!ev0VcPCIXLzUvwt}`a`ME0(QbKOw+peeFxPSQ_f@{@ z=I?S(Il?!9{T2r}LI?QjdoSd!OoXqGU$9Pup6t#OI>2}KWst1Q&Lbh-da`yFS7nU+ zgYL;_Dyt}~$m;Ktk&yuhxw-3DU%dRE*MYzEWbcQB1n7W3;o;%R;p)o%K^`DgZEbCk ziW*2w?F{h5nczsjkh>9Q{DS5F4)TBFT)Y?T8sr%e;_2@v!yfmpi+^Z{o~$f;qW}K< zg)_v{{eLt01^)*v06`G@4oFp51@zysfmgxot2$Oep7(&6+2iZ0f_I+$|6KdeJYW!e z^8Xhwe=*&;3ZSaL4-EP*+4T1vah&Ag;4tL4a`F822+k#(XZQ(Zq{6zPh?mnX-K5U^ zgI8X>IeF`)?~kw844=ZVddOUZ(;82f`ow)aN;HdHhpW5U?cP0h@)_gyrQsHecvz2c z3wDXg){%-o&h)3^Od>1dTB_m%daq|kw7{+mMa&hy1ydTe}xH&H& z!T#evSCiv@lSSiqZnLkno)#1ww{5!=^z^?^aC3(vcKz?KoAGhKTlOixG&=sDQ3YjW z8W@uQH;16i=Y8DV^cw*$BxL_LO&gB#-zhlaZvbypJxH1n-1}e9c*(Im{|6EPC>Lj2 zjL4ni2_}C52OcvFpzHp3LPKW}US9Ht-?G{l|Az^a7Z{-bjEcTKo;h8EiHV6p$FA-A z3&ZDVt_O^jTOTeu|JvVkcwzVE4X9`SUz%`n8r{3OgYeBJLw;KIs{9B~QD5 z%kT=$A6AJjw{Q2}p=`g<9}aoMUVtSg@#H_`W0s052enVKZ`rwX>XEw-R06^@%Y{4E z676lj!_D|w_E5=-^Gdwnm#tp&1De~+7s_9f**H4$@zOe3VkuSe)PQ~5yh<-xO}DH% zyw;1pT+D3u+j&9~pwZ&`lx`?j_leKfC!OM)Diz=I?+}6;!05!C-AKbY!`t^8MDffO z_JplbLMmM`@H?J_E6$JiD`~_LS`q#Ih;LUUq;?3AC0~S$Ihr61Kzxd8|K92Sd@RM; zJV~CvH_ZS}-O<6z85TWjy>J1de-%!-p`7`KE$*Mq0e+~RR|IIg#eMkb7>wQ`#+b(! zVs>=F`2-+=ij$|$?cw4+>|jV?yh$HB#vb$fVZm`lCyv>@f>{Uco)xT=jSz-}AeVLo zIm5~@z)9cxHLqZnk@KltYu02)ip|R59Z>A91L$4TCOzkff6S|7{Mj+(=zi^R>|dI0 z?BgXbwIThixjWK85$Sed|G(}6RNPIQK_;r4F=B&{z~DF+$*I6I&R+o6ClD@Zdy~- z$HmF}Yzh8736P{cxd!0mUhbP00vz`uKXccFU11~VeI3B9M0D6w$nFOh7uB>yCncFZ z*vF5MQA1~IfQiQ+i*gTF7<#_# zBbn9TB7XHIMc-_ypO#|__v5|uflgVupLjn)IPZqzSo=73bm!jT{^^#U-#>-yu5f*$ zn>HOydAx&t&l#Bp6lvPw@91nu6fXd{31zmO7qpAzgp<&{k>>P2!fc{{1Or@~br3eb z==@{%qoETDH+LA#tJDNwH(wg|KLh5x3^1!xtJat+N%r$~_>@`g#3gOwPu;sV8(b%? z*lz^`Ob%X&NH>&>FWZ*}+}ANpatb{rka>Hn6TsQVoV_CcHBjw&M>!&*?eRKuDlyr)&X!**Wp=Jk~ZL!UG zQ*vyF{ob|!a*r`#K0ZDoQng0PB6c4?!|fQS^kPXnc8MdtQ$%oF6cc=F&3%dbRYmc_ zUlaxHt^v~UtVx2ZE7lehYx&{bFYDE3pkJ}J>Au7-YKkK00`}Y)X29^uo}s)-hK5h? zaO7C91u3reC@>~w{&DDSZ)2GR`eW|($3E3zLwS35B-suEj64P_@4GLuug7EE=1QFC znC&De-bj82VgW$NrMYH&xfCr7Pda(pb}awZl3Cz-Ci0dDSJLULgN&B9j{#-c8SkyU zOoMHSZB}c^e%?Q+e)k3bs&FmaiOia6_nif)6b6#3kMaJg{$aPn3+~|*L)MtKh{uJv zxMj+Jd{gU~2p}%#2dL8`-TCkWdn#CHk<97hcn z@G51;1vIYLjJ{f&f{n?sUsB2k<_@V_Gk3nWo4dDj`q0SEgKW$VJTVm4 zK_Zc&uHlPb(w}fmI-UwIhb22?et@s*_;d@pY?6)`pX46_BVVTTg&uTKGn`ktex z@g-+RF5KPg0$UH=aQXr*-h6*4?Ep}Ep~*2NqxB<~uZaVNvn4c3tP+v5!^Dq!0YY2c zxvX&Bd7JA*asAEjAnmS=!p4lhLx%z$=>ua^JBrKfw2UF>R8>CPlXAq%a-z>44)iqt zk0i(#7Nx}fc0@Yd*x}v|YcFv-msDO+6U!=tK&lLPK1^-OJKT`lKQvaEPf2QD{Dfnj!{+R+G z&-l+2{4)jrOu;`>@Xr+d+d=rZtHR!k`nN#%7Zv>5Oa#>6U)u1WDfnj!{+WV*rr=*x zuv2yOFIVs{SMVi{wo{4%>J;^E zeFO>~TNi}Bx4V%AlFP&O5qYsR{HO+4<<%bJ%Y&od;e!HD=;{2%AYH!Hl(SkND+{WF zO4;^I#l|q8@YIwCdsemh_^eBFL$g>SiI;4kA6dJX7ERrev$qtMYrIl6?C;B{0=+RW2U2EI(( zpuvPi(fuY{5=rYVebB%>eSkhUflAfd%)WSGna||iE;(7zMhl7iwQ_&Q%0}U|I(yW# z`w0PfZkiZlI~N5ice;dPbc)lh3kbL+wZ&~M9yW>DRpMo$eRqKxN@wte_0bREXhua< zg+L$9oKEH|-I87f&%rGy8?*1c>4S`lN@VW`47wNg@UKApugsHsxZaR|CQ?3oLK5+6 z8>8!iHUUSxtJYvHrB_WC4ArPNjaWIhq;Dg070|>F;W_k`wZrVfOuPSpw_ZK) zLR+%Bb4J`68oB9pR9wP}CZq()x+X{u>Q>*D0TyqeY(Mf{{;ZWCqpSjLCMBD#qhxi7THZFcKPO5-Cd)c4=ixKbP|5O z_X`PS(2};j+FniUf)~4IKIy6X+QKH_EKr)N$U3Th0T|PK-;7|a&IJZmp{g{s5BD_J zf@kXT&_G}B+jRI+;|<2I(HhW`uIF6=Ia^oD1uUJePzsuI{5q1~zaX4pi`HjTcH2%+ zv4lK;;n&uHp3VXzy7)kFtl|ZR3HVrT_NBRE@U*AKH^{{I0G(K(`{o9Z2ReK0@~;HH z51czx`Co$uM|>pj^UemE_kh_pY+4j;CD)Kj;5j`Ti6wmT^;6TtXKuRM^}ddHwqO8< z=tv?0_=!m#4Zu?O~2%rHq`c z)q^37!j-THb9(YS5;-`x<@<*CV1Ga~M}u}+EM&_x3KT`bGV9O8>=ZP=KGly<6X?Fi z?wV=rdrKEv8v;y)iK~#VO@i*FB|6{UwDVq0OgSUOuT0gl4 ziW#nHi=&?ks$vt0YxkI6j!49P{zL#g?yrUgjmr!9ZM;huG|E*6X{JSW+)v>Y6g)M^Ck#A_UN;ITnpw`G#(WEN;)}aEj7736*O*c5J?Epfim&e z3Cw1C=}r%dQUy?>oj2wMU|VD;!?QH59y_~c7)6=+MN5@-Fo{_%Dtjqz?V*_YkTutE zZ8ZpdX|)iqEv)q(Zyrt-Fs5vmL?6%kl(V`6mKY$aE+@y>4Ko=gzsaouU?R=SoHOzS zt}#@LuT%J{F7^9NTt1>);4x9+GE5ojpIH|ZjZz=bm>xwAI)md^$A9Ijy3JW{g3A*n zk_Gnt)x&IH*q_bHDbG0KLzVl(qMeeZmJ3_Lb>Jd;yJbZGi7C+&AS7u1_T%W4Of9wfgWTh?HCIeU7l)CnXp? z%8#7}2Ss*k(9b5RlqYOMVOX%e{7@Y;h=>l*pYxIS>1whHtpgpuS&yxm2+rPW0`Xl+ znGg{O29!5!^9Rgh@bO}JuIu*~6Mx4t2CSYo=GzOlQ?vdZ3m%~5r)Q#32HF#}W-AI8 zMdTf9*T#(B+^VcVCNZ@aI81Mqq_}a5V1Q=U^!d`dADtxd;xNX?5%mRIrxb|Oi-=g#8y<5 z>8WC(sE>v!!_1b|Fj9%{k6Br6?D28ISToGRgTz)cwAJ=q7IW*vV4BBH>+(fUpN!} zSe!oiJHR6&o2(aQ!A@?50*awSet!_azoIoUNef-&a)&|WrIb7@>9wQsB(&GGyEYjY z6XNv00N+;VKgRLixjYy?q~vG1i)OAs-yJK&HqE6e%%f=36NAT|W*bkSV-B#Me;e4i zqxN3(fHXH$L1wGR86u%9PWrXMi&suu; zz-L<4N7x;I@fSGT;DYACYxUtv3_c<-p`1-G zw#C2j`*P2(?XCm@T36_m&A3ccmX*mFBQiH_>-^L(E}qt<;NhB)-R*g9F0y_{Jsbeg zDiI5S&kBxTo#9L5p2kk|Ek^ZSi^t!#X~j48|~S$%UA z%NoC+to1uhvHmBYkPb=z`XhBVWtiC(&*L!%L zOcrt49u=?0p%GzyAOkcjhwhRPAOG>s$9yNg zo+3Tpz|{MUjdalJ9EtRSa~UmS-q5Y7PqgVQEVJhq>{J!x)wH7Co}Er6XHy_}`ugV? zAW_|?Rlqvz_$U*8c|{VuPXULwu#UgrQ$Hc>L3`wPt#9MHX1i7uS4D zZ+RqzHq(+%{9ZuHkNll0S%;mY_!dT|#?&+N&!zB*Zw{6%hNA^03^MhT3+Up@ld=Mo zFKi~XuCOJ|zY=JOUA$A&3)hn4W_gdNZ89Q$58x-iXn-fcdBODOCs@cW$7sQGH6Hex zsEKGzW<3R-wLMc-;_2f`Ycg(=%Iz63qDWIiUTs_+EzZK~NiSkm9cJ%CxZqk}cB0D+ z6Tr^M+QESSlGZz1k>7tb0-+?z0E{_sX|$=>nb$P+_qeo?o2KvROUI~ar%iIVRVf7? zq!h#GHXgKLgq8NHy20^Dhq zZZ(K)cq1AN`Qf7e;}+5djYp}aPFL#va7h7Rsa+01PCt7d;a-;p$Mu=0Tk?pLd<3Q8ARV zdYA7%QY||omL~@^@b$-Z8a>wP2m$$sAdSNHoMANnR;F>4fATFiN4*-wnCZqC;^PvC zHLI%+Iu?E@4oYfd5Az=9$mA$V5cU>4LPQRXo$jjBSjpbL6S(6~ZmS zJevVE`VA1sW}9tFIU!X)qt3T)dQ_J};6V5jhH1$JfeH#Z{G{*L&=JYeNUhB5sI#eW zdYyJZnUWv#Ru%388NjmiwZr9-J9vb4;$WpzKvltg@7bP7s3BxAcJl|M0-!=|jdoN& zvV6}g(fzZ>)Z~N)Q@i-yLN~^~(1zk2diBSO|7;{AzaS%oikT3Q)D`g(k62f?)vefD zZvJ6d2~U0ei>$g81?fC9#KzJEb%B`JdZzQBC((&5Zg%?s(x19cN(Ycv=MK8sB38^~ zR%3GRsu5iMXkbJ4%?PRlRG}p&B)@*)Hl~9_4m|}A3b5VWq%zR^Qz=(qQ^jVDq4Ysf ztVGJjxKp&3|E6CJw%*n3Xwovd*IYH2tV=nCS*Xn9p>;$ryOt0|34WS3MzPV8mz%`3 z+U9Qlm4Mp-7@jdCwgB!#2krCsSj(`A>8?J8rxC3VIlop;hrK$PFk`Wdx=JgDEs!6&3e{DO`rvc<+0sW3H$ZZCf>|XXj#5&&$>#qT?iIegNFN4IMP+FrH2N4H z|MRe}4;{&G@^dd?9al|8eXSrqXks$zS~GK@#@o*X*L;dJ4ws8rY-}egT1lALZxRY{ z^e-gr8`2Bf&o8??!BKNsdi^bnV(vq^?+a7qE~UnJ$mgot`c*)akEvHEPna6XeNm%) z+i_E7K$j)x$R|kvlp?tR(36*2+thB=nwg-c2xjb~aS3?ttzQ+wp+U>EQ1#fK7G1JK zl&9K5tZBgZbR*X)n1Q<%x+K;Kc6Bs=b7MN$d?I=>U=y#-Ku7clraxR8w_nBI%|%fJ z4pg9A{pjFfX0@1_aBA8DJiZo?3z^R+xq`z7luY;P0)4Hmn}@#V&uL3KJ>yYgQn3|- zKnzon55&Fm{!Rgu5GXfoKuk7R$eNW1@=e%l`kFxhY!!>W4+gvD+VVg(EY5ex_ZCp*3+z>7dm}+^xbJz4hDLR3(b%awn5~M zAKw+jBwyWJno6b(i`oumd(&MkxakpT*DAuJWVibyq|nE=C6H8G@fWU15!o1tWbIL> z$RMYvGjkqLCBP9Krrrw5u9$Kk#uVtMIVQi83%^{&yzU46j2{xre&>20Gm8+LVe)l= zY5rXaapA6F{qMwdf}w9W?9>X|2iOrS_dXzKxS-Mt1Y}ob1Gc{P()^_htO%93D@I1` zy(*b6N!U8=n*^eCg6q@n`U35=?WNZWgDnpB3Ird2Z11XG0tu`)qn@x<%97A}FNLeu z)4w>A?XrUJ&e&>`LvBop{n3wto`c7%+}@m!&bPvl4`}MI%E#5;>>fz%yJPoQ+ zZ)>#6gSWz-+pxN-6I`JAtVbxVFhWq|4}p7|>6t0znQt&LDtSzTfRCC^d;G+}O3QnG*jWWPiXlpQ=f^8+f&FX0cUjdL;A#*-ldlw)eP zTV;8*ZArb}lUL^UV~6xopJFf0^L~fP)<6xUN@=qSQf3U`uECMeW8K3MO$#r?(zm0) z*H&SHB@0jF8^ZUrnfF;~pDD3o+`au{Zu(Lwy)C{tMAq+W47H<^cBw}#o$zcY5^J5> zr?iCFOoAL(yA1fLvvU0*dC1Z6lu0=QD8(m=N>%LT%WF>+bfZ33bzKgPK-JM6+7_Ci zB=NWdk&%aLB$p5U^6yN3Kfzd;)Hq~g2I`o)cv@T2NB8tX!5F(gb! zQ-q!Mvnt;}Iii^{z1+X6nH0Gv)7U}NZ^;bQbv4@{dfO!Gn4cX^;=DeF_{u+3QM$Y5 zUe|JGAmQxBF)KOM-dTf!h8+Ae0mV#zyp>$!x4$_PC7{{3<^HR%ivaR@?MSo&p{k;= zIb7bMF;XizIi*wmGGzDf1n=6wSdDEnW zMGrt&^-fTo^33t<%WooQHh!cE~uxc{uv%QoRoxxbbez&?4foyze@qh=aq##g2(gi#tPQf2y+l@ zlAiCqEtP`0j&U-o%?cQQDdE>v%Fxb1t>sBM0iFfNv9yU>g$6;-DkW4%zk!AMnSl&y4dC13@gXx`e1&!GxBMex*9lS+>2q0a)bkFn~14uhSyay1)NnPOUVHuS})BUJBuynkB z8)?{x`F=7l$p`>7WiryvjQA2Vq;?%SS?7yaIWv_>wgDUi5X|WU z(aTt4M&Bcj_H+~~y8(TJD;O}KP$z5lcC`sdDk1`;?pMaZW`iS@3QWKR{p zLoqHBDKt^li*xT{U{lF;OtpeM>zx=tb~iZA^OECXo=d=4D1zt0nSPrj57EI2!22X) zcb!6YeeFMCg*bOq9C5T77ESMzBmNMRtv+Mm<2ebtGhaNC!gig&(Ku3ck*K>8hvR1t ze>c*-?6OUsT>sf^jpuC~Cuky~RGD}4LbexD9Vw0FDn1`wOnN*Bex=fINL}`aXxHOQ zTigSWl^U(|P#1y?7Gf7S9xfk8D-2dfs8~BjIV6DjV>K4SD{l~vSy{NUKAwu-f@D-d zTad?4uPOc@?}ZheBV79r0%G6cF306tW#I2oH7!`y<$G?;r zknk${wBS?6oKT@52}#fU-PrlQc_8V7&z-j>@kV$Qp4>(4JQin z7&F`X%aGAR7cZ9Goy99MAl{EgfH#$N45=_L$}}Vo=tj=o+^h(QXDC8gJTb)o0g+ zH4hxezpCpLe9g$!Drb3j&xxH*_Xs57&)XJ{xM>u~M-hkNw9DXQt8^dcEi`6SBLke&bAJdr*-CcrTdNQtdtHdAipzM2Oql#en+)3FUmm*>=dFqN@LT9^>vlF3>fquD}WS!toi#6meaqLXF9;$3nOkV$LXx*ui z@aprJSozezg2f!`{HP5U#jopZG;tY6^hYe4kJSg8c~E-4gs1cXnfi}bfZ)eChI?25 z*~oYY?4Y+5#j466Mh168%rcyOp!|zvMpnV=C_kL*>`WagiL4194n?p|RzXONw$R3k zD6oFkbL6=x3L;tqNCOyoE-JZpQwL^_j3F9A6q!_tRYmo3f7vo`UrByEa=*^VR#AC8 zpE$a{Krd~3>jQFdJKsJx*HwDtR^Pk8b<9-MRyV@~jr6FhSQe{PKe|{hyY!HtB@!Y% zGQD+k#=%k~>r1cCsyoiPYpu+n@23A;Y*cNMW^h4wPs~gqgj9iPa>OdT;f7kKQw@mO zVwmk!4}mh#!l#W}3I%zvH2ByPj`-RWz?oj37KuK*N_H~ggMQ?Rw3H=W!S*_kK-!Pt zL4*7qOzcaH*V{b#v1tR6gQl2J>4lP|3S?cc%8M`-Jmmw`F}4CqEvLC1u-cdg859&4 zd<}Pz2!vU{Qo;N&ACHu;#2!f9pa5$W>>D}^H0MCMj$+jz2mG+!xS{Q?Dc9Du^|a67 zs5ROuL7=Q^R)A0YOYhh5WN~MM#9KbG616B?L#F0xawmADG4M`NGYw4Wv(JZOr@IY8 zrCqV^8KIG@)+E>|cfn24B|V;9NB9k%j>bL>^$$4CRQ9_ZL#1|m{vkV$ z7ma0W1|L)MwPK}+9i~3al(KTtt^<*tYGbL_U%@k8toNr$|Dl0^bO^AmoS5x)`7n6Z zt%_-H>m)OQ=#TbELi}DzL^N;x{$SPRgy7di8x9-j7z1lyQz78EBJ0XW(=wkgaIfSI zAg55Ys;&qMBH0m%@MUh}Aq)+DDsUQzeZAk;!n|VVHwnY}#Wa6Pz6C-*P}^5r+_xZS zY&ERer#|{K{yJ>Sk^g>-r^;od^e9Z1Icr;J>J$}C=|SyBYc^`BC7B|sk@G8ZrAv-p7E66-MQejQM`X1`xe57(D zHcvr-gn!`(k$++YuC3a8KfN)i>*g*aS7K6k{j~c?H&Jw8QD4Fpn=8eblOQ;Sclmj+ z0`agsPZfqTT-~TBA#htpQ%pcOLVKG<=Bd*A#l1fM(HMP1mkON5w0H%`_gdLv8xLkx z81g@f40}!KYM@lSF^)3sQP5+|FGiAUqN**qf3oI|wa2Jx%(9*y32BieG`LR9Ax1A) z^OIP#zIP$og;S;EXRQGfE?3Sb(?{Q7mHzIPWe6UQU5Sg#&;IC*UiNt_gqD-cWl;r z1yU3J@_uRzL3yE>HWpqLsz=9+Uc#fxKZ&C!cj=7GGGcpa+kH>rR?Tp84a6(< zy8-eUm^m$)=~wCm4O5K?T((rl#1cYWq3I_){IcmP8}4`;N1<*oW|g+IR7|CS>FN_v zmq=q{B<)aXTl!)m9a3NhOC4{)SyhGN7>ldha+SFwVCnNxO=pk7Nl@l&J24j}?ddMM zfD*X*nY}uH0tA^yWMYpSI-l-adS0+*5VgEa<3UN9+t>M;G6xhJa;7gT9518Ujc?I$ z1pW%qRB{r=-d(R^GNP1dOsK4=pL#MxpKiOpOQcHMTa7W1$HG8gxOh z)O0pudeRJ@vGr&O4Ft=*Vm7SFja;ImIVxKqB7Xu$_v_HI>Y5~cIOz32`o&9xwi;+KRH|@7&!~=uIp4%1a#PH)AUiI2S51=lerOS zq}@zd9|=1$H~#`L7D_^GKe=WZ;! z-sVpcut`>wc$U4B>XX#iMLnR-I#piLtrft35fl;|a8>xxSoADKNw8;RDHlEQE$9SD^LGv;H-as!z=yd1m$Exzy9Lj zVgn4N{Q$z5=8yWi^VF_Gv5she87-D z*uvJ}>-ZL2EG5c&v-{moGzPWx4w=$qTU&*tsB0B&Z4~p#+w1>vIiK4XUb0cQsPjH7 zeGNjriBzY5bdr!t%1#a|L!>YyS9~ljsy%&SYqKW+W8?@JBRYbMgSY2Qnr>uaviJ?w zx$Wny>)g-5L$0-aS;U#5`M}gjB7$CqL~BjO8%Mr}C#zOQ)R{zWF67fbpp?s|MdfM) zI!D$3=fyH@IuiLG1IUDPq+mLERL@XHOU%^h#{#<`7#IXDhz zK5v!cY&0;K4Oz^Xo3!3&)6}jZltGfVf>XX51==hCx>?TJ7=9N*T{HZt9^3KWE@&|f zK|)2Yc5JR?QSEyNH=d>!Mn}r&YeZ8=9};z!+m5kjWkKrRT3V+r7w=zo8!CiDG-E=x zZ-N^&=jbWF@t(TDNzIvS5ls_|j+n|qJIvNdt#VbLK^XMueJ$vGOE9y!MqEQT$L`mS zDjZ#-u+nwjM~GFoxbln~W2u=HF+heH!^jX`uLcu36=`xcOtoOEOZ zLG7qfynZ53ZWTV|q7z7TZxR;(|1^Wu7l_XWXr3twy*+zyLmvG}b$s5xCFE`7BjyV+ zWpymyyT+ITh3$G(r>$imZ?83%iozO{Zgw!#Q$J(EHqMnq!ZfM?#pPSc#W|5K18VB( zVB_izBNt+sp;g|CVO6;sI%8nxZNo1k_gfa-$p~t2@bSj$C?*Z>uJ5gdWNoH&zAA-o zzb+w)FTa}lq>AnLVwep__t}U8853Jze{m{mOg#RqVj8juaZu}B%UaJiZG1V2IJX)h zc+G9h@ymTL-`o_KeQ4FPVPt2MePr#WJW5 z#oF@<)0$31-SF_kNtqQ$Z>I-i2CGt?OiJ42h+lZa8Uq!YQFS-)O?sPQR;f*uI4g)F zt`_nMG89GC+g@wPc;iTK(XGN(_aSy|?82FBxmfOAU&BQ&eY(=zgHRNR9{K63OIpFk zsHU8qxYltXVKc6eKLL~?$nYfj3h6i{0(w68!K#!+ zsYjxJ_qNp>d*CU2MZUUwCMjVg^qV=qTI9&j0+PLpX|v=P3)&p$r^IkRlOUuTBd%F) z03=V{o8WrYdL#1ukozGT`LHl8CIhH%F!u1f-1;*iosNe0Y&A0A?=af1*<1mw&Odn) zBM9cVNt#=aqyhFNRv@|KqZWP7^p#KT#P9LAUWt|5Y3>!C+;^?#uu>nL%;Te9Q)Bo_ z0`ESVHX7OhcIfR|Fn1ShW-m7OQEpL<7_gTJEnsWf7wYuJKrgm>wU7Ewz{M6Gptam_-; z31<_CYJ0bCs3l=ABefn~5=>~fg^)_FL9Xfgn@dn0B0$qIuAWNzTd~vg1+?0RQ>z<5 zwxLdp|23WFyqJhvXK$`3$CFvLq}wFGD{;Gvezy{5#`Y|3-#(DrCw1 z?lj_}0fEw$A8`-hae$_)$?PyyxYPzc*qI&%VXutLY{!4@>LzyXL zi>fYjHSHqbwR1hQO?jzzDww~zt$s4;si-n&NVYu=IP^wvQP)1E-af7YVm@ZMagE`u9ASRLx{4BG)?8r3A`71ePr9 zrxV}Xn2CpDDI57)P0SpxY|O08kn}Dizb=h*#Kx8>^>?v%I1kM4D#;JgP=yuL6x1r- z#wK{6S=+P=W12cI_ef`H!S$$h+daXa&=hg&5_;&#E`DEJlQy#=>oMV1#E5ml8Vapq z4|~nh3ojxtB>Rvxd6d||6L1mf`N0m##g@VRiCHrBeianvH%Bp3$fJxk={?CInL+=I zx6M5n8i)7;JFSL^z^SKi%77$uvZ0hh3n&Wbl=OSsLlqRsD$mLUTmQL!fY_01c_;fe z)+evslqzCyHd29w7S-ZNDGRnGmrryVrQ*846%t!Z}VOeX3U5Qb3@0ebZcIG5nV{nI%4qD-EBZO12b;*tKr8h-uv zohCHDMb^iL2GH0_ravw<63wo@bxch#3ys>u(oGfTSVbww#^w+=t4(rJs&Ul<*`1$0 z$h_}#&3Ou?B3e0N24%t0d!sk8)1r)P1$nvtCU9wWad?!E|7JHPrLz}luUJqt2&A3d z0sC{-Ne^jR^v1B@%^$-at8MF^R3KYJuV4=3icyujglgd_8<3RN4MoR#y;s^|wXWCY z$L5xoHZJ#XK^6Qu?5OFsK(%${SsOX!8-;GL37f!R(gb2PQU^*3TacDcH0su4Zs6)J zHTz^#24_bj959|Q{7v+v)mxjTf^n=!?wT#z#O4{B`j7na(U*WN1T>JJGuY+|c9oI$ zf4-QB3C~EJNM55iY&aCyVKhBk!lTBh2&U?*rC&&T$F7DoEol4?IEh_Ap>(kb;=FL7 zt{ynucM;f~d=0)#|BffI3?P)z+3%tE_7`ZFl+y7xZ)VUlO7C|ZymI6xxV8xc@pk`2 zZ|M~v8Z6IEXVtn7=Ll3W-j&@nJCuC<<)s%&l$e`Q6v?zijcPjI9T^Vpv}}{ocRzzq za0qEtYKI%Ecuxo;Wf-pM=6&3=>Lc8Yw!2~so$@q{Pmv1eHBIw_1<5_FbIqvx@@D&1 z%q6INArsfrMc!UDCUC8A^4PA7%Y0vI`DlK#Y|Mqk`_48eQF60pS z$$%2z>7EZ$hsp;k5be_~dpGu7X>gx=$jh@gVbCIVD&+SQU%ozU zh)E1RK+gy3UFMTpK+w1}+w7f|jF;XnZ_ zVtK@w8lMaH{%Zc5wZersL?F2Ps5^Jwir=-+!jvOyEtvbo|thL41Fp<#$`q7f8S{m}8WC0RWyvH{)?Ol+MjtoWzS$bIh9O14@8jtv-xrm=q z7vVvGzQikWknuec?&QjZ#Lk~c#kHt6<3mFpZ4z(F-`G`3_^b3Kn2zPcAksp&^c#OY z9$Dv9SbY0fm8-5ZUG$*x<=gS}>C@XhPR|Oz9U%VvaX5|Mb1uS~s}Fp({h^Pa0?n&ssi*3vmW>xOvNo=+aWp79dz z6C8sUO(PG*BLU?xAa*2)bnvy;zfk2 zV6&6lW2SM1eVN3Zni3Rb?OxvIG5+P` z1eWnQKU`jX5f`_uL2T}pv5AzSpm-`~QS}fvXBT}>Y_g->?l!3>d;8=b#ct`UmG<#u zn6F`kt* zwd_%upfksQ4$NhGMP>2rA3pTJb*0Ku^M^h1=<~z_pwpgK!q-XVyeGMYxUWx3#a|F$ zWA=ep#ih$W;2Y!sZ0^JQ`eC8F^1T;Lk6Yf7F>JTt+*oRh+xunY>a9mgpNP8e)!qrG z>*Bbth+i7{p)@jOoK*H%yu^0=WB=q}YJV(6`kj&5d#`t=m;KGS^WHvxmwFNycOTr_X1J2ln1M;#=vNRG7-EP{Rjm6@UJwxo705Li#hRnzxTI87uJT&VgN2|H%V+ ze2F*rRzC)ha!9R4D?b(=HPMFnYlo>Ws7>j!YdsV1p4f0XlF#X*|Bxq<8q^m zdg6U=da%cQtnnAPlyyosoinR030>tr6mKq5)S)MQazPB>s$XbA9OU*LYBTBv~`}){4<^#Fz>Q2p`|e z_%`+Iz_H^Vg!xzfju769+Pp~nmo`4(rMxffyt?<56*u$#C^j`eiL!Q!oV9-_v3@FT z+~c&5T;S)Yv+V|xlJ^S|x;$p~ABUap?6sSbYuodJ@D10_yfbpmE}=nVeR(o`PhThN ziIytQ-8a9kIq?S_usOUr%7#nrU<3@0h_ifNVT7loz}@Rj~I^=m9|URe001RO=XxYqvLMX%DvO zFK*r1|HyD(y3ovOyglcY?uTpZpn&V2PARI4*?R?EdE7jI{i{$#(G7TNsb%__Mhg?#vOeg;2HB02bPHY9Mp_IG1 z0_?l?JT8~{;H}MTk>!2CJEJwPf~#(QRb(Tmq4>_&vNpdsQ|Hl{@n?}XUsr9W$FE*< zJ17WGa&tgI6rKxk&rU4qsgMTzg_egYuDE)qlph0gr#-9AT}_2*?C-qm$WC~bU~b3(&0l>gmyMC?e<9g1XnN{(z}$Xooy>}7x1p9hfh zM(#rh{iWBAZk;_(_Cy_7xaVk7BN9#9J_-+O9lGVM0c8O_FQk_e}3 zF8|FmT&RoRwWhnuE1#hk$ZcDMJugjgJb{ImC4vlSEsubhSR*cIL`M<$&l_xvdv5rB4yzWhN5^zD z96ujip-huL#}z}JL8}zz``0JM8wDo@3DZ!dB1yCXhGIdwo}HJ@&KZL~G7rNf%hMpO zA861KQFZ0yqWp4hA?fR0tmErjsKK%sB_|=3yF;Z&ce2H)5>CSFaz-US#oH9te*Q%( zfG9EIAYlM*C3wdei`Ot(LuZA4A7c)w*WuE3Oj^pkZcm{$sxLQz-3GvMa$W8r3`Z1QT-(HXLy7?# z6@mAKy0QRJ&l+Mv0!Ez0AuiR=M7(=No=KO%6~#^{lQYt+WY*KWkrWIBrM^rLzC1H# z>Mi*m(Fokc9e!0RdN6M8E3xpxCZ7P>Y}{Hkkwn#`sC7oPwyFvG9duRxu;K?rGhg>S zxx)RFNM{C#1N-A&8>^AbZ3(5|sdhq1!a;fo)j+TAro$t=TIe26BDuY*u%H?kdVT3u z$F+~(wTP=lMx;)6woB2O{R{kq4<=Y0U=?egN~DuI@qakY3^@*;A5d1`Acu1<4Ww|J zI{_rPZyH3kA#MrranM^cqOKD3lJ{n|%c|CqG2mU@jsfRyT`jcEs6A9k1_~2?8t$)A zr7mgn75M(O5v}+ZE$j9Uu3W^DihE|$=yxp^)u<=qM|FhxnHMiSZLU&{_vhFgf-Pqqdqsg!MJ72qu4wW=ravTB;RyX-uXu$#*9WH zUoC_^&!~L1$>L8K=JDW_T+wE?H#l|c?X$3uwz^PERRYEJl;)=hZ3?*TTxn|^q)>GE zzH;#hqOqk!tisWZRB->ROA3PgkG@vAv{+O8^P)B^;B#)nEz=l_FZ9(9@4_O);fp+} zHR`_k_|LO*bcn>70wumE&L~#133wB|7L00azdif`yu60^n`4<3a9pebAfz#NW&f&d z%hGr{8mRB_PbTp;LBNTS7qn+NbdXJcvA%=9B1#)iJ*M5iT4sa?4;p^;@0HeG- z7nI$?vFqG>V#n399+i3wl0b;iADm@MJlx$BcZ5(VM%3R;b(A zHpQZ(K|A5Bobx|yHhjZo!cSz%5Z}oIOz~eD*n-*|i!f4* zoWApHq4x9Xk9cWfcftE$hKNdn)1yfQ8C}VV;ck*Z>rCTIydEEp&<`jJ+bo7!m@ga) zHZ91{{Mdauw(YIu&SO~jhA7J;^Zd*QoUvi!E9{c^o;cC78sUupD}GMIf&1Ai4b~21 zpZ^7!P%PI#e-`v6sq{|t^rHXtlYq-`JS9d3YTQ*ZVw{d>0kO1OuAI1%rI@N3x)<{ove;K>y3-m=9^kamm%LnF4uU@DnNfvPcJ*g&UX=>2vyf^mc8e^5>83 z@XyMBPejCFebGpgZDQ5W?J*oP$I;{jci&4j4Gxr0@kd6@Vg=LNl)g{&OudigN}yrw z*3a7J)9R}TJZCcQWefR~Rom5qJ#BtqGuEMUJoA;T-yG&$^c~#NGdsAoQvAx6$J`98 z6M7Iaq}G`zPrpe*%A)6WWS8`i5-}C*Ph~(Dm%V>SDy=B40eSCi&l^ zu576p4Cg!rM5~?cT3aU~q?9H)=6_LTLjWVc(ukt{@0_S;Vw5BLf$h|@S596II>=pq zs1J%#Uer4RSh8@+aZus3`TeA}Oq}R31?qOHmJIku$cBZr0M&0~Jma6pNPPFEI9Q$b zvL@M2HnpUx#)UDiqO&utIaMSSi~DgoT4dzzQlqPA8eRw2$w|_0naT_qvc4KQjL2~4 z`xn#kpEJLcbQluc60{l%X#! zN`PjN$mm1ogX7f38P9IeW22zPVE=J+;POe@Jdh&_O@5AaaIHORvhS}@L=?g>SN?*! zp|O;?#vP}jO#WAxN=G%xuzl?(maTwmtD|eV#4z{S>vt6P&Mym%=)*~B<6x$pkObaE z(Di>VG)9#(@e9#r8d5yag(LwTcsx!~H&vqK12#41^fq^e5i<+c9RAP+fsQ^JMJCFn6VSe4`W+{n5tJ}Y{w%ad0Q;+ZTo+CI{rAl0qhanr?EIXp>y+d^+$;_f`^nv2 z-rrDU;x%lBo(}l=TY;}vX7t#uc#_yak74;sUvfG~8e zQeE37C^k1(lbz7^Tr~l;`2V200SEeblRbTlKm(++CWMo9A;p17wGg#_0!YRd5_26n zs8JPF(<<1VZ~c)yHz;d|so4wKrybWspGzdh!HV9uQ)0FvAJgN*+CSdQeO1Z zwaNxo;Hr1qUM9zFg(VQW(j&% zWM90l-+8`*W9%6O3_YFU%*0)AnPGUiet&0ey9?N0Fr8GaVb}7No6?Dc^Sx z8*_$B&wq9KMOOWEbRLN-$s^(h_pI^Olmll0?;Iz&@&vLVr{_*3O014h3zK|iSlSL4 zXSGd3Q=vjq1O^@(iX3$RFtWh$eY-VP-7V|!0B0I0(?^{+1pNAnTiI#2ng6*suGqPQ|><~%_8F53bEg}ag(T6Gzr*C4= zH&-va?T3lN>+VVKz>8l|PoT8v3^l~>z%hUWul8s61=sQKT@}Ds)4Gl@l93$=6ZLYb zL?R9vUS_HIcab?aAyC8)I>;;7xv9 zjJG3~%3WKmU2Vhuc0%sU1nGQxZzPLJ)BMe54ct_@;l3EeKte>h&mOz>Bh1Rs{EOk3 zkx-f^^YmP`E%)gl?X}379%XrwRL}VL)+#jaMQgC4i#WBgf0X20#M~-JyD@4EFS`er z&w$K5e;V2kZl1Q8n5?8`vEexZt{gmApxzBvEluZQ;-De>3qnTAaG~>K*u#{P5 zsDFTJ=V};_W}^jl|7*waVp^3xr)4H2Zr;JH0s3A-Zte2x|D{0_)PNapk-XYD!lDi< zfka|s=VDpV^jwwl47IQ9`te|CH1U;<@hy7@W`bYv)s8WZc3R*sc_M?$}lxru_NQ zcKBB{4XFlpx-~Otkwmx`useEwu!ins67N&r{Hz&y81r$^!NJ46J5FLc3?O^lz{Mf0 zo^KZ1GeG%@|EenK;X#phhJsi!7CIq$!oI!qw+F|3cY41kj^)K8Ae$vClACC7IaOrs zGwRa=?||@pZ$bcIWYG3WpIvEM@|c+3Wt-$e^o$;Ou@tM1kzif0bsH z8sOk-My9yV{u>n-1Z7+K!|;bPGvqIRLBqMv?1aAy0YxYZPO<`A6>x!v1+9P$c?Xn=_`LY6azuDc?05cb};2y*eCYOx(KCN@70=1Mfh z;#rWW5-bAAkWb(s(I5Y%yaHP#*KI0^3htO>JdESF+DK>e`)i#cvf-mC*!Y+TsZU+D zV&qbW74Bh8n-A;BTM!&pJ-`Y~Wep-6Qmuum_eN)t{B$>8jEa_TbFU;ax^#vp2Mo42 zp}ztIIKA-J{G>_q5-d?Nyctjy_Vg*1nZ$Dt+LG=EugVA7!VHzaZ8e|AYahLlgnm?2 z51rS4ap=F)Lwv>r6ME@0g-mcfuh?2?j_c&;xYUy^uTl-}yz+?iw=Xu!cxLMG9-WWg zl6LKc$q|cElZx5L{U32`eyvLlNn)=_fvZTuG*3y-{m3~rJxTKB+Wgw4`5b0KK|1@k ztedo<2FX2=8ZP*>hAx#WanQsLR-R(>rC8$yB~4So-in`v<5#|K!Tjo#9+=VSF+|yy z@uVU8DlSeJtYnf%L{~FnvdJly0OFi7dEL>1-FoRoB2?>3YjT*l_xR$fxp%G{X3r98 zhQBlL1Iq)dmgsLGP{nR=?G-TAxF*3j?kTyFn;pQJafJ|yl=TF>J^^pE`4p_}pv#iV zSVPVNf}i@3*2A8)L!jkf-if7kK^6+JU`A!vLb@dS{a)8dddWn@E%x5ID2v9KD7u6< ztZ3J6A=QQB)I%>AR}jW;^!rsL_5NXl6+a+M!<{75+(Cry|1=Fb{TIi>hB{7vSc=jFvg~l9p=PIR1a)F-*r;)BSK%M zFs3mWwOTTpyQuP{r$C9q=yaQnM5j-h>Jd9=Qi^9yHgUvKsCIB;${Mm7PJPh$4>AOU z{ITycyS2^VB7y)W`Q7i&xFeOU6kHcogE^bm@;N(yk}nodpKktUZ%AdrwHmk8BLJ0=Zz78rNs}GHKghGcdSidA&Od*T6B6%A>Ba&k-Fc5y6-mqs8m~dfyxL}Hgx@-rsZx*-4*#wbN zK`EH=GH8m5ltL!iE>ROXl?#t-yyLF1Xg5Nn8Y02NiugSeGqUg3&%&s!KpDMeTd|ba zZt3QsGyk208|qs^M5tFTfFy|v09zjFNy%hS#e;1um4xPWxH?m&_s* zyL|~xIpdrJpeEkK?mN}_PS~P8ClexO80|uzE5X6^9wOD*IHMz7e+WgZ~5FR`rX<+4o>dm1bU zS>aUPpF%-A+9Bon=pp5?6~+)tk199d_!&opVkc7^yVS39ojN8i#4XxPT@Hc9Lj=h= zm7=FJmv~ZK_=#l1Q2a_bBN3xFAj$3iPwXFQtr*Bf8_;8Y+UiKKIMRD#ef^=7)L6dF z4aXP;#=`d?uuv3@*Sk!(MHwezg~~mGXc=izr>b6F>|*r%c-|?c?HZJDd;W4jIdcwq8D_xoyy#@uOrn;c$sKbhFb9Ac3t67i=?c zSGyg%JEalQQ+nfCLB7;gG9B$hKF*j2M*?0eca|z@Bm=d<)I0i%!k?IqkIf#A#slP} zv;@)%~OVtI`4P=E-YH5iWLbNdFb!&k$F~tByM=Q>0^p zUp*Rz=_g3xx+x@*K0pn}?TRJ*F<0zm^x2mI5!#r^tx{ac3C*TNByj!%3DX5GDK&~H z;kW!)wi>p1Z|bd(&)weU(D&}sQrL>g`^L_6@e|asy3(nJW;$EV`i8Hj#Y>jtSHHKR zJ;1znc@?-)Xd~1TQyD&JeB9!H$1GSQzji#sv(H{2>^RAklU5uh{aVa{+k*wGgOlu) zVQ%vVUdY#!9rCZJg{;A&o0Y_BOG3}%cQSfXu zjJN<^3!9p%!xsLC9^pDjOQJ8w(&j)va#HMQLMfbHH_I}XQletGXrXV4ENMSfXdSM3f+GEdU^FL_HrlJ^6Htxt*I!~?atz?-?X{q0r>FS#{wz2K{L11fw z)N$MwoNyOCF*4h2XNYX$Ub+w!hrIrV$a%>ap$aiO=>ei{=XvOKS2KAfGwJ>)SYDNK>Lf^Bn&vvF)Qq^6{F5;&YOpK$xZBU=%PLu@l;vG*u zLJd9XvC(jL)7pH;k4kIye{Ps{1;=_(N1C zl3-=}j^>l<%+9&vE2S}1agEy^CJXEifCAe^gg6$XeHl~4LO8Qh@FV7AJ6R#$_)wm1 zv=S0;^#3mM2+&7-cj9WPAqrxpoH9MxYpg`G(ajY;6(X0XeEZnA8@*;Cqth=)xwx-lVa+)G6pibo$qNa zURHmw^R3{M_`%TaP&MfNj~lvu4^!f}UiwXXR~7D-5@xPRcibGmZlHIH>kioR9m8Zq zX_VBWjZo8wEW#El?lU1uMw+gbmTk*p-@F&V1t6nFVAbPQY#HjIU@)DAPCGJOADhZ5 zb|u`7884hljJC-s6mh_HupTkQ{-FxX91cX8nmHEOR0*~Ht|G#Mjfr|DY{Zmi=y5zf ztRO#n+Ku!oT@tCG7Qsy2S2}e#J_UHXeWkExi@HFvTGqV(QBT2J&<>kEh>>pK@ALq& z@n{F9a-$vpjn+TXc^o2N@^N;zw0^@>XgG_{it($kBxi%vwObNQZVA=1#S(HO_tlBB zS%bf;nT54Kun^5S<`e!H>}+{N!JqlEKLvu7BtRN;cgw`_chv!c{_)m znEWMUNsTWMKul*%dyd>J@1Am*5`s~Yc;AZtQs~a3$eH@M@eMtC)L-oVChRnnjE2BF z>;Lj4D|HnPd;9I>qXy5LF+l*fhDR~X0q3FO5%nvsAK|XDdNLOAwGO${sQGzthTA@k zeyVo8She=vP*#U27ur27DGoK^ z7=91A35=DSgS8I&@!HteQj*|@!5_All;MI2*wZR5yx+fA6Y-!^WZEVDu>H-Ek%Z=P zoHQ=Gdz}l4V)arQFx%VxYTuS<4x6yYUrmxS9$9SrZzc<7fG9sY)MSr@AcanqAzU$1 zQRr_(7>eM~r0PZqS=^m+%8%k}Ojl@=@_ET<4J|NcnreE$6EG&*3dMtUJQfernH!G@ zpX2~Bt7uIQ73m#i@HQ2x@?lpiS%_ZhPW`VIEnnXjZC|$v4Ga0L$yGEQ5ExH&TOa09 z7>VT0a)T|%Xz>#>;m10W#C5O6n)}OU(86TF&L*#T&(cZnOF( z5<6XoO?n%a3Sk17O$kLqo&4aG9!w07Xc&cy=p#VsU6(>xWs3q}xuCiaVG&YF)gPl9 zfYaDEL$k9>o`AL}jg>0(?u>lmrEh5waG2S`;TY>QCM6CuOLd$N>iqFcU-;MFb#|=S zWr!c*h-z)ejnA!+kcDNW7YGEqa&CPhI9??Z=IZIEhF$bJ?FoyzkLVt=+?V)*Zqz!f zURYlUmgF(|sQ>$)a-vIL9P+{XEhO)MK)|;NQxw(KmlpdFPt>K_f>sSOrrtYf~w-25cK#?JZ!s6~l+_U^+Eaw#vb-~6BDCIZ9RI8kTQ6M#kBrtkxyE6cvZ z0$ck0d3%{ypLDF{f5O16AkW4VHP7q8hP~Afi7Hi{3*c=SU`rxRt=Tb)7MY_>!5DB^cRf%acXPQ zSa;TBAch^3SPYXM$Rk;`SRT$$9bfKe=0QL1^JfHQN8R}+lH;P@mq64aVeP&`Gjzw5 zlxo>{_ivjF{2y%plH?k8dKWAEI&S(uZKsnt?W*I{C=<)a%ceo~2yLK_R-5_5_9Irxu0JZ6JT z(Y_HnWWJ4Md19cNHQ8l#-qkTRdJdW((P59Wp~%gJ#@986r-QzGs_AANMbajqReoOL zUclRzL(D704IJx`cN?c!pgH?lHCVXUUf9R#>h2Ybrkf-9JX?cM7O5TnMZh5_p=Ahu3)5o>C?@rIws(>CQpx~K**iI z#ab9^s9)Yf1RC`XT-7E6u)-nIPRfKVjo$Jnd8ng9;2q*Pm^nOkq-huV zN=Z(;7D4JsyZKSZ`0-QjL3pE6iX!CcNn!0cmpSHoW|)~f8cYRQE>$PR%n7`?Vj^g0 z-k5t_&A>dG{L>zhdoFs0fQaFMCG5W8%A}y7P#sjI=h8aMYHKRXvtrhiZ!x_7CIp7t zaS2tnwYCd?X`{J3?u^GuS*3UXB#6(4PU1Qr6ubT6Vx;nY|kQhc1DSQ2axT`i55mJpsG%~YT4@<=W`CKncraRyC zgGaV@2JwFCdRb$(MfnGv-t<&bxVUFNW<|Dcdu6!LZCO-SzpAy8<8 z3cbX|NrcH+k`?^Lv+P%7`WNk)WN*EOp}^l@!Y(LmQ0aj zJ0Vh1ruSS()vpTCQ>D%!=nWKER&mB?yBvts&O`!3u~(9)^SXFS5tmqv#nvvGFD|XR zEm-5SZ`k_|#tR<8UU=;)7n6SP5|#nN4T{puA^{mKILdh~2@^2C92X~jJHP0rOLwI? zKeUjNJ3ENw3%B52|3D#@R}>LR$Gudp`v=oSVb=I3P@kqqc~Pi3ip=)!q__iLX4+S- zP2z3y+8NH;Nr%wQjxq%%;*@%^gHs-!pM{%my=C_{?&YJd8FhgIww=txr>GS@lyKyD-FEAyMTE5=Pmb4^<-SaJhI;DHUZB$qBI1z#_(bq98TzF zMEc*$UyL~jP(A9_{%TBkin3G}YRwSS|7GkFW)MkW^tp2X54e{MR?x73bt+swV)+L%a zuG>?qt!bh1*>=A4*-sVvlg_rsSs38U@TNYjQh<2NI_-w54g`rDFtq}s9=I*IMSR$R z+OmaL#oy%Zw%Yu#wN)i9B9ilpHKymE4bU<)Mt_1$FqI}NK*V}8+%N2;gy{*LAC6P( zQccIGa$_Q}$TOWLDTr{0Vt?CI3~%PFagfxrZ;u?0WA_jb7*btT*(*X6ai5S0J3FoQ zgv0n}xv*)f`zj~jFEEONMTGrCS?V=MU`}lw9}*1g;P@}ALXOh4V*NT-tw}ZS=#1Vc zL5}~J;H||@5iCDahr0#B)ESb8MvRbw8~m=E)bZm)&GC8mJ|YzDvH~rGfM>(VIPe-` zy^njFo)6QxI)=Dz2sm;nkyJX3i|Z=R{_{%Y&;5I3filon@iRO%9=AGgCI>YHnx{&c5h*MP>9CwX_Y< z{JOMij1w3v`Jh0zk@3je=jzA9XG&W9)siASib-!7LIHJUy}@c$JNNrks`E!`Hh8qZ zKHww~e;!wdc;#QEs({-Mk$g+pLI)`mxeT!ny9IIj-r>Ez&~cJ$eCn+5LoOghL30@e zWlt*+8h68Znffx7@g;$mCAW!sjiK|DFbOAuLZV0}?8?Q}(Qp0Qcw0@zQEnP*mzRIm z7!$u^*-INNzwACkH_vl3aJ&0dp(Z3fY~%^axXoFAl-cMS%ZXVFiEeb=g?GZH;}q#4 z0g+0Q>qv~fBr-NkN{!V9TsSH#rUWWnqB^g4OKWI<45(>g2S*e-EWr#LR zDIk{oBwW-`!>$9LvYUtYUeP2U+F`Br)<3Q!XCs-2oqYEB@6F)1cvsB_zsQDNtu zGhKGLUKQpY2nd8CWLaF4&4MWfid6MG9yUml;e%10DR^5jo&8AB`=f8|M#2)~lh zD(lTxBx-PX4yj7d$mIhu--WuacNIP1%Z5V|IeE{POM zgfYB3@GOJmwC|z=m_y@WS%KJpw@D)DPkb!{JXZAN5+;kK#WWq*+Ix-sg#xz1f498) z!fxrM!jyvko3h;J*A!|`X<{$s1;^5gJ9MiBW(z51n+DsL-gc&|UC^%$fPUg=v+R+* z*2a*6$=DN2bcsDhMS@ds_BF`;LjSpqW=V&P7l|>PL>M0Js!wl<2ACGqEDeMsPM3t! zO7I6)jBrXCU34b~?f5kEkQ|m}O~MVIx1VA?px*8%fZ3+2=T`7oh<_Mz6zX}~QH_jt zr*ZsZxcJeDS|HSs!+%D=>vWcFk%*M4?}I|>%r+o@P3dsc!!&UcQ?iGo-xNK|DYS!a zbM}=g{||3fy?MjD#L!&He?(@cBqUmu^U9syATwf)oj@=72zcV>%?D(h!Zi=bjiZiZ zTohLbhX;3wge;CUPPNP)#+tF~_n(c%A()H_A*SyURQYv;O~q5%AQZ>Npc3()6H_+W z;Yr#;_g&DEQg-_Az-?u*%H;f>bW?w*j%wVDEbt+|@(Vdn{VH_qye7{SEGm?sgb)A% z0}%6@&(q&-Vkhlg+zK1@jX}|1 zV%s+*sEs7ux8}&9S|%x6$Ys~%M_aJk;aLk^fi0Rn-Tfb`s6d~P``TKio`PwjzHsO z(r2vqA;RkiW*PA-c{rKAsoV!>5HU-O)iL| zWEM@G|0j$-{bw;Ikp?tP*vCu4ez#k`?W;e!`aE}g#A^eD`=+d7A0DmV^6Wbp-M3t& zi8c4~RxXIa&70u!j7?(ZKRc%mvF%U{7w3=GNk}r#M-Vh2H(a{cM%yn{TSrch3meq9G3(WK=Q?usESVonCp`WmCPt}~EISv2lvw(Pf z4*KFL(vbpVsq)ZlR-!_QaN^ktUmS3P3&a?LIfL;yq>gX$9qe^x6kRubP9=+_1PX4c z0zYA8d}@yFJISDCsyxqflDPYvD!Cf8=M|iuUIpvirnllxR?HAL3Lx<;$i>~sR54?N zqUey7gVrgCqK=D01^TUXQm$`-jwxjF*iudZ5BJ~53Y>RGq!7amxONpuUb&AO4w(pZ zm>Y8U3dCtt?5ObIBbU?#@O;tY-Czr`@&N?0928%V0XL>0mlM?p{3}}TOJ7K3V55Gp z3o&!pKfSwMA+km56JfQ+BjPmQISLD^vd?k`7;RlQY~%aYZWOn^cMdQGiG@zVV~U@t z%j;$gxU4rw*=X^l9m5&iUgA#nr?|5mWQ^Ph^kw$Ci;!r$lOGhP!Cv|z+Dk%KF1re+ z1a0W=piuo5HPvWDgnt8y=CP5wa0jPbmx~4_@I)vkS6yvBGBQcFcAH%?7`6CCG=~+& z(<5_|T`T-+9#A2K#s>+}KWq@2V@aV^v*ik^I-`qOzxwBt6Qh|rT_N1b(yX9jEMjni z!W8F&@BeU>pTEy2Vq^U*@MmO)>NxGA*x#(oei7%UKpLTRX405QKkPKO(DH(96A_Nm z0XrBTL90KviSZNB9pThvaa68FpRcU|m6+tc5BKP&hqg~FMx2dUHW7digilSC3l1MU z`baXw+PbR^B~~547xKuLJ153UPKEWVH5ZXPKYj7G$*DF|{|>-hpJk&CWuM)EB1`64 z(h1;^%Ip7A{ExkvUHQQ8O_cZ1ubh%P0~oq| z6jpnTSov{S#xD-F3Xi$a<`Iq7X4d$AETkGST*Ds?7lhI?VR6zj_}1(O-IfH`8=^Zk zLv6<5&@Qv7#mY7@s>VB)KcvkRE`2Z(7z}yQ`^9pjU@R4vNEsiE5hUt~$Pg|qOz}#I zxEpqJVc|LA?}pxx^|`Tq2785wX6ccXNVPLW!ipAORH@Y%C~xa4#!XR>z|WRUrsf9nMJ_6)FHmt%;x220 zp{I`PiKx-NuYqws|C>HW0d}4^M|h$uCEl1IVQGK3DB?-1*wS_1b%w7Z#EBrH!LlxP zXi9c@P3+2$c(4Xws^)FrwcUTvu zL`P8qdsLSP$BMEd||`~p(2hfUD7rLk%Ca5zZfx4AboQ9dl40%pVHb2!R`q;#Z^ z@sPf^m-8vRvZS(1>!jjOcv%i=b?+jRmxL6 z5W!pk6bPNr+j?|04%u{0AKUp3kZ)K4F2m z;SRJOom_MvNi;zsykj$XLV-raZUp~lx1GT5wV@I;`k+`3y%{VEn(Z<63F>(G-l1Eei2yZ`3NdcmiD;>u)|rWc4jS!Kf>zpv3Pz`uwY^mRt*FOv^%U8+DW4MPWV$ z!D$8>WLuSr^GrK}{9~Z%cjvCJl!9342VKv&tzeWy_fmIm&cD34>wvq##Lp+qxwHRv0Yl6=a0vmp> z(2P?X&T&hwJ?t!2?QFS+C^6mj<$h2KAsJkm5I1^;%Vjz1ro6d0FT<_umZTd;8uxVg zczJob^LZ$535LYY&a+Lwr>UrzfjJhkJ|OXK5dHywQ_dO)n@vEVe!9mH^I#YB8r#vg zT(IuDz;FV_oe~MKmlvvkVUU^q0m0N9K!G%*0=|zO* zZWzXqMxmBd=1|9qNVYE$8rhe~{F$-uyaEBbtalL69DMSQ2Ass^w`txk{!oZ%TZCwj zAIUDLITRZ?FOrT4qyXQ`-BipIu$;XHk#%)y*7C;LxJN1N7s#k@mTwP)?yQCb*dMGbY0IV@lv!2NrZ}AO zFhe(qK}?57GCoeN_SkeBZIy=vk4%8IuDXSk5#6w(i_kophqN!V=Zl*pQJg2-mzxpN z!`+0WKYFDU#^majjsQ)phPEN@z1P2SY~=MLtyJk)GwR-`_J%jGWR@s~ed`iYVSpBq zmaCjRj9-NbW6g)YAHq@_%}*9ca+pDRVcTY+Ebnt$OvLc0`{!`W`gr78)?rymU8Sj} zrcc%F@$Tycn_+W#EXsamjQE?f6YaPQ8-C(@w43UUcyb}s15+bO>vlJ^Qk^n(D$rVT zGsK4Ua;renYPU7dD@^~j`=tXX&KEyG`$?0fLFNzV%QjvQ$C{|#Erv3;0!~Jf+`y`P z0dWAGj0~2>{&R8_rz*qoc7oYh0(xFXnufna~g_AL#&Q-X9>>yi8T7a1!=Te=R`ZlY^d z88Qw70XW<3x{-IoKbx`9Bj|Ms;Nk4?3Znd;B7M_(E^y*dsJ(tm?NG_-Cg_=HwEtiW z&0aggl9pP8XF&z!_iy|_L&s5msLFV^Hq9eM)m`A$j7gJ{wx9WK<=rRhXBPv~7xZ>< zRTAq8lb=GVRo*FhoeVea2Y!0HilSjQ|ND9z5 zr8Zd%vUvBk9Wb_&2S?(x2GKSF*kbJ8XMAW-(gU_#ong{mb9`&PXxKAc%vV0#0oC!}o!Dwi(p=iI8xOiP+!^LhUFH+e-zMtC;~O z&Zb)C>o9TS&~NlcLsP%@^2S>Bw~{YDCd+p{;jPUw3qE~0xavkZ~OuiLfdPRN_= zMHg@1;O#71Ckuqx%x&%LcT&?3+W&3{{}tkV383vJeGZSJE|6pw=yn%_~VIR z6;|*C-$oHx)CSZPVTg4|Z6E?oI+wCHDn=7$6kl?})Rw>$Npp3xE%tzJM)MnZG4$DF z%B7;>Zair*rWReA{=KB)->;dr(n62&wa}Z-N=3Mo6@vAr`#H@b2qX_eHdgm-g;!$& zB#qo4>86<@R+(KaQjNh2x9+XjXzwMNw^|;W7v}I8<$zr5O?>$FyapTEtp6G2_jAg; zp)pDuBY^TR8siB|p!3+@;g6ePW=oU@ z=@fBoGhiYR1)p)B4BPO>v7NG&(ELAg7Ph~d znGuL~Mi!1v$Sq3;-B_$vL^`I-Les-e28@Gu^k5vBpe-vAe!WiGH;j6P7xa{s9(J^Y zBg-OLToBXKys93u`l}~x+K!#8L2;x)iwVByDH!u3o1sn#+-{{>vt!{{W)=xAcw=q& zv2)+m(O85= z?|AB@D&pmE5#K|Ijq+QlLD+Fnoi$~o0{=VyS1xJO9=RrmU{i0|BX?4}Ftm}+0B9}r z_<;ku{wbF;d|>PG2BhjYlsHHFPyiG>Q$zJ!$srD|~nVD9UvWvNTJqowBxSjAYv%tFuR z!Pc8%>*;V$S^&>daxAscA8d01(rd`{VZPI7jq5vCj0g6lBFVTo3EIW>9jq^)R$YqoE4O zFlCaAmosks5b_4v{J)}$&^4~-jh^`~x&$Z-1V@Ue%a?EMe+*MJQ^jHLW8)gtUv(M( zLQoN7%;C}8tcsox^J7Xi%m0cp;hkyCR0T-q>Gko&5hSyd9!{O7J2tKecxZkv!b9Q} zkr9`_Pt8M9e}ewC5o~Yfcvz3t)$pvjP`u)gqyn&qy!g}9c7g3ht(Zulo&>~3eJcyq7tyRTUDG$us^y*%~JU=callnu| z+3WEp)PPjOSMWAxLM8sc0%}GISo`O@%g-rah>hnXlm^^kbto@_HBxIb$A9=q_pij$ zLf~w%3Ne*r4PTE?%AEky!k4+U6S!i|KazrqIW+noRN-fmI{K!u_!01KLrrv)3EJBj zWpIs)xQ^Wd+MXp{JPoJ$3f4sLWwZzOhEfTBHbUpCOupyQ#iI?mOyC@sE!1eHr8i}? zeqzl=3LS2Xtjd376QIvtJ=z}&Z4#UWV7W%;`LzG(`RvF5;QXl~P(qc5PFBuJ5eRFu zBF!z3O#W}K7E2s({qnt#T&)t~iCw~?{wqNs$}j`f^Mx=#7#|lc8yp)%tNulp8>w_k zha$K9;=(NVu*WUdjgewOG;f^0;gRzHwfEj%O?6w?r~AeI2Dbf^F zqy>~FH54hKBp@O-x-=<~mnNbVK_C!{CQ{Q<{t zNHBY^wdR_A&h;#wJi=AXI4*h_srxv){`qKk=V!)XO+Jt0t%wIw=JWS*26%^sYe*od2nl&qJ;Yi|3x-czdJH`EnY0+zunAjEPCbS^3z` zf%2oChxwsDok&!^5-aD7hI5)!t=wh`E;G2P7E?H%oY^4uO5Cyd&1=X z^MXR0D>qHAwJ6-{VD>SP>|#?3{!CIl%Zh(((&9FETKPr3@jPi<^yw@$R1?3psCG{f z@*qs8jodT{j_m4ukJfsFgpH8@HpU6^GbK?knz%}=($_#{IeMn*((@mi9oYgI&tl0} zvN-s=+%E_^NbJj;i1^-wsDe!1sMYp3i8i4~oEG|m4PoiAba00s_oZB#0{~?f+Tx(H z)t^cKw$-yjA?XpzkCi_P&yQ3uKFKsZ>oQEe*y7&T5p;C<-*1ntk5N-MKzcHs^Xotx zxa;$Bxo7#t5;k8iN?KJV15pop6Y!r9^U&ODK)W7{DfN2aB?net=0bL)NJaMv&veVv z*DF_^z4>lpv;wQW*4J6xamGH!>}>*Sb0+sfvgqZ0)?&5zzWq#J4j%J$k-DC3?r(iD zO435g?~|(4AWSy${$iS>yy4<@ zfb9EslC55KZ!0l(R^8T0h~DE9YRNFqQiyV9M^cz zdlL}8KibXaQjJT9BcGPMbWi_2di~^uCwdH=W)IbuUh8pgPZwG_D9RUz-*}I%(HhIR zQ*;JndiJc;s=D4NI z`WVE<7Bx=iDo!K_FA8;sGq!~0JbTf7%qg?0MJ0_VyhS5t^{ia)h>K#agc-9dyPK;n zB+mGozOLMd!U$t2x?C~S=d0Cw1(>fv?2&9XaMQ4d?8DT^CPDVj1*2NFY*p6>H+v$_ z?$C}KMzJc~ORxAP|6zVmE28FQKGm0&um05HijH96w(-+64{@2s3l1Le;m)&4{n8kT0+dp&j zzg~areSBqjS)gutrE>aNPKev1FG9_Hag)$%X;*<%ej{4zXWoyiYi)_M8POMKMKz+j z7*j?@JsuzL(zTN7C=uJ}Tzuf}E!$Ol)^XyvXVm-7wxhh61DTAKesvxUR*^;X?4NhJ zoRkyqh}|o71URF4l3w$gL`wn1_VP;{KTD{tQ5Ku?vqyh}kjdx7248F@RXMr5SQm9${8us~G<&&AjU@D&6-s=HjJ)!;TSDi{)UnEB8bK<) zz&}{b`27SfmK^La%)$0hrm0r+)hn!vPGw4f?+$w#_F3_0L(Xy3Ua-Lr_OZ`j3Z49) z{A~rUVF{)wjMw=5YN4OD;$a9Y1~r$27nalFLj@o8_$5_c+LRkgkU+h%szW}uu zm`XA^Yu26}?k}0Tw=AA!qZx;pDfM^HS~tcm3gDN6O9&Tjm=~=Po_c0ht^a%~uDj!I zDo{o4iqzS_uo~mclG)(L=r0S`))LY2*^nWOq&K4uMG1Un5(;g9OLBv7>%6yH;mNVA*OP( z=vEN-u*`Azk%hZ#8^-%2Z=`YOwf0W)_AN6$-n{(p9Y2~!S6=t35_a|W>Yo}YJArIw zFb~3OSsDMSFbse8OIGQD-@PcGH0BRReQYXjMFaMLY6xECxR3MP_`88=D%s`;h{JO-idUAN8IDsoFipS_stNdghseFGNc8{-y%f5wMU2rnC(#hh0d z-|YqY(rYfBc%;`1e$=BF-mv$581~xhxpP?kE(~3Y86vUol-E@mn0~o~jgC?DQRIKV*VF$-g<5-?LTrqj@fCT;Duz3Jgjt zC`eK6^Dbz6w|4QZW6&}DhC0k{#@`KNx}KIw5kk9JM|E^A63O#ob8HW1m!5VRLycDp z==P5h0Crf9Cx0xt!&Dv7{I*l*wHkxz2xC4W1aWRZsX0nn-^N-H58kO|} z=Bn9S=qJ?@R+HZg17y?zC!~enAwM=~n7VYb9J?JQ+A0p4y=V&Sod{O@-Ju77>_&SZ z%{%2jF^#_PQ7&-BI8z<}D-5!FrpQmUE6LA^MT4z=)8A{*JVv5m)bv!_Q`Xm_{ilIu zK<;6(n6nVOte2vq&A5+X`Q!a9k(XU;)>qhtEA+;eZ~CrLahz|lf9@O+vzZl>#eO$# zPA@A`2+}=UHi?JPq!stogyI4kZDFhu;Oh`3Z@t%|kQrU4K}JB9MsO_ei#y?sr^^b%Zi*9@#)lFt%b$Y>iU;il@uS(Qit~i6oOmyePor=3C%WXEk z>Pfp3u;Td23+E49Ec&ISJJ7f0)h|P@dV@Ss=EO+H#aC6;v!WiZ%fN5+`9?fGRt_f* z_bP@5DqwY!NZYN7#W9unm#a(sUG$s>g>zmtY49a931&Sw?(UY&FInB+w)7t6vJzn5 zXtqDCU6SQqA~Qz(6-1K&9TM`5wV=n9rQ!8 zC%U`3^O+>Ol4fVD4{zL*!icoO-LoOPp`th6(Lu1vY3zUQxvhZt9=8IYerh)-y+k<} zG)BMZJgwV!|CB_AC3)v<2}+=GhNVZofi>=3k#{cb2nU22LMIAqo z43%dh8mBvkJEnT?>>{?e@PrCm%z&Pgk;%Puw<@S7YvIM&&C~L0C8v68Q&7n!RZ-jD zC7%Ywno0?lk_8nna`t>*e|JQcUXDkbv%GJkrqtP8`6yiO&mz$hmu{H4e~L5X(zpI{ zk?ufkDi24Ce3yHJ6?bnKreDLqckAZ<{95wEm4L;Q#Mnn#vx|W^#{xqc&oMc!{do&spm<`{^q}P!%Vn{2}LAvAM#` za8VswvFLyYJrvv%W~Xrzx9y5c>8CanfkS4t+*$jj+W78vAwmzj-#`z`#o^S^)JlI4(o;b+3OVzc&oF~0vl}p5nC`37D|32KIR#v zKQ8Ow9cH5a{G`|2O&}6Chnx>Ih{aq+%a2tf{7Uq_1LF-f4V033yx@bpXMJNbCBIIF z^CbH1Do&FZzezLt@!bu&f9jwgeMcGaQHi^!%{R_QPG|`->1{oBxT%T4U+u5FUM`ZZ zlYm;)GxV@7Gu`l%?s$l<6LYKky|l`Qw@9DkOsXQJrV5&pd3{(kdTo#616A`wW~&%t zeYpQUIT5ZR7Ua;)p>--KBw7sl)k4ssgQwY|HRkj;Hnuxhw?})K4#GOjgHFyqen(l0 z9sNpNjSCl_wCRd1L>qjLf>#hE4QH|;;{Hrcuo$~4<9E7hWl&Xg-dd5Q zw^V*2=k|#+)W=0|x82V!T^I?j5JDT=#R$0F5Grw(}h~@}U|_56B~d zl+(jE+P2@n%E0B7UGE*jt0ZahHgV~sc!JcP8U5owF@z5^Y^xrGcx>=t;$GQbO>^w$q|KwU`2sO*6KQD_WFGtLMxaf$g{Rt{i;K&F zu{$Dv=!Po1t9y@6BG?mLJmwo+{E|P)%RJT*KRsNkA`31XZCpcTX^x*?botb=+xaBy z*lV|!@^Qd11+Vl8;iU>XVR)F5Xa(bP!XE_bYJrm_!J?v5LPAJ0u!+JS*!ktTa3xDp z{`|IfL{^f^m7~(zvprSzM`5K>Qdc2RRQQ47(|yIyrZ5tSRh ziyf+iTO^+Dml;*!vYEhAwGW>ioX)dt?MiSU(J@w6?zgYeC zG{j{NlCk~F*}#uBBK6eu1EYUq{ONB;zk5n;F6ymi*$L@Cz#p019e*l!CEJ{_^3}{Y zKA-uju0QpW3YkL?Kh(1g_3^n8nfJll0cK|q6Do^AT#DE!^!e1h?N-0KFE_7n1YC;A zMbLX0{%?S9!I#bF4S2qU)zs@d{c~IGk!d2oj^4jsB4HhO=lQI)lYE3qALgyj)Or0H z=t0(|LI}CtC90*aAw@QP%FaP$uXs!3w%ESo?SCc*#SLKRbpmFLv`@GdeqG7Qetun`9D&uJ}47Ica>h+R*EYQSA45-Y@`>v>azG-sn*u9)th!(#(B1wGR^+VG0{&``7df1Vd-!hz%I|~Qt z++{}ZIx_RFx@N&)5Pigr>GBAtGXMTsU`?lRU90Gs&AAK03u3P7dLCzL{ydneUE6tK znWwO^+QO)3AY@bc{*_Sdbf8Q?Z$_3#8L7phJaXC`G8;UoA|e)sFI-?SeYl&^&~9&I zKEM&0nl6)dg_%3l6ESgT1G?~EEP&b1*Y^1o&ikL%Me~XN(egssuDnmI9_xGFG9KrI z$Qbo!ng$`8ZParKxu#n@2pGd?9{zxg|U+x|Z38zaCRQxDfzxj9DIPKy1jO z_NIYSV|LqiXaa7`r#sK};2bnw42_Zw260Y;R;Q$ssqFv6QJx3(X8Q7uZ zxw(aVSsApfA)i4qu+ziF-I$TZ`5T%lL*^IxPZ!J(r4uXOBpr|Ujw-hYfMDeWdq)K~ zZ;SA7M~Y%!zwrsTU$%oBGeRuD?4z zv*hMngJUd!NZg`pY*=`GK^^G5IlvC^Ca`zNutN&f-FCUx3UZRx_%6FnRi;~+kN<3 z*^t~-3WTh2*cMx@6Fu@+@~MQyC( zpL3JLlj50^IiTm^vOFD1vgl{_-(!eBVrqn~3@Pl8Z_dj}f7>N*j$1_JrJaqWK0Sis zKF$EP-jQLLn+WC#!MMy>C`ShhS-5wPov<}m`eXY?XwzZ#6iqqmx|w1MHpRlk-0mhd z{LOkMXMCAw!l3&1&;ugVT`~Z3+YZSDEcS0(s(eTKX^9Sh(Ib1`@`S81ZFI%8^M5kr z7PaA{()9PNkA+pWOm9@>mEAD-=Knm-ukce_I=mMDi>~77+N6yxc`{iCwh&-5hRBPe z6Ls5urz$A=qF33^JiX2A7*n17<8f33!Hc!{f$NJ0glW~PYJE-RTmZ86c6asgSE0d6 zA9R8o`k@DNQhWu}%e#aN0kmb{bFc}AL((|lL3(R|Ql&s_F9d~#U*;~SKB?zgyFFj$ z&gy16i^V2tKf;5RN5wDMTrqi*z8e@)N}n5`7i5?e9ja<8BL6eJm(3-y&BhM51-4Cp zd|C9l$)CvxEehnP8Q;qD2J6MM4s{!C1h|kEp2#@ZU&sGQVn9WtuNK*q6x4~*2LCZA zusk@wn8tA{mV9mMNcKT4ONxo_8g@jo_+;M4auY6EP2A4gVIDiD`V-Czf5K-gH;Zh1 z3~mf{KXg*l7NwbR{rL4Ui^GG7gpnygs=ehg;-IAkpaOOSHgZU>2 zF>&dX^nqnAi6j%GRdRiUH(Sn6u=*;gdf}dl4gl@BVyP-371E`oz_Z>$3k=vzPapF} zxT0uO|IuWHw9HqJjjjo|-1(-vAW^mIny^w_+wA&mtZ`MpF3BByFdT#*a9^5Ki8n6- zz>Eu+a%@w()9>7_Ftg{-ejHW*mB zHKHSxm;i)7;L;4u!1s^TG!72P9sqR5UP)$k|4&Vtjmeoe(nblq~;ESB&js0Mzu~*qVt7TQIE-Zma`zrfb&l6_6@}hRYENVe(l*R)l`mOpo!G%7n^Ctq(|<10 z@#(#L1);%u@OT5+#~-?mfojmWuc%BxBo%x<6zF`Qn*h321iD`lcjaOV;^+WNFSVZDN)x0^vzaM$ z97`CvYhOAS%`e{{`Fw1{GlABd5dpLm+Cxs6oD})$S+K6kO z6IbW%c%;aS^cj1PFY)Vs(dZ_<Y_X})(Ps{*cf1d@*--7}G|MLR$aMLN`Kd=G!L6K40 z&TV0HN1jW5Q+6qG18a{NQ$sX^2{piZzF{&|R)$wP?!&Utbd`hl#kV7mV~w%vP@=(< zGQWAHqJkd9w#pHw*BR(y5Kg`yb>}SEgtIU7Z|Pf{Ap>aC4|UlX=sh69b3v_5>$vZR z7yyjF@2k6;_NhR}>kseD-Sh97Dp$6W*wWV|@UjX523{J3ME$WIlt!YOM-OOMdbv{LWe1cP6hI9Ff zu}cV0eUs{+~U72kHTzoEm8=1J?O}Q^ zpG_$t3EeGT`e1so>9OkI@1>>320E9X=4N~y8Tp6p^RqCrEx(oG$*x5ZMB!iW^X;| zLBdhGC}Z%|)u}0WMW~62ltF_mVrCp|NnJ#0DhZ?qC610|(NwJA5STw@5kcwQoiu9V$s`=NTv#y$*$|w__MM#0sb&Ut`><}l zOeDJ+DCkeTUl9j|4;X)6{McC{_{SG=jF^@~(XrIGVJ=)duHF0~WV-&O8Awxk{Y<58 zyUOyK`M;JoLW&!Qn^Hl$>=S#4rmf|TpedLe{KQgOn+Ku)?v#B_TH5Y!bow?gL3^kv zqb4DYqy&wNC0(NJB<^HRLbqM8l~9d()sy75wb+dee|?NUTQ;9rr-f6hMWm+g0BKAB zAcEi@GK=_HQ+y8cB5?P)*NH66Iz$*OAa|+5*DZ(Dzo;h0c5>&(M{KC;H0`UzI)W4r zPH$>#yy;K)x-~yeY@&7JFbL{UJO&T7v*r&+=Bb59q`*7sQD0OVDFY~2QC9zK^LBkZ znud@b@8#VU0&X#5uPum}fg1@-i2_4{^c?Iw)BGpEq+jS;0h7eA&Z+f=ew)tD`$k8n zvZN?|%h1qorMqFwLzdN>Q zU%j&;a4AmUJQB9j8639X#GHwp4rQZ{JHl}kF|)=}sU!ppT;1FzQAb27OKWPbFYl-5 zo5jXjJ;i*1G5nBdHBx~SD+ZQ{h)+%R>i%R8B4xDZn%#w|-QUZzp#3TAEFKIGkU*B# zsY9~4bN9ayAs1-NazOqJA_tGOuygl5J64OLo+ie1edhywuTW2FKt;2@4 zA2xcV?$o$UBfPnGz(|x?*Z9G{msc`iyN;;?9H8aEd@MC@z%`CPYo0m>pr;gXwArL# z${+}Wj;Mit&7#Rg*U+Z0?H{{CQV;`W6?)XfMRf?B{eliBBPjRy_k>p6gdFP4uBY>rE` z*r#*D_BX#MwIM>cyDFdp=bES|^=q(1KTWb)np7;5Iyb*DJVohMhCQ0vU0|~pplxD@ zfxYr3ufa}Yg3Q{i(ze(jZJSFa#=HbmS;9EQtox*Sn%R?pmz~Ub*gtg1>tT3F23Zd* z1LOW=WEv`p25FQlXwn9#vufaQXG+m}qx>~UgX&}>{K0Q#^mk}@s7eX7S)GHrNI)E+ zV4BElBXS5@8-D%u1VKRxr$qU4m)aoJkkwKdx=$HWZ)tQ2pU#Cr_GPyYmdVczEHi7I z_YAO18;8roMT`8_kl@{c-B%#0JB5J8?b#3@D@M2BHIERt3>)`5N!T_D&Su?~7o5ZW z?^@3MUN)BSERomZ5XY9=6n%tj{cjZiUd6^w*O^~ZogBANlb zi}Cdn^-6R>-kGpYCBJL>(-S^>sVT%UjOJPvrvbIk0d>lQ1%5B&P=zW|MM#zl{LYiL zaLbH&%-T<9Z#3So=*LyUw^RYm@Zhj*(yQ4>iQw(EE!JL9>|Oz zD?_+Yzby~jHT?`}REJU{XDZmTy!2{$w`r^VP_LSL;)i6{>aA z6jxk4mAvzDL5&)-<#&CF*RnJ=W-%J@cBf}*r4e>_0~;m~7WCB(9}C=@Ivzv?-9G}% zQvRg6-@>omehlvQNg_W_ea%iMUiF&Wu>QA2Xc|L<=8s0oUJhnYoZR(o+j9av+*FDr ztP#`JC0fImn{zfgqcE5vkeZxnC!3$Oz&fpXu*d#Df9L~7?LTZ$8{MqF0uQF;Z2Ux1 zXIyj82z6yFxvvXIP?A4rHZ^HW0XKKLxWNfzse*8F1@%h(0&1nc%@w36lY`i8^xYYW ztO(j~I&!d4JwoqlgI2DepcDB0R8jm2l4#N-4XF(dLo2T5HOic%lCSQ9-g>~O^G`;M z2;#IR*aBsDz|j>0=*^GJfYh^W0oF~UKH=#B0d)wFHEcsac%$dV#(?@>BMRjT7w=!I z@Cbj|87s1GGyy>_eWv`{@g)SgVu?eQ^WG~0i(k@cxJIAocq3pF$u96Gz)V4?<~H=rt>3RMVbT`dt^&+FptNxJ z1HLBE9wbSV<}k+t|D*MsjbBv#Hg2S{#+q6k!WI>>y@y&`-fX1Q4J-$=LU7QWPgCyH zhWYgx0Np~R%Z2oGfK-E2LwM#4!$Y#bzCNB^XPVUU2mVwYAW5a+20DOpNNFxzUTn*H zTjNNnbd`!TQxEn-%Sqj7paQg*c!v#L$-_xbm%GGx32Xy8#phpSj0NpOaTd_-P79yLopIDg&+ok19!k~Fy!PD#6aDL~Px54U zgTW18p}g~9mw}sXgWb`4nKc-D1i4_Ny8ufFBYLc>v1y!JdtA7; zn;AAekh|fE%SImC{}mi+nwGavL%t7xIO*oMl0$q!8;(Z`Aam?5Ev$+KL8m-61MRyB zfVQAJ0)QZY-?<08sFpJ_01TFuxN2``~l!`>-nNR&XF>w+>EK>sW9-P!Ed$lVn%!m;!IzZD2~xo5A*OaDz1D z8g~E(u@OrV2@9y}j0qi`f48S*SsF)<<3DeY*q;gBTIuz5@W>I)Lm`y4aKdyG#|4+a1zV7uDm&9=*)_;pU>3D$oPH!8@RHHa8vSLC?R8ZsjV$|YioKVx(FA0 z@)Fyp#xHzn!~^RLKib-W&_4s%O+aAHKTCD{PuQmiWxzJaD}3jg8&^dZ2&^(#)E~V4 zI^=m>jwJI!n*R(A1eVTe41RcbKfWuESmWEgulLVi!&oo!u6Bw)X#FO@9%^Uqci*;O zA~9B?X|1o=;xOF;JkU-XoyjFO!aRwWu)IpDv=7@{*`-k43^+1Z-&qWj2oUfmmx7chNOjy#5ps@N>+N z%IccrUFvKG?0fh(JE#5gG>=(i#*xTSTflr^xWzS(G9a=TLY0&-t;sPMe<0l9mdZLG zx`0~4!ldv)=~kJZplthnZxztK92-&q;IbM(P!MqK58(abn{c{A(IEWOY%SE;!jDce zmq^&ta1{UCD?(}(i*prF*34<}@#NF2g4#AzheL_07ETMl zj-7xzMn1_lrPR3jvttmop0+3{9FMbbZQL5k7!1dofmEcW4DOCHA~^sKUIYAoYK~RP zJAfGN3`YD@O=&CGbyeo zW<5Oc`y`oCAMVeQ9A^jZkvxd)E@U@e$2&HD0^u39(;+vzQb8?24&b3jf7#HVWTr3N z!BCjKkKb5U@Rc$G>fugdRFwa0SIs038&X5ni2Sue1fM*M zk4!9Yj*G83pX7)E{_pRXw9ecbPkzbs-;YNkfw;cGQ)uQtF95z|!0H0W&aM!^aG&G=ji7L%RTt5ATX+7>+Amwnh`Mrsb=^6f1Y3wJ=&^KoDQgR z`mBLx#5r$`W4VM`|2HpyKQ5h<``^->foY9uf2X_Cf4`IfjGF&Y@4p|l-WhB8O4&SD z{@=WkB4%<9iSZvA9}?q`GwAYnC?i99{L%FPS>FadgzWH#wI|Z zpmi9i9Y(E(A^c%J<9|t%!{p9krt5DC$?!1k_rG-HAu;~%wDTcn9C8NWKp&P04(ld= zt22j1q{E6D-D@~3FCNxf|HcxBh3CU6{DEyaY)Lrm&-mNKaoCdZ|Ff2ap85ybM~<*a z8R}lYBdB%Q#dFxwbkJROm;yXZ0Uo9R|KH7)hgq+~tk+@Iiw3&cscIg_5&!B4@W=3m LscxyZ!;}95bjd0s literal 0 HcmV?d00001 diff --git a/star_lock/lib/appRouters.dart b/star_lock/lib/appRouters.dart index 40ddf2ff..31d30827 100644 --- a/star_lock/lib/appRouters.dart +++ b/star_lock/lib/appRouters.dart @@ -6,22 +6,15 @@ import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/ma import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupList_page.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart'; import 'package:star_lock/main/lockDetail/lcokSet/addFamily/addFamily_page.dart'; -import 'package:star_lock/main/lockDetail/lcokSet/catEyeSet/catEyeSet_page.dart'; -import 'package:star_lock/main/lockDetail/lcokSet/catEyeWorkMode/catEyeWorkMode_page.dart'; -import 'package:star_lock/main/lockDetail/lcokSet/coerceFingerprint/coerceFingerprint_page.dart'; -import 'package:star_lock/main/lockDetail/lcokSet/coerceFingerprintList/coerceFingerprintList_page.dart'; -import 'package:star_lock/main/lockDetail/lcokSet/coerceOpenDoor/coerceOpenDoor_page.dart'; +import 'package:star_lock/main/lockDetail/lcokSet/catEyeSet/catEyeSet/catEyeSet_page.dart'; import 'package:star_lock/main/lockDetail/lcokSet/faceUnlock/faceUnlock_page.dart'; import 'package:star_lock/main/lockDetail/lcokSet/familyDetails/familyDetails_page.dart'; import 'package:star_lock/main/lockDetail/lcokSet/lockUser/lockUser_page.dart'; -import 'package:star_lock/main/lockDetail/lcokSet/lowBatteryReminder/lowBatteryReminder_page.dart'; import 'package:star_lock/main/lockDetail/lcokSet/motorPower/motorPower_page.dart'; -import 'package:star_lock/main/lockDetail/lcokSet/msgNotification/msgNotification_page.dart'; +import 'package:star_lock/main/lockDetail/lcokSet/msgNotification/msgNotification/msgNotification_page.dart'; import 'package:star_lock/main/lockDetail/lcokSet/notificationMode/notificationMode_page.dart'; import 'package:star_lock/main/lockDetail/lcokSet/openDoorDirection/openDoorDirection_page.dart'; -import 'package:star_lock/main/lockDetail/lcokSet/openDoorNotify/openDoorNotify_page.dart'; import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_main_page.dart'; -import 'package:star_lock/main/lockDetail/lcokSet/nDaysUnopened/nDaysUnopened_page.dart'; import 'package:star_lock/main/lockDetail/otherTypeKey/addFace/addFace_page.dart'; import 'package:star_lock/mine/about/webviewShow_page.dart'; import 'package:star_lock/mine/mine/safeVerify/safeVerify_page.dart'; @@ -63,6 +56,7 @@ import 'main/lockDetail/lcokSet/basicInformation/editLockName/editLockName_page. import 'main/lockDetail/lcokSet/basicInformation/lockSeletGrouping/lockSeletGrouping_page.dart'; import 'main/lockDetail/lcokSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_page.dart'; import 'main/lockDetail/lcokSet/burglarAlarm/burglarAlarm_page.dart'; +import 'main/lockDetail/lcokSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_page.dart'; import 'main/lockDetail/lcokSet/checkInCreatCompany/checkInCreatCompany_page.dart'; import 'main/lockDetail/lcokSet/configuringWifi/configuringWifi_page.dart'; import 'main/lockDetail/lcokSet/diagnose/diagnose_page.dart'; @@ -75,6 +69,12 @@ import 'main/lockDetail/lcokSet/lockSet/lockSet_page.dart'; import 'main/lockDetail/lcokSet/lockSoundSet/lockSoundSet_page.dart'; import 'main/lockDetail/lcokSet/lockTime/lockTime_page.dart'; import 'main/lockDetail/lcokSet/markedHouseState/markedHouseState_page.dart'; +import 'main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_page.dart'; +import 'main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceFingerprintList/coerceFingerprintList_page.dart'; +import 'main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_page.dart'; +import 'main/lockDetail/lcokSet/msgNotification/lowBatteryReminder/lowBatteryReminder_page.dart'; +import 'main/lockDetail/lcokSet/msgNotification/nDaysUnopened/nDaysUnopened_page.dart'; +import 'main/lockDetail/lcokSet/msgNotification/openDoorNotify/openDoorNotify_page.dart'; import 'main/lockDetail/lcokSet/normallyOpenMode/normallyOpenMode_page.dart'; import 'main/lockDetail/lcokSet/remoteUnlocking/remoteUnlocking_page.dart'; import 'main/lockDetail/lcokSet/resetButton/resetButton_page.dart'; diff --git a/star_lock/lib/blue/blue_manage.dart b/star_lock/lib/blue/blue_manage.dart index 0ca50143..3a4fc21b 100644 --- a/star_lock/lib/blue/blue_manage.dart +++ b/star_lock/lib/blue/blue_manage.dart @@ -120,6 +120,10 @@ class BlueManage{ } }); } + + if(deviceConnectionState == DeviceConnectionState.connected){ + return; + } _flutterReactiveBle!.connectToDevice(id: connectDeviceMacAddress, connectionTimeout: const Duration(seconds: 100000)).listen((connectionStateUpdate) async { // 获取状态 deviceConnectionState = connectionStateUpdate.connectionState; @@ -214,12 +218,15 @@ class BlueManage{ } // 重新连接 - Future judgeReconnect(String deviceMAC, String deviceName, ConnectStateCallBack? connectStateCallBack, {bool isShowLoading = true}) async { + Future judgeReconnect(String deviceMAC, String deviceName, ConnectStateCallBack? connectStateCallBack, {bool isShowLoading = true, bool isShowToast = true}) async { // print("11111111$deviceConnectionState"); - if(deviceMAC.isEmpty){ - Toast.show(msg: "未连接到设备,请确保在设备附近,设备未被连接,设备已打开"); - // return; + if(isShowToast){ + if(deviceMAC.isEmpty){ + Toast.show(msg: "未连接到设备,请确保在设备附近,设备未被连接,设备已打开"); + // return; + } } + if(deviceConnectionState == DeviceConnectionState.connected){ // print("2222222:$deviceConnectionState"); if(isShowLoading){ @@ -303,7 +310,7 @@ class BlueManage{ // 当包有头时 // 判断是否需要分包 dataLen = data[8] * 256 + data[9]; - print("dataLen1111:$dataLen getDataLength:${data.length}"); + // print("dataLen1111:$dataLen getDataLength:${data.length}"); if(dataLen + 12 > data.length){ // 当前包的长度小于实际的包时 分包添加 不解析 allData.addAll(data); @@ -318,7 +325,7 @@ class BlueManage{ // 当包没有头时 是分包的包 直接添加 allData.addAll(data); // var len = allData[8] * 256 + allData[9]; - print("dataLen222:$dataLen"); + // print("dataLen222:$dataLen"); if(dataLen <= (allData.length - 14)){ // 当长度小于等于当前包的数据时 直接解析数据 CommandReciverManager.appDataReceive(allData); diff --git a/star_lock/lib/blue/io_protocol/io_openLock.dart b/star_lock/lib/blue/io_protocol/io_openLock.dart index 3e376694..1cecd9b3 100644 --- a/star_lock/lib/blue/io_protocol/io_openLock.dart +++ b/star_lock/lib/blue/io_protocol/io_openLock.dart @@ -13,6 +13,7 @@ class OpenLockCommand extends SenderProtocol { String? userID; int? openMode; int? openTime; + String? onlineToken; List? token; int? needAuthor; List? signKey; @@ -22,6 +23,7 @@ class OpenLockCommand extends SenderProtocol { this.userID, this.openMode, this.openTime, + this.onlineToken, this.token, this.needAuthor, this.signKey, @@ -102,6 +104,15 @@ class OpenLockCommand extends SenderProtocol { data.addAll(authCode.bytes); } + //onlineToken 16 + print("onlineToken:$onlineToken"); + if(onlineToken!.isNotEmpty){ + int onlineTokenLength = utf8.encode(onlineToken!).length; + print("openDoorOnlineToken:${utf8.encode(onlineToken!)} utf8.encode(onlineToken!).length:${utf8.encode(onlineToken!).length}"); + data.addAll(utf8.encode(onlineToken!)); + data = getFixedLengthList(data, 16 - onlineTokenLength); + } + if ((data.length % 16) != 0) { int add = (16 - data.length % 16); for (int i = 0; i < add; i++) { diff --git a/star_lock/lib/blue/io_protocol/io_senderCustomPasswords.dart b/star_lock/lib/blue/io_protocol/io_senderCustomPasswords.dart index 80340749..1bbaca9e 100644 --- a/star_lock/lib/blue/io_protocol/io_senderCustomPasswords.dart +++ b/star_lock/lib/blue/io_protocol/io_senderCustomPasswords.dart @@ -8,7 +8,7 @@ import '../io_sender.dart'; import '../io_type.dart'; import 'package:crypto/crypto.dart' as crypto; -//TODO:设置自定义密码 +//TODO:设置开锁密码(备注:先添加管理员密码, 管理员满了后就是开锁密码) /* 备注:删除单个密码规则:pwd 设置为 6 个 0,UseCountLimit 设置为 0。删除全部密码规则:pwd 设置为 6 个 0,UseCountLimit 设置为 0,pwdNo 设置为 255,userId 设置为“DeleteAll !@#”,只有门锁管理员才有权限 **/ diff --git a/star_lock/lib/blue/sender_manage.dart b/star_lock/lib/blue/sender_manage.dart index 35fdc17f..6f9531ae 100644 --- a/star_lock/lib/blue/sender_manage.dart +++ b/star_lock/lib/blue/sender_manage.dart @@ -161,6 +161,7 @@ class IoSenderManage { String? userID, int? openMode, int? openTime, + String? onlineToken, List? token, int? needAuthor, List? signKey, @@ -172,6 +173,7 @@ class IoSenderManage { userID: userID, openMode: openMode, openTime: openTime, + onlineToken: onlineToken, token: token, needAuthor: needAuthor, signKey: signKey, diff --git a/star_lock/lib/main/lockDetail/authorizedAdmin/authorizedAdminDetail/authorizedAdminDetail_page.dart b/star_lock/lib/main/lockDetail/authorizedAdmin/authorizedAdminDetail/authorizedAdminDetail_page.dart index e872a383..e025e781 100644 --- a/star_lock/lib/main/lockDetail/authorizedAdmin/authorizedAdminDetail/authorizedAdminDetail_page.dart +++ b/star_lock/lib/main/lockDetail/authorizedAdmin/authorizedAdminDetail/authorizedAdminDetail_page.dart @@ -194,24 +194,6 @@ class _AuthorizedAdminDetailPageState extends State { hintText: "请输入要修改的名字", //不需要输入框下划线 border: InputBorder.none, - //左边图标设置 - // icon: Padding( - // padding: EdgeInsets.only(top:30.w, bottom: 20.w, right: 20.w, left: 20.w), - // child: Image.asset('images/main/icon_main_search.png', width: 40.w, height: 40.w,), - // ), - // //右边图标设置 - // suffixIcon: GestureDetector( - // onTap: () { - // //addPostFrameCallback是 StatefulWidge 渲染结束的回调,只会被调用一次 - // // SchedulerBinding.instance.addPostFrameCallback((_) { - // // _controller.text = ""; - // // }); - // }, - // child: Padding( - // padding: EdgeInsets.all(8), - // child: Image.asset('images/main/icon_main_cell.png', width: 50.w, height: 50.w,), - // ), - // ) ), ), ) diff --git a/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicManageKey/sendElectronicKeyManage_tabbar.dart b/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicManageKey/sendElectronicKeyManage_tabbar.dart index 824b731a..1329f520 100644 --- a/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicManageKey/sendElectronicKeyManage_tabbar.dart +++ b/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicManageKey/sendElectronicKeyManage_tabbar.dart @@ -79,7 +79,7 @@ class _SendElectronicKeyManageTabbarState return Tab( // text: item.title, child: Container( - width: 1.sw / 8, + // width: 1.sw / 8, margin: EdgeInsets.all(10.w), // color: Colors.red, child: Text( diff --git a/star_lock/lib/main/lockDetail/lcokSet/automaticBlocking/automaticBlocking_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/automaticBlocking/automaticBlocking_logic.dart index 5b8d43b5..7a9e4bf8 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/automaticBlocking/automaticBlocking_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/automaticBlocking/automaticBlocking_logic.dart @@ -138,7 +138,7 @@ class AutomaticBlockingLogic extends BaseGetXController{ privateKey: getPrivateKeyList ); } - }, isShowLoading: true); + }); } // 设置支持功能(带参数) diff --git a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_logic.dart index 78edf145..35f2e215 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_logic.dart @@ -36,7 +36,7 @@ class AdminOpenLockPasswordLogic extends BaseGetXController{ privateKey: getPrivateKeyList ); } - }, isShowLoading: true); + }); } @override diff --git a/star_lock/lib/main/lockDetail/lcokSet/burglarAlarm/burglarAlarm_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/burglarAlarm/burglarAlarm_logic.dart index 6398a687..41322f74 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/burglarAlarm/burglarAlarm_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/burglarAlarm/burglarAlarm_logic.dart @@ -133,7 +133,7 @@ class BurglarAlarmLogic extends BaseGetXController{ privateKey: getPrivateKeyList ); } - }, isShowLoading: true); + }); } // 设置支持功能(带参数) diff --git a/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeSet_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeSet/catEyeSet_logic.dart similarity index 65% rename from star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeSet_logic.dart rename to star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeSet/catEyeSet_logic.dart index ee813201..42f67ac1 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeSet_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeSet/catEyeSet_logic.dart @@ -1,6 +1,7 @@ -import 'package:star_lock/main/lockDetail/lcokSet/catEyeSet/catEyeSet_state.dart'; import 'package:star_lock/tools/baseGetXController.dart'; +import 'catEyeSet_state.dart'; + class CatEyeSetLogic extends BaseGetXController { final CatEyeSetState state = CatEyeSetState(); } diff --git a/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeSet_page.dart b/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeSet/catEyeSet_page.dart similarity index 93% rename from star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeSet_page.dart rename to star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeSet/catEyeSet_page.dart index 27abc1fa..2b9bb695 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeSet_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeSet/catEyeSet_page.dart @@ -1,13 +1,14 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; -import 'package:star_lock/main/lockDetail/lcokSet/catEyeSet/catEyeSet_logic.dart'; +import 'package:star_lock/main/lockDetail/lcokSet/catEyeSet/catEyeSet/catEyeSet_logic.dart'; import 'package:star_lock/tools/commonItem.dart'; import 'package:star_lock/tools/custom_bottom_sheet.dart'; -import '../../../../app_settings/app_colors.dart'; -import '../../../../tools/titleAppBar.dart'; +import '../../../../../app_settings/app_colors.dart'; +import '../../../../../tools/titleAppBar.dart'; class CatEyeSetPage extends StatefulWidget { const CatEyeSetPage({Key? key}) : super(key: key); @@ -23,7 +24,7 @@ class _CatEyeSetPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: Colors.white, + backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( barTitle: '猫眼设置', haveBack: true, @@ -33,6 +34,7 @@ class _CatEyeSetPageState extends State { CommonItem( leftTitel: '猫眼工作模式', rightTitle: "", + allHeight: 70.h, isHaveLine: true, isHaveDirection: true, action: () { diff --git a/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeSet_state.dart b/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeSet/catEyeSet_state.dart similarity index 100% rename from star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeSet_state.dart rename to star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeSet/catEyeSet_state.dart diff --git a/star_lock/lib/main/lockDetail/lcokSet/catEyeWorkMode/catEyeWorkMode_page.dart b/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_page.dart similarity index 97% rename from star_lock/lib/main/lockDetail/lcokSet/catEyeWorkMode/catEyeWorkMode_page.dart rename to star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_page.dart index b69ac372..24154e55 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/catEyeWorkMode/catEyeWorkMode_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_page.dart @@ -1,8 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import '../../../../app_settings/app_colors.dart'; -import '../../../../tools/titleAppBar.dart'; +import '../../../../../app_settings/app_colors.dart'; +import '../../../../../tools/titleAppBar.dart'; + class CatEyeWorkModePage extends StatefulWidget { const CatEyeWorkModePage({Key? key}) : super(key: key); diff --git a/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_logic.dart index 2573a862..a5805f28 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_logic.dart @@ -172,7 +172,7 @@ class ConfiguringWifiLogic extends BaseGetXController{ privateKey: getPrivateKeyList, ); } - }); + }, isShowLoading: true); } final _networkInfo = NetworkInfo(); diff --git a/star_lock/lib/main/lockDetail/lcokSet/faceUnlock/faceUnlock_page.dart b/star_lock/lib/main/lockDetail/lcokSet/faceUnlock/faceUnlock_page.dart index 20aebe50..fa2e2934 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/faceUnlock/faceUnlock_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/faceUnlock/faceUnlock_page.dart @@ -33,6 +33,7 @@ class _FaceUnlockPageState extends State { CommonItem( leftTitel: '面容开锁', rightTitle: "", + allHeight: 70.h, isHaveLine: true, isHaveRightWidget: true, rightWidget: diff --git a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_logic.dart index 39a76a8a..4848868e 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_logic.dart @@ -202,7 +202,13 @@ class LockSetLogic extends BaseGetXController { //成功 print("${reply.commandType}数据解析成功"); // Toast.show(msg: "操作成功");featureEnable = state.isOpenStayWarn.value == 1 ? 0 : 1; - if(state.settingUpSupportFeatures == 56){ + if(state.settingUpSupportFeatures == 55){ + // APP开锁时是否需联网 + state.isOpenLockNeedOnline.value = state.isOpenLockNeedOnline.value == 1 ? 0 : 1; + state.lockSetInfoData.value.lockSettingInfo!.appUnlockOnline = state.isOpenLockNeedOnline.value; + setLockSetOpenLockNeedOnline(); + eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(0, state.lockSetInfoData.value.lockSettingInfo!.appUnlockOnline!)); + }else if(state.settingUpSupportFeatures == 56){ // 蓝牙广播 state.isOpenBlueBroadcast.value = state.isOpenBlueBroadcast.value == 1 ? 0 : 1; state.lockSetInfoData.value.lockSettingInfo!.bluetoothBroadcast = state.isOpenBlueBroadcast.value; @@ -215,7 +221,6 @@ class LockSetLogic extends BaseGetXController { state.isOpenExceptionWarnings.value = state.isOpenExceptionWarnings.value == 1 ? 0 : 1; state.lockSetInfoData.value.lockSettingInfo!.abnormalWarn = state.isOpenExceptionWarnings.value; } - print("isOpenBlueBroadcast111:${state.isOpenBlueBroadcast.value}"); break; case 0x06: @@ -337,7 +342,10 @@ class LockSetLogic extends BaseGetXController { state.settingUpSupportFeatures = type; var featureEnable = 0; - if(type == 56){ + if(type == 55){ + // APP开锁时是否需联网 + featureEnable = state.isOpenLockNeedOnline.value == 1 ? 0 : 1; + }else if(type == 56){ // 蓝牙广播 featureEnable = state.isOpenBlueBroadcast.value == 1 ? 0 : 1; }else if(type == 61){ @@ -371,9 +379,11 @@ class LockSetLogic extends BaseGetXController { state.lockFeature.value = state.lockSetInfoData.value.lockFeature!; state.lockStatus.value = state.lockSetInfoData.value.lockStatus!; state.isAttendance.value = state.lockSettingInfo.value.attendance!; + state.isOpenLockNeedOnline.value = state.lockSettingInfo.value.appUnlockOnline!; state.isOpenBlueBroadcast.value = state.lockSettingInfo.value.bluetoothBroadcast!; state.isOpenExceptionWarnings.value = state.lockSettingInfo.value.bluetoothBroadcast!; + // await _readSupportFunctionsNoParameters(56); // _readSupportFunctionsNoParameters(62); } @@ -406,7 +416,7 @@ class LockSetLogic extends BaseGetXController { password: state.passwordTF.text, ); if (entity.errorCode!.codeIsSuccessful) { - // deletLockInfoData(); + deletLockInfoData(); blockDeletNumberCheckPasswordCallback(); // if(state.currentDeviceUUid.value.isEmpty){ @@ -459,6 +469,8 @@ class LockSetLogic extends BaseGetXController { state.isAttendance.value = (state.isAttendance.value == 1 ? 0 : 1); state.lockSettingInfo.value.attendance = state.isAttendance.value; + + eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(0, state.lockSettingInfo.value.attendance!)); print("state.lockSettingInfo.value.attendance:${state.lockSettingInfo.value.attendance}"); Toast.show(msg: "设置成功"); } @@ -479,6 +491,24 @@ class LockSetLogic extends BaseGetXController { } else {} } + // 设置是否打开开锁时是否需联网 + void setLockSetOpenLockNeedOnline() async { + var entity = await ApiRepository.to.setOpenLockNeedOnlineData( + lockId: state.lockSetInfoData.value.lockId!, + appUnlockOnline:state.isOpenLockNeedOnline.value == 1 ? 0 : 1, + ); + if(entity.errorCode!.codeIsSuccessful){ + eventBus.fire(RefreshLockListInfoDataEvent()); + + state.isAttendance.value = (state.isAttendance.value == 1 ? 0 : 1); + state.lockSettingInfo.value.attendance = state.isAttendance.value; + + eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(0, state.lockSettingInfo.value.attendance!)); + print("state.lockSettingInfo.value.attendance:${state.lockSettingInfo.value.attendance}"); + Toast.show(msg: "设置成功"); + } + } + // 下级界面修改成功后传递数据 StreamSubscription? _passCurrentLockInformationEvent; void initLoadDataAction(BlockSetStateCallback blockSetStateCallback) { diff --git a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart index f8a1b2e3..5bc6bac0 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart @@ -414,6 +414,19 @@ class _LockSetPageState extends State with RouteAware { isHaveRightWidget: true, rightWidget: _lockRemindSwitch())), ), + // APP开锁时是否需联网 + Obx(() => + Visibility( + visible: state.lockFeature.value.appUnlockOnline == 1 ? true : false, + child: + CommonItem( + leftTitel: "开锁时是否需联网", + rightTitle: "", + isHaveLine: false, + isHaveRightWidget: true, + rightWidget: _openLockNeedOnlineSwitch()), + ), + ), SizedBox(height: 10.h), // wifi配网 Obx( @@ -533,6 +546,7 @@ class _LockSetPageState extends State with RouteAware { style: TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor)); } + // 开启考勤 CupertinoSwitch _openCheckInSwitch() { // print("111111state.lockSettingInfo.value.attendance:${state.lockSettingInfo.value.attendance}"); return CupertinoSwitch( @@ -552,6 +566,7 @@ class _LockSetPageState extends State with RouteAware { ); } + // 开锁提醒 CupertinoSwitch _lockRemindSwitch() { return CupertinoSwitch( activeColor: CupertinoColors.activeBlue, @@ -566,6 +581,21 @@ class _LockSetPageState extends State with RouteAware { ); } + // APP开锁时是否需联网 + CupertinoSwitch _openLockNeedOnlineSwitch() { + return CupertinoSwitch( + activeColor: CupertinoColors.activeBlue, + trackColor: CupertinoColors.systemGrey5, + thumbColor: CupertinoColors.white, + value: (state.isOpenLockNeedOnline.value) == 1 ? true : false, + onChanged: (value) { + setState(() { + logic.sendBurglarAlarm(55); + }); + }, + ); + } + // 异常警告 CupertinoSwitch _lockExceptionWarningsSwitch() { print("isOpenBlueBroadcast222:${state.isOpenExceptionWarnings.value}"); diff --git a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_state.dart b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_state.dart index 759af3ef..a49a2fed 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_state.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_state.dart @@ -13,6 +13,7 @@ class LockSetState { var isAttendance = 0.obs;// 是否开启考勤 var currentDeviceUUid = "".obs;// 当前设备的uuid + var isOpenLockNeedOnline = 0.obs;// APP开锁时是否需联网 var isLockPickingReminder = 0.obs;// 是否开启开锁提醒 var isOpenBlueBroadcast = 0.obs;// 是否开启蓝牙广播 diff --git a/star_lock/lib/main/lockDetail/lcokSet/lockSoundSet/lockSoundSet_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/lockSoundSet/lockSoundSet_logic.dart index 6baebc17..c4ff99cf 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/lockSoundSet/lockSoundSet_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/lockSoundSet/lockSoundSet_logic.dart @@ -141,7 +141,7 @@ class LockSoundSetLogic extends BaseGetXController { privateKey: getPrivateKeyList ); } - }, isShowLoading: true); + }); } // 设置支持功能(带参数) diff --git a/star_lock/lib/main/lockDetail/lcokSet/lockTime/lockTime_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/lockTime/lockTime_logic.dart index 34464025..af85a3e9 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/lockTime/lockTime_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/lockTime/lockTime_logic.dart @@ -31,58 +31,58 @@ class LockTimeLogic extends BaseGetXController{ } // 获取锁状态 - if(reply is GetLockStatuReply) { - _replyGetLockStatus(reply); - } + // if(reply is GetLockStatuReply) { + // _replyGetLockStatus(reply); + // } }); } // 获取锁状态数据解析 - Future _replyGetLockStatus(Reply reply) async { - int status = reply.data[2]; - switch(status){ - case 0x00: - //成功 - print("${reply.commandType}数据解析成功"); - - // 锁当前时间 - var lockTime = reply.data.sublist(60, 64); - - int value = ( - (0xff & lockTime[(0)]) << 24 | - (0xff & lockTime[1]) << 16 | - (0xff & lockTime[2]) << 8 | - (0xFF & lockTime[3])); - - String dataEime = DateTool().dateToYMDHNSString("$value"); - state.dateTime.value = dataEime; - - // String dataEime = DateTool().dateToYMDHNSString("${value}"); - // state.dateTime.value = dataEime; - print("lockTime:$lockTime value:$value dataEime:$dataEime"); - break; - case 0x06: - //无权限 - print("${reply.commandType}需要鉴权"); - - break; - case 0x07: - //无权限 - print("${reply.commandType}用户无权限"); - - break; - case 0x09: - // 权限校验错误 - print("${reply.commandType}权限校验错误"); - - break; - default: - //失败 - print("${reply.commandType}失败"); - - break; - } - } + // Future _replyGetLockStatus(Reply reply) async { + // int status = reply.data[2]; + // switch(status){ + // case 0x00: + // //成功 + // print("${reply.commandType}数据解析成功"); + // + // // 锁当前时间 + // var lockTime = reply.data.sublist(60, 64); + // + // int value = ( + // (0xff & lockTime[(0)]) << 24 | + // (0xff & lockTime[1]) << 16 | + // (0xff & lockTime[2]) << 8 | + // (0xFF & lockTime[3])); + // + // String dataEime = DateTool().dateToYMDHNSString("$value"); + // state.dateTime.value = dataEime; + // + // // String dataEime = DateTool().dateToYMDHNSString("${value}"); + // // state.dateTime.value = dataEime; + // print("lockTime:$lockTime value:$value dataEime:$dataEime"); + // break; + // case 0x06: + // //无权限 + // print("${reply.commandType}需要鉴权"); + // + // break; + // case 0x07: + // //无权限 + // print("${reply.commandType}用户无权限"); + // + // break; + // case 0x09: + // // 权限校验错误 + // print("${reply.commandType}权限校验错误"); + // + // break; + // default: + // //失败 + // print("${reply.commandType}失败"); + // + // break; + // } + // } // 校时数据解析 Future _replyTiming(Reply reply) async { @@ -129,20 +129,20 @@ class LockTimeLogic extends BaseGetXController{ } // 获取锁状态 - Future _getLockStatus() async { - // 进来之后首先连接 - BlueManage().judgeReconnect(BlueManage().connectDeviceMacAddress, BlueManage().connectDeviceName, (DeviceConnectionState state) async { - if (state == DeviceConnectionState.connected) { - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); - IoSenderManage.senderGetLockStatu( - lockID:BlueManage().connectDeviceName, - userID:await Storage.getUid(), - privateKey:getPrivateKeyList, - ); - } - }, isShowLoading: false); - } + // Future _getLockStatus() async { + // // 进来之后首先连接 + // BlueManage().judgeReconnect(BlueManage().connectDeviceMacAddress, BlueManage().connectDeviceName, (DeviceConnectionState state) async { + // if (state == DeviceConnectionState.connected) { + // var privateKey = await Storage.getStringList(saveBluePrivateKey); + // List getPrivateKeyList = changeStringListToIntList(privateKey!); + // IoSenderManage.senderGetLockStatu( + // lockID:BlueManage().connectDeviceName, + // userID:await Storage.getUid(), + // privateKey:getPrivateKeyList, + // ); + // } + // }, isShowLoading: false); + // } // 校验时间 Future sendTiming() async { diff --git a/star_lock/lib/main/lockDetail/lcokSet/motorPower/motorPower_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/motorPower/motorPower_logic.dart index 6b0f5c69..822797bf 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/motorPower/motorPower_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/motorPower/motorPower_logic.dart @@ -132,7 +132,7 @@ class MotorPowerLogic extends BaseGetXController { privateKey: getPrivateKeyList ); } - }, isShowLoading: true); + }); } // 设置支持功能(带参数) diff --git a/star_lock/lib/main/lockDetail/lcokSet/coerceFingerprint/coerceFingerprint_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_logic.dart similarity index 100% rename from star_lock/lib/main/lockDetail/lcokSet/coerceFingerprint/coerceFingerprint_logic.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_logic.dart diff --git a/star_lock/lib/main/lockDetail/lcokSet/coerceFingerprint/coerceFingerprint_page.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_page.dart similarity index 96% rename from star_lock/lib/main/lockDetail/lcokSet/coerceFingerprint/coerceFingerprint_page.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_page.dart index 166eed11..a14e83b0 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/coerceFingerprint/coerceFingerprint_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_page.dart @@ -5,8 +5,8 @@ import 'package:star_lock/appRouters.dart'; import 'package:star_lock/tools/commonItem.dart'; import 'package:star_lock/tools/submitBtn.dart'; -import '../../../../../app_settings/app_colors.dart'; -import '../../../../../tools/titleAppBar.dart'; +import '../../../../../../app_settings/app_colors.dart'; +import '../../../../../../tools/titleAppBar.dart'; class CoerceFingerprintPage extends StatefulWidget { const CoerceFingerprintPage({Key? key}) : super(key: key); diff --git a/star_lock/lib/main/lockDetail/lcokSet/coerceFingerprint/coerceFingerprint_state.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_state.dart similarity index 100% rename from star_lock/lib/main/lockDetail/lcokSet/coerceFingerprint/coerceFingerprint_state.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_state.dart diff --git a/star_lock/lib/main/lockDetail/lcokSet/coerceFingerprintList/coerceFingerprintList_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceFingerprintList/coerceFingerprintList_logic.dart similarity index 100% rename from star_lock/lib/main/lockDetail/lcokSet/coerceFingerprintList/coerceFingerprintList_logic.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceFingerprintList/coerceFingerprintList_logic.dart diff --git a/star_lock/lib/main/lockDetail/lcokSet/coerceFingerprintList/coerceFingerprintList_page.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceFingerprintList/coerceFingerprintList_page.dart similarity index 95% rename from star_lock/lib/main/lockDetail/lcokSet/coerceFingerprintList/coerceFingerprintList_page.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceFingerprintList/coerceFingerprintList_page.dart index 0d99a0c5..1e7ad2e2 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/coerceFingerprintList/coerceFingerprintList_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceFingerprintList/coerceFingerprintList_page.dart @@ -2,10 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/lcokSet/lockUser/lockUser_logic.dart'; -import '../../../../app_settings/app_colors.dart'; -import '../../../../tools/submitBtn.dart'; -import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; + +import '../../../../../../app_settings/app_colors.dart'; +import '../../../../../../tools/submitBtn.dart'; +import '../../../../../../tools/titleAppBar.dart'; +import '../../../../../../translations/trans_lib.dart'; class CoerceFingerprintListPage extends StatefulWidget { const CoerceFingerprintListPage({Key? key}) : super(key: key); diff --git a/star_lock/lib/main/lockDetail/lcokSet/coerceFingerprintList/coerceFingerprintList_state.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceFingerprintList/coerceFingerprintList_state.dart similarity index 100% rename from star_lock/lib/main/lockDetail/lcokSet/coerceFingerprintList/coerceFingerprintList_state.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceFingerprintList/coerceFingerprintList_state.dart diff --git a/star_lock/lib/main/lockDetail/lcokSet/coerceOpenDoor/coerceOpenDoor_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_logic.dart similarity index 65% rename from star_lock/lib/main/lockDetail/lcokSet/coerceOpenDoor/coerceOpenDoor_logic.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_logic.dart index cf0d75b2..dbd8306c 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/coerceOpenDoor/coerceOpenDoor_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_logic.dart @@ -1,6 +1,7 @@ -import 'package:star_lock/main/lockDetail/lcokSet/coerceOpenDoor/coerceOpenDoor_state.dart'; import 'package:star_lock/tools/baseGetXController.dart'; +import 'coerceOpenDoor_state.dart'; + class CoerceOpenDoorLogic extends BaseGetXController { final CoerceOpenDoorState state = CoerceOpenDoorState(); } diff --git a/star_lock/lib/main/lockDetail/lcokSet/coerceOpenDoor/coerceOpenDoor_page.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_page.dart similarity index 95% rename from star_lock/lib/main/lockDetail/lcokSet/coerceOpenDoor/coerceOpenDoor_page.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_page.dart index 8899b845..4171e4de 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/coerceOpenDoor/coerceOpenDoor_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_page.dart @@ -2,10 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; -import 'package:star_lock/main/lockDetail/lcokSet/coerceOpenDoor/coerceOpenDoor_logic.dart'; -import '../../../../app_settings/app_colors.dart'; -import '../../../../tools/submitBtn.dart'; -import '../../../../tools/titleAppBar.dart'; + +import '../../../../../../app_settings/app_colors.dart'; +import '../../../../../../tools/submitBtn.dart'; +import '../../../../../../tools/titleAppBar.dart'; +import 'coerceOpenDoor_logic.dart'; class CoerceOpenDoorPage extends StatefulWidget { const CoerceOpenDoorPage({Key? key}) : super(key: key); diff --git a/star_lock/lib/main/lockDetail/lcokSet/coerceOpenDoor/coerceOpenDoor_state.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_state.dart similarity index 100% rename from star_lock/lib/main/lockDetail/lcokSet/coerceOpenDoor/coerceOpenDoor_state.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_state.dart diff --git a/star_lock/lib/main/lockDetail/lcokSet/lowBatteryReminder/lowBatteryReminder_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/lowBatteryReminder/lowBatteryReminder_logic.dart similarity index 64% rename from star_lock/lib/main/lockDetail/lcokSet/lowBatteryReminder/lowBatteryReminder_logic.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/lowBatteryReminder/lowBatteryReminder_logic.dart index 833130f5..b080d53f 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/lowBatteryReminder/lowBatteryReminder_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/lowBatteryReminder/lowBatteryReminder_logic.dart @@ -1,6 +1,7 @@ -import 'package:star_lock/main/lockDetail/lcokSet/lowBatteryReminder/lowBatteryReminder_state.dart'; import 'package:star_lock/tools/baseGetXController.dart'; +import 'lowBatteryReminder_state.dart'; + class LowBatteryReminderLogic extends BaseGetXController { LowBatteryReminderState state = LowBatteryReminderState(); } diff --git a/star_lock/lib/main/lockDetail/lcokSet/lowBatteryReminder/lowBatteryReminder_page.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/lowBatteryReminder/lowBatteryReminder_page.dart similarity index 97% rename from star_lock/lib/main/lockDetail/lcokSet/lowBatteryReminder/lowBatteryReminder_page.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/lowBatteryReminder/lowBatteryReminder_page.dart index 1b2a5e4f..7bdc2f5f 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/lowBatteryReminder/lowBatteryReminder_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/lowBatteryReminder/lowBatteryReminder_page.dart @@ -3,12 +3,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; -import 'package:star_lock/main/lockDetail/lcokSet/lowBatteryReminder/lowBatteryReminder_logic.dart'; import 'package:star_lock/tools/commonItem.dart'; import 'package:star_lock/tools/submitBtn.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; +import 'lowBatteryReminder_logic.dart'; class LowBatteryReminderPage extends StatefulWidget { const LowBatteryReminderPage({Key? key}) : super(key: key); diff --git a/star_lock/lib/main/lockDetail/lcokSet/lowBatteryReminder/lowBatteryReminder_state.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/lowBatteryReminder/lowBatteryReminder_state.dart similarity index 100% rename from star_lock/lib/main/lockDetail/lcokSet/lowBatteryReminder/lowBatteryReminder_state.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/lowBatteryReminder/lowBatteryReminder_state.dart diff --git a/star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification/msgNotification_logic.dart similarity index 65% rename from star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification_logic.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification/msgNotification_logic.dart index 9817187a..0c09a6ee 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification/msgNotification_logic.dart @@ -1,5 +1,6 @@ -import 'package:star_lock/main/lockDetail/lcokSet/msgNotification/msgNotification_state.dart'; + import 'package:star_lock/tools/baseGetXController.dart'; +import 'msgNotification_state.dart'; class MsgNotificationLogic extends BaseGetXController { final MsgNotificationState state = MsgNotificationState(); diff --git a/star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification_page.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification/msgNotification_page.dart similarity index 76% rename from star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification_page.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification/msgNotification_page.dart index e65d973c..85fafd44 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification/msgNotification_page.dart @@ -3,11 +3,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; -import 'package:star_lock/main/lockDetail/lcokSet/msgNotification/msgNotification_logic.dart'; +import 'package:star_lock/main/lockDetail/lcokSet/msgNotification/msgNotification/msgNotification_logic.dart'; -import '../../../../app_settings/app_colors.dart'; -import '../../../../tools/commonItem.dart'; -import '../../../../tools/titleAppBar.dart'; +import '../../../../../app_settings/app_colors.dart'; +import '../../../../../tools/commonItem.dart'; +import '../../../../../tools/titleAppBar.dart'; class MsgNotificationPage extends StatefulWidget { const MsgNotificationPage({Key? key}) : super(key: key); @@ -38,7 +38,7 @@ class _MsgNotificationPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: Colors.white, + backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( barTitle: '消息提醒', haveBack: true, @@ -51,31 +51,33 @@ class _MsgNotificationPageState extends State { Widget _buildMainItem() { return Column( children: [ - Container( - alignment: Alignment.centerLeft, - margin: EdgeInsets.only(left: 40.w, top: 40.h, bottom: 30.h), - child: Text( - '门锁通知', - style: - TextStyle(color: AppColors.msgNoticeTextColor, fontSize: 24.sp), - ), - ), + // Container( + // alignment: Alignment.centerLeft, + // margin: EdgeInsets.only(left: 40.w, top: 20.h, bottom: 20.h), + // child: Text( + // '门锁通知', + // style: TextStyle(color: Colors.black, fontSize: 26.sp, fontWeight: FontWeight.w500), + // ), + // ), + // Divider( + // color: AppColors.greyLineColor, + // indent: 20.w, + // endIndent: 20.w, + // height: 1, + // ), CommonItem( leftTitel: '开门通知', rightTitle: "已启用", - isHaveLine: false, + isHaveLine: true, isHaveDirection: true, action: () { Get.toNamed(Routers.openDoorNotifyPage); }, ), - SizedBox( - height: 20.h, - ), CommonItem( leftTitel: 'N天未开门', rightTitle: "已启用", - isHaveLine: false, + isHaveLine: true, isHaveDirection: true, action: () { Get.toNamed(Routers.nDaysUnopenedPage); @@ -91,40 +93,28 @@ class _MsgNotificationPageState extends State { // isHaveRightWidget: true, // rightWidget: // SizedBox(width: 60.w, height: 50.h, child: _switch(1)))), - SizedBox( - height: 20.h, - ), Obx(() => CommonItem( leftTitel: '门未关好', rightTitle: "", - isHaveLine: false, + isHaveLine: true, isHaveRightWidget: true, rightWidget: SizedBox(width: 60.w, height: 50.h, child: _switch(2)))), - SizedBox( - height: 20.h, - ), CommonItem( leftTitel: '防拆报警', rightTitle: "已启用", - isHaveLine: false, + isHaveLine: true, isHaveDirection: true, ), - SizedBox( - height: 20.h, - ), CommonItem( leftTitel: '低电量提醒', rightTitle: "已启用", - isHaveLine: false, + isHaveLine: true, isHaveDirection: true, action: () { Get.toNamed(Routers.lowBatteryReminderPage); }, ), - SizedBox( - height: 20.h, - ), CommonItem( leftTitel: '胁迫开门', rightTitle: "", @@ -134,17 +124,16 @@ class _MsgNotificationPageState extends State { Get.toNamed(Routers.coerceOpenDoorPage); }, ), + // Container( + // alignment: Alignment.centerLeft, + // margin: EdgeInsets.only(left: 40.w, top: 20.h, bottom: 20.h), + // child: Text( + // '门铃通知', + // style: TextStyle(color: Colors.black, fontSize: 26.sp, fontWeight: FontWeight.w500), + // ), + // ), SizedBox( - height: 30.h, - ), - Container( - alignment: Alignment.centerLeft, - margin: EdgeInsets.only(left: 40.w, top: 40.h, bottom: 30.h), - child: Text( - '门铃通知', - style: - TextStyle(color: AppColors.msgNoticeTextColor, fontSize: 24.sp), - ), + height: 10.h, ), Obx(() => CommonItem( leftTitel: '有人按门铃', @@ -153,22 +142,21 @@ class _MsgNotificationPageState extends State { isHaveRightWidget: true, rightWidget: SizedBox(width: 60.w, height: 50.h, child: _switch(3)))), + // Container( + // alignment: Alignment.centerLeft, + // margin: EdgeInsets.only(left: 40.w, top: 40.h, bottom: 30.h), + // child: Text( + // '猫眼通知', + // style:TextStyle(color: Colors.black, fontSize: 26.sp, fontWeight: FontWeight.w500) + // ), + // ), SizedBox( - height: 30.h, - ), - Container( - alignment: Alignment.centerLeft, - margin: EdgeInsets.only(left: 40.w, top: 40.h, bottom: 30.h), - child: Text( - '猫眼通知', - style: - TextStyle(color: AppColors.msgNoticeTextColor, fontSize: 24.sp), - ), + height: 10.h, ), Obx(() => CommonItem( leftTitel: '有人出现在门口', rightTitle: "", - isHaveLine: false, + isHaveLine: true, isHaveRightWidget: true, rightWidget: SizedBox(width: 60.w, height: 50.h, child: _switch(4)))), diff --git a/star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification_state.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification/msgNotification_state.dart similarity index 100% rename from star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification_state.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification/msgNotification_state.dart diff --git a/star_lock/lib/main/lockDetail/lcokSet/nDaysUnopened/nDaysUnopened_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/nDaysUnopened/nDaysUnopened_logic.dart similarity index 64% rename from star_lock/lib/main/lockDetail/lcokSet/nDaysUnopened/nDaysUnopened_logic.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/nDaysUnopened/nDaysUnopened_logic.dart index 5b7aa719..e986ef89 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/nDaysUnopened/nDaysUnopened_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/nDaysUnopened/nDaysUnopened_logic.dart @@ -1,6 +1,7 @@ -import 'package:star_lock/main/lockDetail/lcokSet/nDaysUnopened/nDaysUnopened_state.dart'; import 'package:star_lock/tools/baseGetXController.dart'; +import 'nDaysUnopened_state.dart'; + class NDaysUnopenedLogic extends BaseGetXController { NDaysUnopenedState state = NDaysUnopenedState(); } diff --git a/star_lock/lib/main/lockDetail/lcokSet/nDaysUnopened/nDaysUnopened_page.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/nDaysUnopened/nDaysUnopened_page.dart similarity index 98% rename from star_lock/lib/main/lockDetail/lcokSet/nDaysUnopened/nDaysUnopened_page.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/nDaysUnopened/nDaysUnopened_page.dart index 3da8e3d7..241a6716 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/nDaysUnopened/nDaysUnopened_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/nDaysUnopened/nDaysUnopened_page.dart @@ -5,12 +5,12 @@ import 'package:flutter_pickers/style/default_style.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; -import 'package:star_lock/main/lockDetail/lcokSet/nDaysUnopened/nDaysUnopened_logic.dart'; import 'package:star_lock/tools/commonItem.dart'; import 'package:star_lock/tools/submitBtn.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; +import 'nDaysUnopened_logic.dart'; class NDaysUnopenedPage extends StatefulWidget { const NDaysUnopenedPage({Key? key}) : super(key: key); diff --git a/star_lock/lib/main/lockDetail/lcokSet/nDaysUnopened/nDaysUnopened_state.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/nDaysUnopened/nDaysUnopened_state.dart similarity index 100% rename from star_lock/lib/main/lockDetail/lcokSet/nDaysUnopened/nDaysUnopened_state.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/nDaysUnopened/nDaysUnopened_state.dart diff --git a/star_lock/lib/main/lockDetail/lcokSet/openDoorNotify/openDoorNotify_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/openDoorNotify/openDoorNotify_logic.dart similarity index 65% rename from star_lock/lib/main/lockDetail/lcokSet/openDoorNotify/openDoorNotify_logic.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/openDoorNotify/openDoorNotify_logic.dart index 3d826370..4bac0f4b 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/openDoorNotify/openDoorNotify_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/openDoorNotify/openDoorNotify_logic.dart @@ -1,5 +1,6 @@ -import 'package:star_lock/main/lockDetail/lcokSet/openDoorNotify/openDoorNotify_state.dart'; + import 'package:star_lock/tools/baseGetXController.dart'; +import 'openDoorNotify_state.dart'; class OpenDoorNotifyLogic extends BaseGetXController { final OpenDoorNotifyState state = OpenDoorNotifyState(); diff --git a/star_lock/lib/main/lockDetail/lcokSet/openDoorNotify/openDoorNotify_page.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/openDoorNotify/openDoorNotify_page.dart similarity index 95% rename from star_lock/lib/main/lockDetail/lcokSet/openDoorNotify/openDoorNotify_page.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/openDoorNotify/openDoorNotify_page.dart index cd52a042..c24a07e3 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/openDoorNotify/openDoorNotify_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/openDoorNotify/openDoorNotify_page.dart @@ -2,10 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; -import 'package:star_lock/main/lockDetail/lcokSet/openDoorNotify/openDoorNotify_logic.dart'; -import '../../../../app_settings/app_colors.dart'; -import '../../../../tools/submitBtn.dart'; -import '../../../../tools/titleAppBar.dart'; + +import '../../../../../app_settings/app_colors.dart'; +import '../../../../../tools/submitBtn.dart'; +import '../../../../../tools/titleAppBar.dart'; +import 'openDoorNotify_logic.dart'; class OpenDoorNotifyPage extends StatefulWidget { const OpenDoorNotifyPage({Key? key}) : super(key: key); diff --git a/star_lock/lib/main/lockDetail/lcokSet/openDoorNotify/openDoorNotify_state.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/openDoorNotify/openDoorNotify_state.dart similarity index 100% rename from star_lock/lib/main/lockDetail/lcokSet/openDoorNotify/openDoorNotify_state.dart rename to star_lock/lib/main/lockDetail/lcokSet/msgNotification/openDoorNotify/openDoorNotify_state.dart diff --git a/star_lock/lib/main/lockDetail/lcokSet/normallyOpenMode/normallyOpenMode_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/normallyOpenMode/normallyOpenMode_logic.dart index cba0c7a2..9853b9e4 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/normallyOpenMode/normallyOpenMode_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/normallyOpenMode/normallyOpenMode_logic.dart @@ -160,7 +160,7 @@ class NormallyOpenModeLogic extends BaseGetXController{ privateKey: getPrivateKeyList ); } - }, isShowLoading: true); + }); } // 设置支持功能(带参数) diff --git a/star_lock/lib/main/lockDetail/lcokSet/openDoorDirection/openDoorDirection_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/openDoorDirection/openDoorDirection_logic.dart index 0325f044..ea6cc020 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/openDoorDirection/openDoorDirection_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/openDoorDirection/openDoorDirection_logic.dart @@ -134,7 +134,7 @@ class OpenDoorDirectionLogic extends BaseGetXController { privateKey: getPrivateKeyList ); } - }, isShowLoading: true); + }); } // 设置支持功能(带参数) diff --git a/star_lock/lib/main/lockDetail/lcokSet/resetButton/resetButton_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/resetButton/resetButton_logic.dart index 27d8f66b..8e22c031 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/resetButton/resetButton_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/resetButton/resetButton_logic.dart @@ -135,7 +135,7 @@ class ResetButtonLogic extends BaseGetXController{ privateKey: getPrivateKeyList ); } - }, isShowLoading: true); + }); } // 设置支持功能(带参数) diff --git a/star_lock/lib/main/lockDetail/lcokSet/uploadData/uploadData_page.dart b/star_lock/lib/main/lockDetail/lcokSet/uploadData/uploadData_page.dart index 457775c7..6ddfa29b 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/uploadData/uploadData_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/uploadData/uploadData_page.dart @@ -27,7 +27,7 @@ class _UploadDataPageState extends State { Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - Expanded(child: Text(TranslationLoader.lanKeys!.uploadDataTip!.tr, style: TextStyle(fontSize: 24.sp,),)), + Expanded(child: Text(TranslationLoader.lanKeys!.uploadDataTip!.tr, style: TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor),)), ], ), SizedBox(height: 30.h,), diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart index c63695c4..77e57442 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart @@ -1,14 +1,10 @@ import 'dart:async'; -import 'dart:convert'; import 'dart:io'; -import 'package:flutter/material.dart'; -import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:star_lock/blue/io_protocol/io_editUser.dart'; -import 'package:star_lock/blue/io_protocol/io_factoryDataReset.dart'; import 'package:star_lock/blue/io_protocol/io_getLockStatu.dart'; import 'package:star_lock/blue/io_type.dart'; import 'package:star_lock/tools/toast.dart'; @@ -18,12 +14,9 @@ import '../../../blue/io_protocol/io_getStarLockStatusInfo.dart'; import '../../../blue/io_protocol/io_openLock.dart'; import '../../../blue/io_protocol/io_referEventRecordTime.dart'; import '../../../blue/io_reply.dart'; -import '../../../blue/io_tool/io_manager.dart'; import '../../../blue/io_tool/io_tool.dart'; import '../../../blue/io_tool/manager_event_bus.dart'; import '../../../blue/sender_manage.dart'; -import '../../../login/login/entity/LoginData.dart'; -import '../../../login/login/entity/LoginEntity.dart'; import '../../../network/api_repository.dart'; import '../../../tools/baseGetXController.dart'; import '../../../tools/eventBusEventManage.dart'; @@ -31,6 +24,7 @@ import '../../../tools/storage.dart'; import '../electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart'; import '../lockOperatingRecord/lockOperatingRecordGetLastRecordTime_entity.dart'; import 'lockDetail_state.dart'; +import 'lockNetToken_entity.dart'; class LockDetailLogic extends BaseGetXController{ final LockDetailState state = LockDetailState(); @@ -44,15 +38,10 @@ class LockDetailLogic extends BaseGetXController{ _replyOpenLock(reply); } - // 获取锁状态 - if(reply is GetLockStatuReply) { - _replyGetLockStatus(reply); - } - // 编辑锁用户 - if(reply is EditUserReply){ - _replyEditUserKey(reply); - } + // if(reply is EditUserReply){ + // _replyEditUserKey(reply); + // } // 获取星锁状态信息 if(reply is GetStarLockStatuInfoReply){ @@ -76,11 +65,12 @@ class LockDetailLogic extends BaseGetXController{ var tokenData = reply.data.sublist(2, 6); var saveStrList = changeIntListToStringList(tokenData); - print("openDoorToken:$tokenData"); + // print("openDoorToken:$tokenData"); Storage.setStringList(saveBlueToken, saveStrList); // 电量 int power = reply.data[7]; + state.electricQuantity.value = power; int status = reply.data[6]; print("status:$status"); @@ -96,15 +86,15 @@ class LockDetailLogic extends BaseGetXController{ // state.animationController.isCompleted; break; case 0x06: - //无权限 + //无权限 print("${reply.commandType}需要鉴权"); - print("millisecondsSinceEpoch/1000:${DateTime.now().millisecondsSinceEpoch~/1000}"); IoSenderManage.senderOpenLock( keyID: BlueManage().connectDeviceName, userID: await Storage.getUid(), openMode: 1, openTime: DateTime.now().millisecondsSinceEpoch~/1000, + onlineToken:state.lockNetToken, token: tokenData, needAuthor: 1, signKey: signKeyDataList, @@ -130,139 +120,67 @@ class LockDetailLogic extends BaseGetXController{ } } - // 获取锁状态数据解析 - Future _replyGetLockStatus(Reply reply) async { - int status = reply.data[2]; - switch(status){ - case 0x00: - //成功 - print("${reply.commandType}数据解析成功"); - var softVersion = reply.data.sublist(3, 7); - print("softVersion:$softVersion"); - - var power = reply.data[7]; - print("power:$power"); - - // APP 用户数量 - var appUserCount = reply.data.sublist(50, 53); - print("appUserCount:$appUserCount"); - - // 黑名单用户数量 - var blacklistCount = reply.data[53]; - print("blacklistCount:$blacklistCount"); - - // 蓝牙钥匙数量 - var bleKeyCount = reply.data[54]; - print("bleKeyCount:$bleKeyCount"); - - // 剩余可添加用户数量 - var remainCount = reply.data.sublist(54, 56); - print("remainCount:$remainCount"); - - // 未上传开锁记录数量 - var notUploadCount = reply.data.sublist(56, 58); - print("notUploadCount:$notUploadCount"); - - // 已设置开门密码数量 - var pwdCount = reply.data[58]; - print("pwdCount:$pwdCount"); - - // 已设置开门指纹数量 - var fingerprintCount = reply.data[59]; - print("fingerprintCount:$fingerprintCount"); - - // 锁当前时间 - var lockTime = reply.data.sublist(60, 64); - print("lockTime:$lockTime"); - - // 硬件版本信息,为固件升级提供判断依据 - var hardVersion = reply.data.sublist(64, 68); - print("hardVersion:$hardVersion"); - - break; - case 0x06: - //无权限 - print("${reply.commandType}需要鉴权"); - - break; - case 0x07: - //无权限 - print("${reply.commandType}用户无权限"); - - break; - case 0x09: - // 权限校验错误 - print("${reply.commandType}权限校验错误"); - - break; - default: - //失败 - print("${reply.commandType}失败"); - - break; - } - } - // 编辑用户数据解析 - Future _replyEditUserKey(Reply reply) async { - var token = reply.data.sublist(2, 6); - var saveStrList = changeIntListToStringList(token); - print("_replyEditUserKeyToken:$token"); - Storage.setStringList(saveBlueToken, saveStrList); - - int status = reply.data[6]; - print("status:$status"); - - switch(status){ - case 0x00: - //成功 - print("${reply.commandType!.typeValue} 数据解析成功"); - - break; - case 0x06: - //无权限 - print("${reply.commandType!.typeValue} 需要鉴权"); - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); - - var publicKey = await Storage.getStringList(saveBluePublicKey); - List publicKeyDataList = changeStringListToIntList(publicKey!); - - IoSenderManage.senderEditUser( - lockID:BlueManage().connectDeviceName, - authUserID:await Storage.getUid(), - keyID:"1", - userID:await Storage.getUid(), - openMode:1, - keyType:1, - startDate:0x11223344, - expireDate:0x11223344, - role:255, - password:"123456", - needAuthor:1, - publicKey:publicKeyDataList, - privateKey:getPrivateKeyList, - token: token - ); - break; - case 0x07: - //无权限 - print("${reply.commandType!.typeValue} 用户无权限"); - - break; - case 0x09: - // 权限校验错误 - print("${reply.commandType!.typeValue} 权限校验错误"); - - break; - default: - //失败 - print("${reply.commandType!.typeValue} 失败"); - - break; - } - } + // Future _replyEditUserKey(Reply reply) async { + // var token = reply.data.sublist(2, 6); + // var saveStrList = changeIntListToStringList(token); + // print("_replyEditUserKeyToken:$token"); + // Storage.setStringList(saveBlueToken, saveStrList); + // + // int status = reply.data[6]; + // print("status:$status"); + // + // switch(status){ + // case 0x00: + // //成功 + // print("${reply.commandType!.typeValue} 数据解析成功"); + // + // break; + // case 0x06: + // //无权限 + // print("${reply.commandType!.typeValue} 需要鉴权"); + // var privateKey = await Storage.getStringList(saveBluePrivateKey); + // List getPrivateKeyList = changeStringListToIntList(privateKey!); + // + // var publicKey = await Storage.getStringList(saveBluePublicKey); + // List publicKeyDataList = changeStringListToIntList(publicKey!); + // + // IoSenderManage.senderEditUser( + // lockID:BlueManage().connectDeviceName, + // authUserID:await Storage.getUid(), + // keyID:"1", + // userID:await Storage.getUid(), + // openMode:1, + // keyType:1, + // startDate:0x11223344, + // expireDate:0x11223344, + // role:255, + // password:"123456", + // needAuthor:1, + // publicKey:publicKeyDataList, + // privateKey:getPrivateKeyList, + // token: token + // ); + // break; + // case 0x07: + // //无权限 + // print("${reply.commandType!.typeValue} 用户无权限"); + // + // break; + // case 0x09: + // // 权限校验错误 + // print("${reply.commandType!.typeValue} 权限校验错误"); + // + // break; + // default: + // //失败 + // print("${reply.commandType!.typeValue} 失败"); + // + // break; + // } + // } + // 获取锁状态数据解析 Future _replyGetStarLockStatusInfo(Reply reply) async { int status = reply.data[2]; switch(status){ @@ -271,55 +189,55 @@ class LockDetailLogic extends BaseGetXController{ print("${reply.commandType}数据解析成功"); // 厂商名称 var vendor = reply.data.sublist(3, 23); - print("vendor:$vendor"); + // print("vendor:$vendor"); // 锁设备类型 var product = reply.data[23]; - print("product:$product"); + // print("product:$product"); // 产品名称 var model = reply.data.sublist(24, 44); - print("model:$model"); + // print("model:$model"); // 软件版本 var fwVersion = reply.data.sublist(44, 64); - print("fwVersion:$fwVersion"); + // print("fwVersion:$fwVersion"); // 硬件版本 var hwVersion = reply.data.sublist(64, 84); - print("hwVersion:$hwVersion"); + // print("hwVersion:$hwVersion"); // 厂商序列号 var serialNum0 = reply.data.sublist(84, 100); - print("serialNum0:$serialNum0"); + // print("serialNum0:$serialNum0"); // 成品商序列号 var serialNum1 = reply.data.sublist(100, 116); - print("serialNum1:$serialNum1"); + // print("serialNum1:$serialNum1"); // 蓝牙名称 var btDeviceName = reply.data.sublist(116, 132); - print("btDeviceName:$btDeviceName"); + // print("btDeviceName:$btDeviceName"); // 电池剩余电量 var battRemCap = reply.data[132]; - print("battRemCap:$battRemCap"); + // print("battRemCap:$battRemCap"); // 重置次数 var restoreCounter = reply.data.sublist(133, 135); - print("restoreCounter:$restoreCounter"); + // print("restoreCounter:$restoreCounter"); // 重置时间 var restoreDate = reply.data.sublist(135, 139); - print("restoreDate:$restoreDate"); + // print("restoreDate:$restoreDate"); // 主控芯片型号 var icPartNo = reply.data.sublist(139, 149); - print("icPartNo:$icPartNo"); + // print("icPartNo:$icPartNo"); // 有效时间 var indate = reply.data.sublist(149, 153); - print("indate:$indate"); + // print("indate:$indate"); break; case 0x06: @@ -356,9 +274,11 @@ class LockDetailLogic extends BaseGetXController{ reply.data.removeRange(0, 6); // 把得到的数据按8位分割成数组 然后塞进一个新的数组里面 var getList = splitList(reply.data, 8); + // print("getList:$getList"); var uploadList = []; for(int i = 0; i getPrivateKeyList = changeStringListToIntList(privateKey!); @@ -433,13 +353,14 @@ class LockDetailLogic extends BaseGetXController{ userID: await Storage.getUid(), openMode: 1, openTime: DateTime.now().millisecondsSinceEpoch~/1000, + onlineToken:state.lockNetToken, token: getTokenList, needAuthor: 1, signKey: signKeyDataList, privateKey: getPrivateKeyList, ); } - }, isShowLoading: false); + }, isShowLoading: false, isShowToast: false); } // 编辑用户事件 @@ -524,12 +445,12 @@ class LockDetailLogic extends BaseGetXController{ privateKey:getPrivateKeyList, ); } - }); + }, isShowLoading: false); } void startScanAction(){ BlueManage().startScan(true, (v){ - print("startScanAllDevice:${v}"); + // print("startScanAllDevice:${v}"); final knownDeviceIndex = v.indexWhere((d) => d.name == state.keyInfos.value.bluetooth!.bluetoothDeviceName!); // 当扫描到的时候 if (knownDeviceIndex >= 0) { @@ -545,7 +466,12 @@ class LockDetailLogic extends BaseGetXController{ startConnect() { state.lockState.value = 1; state.animationController.forward(); - openDoorAction(); + + if(state.isOpenLockNeedOnline.value == 0){ + openDoorAction(); + }else{ + getLockNetToken(); + } Future.delayed(const Duration(seconds: 10), () { if(state.lockState.value == 1){ @@ -563,6 +489,16 @@ class LockDetailLogic extends BaseGetXController{ } + // 获取手机联网token,根据锁设置里面获取的开锁时是否联网来判断是否调用这个接口 + void getLockNetToken() async { + LockNetTokenEntity entity = await ApiRepository.to.getLockNetToken(lockId: state.keyInfos.value.lockId.toString()); + if (entity.errorCode!.codeIsSuccessful) { + state.lockNetToken = entity.data!.token!; + print("state.lockNetToken:${state.lockNetToken}"); + openDoorAction(); + } + } + // 查询锁记录最后时间 void getLockRecordLastUploadDataTime() async { LockOperatingRecordGetLastRecordTimeEntity entity = @@ -583,20 +519,42 @@ class LockDetailLogic extends BaseGetXController{ } } + /// 锁设置里面开启关闭考勤刷新锁详情 + StreamSubscription? _lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent; + void initLockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceAction() { + // 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus + _lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent = eventBus.on().listen((event) { + if(event.type == 0){ + // 0考勤 + print("event.setResult:${event.setResult}"); + state.isAttendance.value = event.setResult; + state.keyInfos.value.lockSetting!.attendance = event.setResult; + print("state.keyInfos.value.lockSetting!.attendance:${state.keyInfos.value.lockSetting!.attendance}"); + }else if(event.type == 1){ + // 1 开锁时是否需联网 + state.isOpenLockNeedOnline.value = event.setResult; + state.keyInfos.value.lockSetting!.appUnlockOnline = event.setResult; + } + }); + } + @override void onReady() { // TODO: implement onReady super.onReady(); print("onReady()"); _initReplySubscription(); + initLockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceAction(); if(Platform.isIOS){ + print("有蓝牙权限开始扫描"); startScanAction(); }else{ getMicrophonePermission() .then((value) { if (value) { // 有权限 + print("有蓝牙权限开始扫描"); startScanAction(); }else{ //没有权限 @@ -610,7 +568,7 @@ class LockDetailLogic extends BaseGetXController{ void onInit() { // TODO: implement onInit super.onInit(); - print("lockDetail_onInit()"); + // print("lockDetail_onInit()"); // 进来获取锁状态 // connectBlue(); @@ -621,7 +579,10 @@ class LockDetailLogic extends BaseGetXController{ @override void onClose() { // TODO: implement onClose + print("锁详情界面销毁了"); + _replySubscription.cancel(); + _lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent!.cancel(); } ///请求录音相机权限 diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart index 2e8736c7..548a9058 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart @@ -38,6 +38,10 @@ class _LockDetailPageState extends State super.initState(); state.keyInfos.value = widget.lockListInfoItemEntity; + state.isAttendance.value = state.keyInfos.value.lockSetting!.attendance!; + state.isOpenLockNeedOnline.value = state.keyInfos.value.lockSetting!.appUnlockOnline!; + state.electricQuantity.value = state.keyInfos.value.electricQuantity!; + BlueManage().connectDeviceName = state.keyInfos.value.bluetooth!.bluetoothDeviceName!; // BlueManage().connectDeviceMacAddress = @@ -74,7 +78,7 @@ class _LockDetailPageState extends State child: Column( children: [ topWidget(), - Expanded(child: bottomWidget()) + Expanded(child: Obx(() => bottomWidget())) ], ), ); @@ -85,35 +89,6 @@ class _LockDetailPageState extends State return Column( children: [ SizedBox(height: 50.h), - // Stack( - // alignment: Alignment.center, - // children: [ - // Align( - // alignment: Alignment.center, - // child: Text( - // widget.keyInfo!.lockAlias!, - // style: - // TextStyle(fontSize: 22.sp, fontWeight: FontWeight.w400), - // )), - // Row( - // mainAxisAlignment: MainAxisAlignment.end, - // children: [ - // Text( - // "100%", - // style: TextStyle( - // fontSize: 18.sp, color: AppColors.darkGrayTextColor), - // ), - // SizedBox(width: 2.w), - // Image.asset( - // 'images/main/icon_main_cell.png', - // width: 30.w, - // height: 24.w, - // ), - // SizedBox(width: 30.w), - // ], - // ), - // ], - // ), Stack( alignment: Alignment.center, children: [ @@ -126,15 +101,15 @@ class _LockDetailPageState extends State TextStyle(fontSize: 22.sp, fontWeight: FontWeight.w400), ))), Positioned( - child: Row( + child: Obx(() => Row( mainAxisAlignment: MainAxisAlignment.end, children: [ - Text("100%", style: TextStyle(fontSize: 18.sp, color: AppColors.darkGrayTextColor)), + Text("${state.electricQuantity.value}%", style: TextStyle(fontSize: 18.sp, color: AppColors.darkGrayTextColor)), SizedBox(width: 2.w), - Image.asset('images/main/icon_main_cell.png', width: 30.w, height: 24.w), + Image.asset(showElectricIcon(state.electricQuantity.value), width: 30.w, height: 24.w), SizedBox(width: 30.w), ], - ) + )) ) ], ), @@ -299,9 +274,9 @@ class _LockDetailPageState extends State List getShowWidget() { var showWidgetArr = []; - + print("pagepagepage:state.keyInfos.value.lockSetting!.attendance:${state.keyInfos.value.lockSetting!.attendance}"); // 考勤 - if (state.keyInfos.value.lockSetting!.attendance == 1) { + if (state.isAttendance.value == 1) { showWidgetArr.add(bottomItem('images/main/icon_main_clockingIn.png', TranslationLoader.lanKeys!.checkingIn!.tr, () { Get.toNamed(Routers.checkingInListPage, @@ -410,9 +385,7 @@ class _LockDetailPageState extends State Get.toNamed(Routers.msgNotificationPage); }), // 设置 - bottomItem( - 'images/main/icon_main_set.png', TranslationLoader.lanKeys!.set!.tr, - () { + bottomItem('images/main/icon_main_set.png', TranslationLoader.lanKeys!.set!.tr, () { BlueManage().stopScan(); Get.toNamed(Routers.lockSetPage, arguments: {"lockId": widget.lockListInfoItemEntity.lockId}); @@ -467,6 +440,21 @@ class _LockDetailPageState extends State }); } + String showElectricIcon (int electricnumber){ + if(electricnumber >= 100){ + return 'images/main/icon_lockElectricLevel_5.png'; + }else if((electricnumber > 50) && (electricnumber < 100)){ + return 'images/main/icon_lockElectricLevel_4.png'; + }else if((electricnumber > 25) && (electricnumber <= 50)){ + return 'images/main/icon_lockElectricLevel_3.png'; + }else if((electricnumber > 5) && (electricnumber <= 25)){ + return 'images/main/icon_lockElectricLevel_2.png'; + }else if(electricnumber <= 5){ + return 'images/main/icon_lockElectricLevel_1.png'; + } + return 'images/main/icon_lockElectricLevel_5.png'; + } + static Future tokNative(String method, {required Map arguments}) async { if (arguments == null) { diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_state.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_state.dart index 1f836ecb..fcb5db03 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_state.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_state.dart @@ -17,6 +17,12 @@ import '../../lockMian/entity/lockListInfo_entity.dart'; class LockDetailState { Rx keyInfos = LockListInfoItemEntity().obs; + String lockNetToken = ""; + + var isAttendance = 0.obs;// 是否开启考勤 + var isOpenLockNeedOnline = 0.obs; // APP开锁时是否需联网 + var electricQuantity = 0.obs; // 电量 + //过渡动画控制器 late AnimationController animationController; var lockState = 0.obs;// 0未连接普通状态 1连接开锁中(展示动画) 2已连接开锁成功 3检测可用性 4连接失败 diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockNetToken_entity.dart b/star_lock/lib/main/lockDetail/lockDetail/lockNetToken_entity.dart new file mode 100644 index 00000000..fc74063a --- /dev/null +++ b/star_lock/lib/main/lockDetail/lockDetail/lockNetToken_entity.dart @@ -0,0 +1,43 @@ +class LockNetTokenEntity { + int? errorCode; + String? description; + String? errorMsg; + Data? data; + + LockNetTokenEntity( + {this.errorCode, this.description, this.errorMsg, this.data}); + + LockNetTokenEntity.fromJson(Map json) { + errorCode = json['errorCode']; + description = json['description']; + errorMsg = json['errorMsg']; + data = json['data'] != null ? Data.fromJson(json['data']) : null; + } + + Map toJson() { + final Map data = {}; + data['errorCode'] = errorCode; + data['description'] = description; + data['errorMsg'] = errorMsg; + if (this.data != null) { + data['data'] = this.data!.toJson(); + } + return data; + } +} + +class Data { + String? token; + + Data({this.token}); + + Data.fromJson(Map json) { + token = json['token']; + } + + Map toJson() { + final Map data = {}; + data['token'] = token; + return data; + } +} \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_logic.dart b/star_lock/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_logic.dart index 4f9984ef..6cd78e8e 100644 --- a/star_lock/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_logic.dart +++ b/star_lock/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_logic.dart @@ -81,9 +81,11 @@ class LockOperatingRecordLogic extends BaseGetXController{ reply.data.removeRange(0, 6); // 把得到的数据按8位分割成数组 然后塞进一个新的数组里面 var getList = splitList(reply.data, 8); + print("getList:$getList"); var uploadList = []; for(int i = 0; i senderQueryingFingerprintStatus() async { - BlueManage().judgeReconnect(BlueManage().connectDeviceMacAddress, BlueManage().connectDeviceName, (DeviceConnectionState state) async { + BlueManage().judgeReconnect(BlueManage().connectDeviceMacAddress, BlueManage().connectDeviceName,(DeviceConnectionState state) async { if (state == DeviceConnectionState.connected) { var privateKey = await Storage.getStringList(saveBluePrivateKey); List getPrivateKeyList = changeStringListToIntList(privateKey!); diff --git a/star_lock/lib/main/lockDetail/passwordKey/passwordKeyManage/passwordKeyManage_tabbar.dart b/star_lock/lib/main/lockDetail/passwordKey/passwordKeyManage/passwordKeyManage_tabbar.dart index ff466c5b..a9cd295e 100644 --- a/star_lock/lib/main/lockDetail/passwordKey/passwordKeyManage/passwordKeyManage_tabbar.dart +++ b/star_lock/lib/main/lockDetail/passwordKey/passwordKeyManage/passwordKeyManage_tabbar.dart @@ -84,8 +84,8 @@ class _PasswordKeyManageTabbarPageState Tab _tab(ItemView item) { return Tab( // text: item.title, - child: SizedBox( - width: item.title.length > 2 ? 1.sw / 8 : 1.sw / 12, + child: Container( + // width: item.title.length > 2 ? 1.sw / 8 : 1.sw / 12, // margin: EdgeInsets.all(10.w), // color: Colors.red, child: Text( diff --git a/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart b/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart index 73ee4ad7..69236e8a 100644 --- a/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart +++ b/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart @@ -102,7 +102,10 @@ class _VideoLogPageState extends State { state.isNavLocal.value = false; }); }, - child: Obx(() => Text("云存", style: state.isNavLocal.value == true ? TextStyle(color: Colors.grey, fontSize: 26.sp) : TextStyle(color: Colors.white, fontSize: 28.sp))) + child: Obx(() => Text("云存", + style: state.isNavLocal.value == true ? + TextStyle(color: Colors.grey, fontSize: 26.sp, fontWeight: FontWeight.w600) : + TextStyle(color: Colors.white, fontSize: 28.sp, fontWeight: FontWeight.w600))) ), TextButton( onPressed: (){ @@ -110,7 +113,10 @@ class _VideoLogPageState extends State { state.isNavLocal.value = true; }); }, - child: Obx(() => Text("本地", style: state.isNavLocal.value == true ? TextStyle(color: Colors.white, fontSize: 28.sp) : TextStyle(color: Colors.grey, fontSize: 26.sp))) + child: Obx(() => Text("本地", + style: state.isNavLocal.value == true ? + TextStyle(color: Colors.white, fontSize: 28.sp, fontWeight: FontWeight.w600) : + TextStyle(color: Colors.grey, fontSize: 26.sp, fontWeight: FontWeight.w600))) ), ], ), @@ -136,13 +142,13 @@ class _VideoLogPageState extends State { Expanded(child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("3天滚动储存", style: TextStyle(fontSize: 26.sp)), + Text("3天滚动储存", style: TextStyle(fontSize: 24.sp)), SizedBox(height: 10.h), Text("星锁已为本设备免费提供3大滚动视频储存服务", style: TextStyle(fontSize: 22.sp, color: Colors.grey)), ], )), SizedBox(width: 15.w), - Text("去升级", style: TextStyle(fontSize: 24.sp)), + Text("去升级", style: TextStyle(fontSize: 22.sp)), Image(width: 40.w, height: 24.w, image: const AssetImage("images/icon_right_black.png")) ], ), @@ -170,7 +176,7 @@ class _VideoLogPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ // SizedBox(height: 20.h), - Text("下载列表", style: TextStyle(fontSize: 26.sp)), + Text("下载列表", style: TextStyle(fontSize: 24.sp)), SizedBox(height: 15.h), Text("暂无下载内容", style: TextStyle(fontSize: 22.sp, color: Colors.grey)), ], @@ -191,7 +197,7 @@ class _VideoLogPageState extends State { child: Row( // mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(state.isNavLocal.value == true ? "已下载":"全部视频", style: TextStyle(fontSize: 28.sp)), + Text(state.isNavLocal.value == true ? "已下载":"全部视频", style: TextStyle(fontSize: 26.sp, fontWeight: FontWeight.w500)), Expanded(child: SizedBox(width: 10.w)), IconButton( icon: Image(width: 40.w, height: 40.w, image: const AssetImage("images/main/icon_lockDetail_monitoringEditVoice.png")), diff --git a/star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_page.dart b/star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_page.dart index a43409ab..c1cedd85 100644 --- a/star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_page.dart +++ b/star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_page.dart @@ -41,7 +41,11 @@ class _DemoModeLockDetailPageState extends State { height: 1.sh - ScreenUtil().statusBarHeight * 2, color: Colors.white, child: Column( - children: [topTip(), topWidget(), Expanded(child: bottomWidget())], + children: [ + topTip(), + topWidget(), + Expanded(child: bottomWidget()) + ], ), )); } @@ -375,4 +379,5 @@ class _DemoModeLockDetailPageState extends State { // Get.toNamed(Routers.seletLockTypePage); Toast.show(msg: "演示模式"); } + } diff --git a/star_lock/lib/main/lockMian/demoMode/demoModeLockSet/demoModeLockSet_page.dart b/star_lock/lib/main/lockMian/demoMode/demoModeLockSet/demoModeLockSet_page.dart index 16700a59..afaf947a 100644 --- a/star_lock/lib/main/lockMian/demoMode/demoModeLockSet/demoModeLockSet_page.dart +++ b/star_lock/lib/main/lockMian/demoMode/demoModeLockSet/demoModeLockSet_page.dart @@ -242,6 +242,12 @@ class _DemoModeLockSetPageState extends State { isHaveLine: false, isHaveRightWidget: true, rightWidget: _lockRemindSwitch()), + CommonItem( + leftTitel: "开锁时是否需联网", + rightTitle: "", + isHaveLine: false, + isHaveRightWidget: true, + rightWidget: _lockRemindSwitch()), SizedBox(height: 10.h), // wifi配网 CommonItem( diff --git a/star_lock/lib/main/lockMian/lockList/lockList_page.dart b/star_lock/lib/main/lockMian/lockList/lockList_page.dart index 89adbe12..4be593ed 100644 --- a/star_lock/lib/main/lockMian/lockList/lockList_page.dart +++ b/star_lock/lib/main/lockMian/lockList/lockList_page.dart @@ -144,7 +144,7 @@ class _LockListPageState extends State { ), SizedBox(width: 2.w), Image.asset( - 'images/main/icon_main_cell.png', + showElectricIcon(keyInfo.electricQuantity!), width: 30.w, height: 24.w, ), @@ -201,4 +201,19 @@ class _LockListPageState extends State { return useDateStr; } + String showElectricIcon (int electricnumber){ + if(electricnumber >= 100){ + return 'images/main/icon_lockElectricLevel_5.png'; + }else if((electricnumber > 50) && (electricnumber < 100)){ + return 'images/main/icon_lockElectricLevel_4.png'; + }else if((electricnumber > 25) && (electricnumber <= 50)){ + return 'images/main/icon_lockElectricLevel_3.png'; + }else if((electricnumber > 5) && (electricnumber <= 25)){ + return 'images/main/icon_lockElectricLevel_2.png'; + }else if(electricnumber <= 5){ + return 'images/main/icon_lockElectricLevel_1.png'; + } + return 'images/main/icon_lockElectricLevel_5.png'; + } + } diff --git a/star_lock/lib/main/lockMian/lockMain/lockMain_logic.dart b/star_lock/lib/main/lockMian/lockMain/lockMain_logic.dart index c18f56dd..2f84ecf2 100644 --- a/star_lock/lib/main/lockMian/lockMain/lockMain_logic.dart +++ b/star_lock/lib/main/lockMian/lockMain/lockMain_logic.dart @@ -90,6 +90,8 @@ class LockMainLogic extends BaseGetXController { } state.lockListInfoEntity.value = entity; }else{ + print("首页锁列表请求失败"); + state.dataLength.value = 0; // refreshController.loadFailed(); } // refreshController.refreshCompleted(); diff --git a/star_lock/lib/mine/about/about_page.dart b/star_lock/lib/mine/about/about_page.dart index 78c31c42..d7ec95e9 100644 --- a/star_lock/lib/mine/about/about_page.dart +++ b/star_lock/lib/mine/about/about_page.dart @@ -46,7 +46,7 @@ class _AbountPageState extends State { height: 20.h, ), Text( - "星锁 1.0.0.01(preRelease-20231118)", + "星锁 1.0.0.02(preRelease-20231124)", style: TextStyle(fontSize: 24.sp, color: AppColors.blackColor), ), SizedBox( diff --git a/star_lock/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_page.dart b/star_lock/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_page.dart index e1ba8ab4..a561527c 100644 --- a/star_lock/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_page.dart +++ b/star_lock/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_page.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:amap_flutter_location/amap_flutter_location.dart'; @@ -57,7 +58,7 @@ class _LockAddressGaoDePageState extends State{ // EasyLoading.dismiss(); // } // }); - requestLocation(); + // requestLocation(); } Future requestPermission() async { @@ -69,8 +70,13 @@ class _LockAddressGaoDePageState extends State{ print("拒绝"); break; case PermissionStatus.granted: - _setLocationOption(); - location.startLocation(); + if(Platform.isIOS){ + _setLocationOption(); + requestIOSLocation(); + }else{ + requestAndroidLocation(); + location.startLocation(); + } break; case PermissionStatus.limited: print("限制"); @@ -82,7 +88,7 @@ class _LockAddressGaoDePageState extends State{ } } - Future requestLocation() async { + Future requestAndroidLocation() async { location.onLocationChanged().listen((event) { print("listenLocationChanged$event"); // EasyLoading.dismiss(); @@ -95,6 +101,22 @@ class _LockAddressGaoDePageState extends State{ }); } + Future requestIOSLocation() async { + location = AMapFlutterLocation() + ..setLocationOption(AMapLocationOption()) + ..onLocationChanged().listen((event) { + print("listenLocationChanged$event"); + // EasyLoading.dismiss(); + if (event.isNotEmpty) { + setState(() { + addressInfo = event; + }); + // location.stopLocation(); + } + }) + ..startLocation(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -123,9 +145,7 @@ class _LockAddressGaoDePageState extends State{ // ), // ], ), - body: - addressInfo != null ? - ListView( + body: ListView( children: [ Container( margin: EdgeInsets.only(left: 25.w, top: 40.h, bottom: 40.w), @@ -137,83 +157,73 @@ class _LockAddressGaoDePageState extends State{ ), ), SizedBox( - height: 1.sw/5*4, - width: 1.sw, child: - (addressInfo!["address"].toString().isNotEmpty) ? - AMapWidget( - apiKey: amapApiKeys, - // 初始化地图中心 - initialCameraPosition: ( - CameraPosition( - target: LatLng(double.parse(addressInfo!['latitude'].toString()), double.parse(addressInfo!['longitude'].toString())), - zoom: 10.0, - ) - ), - //定位小蓝点 - myLocationStyleOptions: MyLocationStyleOptions( - true, - ), - // 普通地图normal,卫星地图satellite,夜间视图night,导航视图 navi,公交视图bus, - mapType: MapType.normal, - // 缩放级别范围 - minMaxZoomPreference: const MinMaxZoomPreference(3, 20), - // 隐私政策包含高德 必须填写 - privacyStatement: const AMapPrivacyStatement(hasAgree: true, hasContains: true, hasShow: true), - // 地图创建成功时返回AMapController - onMapCreated: (AMapController controller) { - mapController = controller; - }, - ) : Container(), - ), - Container( - margin: EdgeInsets.only(left: 25.w, top: 20.h, right: 25.w), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, + addressInfo != null ? + Column( children: [ - Text("检查以确保以下地址是正确的", style: TextStyle(fontSize: 24.sp)), - ], - ), - ), - // SizedBox(height: 20.h), - Container( - margin: EdgeInsets.only(left: 25.w, top: 20.h, right: 25.w), - // decoration: BoxDecoration( - // color: AppColors.mainColor, - // borderRadius: BorderRadius.circular(15.w), - // ), - child:Column( - children: [ - Container( - // height: h(53), - // padding: EdgeInsets.only(top: 15.h, bottom: 15, left:15.w, right: 15.w), - child: Row( - children: [ - // Image.asset('images/main/icon_addUserShowAddress.png', width: 30.w, height: 30.w), - // SizedBox(width: 10.w), - Expanded( - child: Text(addressInfo!["address"].toString() ?? "", style: const TextStyle(color: Colors.grey, fontSize: 16, fontWeight: FontWeight.w500, overflow: TextOverflow.clip)) - ), - ], + SizedBox( + height: 1.sw/5*4, + width: 1.sw, + child: AMapWidget( + apiKey: amapApiKeys, + // 初始化地图中心 + initialCameraPosition: ( + CameraPosition( + target: LatLng(double.parse(addressInfo!['latitude'].toString()), double.parse(addressInfo!['longitude'].toString())), + zoom: 10.0, + ) ), + //定位小蓝点 + myLocationStyleOptions: MyLocationStyleOptions( + true, + ), + // 普通地图normal,卫星地图satellite,夜间视图night,导航视图 navi,公交视图bus, + mapType: MapType.normal, + // 缩放级别范围 + minMaxZoomPreference: const MinMaxZoomPreference(3, 20), + // 隐私政策包含高德 必须填写 + privacyStatement: const AMapPrivacyStatement(hasAgree: true, hasContains: true, hasShow: true), + // 地图创建成功时返回AMapController + onMapCreated: (AMapController controller) { + mapController = controller; + }, ), - SizedBox(height: 5.h), - Container(height: 1.h, color: AppColors.mainColor,), - // Container( - // // height: h(52), - // padding: EdgeInsets.only(top: 15.h, bottom: 15, left:15.w, right: 15.w), - // child: Row( - // children: [ - // Image.asset('images/main/icon_addUserAddressShowTime.png', width: 30.w, height: 30.w), - // SizedBox(width: 10.w,), - // Expanded( - // child: Text(DateTool().getNowDateYMDHM(), style: const TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.w500),) - // ), - // ], - // ), - // ), - ], - ) + ), + Container( + // color: Colors.red, + height: 45.h, + margin: EdgeInsets.only(left: 25.w, top: 20.h, right: 25.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text("检查以确保以下地址是正确的", style: TextStyle(fontSize: 24.sp)), + ], + ), + ), + // SizedBox(height: 20.h), + Container( + // color: Colors.red, + // height: 45.h, + margin: EdgeInsets.only(left: 25.w, top: 20.h, right: 25.w), + child:Column( + children: [ + Row( + children: [ + Expanded( + child: Text(addressInfo!["address"].toString() ?? "", style: const TextStyle(color: Colors.grey, fontSize: 16, fontWeight: FontWeight.w500, overflow: TextOverflow.clip)) + ), + ], + ), + SizedBox(height: 5.h), + Container(height: 1.h, color: AppColors.mainColor,), + ], + ) + ), + ], + ) : SizedBox( + height: 1.sw/5*4 + 65.h*2, + child: const Center(child: Text('地图加载中,请稍候。。。'))) + , ), SizedBox(height:200.h), Row( @@ -291,8 +301,7 @@ class _LockAddressGaoDePageState extends State{ // ) // ),), ], - ) - : const Center(child: Text('地图加载中,请稍候。。。')), + ), ); } @@ -343,11 +352,10 @@ class _LockAddressGaoDePageState extends State{ location.setLocationOption(locationOption); } - @override void dispose() { super.dispose(); - + location.stopLocation(); location.destroy(); print("地图界面销毁了"); } diff --git a/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart b/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart index 519ce1d9..f6907287 100644 --- a/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart +++ b/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart @@ -36,6 +36,7 @@ class SaveLockLogic extends BaseGetXController { }); } + // 添加用户 Future _replyAddUserKey(Reply reply) async { var lockId = reply.data.sublist(2, 42); // print("lockId:$lockId"); @@ -101,6 +102,7 @@ class SaveLockLogic extends BaseGetXController { } } + // 获取星锁状态 Future _replyGetStarLockStatusInfo(Reply reply) async { int status = reply.data[2]; switch(status){ diff --git a/star_lock/lib/mine/mine/starLockMine_page.dart b/star_lock/lib/mine/mine/starLockMine_page.dart index 20053c4d..6205209b 100644 --- a/star_lock/lib/mine/mine/starLockMine_page.dart +++ b/star_lock/lib/mine/mine/starLockMine_page.dart @@ -1,19 +1,12 @@ -import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; -import 'package:star_lock/common/safetyVerification/entity/Data.dart'; -import 'package:star_lock/tools/toast.dart'; import '../../appRouters.dart'; import '../../app_settings/app_colors.dart'; import '../../baseWidget.dart'; -import '../../login/login/entity/LoginData.dart'; -import '../../login/login/entity/LoginEntity.dart'; -import '../../tools/store_service.dart'; import '../../tools/submitBtn.dart'; -import '../../tools/titleAppBar.dart'; import '../../translations/trans_lib.dart'; import 'starLockMine_logic.dart'; @@ -39,9 +32,7 @@ class _StarLockMinePageState extends State with BaseWidget { children: [ topWidget(), bottomListWidget(), - SizedBox( - height: 40.h, - ), + SizedBox(height: 40.h,), // keyBottomWidget() ], ), @@ -93,7 +84,7 @@ class _StarLockMinePageState extends State with BaseWidget { SizedBox( height: 20.h, ), - Text(state.mobile(), + Text(state.nickname(), style: TextStyle( fontSize: 22.sp, color: Colors.white, @@ -101,7 +92,7 @@ class _StarLockMinePageState extends State with BaseWidget { SizedBox( height: 10.h, ), - Text("${TranslationLoader.lanKeys!.accountNumber!.tr}:-", + Text("${TranslationLoader.lanKeys!.accountNumber!.tr}:${state.mobile().isNotEmpty ? state.mobile() : state.email()}", style: TextStyle( fontSize: 18.sp, color: Colors.white, diff --git a/star_lock/lib/mine/mine/starLockMine_state.dart b/star_lock/lib/mine/mine/starLockMine_state.dart index 315848ec..1008ae15 100644 --- a/star_lock/lib/mine/mine/starLockMine_state.dart +++ b/star_lock/lib/mine/mine/starLockMine_state.dart @@ -40,6 +40,14 @@ class StarLockMineState { return loginData.value.mobile ?? '-'; } + String email() { + return loginData.value.email ?? '-'; + } + + String nickname() { + return loginData.value.nickname ?? '-'; + } + ///用户头像 String headUrl() { return loginData.value.headUrl ?? ''; diff --git a/star_lock/lib/mine/mineMultiLanguage/mineMultiLanguage_page.dart b/star_lock/lib/mine/mineMultiLanguage/mineMultiLanguage_page.dart index ffb0c30e..5a2a3ee6 100644 --- a/star_lock/lib/mine/mineMultiLanguage/mineMultiLanguage_page.dart +++ b/star_lock/lib/mine/mineMultiLanguage/mineMultiLanguage_page.dart @@ -43,7 +43,6 @@ class _MineMultiLanguagePageState extends State { CommonItem( leftTitel: '跟随系统', rightTitle: "", - allHeight: 90.h, isHaveLine: true, isHaveDirection: false, isHaveRightWidget: true, @@ -59,7 +58,6 @@ class _MineMultiLanguagePageState extends State { CommonItem( leftTitel: lanType.lanTitle, rightTitle: "", - allHeight: 90.h, isHaveLine: true, isHaveDirection: false, isHaveRightWidget: true, diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonGetUploadFileInfo_entity.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonGetUploadFileInfo_entity.dart new file mode 100644 index 00000000..e6dcd75c --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonGetUploadFileInfo_entity.dart @@ -0,0 +1,89 @@ +class MinePersonGetUploadFileInfoEntity { + int? errorCode; + String? description; + String? errorMsg; + Data? data; + + MinePersonGetUploadFileInfoEntity( + {this.errorCode, this.description, this.errorMsg, this.data}); + + MinePersonGetUploadFileInfoEntity.fromJson(Map json) { + errorCode = json['errorCode']; + description = json['description']; + errorMsg = json['errorMsg']; + data = json['data'] != null ? Data.fromJson(json['data']) : null; + } + + Map toJson() { + final Map data = {}; + data['errorCode'] = errorCode; + data['description'] = description; + data['errorMsg'] = errorMsg; + if (this.data != null) { + data['data'] = this.data!.toJson(); + } + return data; + } +} + +class Data { + String? uploadUrl; + Map? formData; + String? fileUrl; + String? fileField; + + Data({this.uploadUrl, this.formData, this.fileUrl, this.fileField}); + + Data.fromJson(Map json) { + uploadUrl = json['uploadUrl']; + formData = json['formData']; + fileUrl = json['fileUrl']; + fileField = json['fileField']; + } + + Map toJson() { + final Map data = {}; + data['uploadUrl'] = uploadUrl; + data['formData'] = formData; + data['fileUrl'] = fileUrl; + data['fileField'] = fileField; + return data; + } +} + +// class GetFormData { +// String? oSSAccessKeyId; +// String? host; +// String? policy; +// String? signature; +// int? expire; +// String? key; +// +// GetFormData( +// {this.oSSAccessKeyId, +// this.host, +// this.policy, +// this.signature, +// this.expire, +// this.key}); +// +// GetFormData.fromJson(Map json) { +// oSSAccessKeyId = json['OSSAccessKeyId']; +// host = json['host']; +// policy = json['policy']; +// signature = json['signature']; +// expire = json['expire']; +// key = json['key']; +// } +// +// Map toJson() { +// final Map data = {}; +// data['OSSAccessKeyId'] = oSSAccessKeyId; +// data['host'] = host; +// data['policy'] = policy; +// data['signature'] = signature; +// data['expire'] = expire; +// data['key'] = key; +// return data; +// } +// } diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart index 51cfaaa7..c7081a19 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart @@ -1,10 +1,14 @@ import 'dart:async'; +import 'dart:convert'; +import 'package:get/get.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_state.dart'; import 'package:star_lock/tools/toast.dart'; import '../../../../network/api_repository.dart'; import '../../../../tools/baseGetXController.dart'; +import 'minePersonGetUploadFileInfo_entity.dart'; -class MinePersonInfoLogic extends BaseGetXController { +class MinePersonInfoLogic extends GetConnect{ final MinePersonInfoState state = MinePersonInfoState(); //用户信息 Future getUserInfoRequest() async { @@ -20,9 +24,57 @@ class MinePersonInfoLogic extends BaseGetXController { } //上传头像 先获取upToken 再调用updateUserInfo - Future getUpTokenRequest() async { - var entity = await ApiRepository.to.getUpToken(state.typeStr.value); - if (entity.errorCode!.codeIsSuccessful) {} + Future getUpTokenRequest(String filename, int size) async { + var entity = await ApiRepository.to.getUpToken( + module: 'avatar', + typeKey: 'userId', + type: state.mineInfoData.value.uid!, + filename: filename, + size: size + ); + if (entity.errorCode!.codeIsSuccessful) { + uploadFile(entity); + // print("aaaaa:$loginEntity"); + } + } + + // 上传头像 + void uploadFile(MinePersonGetUploadFileInfoEntity minePersonGetUploadFileInfoEntity) async { + // String json = JsonDecoder(minePersonGetUploadFileInfoEntity.data!.formData!); + + // var formData = FormData(); + // + // formData.files.add(MapEntry( + // "files", //后台接收的名字 + // MultipartFile(state.image!.path, filename: 'b'), + // )); + + Map user = minePersonGetUploadFileInfoEntity.data!.formData!; + user[minePersonGetUploadFileInfoEntity.data!.fileField!] = state.image!.path; + final form = FormData(user); + var entity = await ApiRepository.to.uploadFile( + url: minePersonGetUploadFileInfoEntity.data!.uploadUrl!, + body: form + ); + if (entity.errorCode!.codeIsSuccessful) { + + } + + // final formData = FormData.fromMap({ + // 'file': await MultipartFile.fromFile(imageFile.path, contentType: MediaType.parse(mimeType)) + // }); + + // final form = FormData(user); + // Response response= await post(minePersonGetUploadFileInfoEntity.data!.uploadUrl, form); + // print("statusText:${response.statusText} statusCode:${response.statusCode} response:$response"); + } + + void postCases(List image) async { + final form = FormData({ + 'file': MultipartFile(image, filename: 'avatar.png'), + 'otherFile': MultipartFile(image, filename: 'cover.png'), + }); + Response response= await post('http://youapi/users/upload', form); } //更新个人信息-头像 @@ -32,4 +84,27 @@ class MinePersonInfoLogic extends BaseGetXController { Toast.show(msg: '操作成功'); } } + + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + + getUserInfoRequest(); + } + + @override + void onInit() { + // TODO: implement onInit + super.onInit(); + + getUserInfoRequest(); + } + + + @override + void onClose() { + // TODO: implement onClose + + } } diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart index 2724ae70..af614314 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart @@ -23,12 +23,12 @@ class _MinePersonInfoPageState extends State { final logic = Get.put(MinePersonInfoLogic()); final state = Get.find().state; - @override - void initState() { - super.initState(); - - logic.getUserInfoRequest(); - } + // @override + // void initState() { + // super.initState(); + // + // logic.getUserInfoRequest(); + // } @override Widget build(BuildContext context) { @@ -198,7 +198,14 @@ class _MinePersonInfoPageState extends State { maxHeight: 250, maxWidth: 250, ); - if (image != null) state.image = image; - setState(() {}); + if (image != null) { + state.image = image; + var bytes = File(state.image!.path); + var enc = await bytes.readAsBytes(); + print(enc.length); + print("state.image!.path:${state.image!.path} state.image!.name:${state.image!.name} state.image!.length():${state.image!.length()}"); + logic.getUpTokenRequest(state.image!.name, enc.length); + setState((){}); + } } } diff --git a/star_lock/lib/mine/mineSet/mineSet/mineSet_page.dart b/star_lock/lib/mine/mineSet/mineSet/mineSet_page.dart index 12a49b33..98c9151a 100644 --- a/star_lock/lib/mine/mineSet/mineSet/mineSet_page.dart +++ b/star_lock/lib/mine/mineSet/mineSet/mineSet_page.dart @@ -198,6 +198,14 @@ class _MineSetPageState extends State { action: () { Toast.show(msg: "功能暂未开放"); }), + CommonItem( + leftTitel: "小米IoT平台", + rightTitle: "", + isHaveLine: false, + isHaveDirection: true, + action: () { + Toast.show(msg: "功能暂未开放"); + }), // CommonItem(leftTitel:TranslationLoader.lanKeys!.valueAddedServices!.tr, rightTitle:"", isHaveDirection: true, action: (){ // // }), diff --git a/star_lock/lib/network/api.dart b/star_lock/lib/network/api.dart index d0d84585..73432872 100644 --- a/star_lock/lib/network/api.dart +++ b/star_lock/lib/network/api.dart @@ -26,6 +26,8 @@ abstract class Api { final String lockRecordUploadURL = '/lockRecords/fromLock'; //操作上传 final String getLockRecordLastUploadDataTimeURL = '/lockRecords/getLastRecordTime'; //查询锁记录最后时间 + final String getLockNetTokenURL = '/lock/getLockNetToken'; //获取手机联网token + final String bindingBlueAdminURL = '/lock/bindAdmin'; //绑定蓝牙管理员 final String modifyKeyNameURL = '/key/modifyKeyName'; //修改锁名称 final String updateLockNameURL = '/lock/updateLockName'; //修改锁名(新) @@ -141,7 +143,7 @@ abstract class Api { '/safeAnswer/getOwnQuestionList'; //获取已设置的安全信息 final String setSafeAnswerURL = '/safeAnswer/set'; //设置安全信息 final String getUpTokenURL = - '/user/getUpToken'; //上传头像 先获取upToken 再调用updateUserInfo + '/file/getUploadParams'; //上传头像 先获取upToken 再调用updateUserInfo final String unbindPhoneTokenURL = '/user/unbindPhoneToken'; //获取解绑手机号Token final String unbindEmailTokenURL = '/user/unbindEmailToken'; //获取解绑邮箱Token final String pushBindAppIdURL = '/user/bindAppId'; //推送绑定APP设备 diff --git a/star_lock/lib/network/api_provider.dart b/star_lock/lib/network/api_provider.dart index 1fba9a04..c48dd407 100644 --- a/star_lock/lib/network/api_provider.dart +++ b/star_lock/lib/network/api_provider.dart @@ -260,14 +260,24 @@ class ApiProvider extends BaseProvider { jsonEncode({ 'lockId': lockId, 'records': records, - })); + }), + isUnShowLoading:true); // 查询锁记录最后时间 Future getLockRecordLastUploadDataTime(String lockId) => post( getLockRecordLastUploadDataTimeURL.toUrl, jsonEncode({ 'lockId': lockId, - })); + }), + isUnShowLoading: true); + + // 获取手机联网token + Future getLockNetToken(String lockId) => post( + getLockNetTokenURL.toUrl, + jsonEncode({ + 'lockId': lockId, + }), + isUnShowLoading: true); // 绑定蓝牙管理员 Future bindingBlueAdmin( @@ -603,6 +613,15 @@ class ApiProvider extends BaseProvider { 'attendance': resetSwitch, })); + // 设置开锁时是否需联网 + Future setOpenLockNeedOnlineData(int lockId, int appUnlockOnline) => + post( + updateLockSettingUrl.toUrl, + jsonEncode({ + 'lockId': lockId, + 'appUnlockOnline': appUnlockOnline, + })); + // 设置标记房态 Future setRoomStatusData(int lockId, int roomStatus) => post( @@ -1319,9 +1338,19 @@ class ApiProvider extends BaseProvider { setSafeAnswerURL.toUrl, jsonEncode({"questionAndAnswerList": questionAndAnswerList})); - //上传头像 先获取upToken 再调用updateUserInfo - Future getUpToken(String type) => - post(getUpTokenURL.toUrl, jsonEncode({"type": type})); + // 获取上传文件的upToken 再调用updateUserInfo + Future getUpToken(String module, String typeKey, String type, String filename, int size) => + post( + getUpTokenURL.toUrl, + jsonEncode({ + "module": module, + typeKey: type, + "filename": filename, + "size": size, + })); + + // 文件上传 + Future uploadFile(String url, dynamic boay) => post(url, boay, isUnUploadFile: false, contentType:'multipart/form-data'); //获取解绑手机号Token Future unbindPhoneToken(String verificationCode) => post( diff --git a/star_lock/lib/network/api_provider_base.dart b/star_lock/lib/network/api_provider_base.dart index e00ac289..cfd44cec 100644 --- a/star_lock/lib/network/api_provider_base.dart +++ b/star_lock/lib/network/api_provider_base.dart @@ -23,10 +23,11 @@ class BaseProvider extends GetConnect with Api { @override Future> post(String? url, body, - {String? contentType, + {String? contentType = "application/json", Map? headers, Map? query, Decoder? decoder, + bool? isUnUploadFile = true, Progress? uploadProgress, bool? isUnShowLoading = false}) async { // print("post: url:${url} body:${body} contentType:${contentType} headers:${headers} query:${query}"); diff --git a/star_lock/lib/network/api_repository.dart b/star_lock/lib/network/api_repository.dart index 311cf417..f3faf500 100644 --- a/star_lock/lib/network/api_repository.dart +++ b/star_lock/lib/network/api_repository.dart @@ -33,12 +33,14 @@ import '../main/lockDetail/lcokSet/configuringWifi/configuringWifiEntity.dart'; import '../main/lockDetail/lcokSet/lockSet/checkingInInfoData_entity.dart'; import '../main/lockDetail/lcokSet/lockSet/lockSetInfo_entity.dart'; import '../main/lockDetail/lcokSet/lockTime/getServerDatetime_entity.dart'; +import '../main/lockDetail/lockDetail/lockNetToken_entity.dart'; import '../main/lockDetail/lockOperatingRecord/lockOperatingRecordGetLastRecordTime_entity.dart'; import '../main/lockDetail/otherTypeKey/addFingerprint/addFingerprint/addFingerprint_entity.dart'; import '../main/lockDetail/otherTypeKey/addICCard/addICCard_entity.dart'; import '../main/lockDetail/otherTypeKey/otherTypeKeyList/fingerprintListData_entity.dart'; import '../main/lockMian/entity/lockListInfo_entity.dart'; import '../mine/addLock/saveLock/entity/SaveLockEntity.dart'; +import '../mine/minePersonInfo/minePersonInfoPage/minePersonGetUploadFileInfo_entity.dart'; import '../mine/mineSet/transferGateway/selectGetewayList_entity.dart'; import '../mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_entity.dart'; import '../mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_entity.dart'; @@ -228,6 +230,12 @@ class ApiRepository { return LockOperatingRecordGetLastRecordTimeEntity.fromJson(res.body); } + // 获取手机联网token + Future getLockNetToken({required String lockId}) async { + final res = await apiProvider.getLockNetToken(lockId); + return LockNetTokenEntity.fromJson(res.body); + } + // 绑定蓝牙管理员 Future bindingBlueAdmin( { required String lockAlias, @@ -622,6 +630,15 @@ class ApiRepository { return LoginEntity.fromJson(res.body); } + // 设置开锁时是否需联网 + Future setOpenLockNeedOnlineData({ + required int lockId, + required int appUnlockOnline, + }) async { + final res = await apiProvider.setOpenLockNeedOnlineData(lockId, appUnlockOnline); + return LoginEntity.fromJson(res.body); + } + // 设置开门方向 Future setOpenDoorDirectionData({ required int lockId, @@ -1330,8 +1347,26 @@ class ApiRepository { } //上传头像 先获取upToken 再调用updateUserInfo - Future getUpToken(String type) async { - final res = await apiProvider.getUpToken(type); + Future getUpToken( + { + required String module, + required String typeKey, + required String type, + required String filename, + required int size + } + ) async { + final res = await apiProvider.getUpToken(module, typeKey, type, filename, size); + return MinePersonGetUploadFileInfoEntity.fromJson(res.body); + } + + // 文件上传 + Future uploadFile( + { + required String url, + required dynamic body, + }) async { + final res = await apiProvider.uploadFile(url, body); return LoginEntity.fromJson(res.body); } diff --git a/star_lock/lib/network/request_interceptor.dart b/star_lock/lib/network/request_interceptor.dart index f77d4faa..21a09088 100644 --- a/star_lock/lib/network/request_interceptor.dart +++ b/star_lock/lib/network/request_interceptor.dart @@ -14,7 +14,7 @@ FutureOr requestInterceptor(Request request) async { request.headers['User-Agent'] = 'StarLock/${PlatformInfoService.to.info.version}/${PlatformInfoService.to.info.buildNumber}/${GetPlatform.isAndroid ? 'Android' : 'iOS'}'; request.headers['Accept-Language'] = 'zh_CN'; - request.headers['Content-Type'] = 'application/json'; + // request.headers['Content-Type'] = 'application/json'; // request.headers['token'] = StoreService.to.userToken!; // print("11111${StoreService.to.userToken}"); String? xToken = ''; diff --git a/star_lock/lib/tools/commonItem.dart b/star_lock/lib/tools/commonItem.dart index c35d83ea..4f0790a8 100644 --- a/star_lock/lib/tools/commonItem.dart +++ b/star_lock/lib/tools/commonItem.dart @@ -17,7 +17,7 @@ class CommonItem extends StatelessWidget { {Key? key, required this.leftTitel, this.rightTitle, - this.allHeight = 45, + this.allHeight, this.isHaveDirection = false, this.isHaveLine = false, this.isHaveRightWidget = false, @@ -34,7 +34,7 @@ class CommonItem extends StatelessWidget { // mainAxisAlignment: MainAxisAlignment.center, children: [ Container( - height: allHeight ?? 60.h, + height: allHeight ?? 65.h, color: Colors.white, padding: EdgeInsets.only( left: 20.w, right: 10.w), // , top: 20.w, bottom: 20.w diff --git a/star_lock/lib/tools/eventBusEventManage.dart b/star_lock/lib/tools/eventBusEventManage.dart index 52dc945d..8f1d6546 100644 --- a/star_lock/lib/tools/eventBusEventManage.dart +++ b/star_lock/lib/tools/eventBusEventManage.dart @@ -47,4 +47,11 @@ class ChangeLanguageBlockLastLanguageEvent{ /// 锁分组添加或者删除锁之后刷新首页数据 class LockGroupEditGroupLockRefreshEvent{ LockGroupEditGroupLockRefreshEvent(); +} + +/// 锁设置里面开启关闭刷新锁详情 +class LockSetChangeSetRefreshLockDetailWithType{ + int type;// 0 考勤 1开锁时是否需联网 + int setResult; + LockSetChangeSetRefreshLockDetailWithType(this.type, this.setResult); } \ No newline at end of file diff --git a/star_lock/lib/tools/showTFView.dart b/star_lock/lib/tools/showTFView.dart index 4fc01340..c5827ae9 100644 --- a/star_lock/lib/tools/showTFView.dart +++ b/star_lock/lib/tools/showTFView.dart @@ -51,24 +51,6 @@ class ShowTFView extends StatelessWidget { hintStyle: TextStyle(fontSize: 22.sp, height: 1.0), //不需要输入框下划线 border: InputBorder.none, - //左边图标设置 - // icon: Padding( - // padding: EdgeInsets.only(top:30.w, bottom: 20.w, right: 20.w, left: 20.w), - // child: Image.asset('images/main/icon_main_search.png', width: 40.w, height: 40.w,), - // ), - // //右边图标设置 - // suffixIcon: GestureDetector( - // onTap: () { - // //addPostFrameCallback是 StatefulWidge 渲染结束的回调,只会被调用一次 - // // SchedulerBinding.instance.addPostFrameCallback((_) { - // // _controller.text = ""; - // // }); - // }, - // child: Padding( - // padding: EdgeInsets.all(8), - // child: Image.asset('images/main/icon_main_cell.png', width: 50.w, height: 50.w,), - // ), - // ) ), ), )