From 0c0f9c1d24d58ec803e7dfaa7c462dab67fc9854 Mon Sep 17 00:00:00 2001 From: UnknownObject Date: Mon, 14 Nov 2022 22:34:17 +0800 Subject: [PATCH] add ReadMe.md --- ReadMe.md | 101 +++++++++++++++ app/src/main/res/drawable/ocr_demo.png | Bin 39984 -> 0 bytes .../x86/generate_cxx_metadata_296_timing.txt | 2 + .../x86/generate_cxx_metadata_31_timing.txt | 2 + .../meta/x86/metadata_generation_record.json | 120 +----------------- .../x86/generate_cxx_metadata_296_timing.txt | 2 + .../x86/generate_cxx_metadata_31_timing.txt | 2 + .../meta/x86/metadata_generation_record.json | 6 +- .../cxx/create_cxx_tasks_296_timing.txt | 12 ++ .../cxx/create_cxx_tasks_31_timing.txt | 13 ++ .../cxx/ndk_locator_record_50t213g5.log | 12 +- 11 files changed, 147 insertions(+), 125 deletions(-) create mode 100644 ReadMe.md delete mode 100644 app/src/main/res/drawable/ocr_demo.png diff --git a/ReadMe.md b/ReadMe.md new file mode 100644 index 0000000..8178ecc --- /dev/null +++ b/ReadMe.md @@ -0,0 +1,101 @@ +# MainCar - 主车远端服务程序 + +- 本程序用于嵌入式比赛中Android部分识别/控制相关功能的实现。 +- 程序最初版写于2022-09 +- 作者:UnknownObject; 技术支持:UnknownNetworkService Group + +## 使用和后续开发说明 + +1. 本程序在开发时(2022-09)使用的SDK/NDK/Gradle版本是最新的,后续开发时注意随时更新版本并记录在本文档中: + - Target SDK版本:32 + - Compile SDK版本:32 + - Min SDK版本:26 + - Gradle Plugin版本:7.2.1 + - Gradle版本:7.3.3 + - Android Studio IDE版本:2021.2.1 +2. 本程序识别与图像处理相关功能均使用C/C++以原生库的形式实现 +3. 部分算法/库文件引用(或改编、合并、抽取)自其他第三方库,尽可能地不要改动它们 +4. 如有项目结构/用法上的更新,记得更新这个文档 + +## 项目结构简述 + +### 源代码 + +- ```cpp``` -> 所有的C/C++源代码文件 + - ```lib_hyper_lpr``` -> 开源库HyperLPR的导出,用于进行车牌识别 + - ```include``` -> HyperLPR头文件 + - ```src``` -> HyperLPR源文件 + - ```javaWarpper.cpp``` -> HyperLPR中负责提供Java接口的文件 + - ```lib_serial_port``` -> 从Google示例中抽取的串口通信库 + - ```opencv_libqr``` -> 从OpenCV源代码中提取并改写的多个二维码检测/分离库 + - ```CMakeLists.txt``` -> 用于CMake编译的工程文件,记录着所有的原生库信息和如何进行编译 + - ```car_license.h/car_license.cpp``` -> 基于模板匹配的车牌识别 + - ```car_license_ocr.h/car_license_ocr.cpp``` -> 基于OCR的车牌识别(图像预处理部分) + - ```color_reco.h/color_reco.cpp``` -> 颜色识别库(仅作为形状颜色识别的子库使用,无除自检外的Java接口) + - ```debug_logger.h``` -> 用于调试的原生库日志再封装 + - ```env_test.cpp``` -> NDK编译与原生OpenCV自检库,用于检查库是否正确导入及NDK动态库是否能正常加载 + - ```image_processor.h/image_processor.cpp``` -> 形状颜色和交通标志识别的图像预处理库(仅作为子库使用,无除自检外的Java接口) + - ```main_car_aes.h/main_car_aes.cpp``` -> 数据处理算法库,这个库中的内容需要根据比赛时的算法现场编写 + - ```ocr_text.h/ocr_text.cpp``` -> OCR(光学字符识别)的图像预处理库 + - ```opencv_support.h/opencv_support.cpp``` -> 图像格式转换库,提供Android中Bitmap与OpenCV中Mat的互相转换 + - ```public_types.h/public_types.cpp``` -> 识别中使用到的类/结构体/枚举类型的定义 + - ```qr_code_decode.h/qr_code_decode.cpp``` -> 二维码识别的图像预处理和切分 + - ```shape_color_reco.h/shape_color_reco.cpp``` -> 形状颜色识别 + - ```shape_reco.h/shape_reco.cpp``` -> 形状识别库(仅作为形状颜色识别的子库使用,无除自检外的Java接口) + - ```traffic_light.h/traffic_light.cpp``` -> 交通灯识别 + - ```traffic_sign.h/traffic_sign.cpp``` -> 基于模板匹配的交通标志识别 +- ```java``` -> 所有的Java源代码文件 + - ```com.uns.maincar``` -> 主包名 + - ```communication``` -> 通信相关代码 + - ```CommandEncoder``` -> 指令编码类 + - ```CommandDecoder``` -> 指令解码类 + - ```DataTransferCore``` -> 通信接口,定义了基本的通信函数 + - ```SerialPortTransferCore``` -> 通信接口的实现类,实现了串口通信 + - ```WifiTransferCore``` -> 通信接口的实现类,实现了Wifi通信 + - ```constrants``` -> 常量和枚举类型定义 + - ```Commands``` -> 与主车通信的指令定义 + - ```Flags``` -> 主/从车的移动控制指令和一些其他的常量 + - ```GlobalColor``` -> 颜色种类的枚举类型 + - ```GlobalShape``` -> 形状种类的枚举类型 + - ```GlobalSignType``` -> 交通标志种类的枚举类型 + - ```cpp_interface``` -> 原生库对应的Java接口类 + - ```hyperlpr``` -> HyperLPR的接口库 + - ```DeepAssetUtil``` -> HyperLPR资源管理接口 + - ```PlateRecognition``` -> HyperLPR识别接口 + - ```CarLicense``` -> 车牌识别接口类,包含模板匹配、OCR、HyperLPR三种识别方式 + - ```EnvTest``` -> 自检接口类,包含了全部的原生库自检 + - ```MainCarAES``` -> 数据处理算法接口类 + - ```OCR``` -> OCR接口类,提供静态文本识别功能并对基于OCR的车牌识别提供支持 + - ```QRDecode``` -> 二维码识别接口类,提供单个/多个二维码识别功能 + - ```ShapeColor``` -> 形状颜色识别接口类 + - ```TrafficLight``` -> 交通灯识别接口类 + - ```TrafficSign``` -> 交通标志识别接口类 + - ```gui``` -> 图形用户界面(Activity) + - ```MainActivity``` -> 程序主界面和初始化 + - ```MovementController``` -> 主车和从车的移动控制(警告:该功能并不完善,仅供调试及娱乐用途) + - ```PermissionGetter``` -> 外部存储权限获取 + - ```tools``` -> 一些工具类 + - ```ImageReleaser``` -> 车牌和交通标志的模板图释放类 + - ```OCRDataReleaser``` -> OCR训练模型释放类 + - ```TextFilter``` -> 文本过滤器 + +### 资源文件 + +- ```assets``` + - ```lpr``` -> HyperLPR的资源文件 +- ```res``` + - ```drawable``` + - ```cl_x.jpg``` -> 车牌识别的字符模板 + - ```tf_x.jpg``` -> 交通标志识别的模板 + - ```ocr_self_test.png``` -> OCR自检图片 + - ```qr_decode_test``` -> 二维码识别自检图片 + - ```raw``` + - ```chi_sim.traineddata``` -> 简体中文OCR模型 + - ```eng.traineddata``` -> 英文(和数字)OCR模型 + +### 第三方库 + +- ```libs``` + - ```camerautil.jar``` -> 百科融创摄像头操作库 + - ```zxingcpp-release.aar``` -> ZXing二维码识别库 +- ```opencv``` -> OpenCV计算机视觉库 \ No newline at end of file diff --git a/app/src/main/res/drawable/ocr_demo.png b/app/src/main/res/drawable/ocr_demo.png deleted file mode 100644 index 6b07db0bda5e94e450edd4785b1d8716c0b6a45d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39984 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 diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_296_timing.txt b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_296_timing.txt index 581e979..71ad0aa 100644 --- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_296_timing.txt +++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_296_timing.txt @@ -19,3 +19,5 @@ generate_cxx_metadata [gap of 12ms] generate_cxx_metadata completed in 643ms +# C/C++ build system timings + diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_31_timing.txt b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_31_timing.txt index 32a2e40..9e616b5 100644 --- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_31_timing.txt +++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_31_timing.txt @@ -156,3 +156,5 @@ generate_cxx_metadata create-invalidation-state 10ms generate_cxx_metadata completed in 14ms +# C/C++ build system timings + diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/metadata_generation_record.json b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/metadata_generation_record.json index 107fcb5..1307eb0 100644 --- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/metadata_generation_record.json +++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/metadata_generation_record.json @@ -11,11 +11,11 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -1159070138 + "memoizedHashCode": 931437989 }, { "level_": 0, - "message_": "rebuilding JSON F:\\Android-APK\\MainCar\\opencv\\.cxx\\Debug\\6x33t2q6\\x86\\android_gradle_build.json due to:", + "message_": "JSON \u0027F:\\Android-APK\\MainCar\\opencv\\.cxx\\Debug\\6x33t2q6\\x86\\android_gradle_build.json\u0027 was up-to-date", "file_": "F:\\Android-APK\\MainCar\\opencv\\libcxx_helper\\CMakeLists.txt", "tag_": "debug|x86", "diagnosticCode_": 0, @@ -25,119 +25,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -1355196926 - }, - { - "level_": 0, - "message_": "- force flag, will remove stale json folder", - "file_": "F:\\Android-APK\\MainCar\\opencv\\libcxx_helper\\CMakeLists.txt", - "tag_": "debug|x86", - "diagnosticCode_": 0, - "memoizedIsInitialized": 1, - "unknownFields": { - "fields": {}, - "fieldsDescending": {} - }, - "memoizedSize": -1, - "memoizedHashCode": -1958375788 - }, - { - "level_": 0, - "message_": "removing stale contents from \u0027F:\\Android-APK\\MainCar\\opencv\\.cxx\\Debug\\6x33t2q6\\x86\u0027", - "file_": "F:\\Android-APK\\MainCar\\opencv\\libcxx_helper\\CMakeLists.txt", - "tag_": "debug|x86", - "diagnosticCode_": 0, - "memoizedIsInitialized": 1, - "unknownFields": { - "fields": {}, - "fieldsDescending": {} - }, - "memoizedSize": -1, - "memoizedHashCode": -757246036 - }, - { - "level_": 0, - "message_": "created folder \u0027F:\\Android-APK\\MainCar\\opencv\\.cxx\\Debug\\6x33t2q6\\x86\u0027", - "file_": "F:\\Android-APK\\MainCar\\opencv\\libcxx_helper\\CMakeLists.txt", - "tag_": "debug|x86", - "diagnosticCode_": 0, - "memoizedIsInitialized": 1, - "unknownFields": { - "fields": {}, - "fieldsDescending": {} - }, - "memoizedSize": -1, - "memoizedHashCode": -1074877000 - }, - { - "level_": 0, - "message_": "executing cmake Executable : D:\\Android_SDK\\cmake\\3.18.1\\bin\\cmake.exe\narguments : \n-HF:\\Android-APK\\MainCar\\opencv\\libcxx_helper\n-DCMAKE_SYSTEM_NAME\u003dAndroid\n-DCMAKE_EXPORT_COMPILE_COMMANDS\u003dON\n-DCMAKE_SYSTEM_VERSION\u003d26\n-DANDROID_PLATFORM\u003dandroid-26\n-DANDROID_ABI\u003dx86\n-DCMAKE_ANDROID_ARCH_ABI\u003dx86\n-DANDROID_NDK\u003dD:\\Android_SDK\\ndk\\21.4.7075529\n-DCMAKE_ANDROID_NDK\u003dD:\\Android_SDK\\ndk\\21.4.7075529\n-DCMAKE_TOOLCHAIN_FILE\u003dD:\\Android_SDK\\ndk\\21.4.7075529\\build\\cmake\\android.toolchain.cmake\n-DCMAKE_MAKE_PROGRAM\u003dD:\\Android_SDK\\cmake\\3.18.1\\bin\\ninja.exe\n-DCMAKE_LIBRARY_OUTPUT_DIRECTORY\u003dF:\\Android-APK\\MainCar\\opencv\\build\\intermediates\\cxx\\Debug\\6x33t2q6\\obj\\x86\n-DCMAKE_RUNTIME_OUTPUT_DIRECTORY\u003dF:\\Android-APK\\MainCar\\opencv\\build\\intermediates\\cxx\\Debug\\6x33t2q6\\obj\\x86\n-DCMAKE_BUILD_TYPE\u003dDebug\n-BF:\\Android-APK\\MainCar\\opencv\\.cxx\\Debug\\6x33t2q6\\x86\n-GNinja\n-DANDROID_STL\u003dc++_shared\njvmArgs : \n\n", - "file_": "F:\\Android-APK\\MainCar\\opencv\\libcxx_helper\\CMakeLists.txt", - "tag_": "debug|x86", - "diagnosticCode_": 0, - "memoizedIsInitialized": 1, - "unknownFields": { - "fields": {}, - "fieldsDescending": {} - }, - "memoizedSize": -1, - "memoizedHashCode": 155087040 - }, - { - "level_": 0, - "message_": "Executable : D:\\Android_SDK\\cmake\\3.18.1\\bin\\cmake.exe\narguments : \n-HF:\\Android-APK\\MainCar\\opencv\\libcxx_helper\n-DCMAKE_SYSTEM_NAME\u003dAndroid\n-DCMAKE_EXPORT_COMPILE_COMMANDS\u003dON\n-DCMAKE_SYSTEM_VERSION\u003d26\n-DANDROID_PLATFORM\u003dandroid-26\n-DANDROID_ABI\u003dx86\n-DCMAKE_ANDROID_ARCH_ABI\u003dx86\n-DANDROID_NDK\u003dD:\\Android_SDK\\ndk\\21.4.7075529\n-DCMAKE_ANDROID_NDK\u003dD:\\Android_SDK\\ndk\\21.4.7075529\n-DCMAKE_TOOLCHAIN_FILE\u003dD:\\Android_SDK\\ndk\\21.4.7075529\\build\\cmake\\android.toolchain.cmake\n-DCMAKE_MAKE_PROGRAM\u003dD:\\Android_SDK\\cmake\\3.18.1\\bin\\ninja.exe\n-DCMAKE_LIBRARY_OUTPUT_DIRECTORY\u003dF:\\Android-APK\\MainCar\\opencv\\build\\intermediates\\cxx\\Debug\\6x33t2q6\\obj\\x86\n-DCMAKE_RUNTIME_OUTPUT_DIRECTORY\u003dF:\\Android-APK\\MainCar\\opencv\\build\\intermediates\\cxx\\Debug\\6x33t2q6\\obj\\x86\n-DCMAKE_BUILD_TYPE\u003dDebug\n-BF:\\Android-APK\\MainCar\\opencv\\.cxx\\Debug\\6x33t2q6\\x86\n-GNinja\n-DANDROID_STL\u003dc++_shared\njvmArgs : \n\n", - "file_": "F:\\Android-APK\\MainCar\\opencv\\libcxx_helper\\CMakeLists.txt", - "tag_": "debug|x86", - "diagnosticCode_": 0, - "memoizedIsInitialized": 1, - "unknownFields": { - "fields": {}, - "fieldsDescending": {} - }, - "memoizedSize": -1, - "memoizedHashCode": 700052607 - }, - { - "level_": 0, - "message_": "Exiting generation of F:\\Android-APK\\MainCar\\opencv\\.cxx\\Debug\\6x33t2q6\\x86\\compile_commands.json.bin normally", - "file_": "F:\\Android-APK\\MainCar\\opencv\\libcxx_helper\\CMakeLists.txt", - "tag_": "debug|x86", - "diagnosticCode_": 0, - "memoizedIsInitialized": 1, - "unknownFields": { - "fields": {}, - "fieldsDescending": {} - }, - "memoizedSize": -1, - "memoizedHashCode": -452835122 - }, - { - "level_": 0, - "message_": "done executing cmake", - "file_": "F:\\Android-APK\\MainCar\\opencv\\libcxx_helper\\CMakeLists.txt", - "tag_": "debug|x86", - "diagnosticCode_": 0, - "memoizedIsInitialized": 1, - "unknownFields": { - "fields": {}, - "fieldsDescending": {} - }, - "memoizedSize": -1, - "memoizedHashCode": -365654144 - }, - { - "level_": 0, - "message_": "write command file F:\\Android-APK\\MainCar\\opencv\\.cxx\\Debug\\6x33t2q6\\x86\\metadata_generation_command.txt", - "file_": "F:\\Android-APK\\MainCar\\opencv\\libcxx_helper\\CMakeLists.txt", - "tag_": "debug|x86", - "diagnosticCode_": 0, - "memoizedIsInitialized": 1, - "unknownFields": { - "fields": {}, - "fieldsDescending": {} - }, - "memoizedSize": -1, - "memoizedHashCode": 1138716982 + "memoizedHashCode": -1430839592 }, { "level_": 0, @@ -151,6 +39,6 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": 1572418940 + "memoizedHashCode": -632040229 } ] \ No newline at end of file diff --git a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/generate_cxx_metadata_296_timing.txt b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/generate_cxx_metadata_296_timing.txt index c4a800a..d43933f 100644 --- a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/generate_cxx_metadata_296_timing.txt +++ b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/generate_cxx_metadata_296_timing.txt @@ -7,3 +7,5 @@ generate_cxx_metadata completed in 18ms # C/C++ build system timings +# C/C++ build system timings + diff --git a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/generate_cxx_metadata_31_timing.txt b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/generate_cxx_metadata_31_timing.txt index 5be3558..ccc7315 100644 --- a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/generate_cxx_metadata_31_timing.txt +++ b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/generate_cxx_metadata_31_timing.txt @@ -86,3 +86,5 @@ generate_cxx_metadata completed in 23ms # C/C++ build system timings generate_cxx_metadata 10ms +# C/C++ build system timings + diff --git a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/metadata_generation_record.json b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/metadata_generation_record.json index 794bda9..62b5b5d 100644 --- a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/metadata_generation_record.json +++ b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/metadata_generation_record.json @@ -11,7 +11,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -762021707 + "memoizedHashCode": 919642793 }, { "level_": 0, @@ -25,7 +25,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -1113936271 + "memoizedHashCode": 567728229 }, { "level_": 0, @@ -39,6 +39,6 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": 1969467371 + "memoizedHashCode": -643835425 } ] \ No newline at end of file diff --git a/opencv/build/intermediates/cxx/create_cxx_tasks_296_timing.txt b/opencv/build/intermediates/cxx/create_cxx_tasks_296_timing.txt index cba6ec3..2477201 100644 --- a/opencv/build/intermediates/cxx/create_cxx_tasks_296_timing.txt +++ b/opencv/build/intermediates/cxx/create_cxx_tasks_296_timing.txt @@ -166,3 +166,15 @@ create_cxx_tasks create-initial-cxx-model completed in 85ms create_cxx_tasks completed in 86ms +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 33ms + create-module-model completed in 36ms + create-module-model + create-cmake-model 33ms + create-module-model completed in 36ms + create-initial-cxx-model completed in 89ms +create_cxx_tasks completed in 90ms + diff --git a/opencv/build/intermediates/cxx/create_cxx_tasks_31_timing.txt b/opencv/build/intermediates/cxx/create_cxx_tasks_31_timing.txt index 036f56f..67a6217 100644 --- a/opencv/build/intermediates/cxx/create_cxx_tasks_31_timing.txt +++ b/opencv/build/intermediates/cxx/create_cxx_tasks_31_timing.txt @@ -864,3 +864,16 @@ create_cxx_tasks create-initial-cxx-model completed in 87ms create_cxx_tasks completed in 89ms +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 34ms + create-module-model completed in 36ms + create-module-model + create-cmake-model 31ms + create-module-model completed in 33ms + [gap of 10ms] + create-initial-cxx-model completed in 88ms +create_cxx_tasks completed in 89ms + diff --git a/opencv/build/intermediates/cxx/ndk_locator_record_50t213g5.log b/opencv/build/intermediates/cxx/ndk_locator_record_50t213g5.log index de322f2..9a6ba44 100644 --- a/opencv/build/intermediates/cxx/ndk_locator_record_50t213g5.log +++ b/opencv/build/intermediates/cxx/ndk_locator_record_50t213g5.log @@ -11,7 +11,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -585486183 + "memoizedHashCode": 1505021944 }, { "level_": 0, @@ -25,7 +25,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": 206701920 + "memoizedHashCode": -1997757249 }, { "level_": 0, @@ -39,7 +39,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": 911163113 + "memoizedHashCode": -1293296056 }, { "level_": 0, @@ -53,7 +53,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -1520990113 + "memoizedHashCode": 569518014 }, { "level_": 0, @@ -67,7 +67,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": 1881287601 + "memoizedHashCode": -323171568 }, { "level_": 0, @@ -81,6 +81,6 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -2077699476 + "memoizedHashCode": 12808651 } ] \ No newline at end of file