├── Android
└── ESP32-CAM-MJPEG-Viewer
│ ├── .DS_Store
│ ├── .gradle
│ ├── 6.5
│ │ ├── executionHistory
│ │ │ ├── executionHistory.bin
│ │ │ └── executionHistory.lock
│ │ ├── fileChanges
│ │ │ └── last-build.bin
│ │ ├── fileContent
│ │ │ └── fileContent.lock
│ │ ├── fileHashes
│ │ │ ├── fileHashes.bin
│ │ │ ├── fileHashes.lock
│ │ │ └── resourceHashesCache.bin
│ │ ├── gc.properties
│ │ └── javaCompile
│ │ │ ├── classAnalysis.bin
│ │ │ ├── jarAnalysis.bin
│ │ │ ├── javaCompile.lock
│ │ │ └── taskHistory.bin
│ ├── buildOutputCleanup
│ │ ├── buildOutputCleanup.lock
│ │ ├── cache.properties
│ │ └── outputFiles.bin
│ ├── checksums
│ │ └── checksums.lock
│ └── vcs-1
│ │ └── gc.properties
│ ├── .idea
│ ├── $CACHE_FILE$
│ ├── .gitignore
│ ├── .name
│ ├── caches
│ │ └── build_file_checksums.ser
│ ├── compiler.xml
│ ├── dictionaries
│ ├── encodings.xml
│ ├── gradle.xml
│ ├── jarRepositories.xml
│ ├── libraries
│ │ ├── Gradle__androidx_activity_activity_1_0_0_aar.xml
│ │ ├── Gradle__androidx_annotation_annotation_1_1_0.xml
│ │ ├── Gradle__androidx_appcompat_appcompat_1_1_0_aar.xml
│ │ ├── Gradle__androidx_appcompat_appcompat_resources_1_1_0_aar.xml
│ │ ├── Gradle__androidx_arch_core_core_common_2_1_0.xml
│ │ ├── Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml
│ │ ├── Gradle__androidx_cardview_cardview_1_0_0_aar.xml
│ │ ├── Gradle__androidx_collection_collection_1_1_0.xml
│ │ ├── Gradle__androidx_constraintlayout_constraintlayout_1_1_3_aar.xml
│ │ ├── Gradle__androidx_constraintlayout_constraintlayout_solver_1_1_3.xml
│ │ ├── Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_aar.xml
│ │ ├── Gradle__androidx_core_core_1_1_0_aar.xml
│ │ ├── Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml
│ │ ├── Gradle__androidx_customview_customview_1_0_0_aar.xml
│ │ ├── Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml
│ │ ├── Gradle__androidx_fragment_fragment_1_1_0_aar.xml
│ │ ├── Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml
│ │ ├── Gradle__androidx_lifecycle_lifecycle_common_2_1_0.xml
│ │ ├── Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml
│ │ ├── Gradle__androidx_lifecycle_lifecycle_livedata_core_2_0_0_aar.xml
│ │ ├── Gradle__androidx_lifecycle_lifecycle_runtime_2_1_0_aar.xml
│ │ ├── Gradle__androidx_lifecycle_lifecycle_viewmodel_2_1_0_aar.xml
│ │ ├── Gradle__androidx_loader_loader_1_0_0_aar.xml
│ │ ├── Gradle__androidx_recyclerview_recyclerview_1_1_0_aar.xml
│ │ ├── Gradle__androidx_savedstate_savedstate_1_0_0_aar.xml
│ │ ├── Gradle__androidx_test_core_1_2_0_aar.xml
│ │ ├── Gradle__androidx_test_espresso_espresso_core_3_2_0_aar.xml
│ │ ├── Gradle__androidx_test_espresso_espresso_idling_resource_3_2_0_aar.xml
│ │ ├── Gradle__androidx_test_ext_junit_1_1_1_aar.xml
│ │ ├── Gradle__androidx_test_monitor_1_2_0_aar.xml
│ │ ├── Gradle__androidx_test_runner_1_2_0_aar.xml
│ │ ├── Gradle__androidx_transition_transition_1_2_0_aar.xml
│ │ ├── Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml
│ │ ├── Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml
│ │ ├── Gradle__androidx_versionedparcelable_versionedparcelable_1_1_0_aar.xml
│ │ ├── Gradle__androidx_viewpager2_viewpager2_1_0_0_aar.xml
│ │ ├── Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml
│ │ ├── Gradle__com_google_android_material_material_1_1_0_aar.xml
│ │ ├── Gradle__com_google_code_findbugs_jsr305_2_0_1.xml
│ │ ├── Gradle__com_squareup_javawriter_2_1_1.xml
│ │ ├── Gradle__javax_inject_javax_inject_1.xml
│ │ ├── Gradle__junit_junit_4_12.xml
│ │ ├── Gradle__junit_junit_4_13_2.xml
│ │ ├── Gradle__net_sf_kxml_kxml2_2_3_0.xml
│ │ ├── Gradle__org_hamcrest_hamcrest_core_1_3.xml
│ │ ├── Gradle__org_hamcrest_hamcrest_integration_1_3.xml
│ │ └── Gradle__org_hamcrest_hamcrest_library_1_3.xml
│ ├── misc.xml
│ ├── modules.xml
│ └── modules
│ │ ├── ESP32-CAM-MJPEG-Monitor.iml
│ │ └── app
│ │ └── ESP32-CAM-MJPEG-Monitor.app.iml
│ ├── app
│ ├── .DS_Store
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src
│ │ ├── .DS_Store
│ │ ├── androidTest
│ │ └── java
│ │ │ └── com
│ │ │ └── example
│ │ │ └── esp32_cam_mjpeg_monitor
│ │ │ └── ExampleInstrumentedTest.java
│ │ ├── main
│ │ ├── .DS_Store
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── example
│ │ │ │ └── esp32_cam_mjpeg_monitor
│ │ │ │ └── MainActivity.java
│ │ └── res
│ │ │ ├── .DS_Store
│ │ │ ├── drawable-v24
│ │ │ └── ic_launcher_foreground.xml
│ │ │ ├── drawable
│ │ │ └── ic_launcher_background.xml
│ │ │ ├── layout
│ │ │ └── activity_main.xml
│ │ │ ├── mipmap-anydpi-v26
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ │ ├── mipmap-hdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-mdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── values-night
│ │ │ └── themes.xml
│ │ │ └── values
│ │ │ ├── colors.xml
│ │ │ ├── strings.xml
│ │ │ └── themes.xml
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── example
│ │ └── esp32_cam_mjpeg_monitor
│ │ └── ExampleUnitTest.java
│ ├── build.gradle
│ ├── gradle.properties
│ ├── gradle
│ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
│ ├── gradlew
│ ├── gradlew.bat
│ ├── local.properties
│ └── settings.gradle
├── Firmware
└── ESP32-CAM
│ ├── .DS_Store
│ ├── ESP32-CAM.ino
│ ├── app_httpd.cpp
│ ├── camera_index.h
│ ├── camera_pins.h
│ └── define.h
├── LICENSE
├── README.md
└── res
└── demo.gif
/Android/ESP32-CAM-MJPEG-Viewer/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/.DS_Store
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/executionHistory/executionHistory.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/executionHistory/executionHistory.bin
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/executionHistory/executionHistory.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/executionHistory/executionHistory.lock
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/fileChanges/last-build.bin:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/fileContent/fileContent.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/fileContent/fileContent.lock
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/fileHashes/fileHashes.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/fileHashes/fileHashes.bin
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/fileHashes/fileHashes.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/fileHashes/fileHashes.lock
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/fileHashes/resourceHashesCache.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/fileHashes/resourceHashesCache.bin
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/gc.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/gc.properties
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/javaCompile/classAnalysis.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/javaCompile/classAnalysis.bin
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/javaCompile/jarAnalysis.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/javaCompile/jarAnalysis.bin
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/javaCompile/javaCompile.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/javaCompile/javaCompile.lock
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/javaCompile/taskHistory.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/.gradle/6.5/javaCompile/taskHistory.bin
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.gradle/buildOutputCleanup/buildOutputCleanup.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/.gradle/buildOutputCleanup/buildOutputCleanup.lock
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.gradle/buildOutputCleanup/cache.properties:
--------------------------------------------------------------------------------
1 | #Sun Jun 20 21:40:55 CST 2021
2 | gradle.version=6.5
3 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.gradle/buildOutputCleanup/outputFiles.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/.gradle/buildOutputCleanup/outputFiles.bin
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.gradle/checksums/checksums.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/.gradle/checksums/checksums.lock
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.gradle/vcs-1/gc.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/.gradle/vcs-1/gc.properties
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/$CACHE_FILE$:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | Android
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/.name:
--------------------------------------------------------------------------------
1 | ESP32-CAM-MJPEG-Monitor
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/caches/build_file_checksums.ser:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/.idea/caches/build_file_checksums.ser
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/dictionaries:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/jarRepositories.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_activity_activity_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_annotation_annotation_1_1_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_1_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_1_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_arch_core_core_common_2_1_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_cardview_cardview_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_collection_collection_1_1_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_1_1_3_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_solver_1_1_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_core_core_1_1_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_fragment_fragment_1_1_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_1_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_1_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_1_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_recyclerview_recyclerview_1_1_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_test_core_1_2_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_2_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_2_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_test_monitor_1_2_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_test_runner_1_2_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_transition_transition_1_2_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_viewpager2_viewpager2_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__com_google_android_material_material_1_1_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_2_0_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__com_squareup_javawriter_2_1_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__junit_junit_4_12.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__junit_junit_4_13_2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__net_sf_kxml_kxml2_2_3_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/modules/ESP32-CAM-MJPEG-Monitor.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/.idea/modules/app/ESP32-CAM-MJPEG-Monitor.app.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | generateDebugSources
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/app/.DS_Store
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id 'com.android.application'
3 | }
4 |
5 | android {
6 | compileSdkVersion 29
7 |
8 | defaultConfig {
9 | applicationId "com.example.esp32_cam_mjpeg_monitor"
10 | minSdkVersion 21
11 | targetSdkVersion 29
12 | versionCode 1
13 | versionName "1.0"
14 |
15 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
16 | }
17 |
18 | buildTypes {
19 | release {
20 | minifyEnabled false
21 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
22 | }
23 | }
24 | compileOptions {
25 | sourceCompatibility JavaVersion.VERSION_1_8
26 | targetCompatibility JavaVersion.VERSION_1_8
27 | }
28 | }
29 |
30 | dependencies {
31 |
32 | implementation 'androidx.appcompat:appcompat:1.1.0'
33 | implementation 'com.google.android.material:material:1.1.0'
34 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
35 | testImplementation 'junit:junit:4.+'
36 | androidTestImplementation 'androidx.test.ext:junit:1.1.1'
37 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
38 | }
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/app/src/.DS_Store
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/androidTest/java/com/example/esp32_cam_mjpeg_monitor/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.example.esp32_cam_mjpeg_monitor;
2 |
3 | import android.content.Context;
4 |
5 | import androidx.test.platform.app.InstrumentationRegistry;
6 | import androidx.test.ext.junit.runners.AndroidJUnit4;
7 |
8 | import org.junit.Test;
9 | import org.junit.runner.RunWith;
10 |
11 | import static org.junit.Assert.*;
12 |
13 | /**
14 | * Instrumented test, which will execute on an Android device.
15 | *
16 | * @see Testing documentation
17 | */
18 | @RunWith(AndroidJUnit4.class)
19 | public class ExampleInstrumentedTest {
20 | @Test
21 | public void useAppContext() {
22 | // Context of the app under test.
23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
24 | assertEquals("com.example.esp32_cam_mjpeg_monitor", appContext.getPackageName());
25 | }
26 | }
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/.DS_Store
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/java/com/example/esp32_cam_mjpeg_monitor/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.esp32_cam_mjpeg_monitor;
2 |
3 | import android.app.Activity;
4 | import android.graphics.Bitmap;
5 | import android.graphics.BitmapFactory;
6 | import android.os.Bundle;
7 | import android.os.Environment;
8 | import android.os.Handler;
9 | import android.os.HandlerThread;
10 | import android.os.Looper;
11 | import android.os.Message;
12 | import android.view.View;
13 | import android.widget.Button;
14 | import android.widget.EditText;
15 | import android.widget.ImageView;
16 | import android.widget.TextView;
17 |
18 | import java.io.BufferedInputStream;
19 | import java.io.BufferedReader;
20 | import java.io.File;
21 | import java.io.FileOutputStream;
22 | import java.io.IOException;
23 | import java.io.InputStream;
24 | import java.io.InputStreamReader;
25 | import java.net.HttpURLConnection;
26 | import java.net.MalformedURLException;
27 | import java.net.URL;
28 |
29 | public class MainActivity extends Activity implements View.OnClickListener
30 | {
31 |
32 | private static final String TAG = "MainActivity::";
33 |
34 | private HandlerThread stream_thread,flash_thread,rssi_thread;
35 | private Handler stream_handler,flash_handler,rssi_handler;
36 | private Button flash_button;
37 | private ImageView monitor;
38 | private TextView rssi_text;
39 | private EditText ip_text;
40 |
41 | private final int ID_CONNECT = 200;
42 | private final int ID_FLASH = 201;
43 | private final int ID_RSSI = 202;
44 |
45 | private boolean flash_on_off = false;
46 |
47 | @Override
48 | protected void onCreate(Bundle savedInstanceState) {
49 | super.onCreate(savedInstanceState);
50 | setContentView(R.layout.activity_main);
51 |
52 | findViewById(R.id.connect).setOnClickListener(this);
53 | findViewById(R.id.flash).setOnClickListener(this);
54 | flash_button = findViewById(R.id.flash);
55 | monitor = findViewById(R.id.monitor);
56 | rssi_text = findViewById(R.id.rssi);
57 | ip_text = findViewById(R.id.ip);
58 |
59 | ip_text.setText("192.168.110.253");
60 |
61 | stream_thread = new HandlerThread("http");
62 | stream_thread.start();
63 | stream_handler = new HttpHandler(stream_thread.getLooper());
64 |
65 | flash_thread = new HandlerThread("http");
66 | flash_thread.start();
67 | flash_handler = new HttpHandler(flash_thread.getLooper());
68 |
69 | rssi_thread = new HandlerThread("http");
70 | rssi_thread.start();
71 | rssi_handler = new HttpHandler(rssi_thread.getLooper());
72 | }
73 |
74 | @Override
75 | public void onClick(View v)
76 | {
77 | switch (v.getId())
78 | {
79 | case R.id.connect:
80 | stream_handler.sendEmptyMessage(ID_CONNECT);
81 | rssi_handler.sendEmptyMessage(ID_RSSI);
82 | break;
83 | case R.id.flash:
84 | flash_handler.sendEmptyMessage(ID_FLASH);
85 | break;
86 | default:
87 | break;
88 | }
89 | }
90 |
91 | private class HttpHandler extends Handler
92 | {
93 | public HttpHandler(Looper looper)
94 | {
95 | super(looper);
96 | }
97 |
98 | @Override
99 | public void handleMessage(Message msg)
100 | {
101 | switch (msg.what)
102 | {
103 | case ID_CONNECT:
104 | VideoStream();
105 | break;
106 | case ID_FLASH:
107 | SetFlash();
108 | break;
109 | case ID_RSSI:
110 | GetRSSI();
111 | break;
112 | default:
113 | break;
114 | }
115 | }
116 | }
117 |
118 | private void SetFlash()
119 | {
120 | flash_on_off ^= true;
121 |
122 | String flash_url;
123 | if(flash_on_off){
124 | flash_url = "http://" + ip_text.getText() + ":80/led?var=flash&val=1";
125 | }
126 | else {
127 | flash_url = "http://" + ip_text.getText() + ":80/led?var=flash&val=0";
128 | }
129 |
130 | try
131 | {
132 |
133 | URL url = new URL(flash_url);
134 |
135 | HttpURLConnection huc = (HttpURLConnection) url.openConnection();
136 | huc.setRequestMethod("GET");
137 | huc.setConnectTimeout(1000 * 5);
138 | huc.setReadTimeout(1000 * 5);
139 | huc.setDoInput(true);
140 | huc.connect();
141 | if (huc.getResponseCode() == 200)
142 | {
143 | InputStream in = huc.getInputStream();
144 |
145 | InputStreamReader isr = new InputStreamReader(in);
146 | BufferedReader br = new BufferedReader(isr);
147 | }
148 |
149 | } catch (Exception e)
150 | {
151 | e.printStackTrace();
152 | }
153 | }
154 |
155 | private void GetRSSI() {
156 | rssi_handler.sendEmptyMessageDelayed(ID_RSSI,500);
157 |
158 | String rssi_url = "http://" + ip_text.getText() + ":80/RSSI";
159 |
160 | try {
161 | URL url = new URL(rssi_url);
162 |
163 | try {
164 |
165 | HttpURLConnection huc = (HttpURLConnection) url.openConnection();
166 | huc.setRequestMethod("GET");
167 | huc.setConnectTimeout(1000 * 5);
168 | huc.setReadTimeout(1000 * 5);
169 | huc.setDoInput(true);
170 | huc.connect();
171 | if (huc.getResponseCode() == 200) {
172 | InputStream in = huc.getInputStream();
173 |
174 | InputStreamReader isr = new InputStreamReader(in);
175 | BufferedReader br = new BufferedReader(isr);
176 | final String data = br.readLine();
177 | if (!data.isEmpty()) {
178 | runOnUiThread(new Runnable() {
179 | @Override
180 | public void run() {
181 | rssi_text.setText(data);
182 | }
183 | });
184 | }
185 |
186 | }
187 |
188 | } catch (Exception e) {
189 | e.printStackTrace();
190 | }
191 | }catch (MalformedURLException e) {
192 | e.printStackTrace();
193 | }
194 | }
195 |
196 | private void VideoStream()
197 | {
198 | String stream_url = "http://" + ip_text.getText() + ":81/stream";
199 |
200 | BufferedInputStream bis = null;
201 | FileOutputStream fos = null;
202 | try
203 | {
204 |
205 | URL url = new URL(stream_url);
206 |
207 | try
208 | {
209 | HttpURLConnection huc = (HttpURLConnection) url.openConnection();
210 | huc.setRequestMethod("GET");
211 | huc.setConnectTimeout(1000 * 5);
212 | huc.setReadTimeout(1000 * 5);
213 | huc.setDoInput(true);
214 | huc.connect();
215 |
216 | if (huc.getResponseCode() == 200)
217 | {
218 | InputStream in = huc.getInputStream();
219 |
220 | InputStreamReader isr = new InputStreamReader(in);
221 | BufferedReader br = new BufferedReader(isr);
222 |
223 | String data;
224 |
225 | int len;
226 | byte[] buffer;
227 |
228 | while ((data = br.readLine()) != null)
229 | {
230 | if (data.contains("Content-Type:"))
231 | {
232 | data = br.readLine();
233 |
234 | len = Integer.parseInt(data.split(":")[1].trim());
235 |
236 | bis = new BufferedInputStream(in);
237 | buffer = new byte[len];
238 |
239 | int t = 0;
240 | while (t < len)
241 | {
242 | t += bis.read(buffer, t, len - t);
243 | }
244 |
245 | Bytes2ImageFile(buffer, getExternalFilesDir(Environment.DIRECTORY_PICTURES) + "/0A.jpg");
246 |
247 | final Bitmap bitmap = BitmapFactory.decodeFile(getExternalFilesDir(Environment.DIRECTORY_PICTURES) + "/0A.jpg");
248 |
249 | runOnUiThread(new Runnable()
250 | {
251 | @Override
252 | public void run()
253 | {
254 | monitor.setImageBitmap(bitmap);
255 | }
256 | });
257 |
258 | }
259 |
260 |
261 | }
262 | }
263 |
264 | } catch (IOException e)
265 | {
266 | e.printStackTrace();
267 | }
268 | } catch (MalformedURLException e)
269 | {
270 | e.printStackTrace();
271 | } finally
272 | {
273 | try
274 | {
275 | if (bis != null)
276 | {
277 | bis.close();
278 | }
279 | if (fos != null)
280 | {
281 | fos.close();
282 | }
283 |
284 | stream_handler.sendEmptyMessageDelayed(ID_CONNECT,3000);
285 | } catch (IOException e)
286 | {
287 | e.printStackTrace();
288 | }
289 | }
290 |
291 | }
292 |
293 | private void Bytes2ImageFile(byte[] bytes, String fileName)
294 | {
295 | try
296 | {
297 | File file = new File(fileName);
298 | FileOutputStream fos = new FileOutputStream(file);
299 | fos.write(bytes, 0, bytes.length);
300 | fos.flush();
301 | fos.close();
302 | } catch (Exception e)
303 | {
304 | e.printStackTrace();
305 | }
306 | }
307 |
308 | }
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/.DS_Store
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/drawable-v24/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
15 |
18 |
21 |
22 |
23 |
24 |
30 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
15 |
20 |
25 |
30 |
35 |
40 |
45 |
50 |
55 |
60 |
65 |
70 |
75 |
80 |
85 |
90 |
95 |
100 |
105 |
110 |
115 |
120 |
125 |
130 |
135 |
140 |
145 |
150 |
155 |
160 |
165 |
170 |
171 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
18 |
19 |
27 |
28 |
34 |
35 |
41 |
42 |
48 |
49 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/values-night/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
16 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFBB86FC
4 | #FF6200EE
5 | #FF3700B3
6 | #FF03DAC5
7 | #FF018786
8 | #FF000000
9 | #FFFFFFFF
10 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | ESP32-CAM-MJPEG-Monitor
3 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
16 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/app/src/test/java/com/example/esp32_cam_mjpeg_monitor/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.example.esp32_cam_mjpeg_monitor;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 | buildscript {
3 | repositories {
4 | google()
5 | jcenter()
6 | }
7 | dependencies {
8 | classpath "com.android.tools.build:gradle:4.1.3"
9 |
10 | // NOTE: Do not place your application dependencies here; they belong
11 | // in the individual module build.gradle files
12 | }
13 | }
14 |
15 | allprojects {
16 | repositories {
17 | google()
18 | jcenter()
19 | }
20 | }
21 |
22 | task clean(type: Delete) {
23 | delete rootProject.buildDir
24 | }
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. More details, visit
12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13 | # org.gradle.parallel=true
14 | # AndroidX package structure to make it clearer which packages are bundled with the
15 | # Android operating system, and which are packaged with your app"s APK
16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
17 | android.useAndroidX=true
18 | # Automatically convert third-party libraries to use AndroidX
19 | android.enableJetifier=true
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Android/ESP32-CAM-MJPEG-Viewer/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sun Jun 20 21:26:19 CST 2021
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
7 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Attempt to set APP_HOME
10 | # Resolve links: $0 may be a link
11 | PRG="$0"
12 | # Need this for relative symlinks.
13 | while [ -h "$PRG" ] ; do
14 | ls=`ls -ld "$PRG"`
15 | link=`expr "$ls" : '.*-> \(.*\)$'`
16 | if expr "$link" : '/.*' > /dev/null; then
17 | PRG="$link"
18 | else
19 | PRG=`dirname "$PRG"`"/$link"
20 | fi
21 | done
22 | SAVED="`pwd`"
23 | cd "`dirname \"$PRG\"`/" >/dev/null
24 | APP_HOME="`pwd -P`"
25 | cd "$SAVED" >/dev/null
26 |
27 | APP_NAME="Gradle"
28 | APP_BASE_NAME=`basename "$0"`
29 |
30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31 | DEFAULT_JVM_OPTS=""
32 |
33 | # Use the maximum available, or set MAX_FD != -1 to use that value.
34 | MAX_FD="maximum"
35 |
36 | warn () {
37 | echo "$*"
38 | }
39 |
40 | die () {
41 | echo
42 | echo "$*"
43 | echo
44 | exit 1
45 | }
46 |
47 | # OS specific support (must be 'true' or 'false').
48 | cygwin=false
49 | msys=false
50 | darwin=false
51 | nonstop=false
52 | case "`uname`" in
53 | CYGWIN* )
54 | cygwin=true
55 | ;;
56 | Darwin* )
57 | darwin=true
58 | ;;
59 | MINGW* )
60 | msys=true
61 | ;;
62 | NONSTOP* )
63 | nonstop=true
64 | ;;
65 | esac
66 |
67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68 |
69 | # Determine the Java command to use to start the JVM.
70 | if [ -n "$JAVA_HOME" ] ; then
71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72 | # IBM's JDK on AIX uses strange locations for the executables
73 | JAVACMD="$JAVA_HOME/jre/sh/java"
74 | else
75 | JAVACMD="$JAVA_HOME/bin/java"
76 | fi
77 | if [ ! -x "$JAVACMD" ] ; then
78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79 |
80 | Please set the JAVA_HOME variable in your environment to match the
81 | location of your Java installation."
82 | fi
83 | else
84 | JAVACMD="java"
85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86 |
87 | Please set the JAVA_HOME variable in your environment to match the
88 | location of your Java installation."
89 | fi
90 |
91 | # Increase the maximum file descriptors if we can.
92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93 | MAX_FD_LIMIT=`ulimit -H -n`
94 | if [ $? -eq 0 ] ; then
95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96 | MAX_FD="$MAX_FD_LIMIT"
97 | fi
98 | ulimit -n $MAX_FD
99 | if [ $? -ne 0 ] ; then
100 | warn "Could not set maximum file descriptor limit: $MAX_FD"
101 | fi
102 | else
103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104 | fi
105 | fi
106 |
107 | # For Darwin, add options to specify how the application appears in the dock
108 | if $darwin; then
109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110 | fi
111 |
112 | # For Cygwin, switch paths to Windows format before running java
113 | if $cygwin ; then
114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116 | JAVACMD=`cygpath --unix "$JAVACMD"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Escape application args
158 | save () {
159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160 | echo " "
161 | }
162 | APP_ARGS=$(save "$@")
163 |
164 | # Collect all arguments for the java command, following the shell quoting and substitution rules
165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166 |
167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169 | cd "$(dirname "$0")"
170 | fi
171 |
172 | exec "$JAVACMD" "$@"
173 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | set DIRNAME=%~dp0
12 | if "%DIRNAME%" == "" set DIRNAME=.
13 | set APP_BASE_NAME=%~n0
14 | set APP_HOME=%DIRNAME%
15 |
16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17 | set DEFAULT_JVM_OPTS=
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windows variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 |
53 | :win9xME_args
54 | @rem Slurp the command line arguments.
55 | set CMD_LINE_ARGS=
56 | set _SKIP=2
57 |
58 | :win9xME_args_slurp
59 | if "x%~1" == "x" goto execute
60 |
61 | set CMD_LINE_ARGS=%*
62 |
63 | :execute
64 | @rem Setup the command line
65 |
66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67 |
68 | @rem Execute Gradle
69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70 |
71 | :end
72 | @rem End local scope for the variables with windows NT shell
73 | if "%ERRORLEVEL%"=="0" goto mainEnd
74 |
75 | :fail
76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77 | rem the _cmd.exe /c_ return code!
78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79 | exit /b 1
80 |
81 | :mainEnd
82 | if "%OS%"=="Windows_NT" endlocal
83 |
84 | :omega
85 |
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/local.properties:
--------------------------------------------------------------------------------
1 | ## This file is automatically generated by Android Studio.
2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
3 | #
4 | # This file should *NOT* be checked into Version Control Systems,
5 | # as it contains information specific to your local configuration.
6 | #
7 | # Location of the SDK. This is only used by Gradle.
8 | # For customization when using a Version Control System, please read the
9 | # header note.
10 | sdk.dir=/Users/gcy/Library/Android/sdk
--------------------------------------------------------------------------------
/Android/ESP32-CAM-MJPEG-Viewer/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 | rootProject.name = "ESP32-CAM-MJPEG-Monitor"
--------------------------------------------------------------------------------
/Firmware/ESP32-CAM/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/Firmware/ESP32-CAM/.DS_Store
--------------------------------------------------------------------------------
/Firmware/ESP32-CAM/ESP32-CAM.ino:
--------------------------------------------------------------------------------
1 | #include "esp_camera.h"
2 | #include
3 | #include "define.h"
4 |
5 | //
6 | // WARNING!!! Make sure that you have either selected ESP32 Wrover Module,
7 | // or another board which has PSRAM enabled
8 | //
9 |
10 | // Select camera model
11 | //#define CAMERA_MODEL_WROVER_KIT
12 | //#define CAMERA_MODEL_ESP_EYE
13 | //#define CAMERA_MODEL_M5STACK_PSRAM
14 | //#define CAMERA_MODEL_M5STACK_WIDE
15 | #define CAMERA_MODEL_AI_THINKER
16 |
17 | #include "camera_pins.h"
18 |
19 | const char* ssid = "Your AP SSID";
20 | const char* password = "Your AP Password";
21 |
22 | // Set your Static IP address
23 | IPAddress local_IP(192, 168, 110, 253);
24 | //IPAddress local_IP(192, 168, 1, 254);
25 | // Set your Gateway IP address
26 | IPAddress gateway(192, 168, 110, 1);
27 | //IPAddress gateway(192, 168, 1, 1);
28 |
29 | IPAddress subnet(255, 255, 255, 0);
30 |
31 | int rssi = 0;
32 |
33 | void startCameraServer();
34 |
35 | /*
36 | typedef enum {
37 | FRAMESIZE_QQVGA, // 160x120
38 | FRAMESIZE_QQVGA2, // 128x160
39 | FRAMESIZE_QCIF, // 176x144
40 | FRAMESIZE_HQVGA, // 240x176
41 | FRAMESIZE_QVGA, // 320x240
42 | FRAMESIZE_CIF, // 400x296
43 | FRAMESIZE_VGA, // 640x480
44 | FRAMESIZE_SVGA, // 800x600
45 | FRAMESIZE_XGA, // 1024x768
46 | FRAMESIZE_SXGA, // 1280x1024
47 | FRAMESIZE_UXGA, // 1600x1200
48 | FRAMESIZE_QXGA, // 2048*1536
49 | FRAMESIZE_INVALID
50 | } framesize_t;
51 | */
52 |
53 | void setup() {
54 | Serial.begin(115200);
55 | Serial.setDebugOutput(true);
56 | Serial.println();
57 |
58 | camera_config_t config;
59 | config.ledc_channel = LEDC_CHANNEL_0;
60 | config.ledc_timer = LEDC_TIMER_0;
61 | config.pin_d0 = Y2_GPIO_NUM;
62 | config.pin_d1 = Y3_GPIO_NUM;
63 | config.pin_d2 = Y4_GPIO_NUM;
64 | config.pin_d3 = Y5_GPIO_NUM;
65 | config.pin_d4 = Y6_GPIO_NUM;
66 | config.pin_d5 = Y7_GPIO_NUM;
67 | config.pin_d6 = Y8_GPIO_NUM;
68 | config.pin_d7 = Y9_GPIO_NUM;
69 | config.pin_xclk = XCLK_GPIO_NUM;
70 | config.pin_pclk = PCLK_GPIO_NUM;
71 | config.pin_vsync = VSYNC_GPIO_NUM;
72 | config.pin_href = HREF_GPIO_NUM;
73 | config.pin_sscb_sda = SIOD_GPIO_NUM;
74 | config.pin_sscb_scl = SIOC_GPIO_NUM;
75 | config.pin_pwdn = PWDN_GPIO_NUM;
76 | config.pin_reset = RESET_GPIO_NUM;
77 | config.xclk_freq_hz = 20000000;
78 | config.pixel_format = PIXFORMAT_JPEG;
79 | //init with high specs to pre-allocate larger buffers
80 | if(psramFound()){
81 | config.frame_size = FRAMESIZE_UXGA;
82 | config.jpeg_quality = 10;
83 | config.fb_count = 2;
84 | } else {
85 | config.frame_size = FRAMESIZE_SVGA;
86 | config.jpeg_quality = 12;
87 | config.fb_count = 1;
88 | }
89 |
90 | #if defined(CAMERA_MODEL_ESP_EYE)
91 | pinMode(13, INPUT_PULLUP);
92 | pinMode(14, INPUT_PULLUP);
93 | #endif
94 |
95 | // camera init
96 | esp_err_t err = esp_camera_init(&config);
97 | if (err != ESP_OK) {
98 | Serial.printf("Camera init failed with error 0x%x", err);
99 | return;
100 | }
101 |
102 | sensor_t * s = esp_camera_sensor_get();
103 | //initial sensors are flipped vertically and colors are a bit saturated
104 | if (s->id.PID == OV3660_PID) {
105 | s->set_vflip(s, 1);//flip it back
106 | s->set_brightness(s, 1);//up the blightness just a bit
107 | s->set_saturation(s, -2);//lower the saturation
108 | }
109 | //drop down frame size for higher initial frame rate
110 | s->set_framesize(s, /*FRAMESIZE_VGA*/FRAMESIZE_SVGA);
111 |
112 | #if defined(CAMERA_MODEL_M5STACK_WIDE)
113 | s->set_vflip(s, 1);
114 | s->set_hmirror(s, 1);
115 | #endif
116 |
117 | s->set_framesize(s, FRAMESIZE_QVGA);
118 | s->set_vflip(s, 1);
119 |
120 | WiFi.begin(ssid, password);
121 | if (!WiFi.config(local_IP, gateway, subnet)) {
122 | Serial.println("STA Failed to configure");
123 | }
124 |
125 | while (WiFi.status() != WL_CONNECTED) {
126 | delay(500);
127 | Serial.print(".");
128 | }
129 | Serial.println("");
130 | Serial.println("WiFi connected");
131 |
132 | startCameraServer();
133 |
134 | Serial.print("Camera Ready! Use 'http://");
135 | Serial.print(WiFi.localIP());
136 | Serial.println("' to connect");
137 | }
138 |
139 | void loop() {
140 | // put your main code here, to run repeatedly:
141 | rssi = WiFi.RSSI();
142 | //Serial.println(rssi);
143 | }
144 |
--------------------------------------------------------------------------------
/Firmware/ESP32-CAM/app_httpd.cpp:
--------------------------------------------------------------------------------
1 | // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
2 | //
3 | // Licensed under the Apache License, Version 2.0 (the "License");
4 | // you may not use this file except in compliance with the License.
5 | // You may obtain a copy of the License at
6 | //
7 | // http://www.apache.org/licenses/LICENSE-2.0
8 | //
9 | // Unless required by applicable law or agreed to in writing, software
10 | // distributed under the License is distributed on an "AS IS" BASIS,
11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 | // See the License for the specific language governing permissions and
13 | // limitations under the License.
14 | #include "esp_http_server.h"
15 | #include "esp_timer.h"
16 | #include "esp_camera.h"
17 | #include "img_converters.h"
18 | #include "camera_index.h"
19 | #include "Arduino.h"
20 |
21 | #include "fb_gfx.h"
22 | #include "fd_forward.h"
23 | #include "fr_forward.h"
24 |
25 | #include "define.h"
26 |
27 | #define ENROLL_CONFIRM_TIMES 5
28 | #define FACE_ID_SAVE_NUMBER 7
29 |
30 | #define FACE_COLOR_WHITE 0x00FFFFFF
31 | #define FACE_COLOR_BLACK 0x00000000
32 | #define FACE_COLOR_RED 0x000000FF
33 | #define FACE_COLOR_GREEN 0x0000FF00
34 | #define FACE_COLOR_BLUE 0x00FF0000
35 | #define FACE_COLOR_YELLOW (FACE_COLOR_RED | FACE_COLOR_GREEN)
36 | #define FACE_COLOR_CYAN (FACE_COLOR_BLUE | FACE_COLOR_GREEN)
37 | #define FACE_COLOR_PURPLE (FACE_COLOR_BLUE | FACE_COLOR_RED)
38 |
39 | typedef struct {
40 | size_t size; //number of values used for filtering
41 | size_t index; //current value index
42 | size_t count; //value count
43 | int sum;
44 | int * values; //array to be filled with values
45 | } ra_filter_t;
46 |
47 | typedef struct {
48 | httpd_req_t *req;
49 | size_t len;
50 | } jpg_chunking_t;
51 |
52 | /*
53 | #define PART_BOUNDARY "WINBONDBOUDARY"
54 | static const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;
55 | static const char* _STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n";
56 | static const char* _STREAM_PART = "Content-Type: image/jpeg\r\n\r\n";
57 | */
58 |
59 | #define PART_BOUNDARY "123456789000000000000987654321"
60 | static const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;
61 | static const char* _STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n";
62 | static const char* _STREAM_PART = "Content-Type: image/jpeg\r\nContent-Length: %u\r\n\r\n";
63 |
64 | static ra_filter_t ra_filter;
65 | httpd_handle_t stream_httpd = NULL;
66 | httpd_handle_t camera_httpd = NULL;
67 |
68 | static mtmn_config_t mtmn_config = {0};
69 | static int8_t detection_enabled = 0;
70 | static int8_t recognition_enabled = 0;
71 | static int8_t is_enrolling = 0;
72 | static face_id_list id_list = {0};
73 |
74 | static ra_filter_t * ra_filter_init(ra_filter_t * filter, size_t sample_size){
75 | memset(filter, 0, sizeof(ra_filter_t));
76 |
77 | filter->values = (int *)malloc(sample_size * sizeof(int));
78 | if(!filter->values){
79 | return NULL;
80 | }
81 | memset(filter->values, 0, sample_size * sizeof(int));
82 |
83 | filter->size = sample_size;
84 | return filter;
85 | }
86 |
87 | static int ra_filter_run(ra_filter_t * filter, int value){
88 | if(!filter->values){
89 | return value;
90 | }
91 | filter->sum -= filter->values[filter->index];
92 | filter->values[filter->index] = value;
93 | filter->sum += filter->values[filter->index];
94 | filter->index++;
95 | filter->index = filter->index % filter->size;
96 | if (filter->count < filter->size) {
97 | filter->count++;
98 | }
99 | return filter->sum / filter->count;
100 | }
101 |
102 | static void rgb_print(dl_matrix3du_t *image_matrix, uint32_t color, const char * str){
103 | fb_data_t fb;
104 | fb.width = image_matrix->w;
105 | fb.height = image_matrix->h;
106 | fb.data = image_matrix->item;
107 | fb.bytes_per_pixel = 3;
108 | fb.format = FB_BGR888;
109 | fb_gfx_print(&fb, (fb.width - (strlen(str) * 14)) / 2, 10, color, str);
110 | }
111 |
112 | static int rgb_printf(dl_matrix3du_t *image_matrix, uint32_t color, const char *format, ...){
113 | char loc_buf[64];
114 | char * temp = loc_buf;
115 | int len;
116 | va_list arg;
117 | va_list copy;
118 | va_start(arg, format);
119 | va_copy(copy, arg);
120 | len = vsnprintf(loc_buf, sizeof(loc_buf), format, arg);
121 | va_end(copy);
122 | if(len >= sizeof(loc_buf)){
123 | temp = (char*)malloc(len+1);
124 | if(temp == NULL) {
125 | return 0;
126 | }
127 | }
128 | vsnprintf(temp, len+1, format, arg);
129 | va_end(arg);
130 | rgb_print(image_matrix, color, temp);
131 | if(len > 64){
132 | free(temp);
133 | }
134 | return len;
135 | }
136 |
137 | static void draw_face_boxes(dl_matrix3du_t *image_matrix, box_array_t *boxes, int face_id){
138 | int x, y, w, h, i;
139 | uint32_t color = FACE_COLOR_YELLOW;
140 | if(face_id < 0){
141 | color = FACE_COLOR_RED;
142 | } else if(face_id > 0){
143 | color = FACE_COLOR_GREEN;
144 | }
145 | fb_data_t fb;
146 | fb.width = image_matrix->w;
147 | fb.height = image_matrix->h;
148 | fb.data = image_matrix->item;
149 | fb.bytes_per_pixel = 3;
150 | fb.format = FB_BGR888;
151 | for (i = 0; i < boxes->len; i++){
152 | // rectangle box
153 | x = (int)boxes->box[i].box_p[0];
154 | y = (int)boxes->box[i].box_p[1];
155 | w = (int)boxes->box[i].box_p[2] - x + 1;
156 | h = (int)boxes->box[i].box_p[3] - y + 1;
157 | fb_gfx_drawFastHLine(&fb, x, y, w, color);
158 | fb_gfx_drawFastHLine(&fb, x, y+h-1, w, color);
159 | fb_gfx_drawFastVLine(&fb, x, y, h, color);
160 | fb_gfx_drawFastVLine(&fb, x+w-1, y, h, color);
161 | #if 0
162 | // landmark
163 | int x0, y0, j;
164 | for (j = 0; j < 10; j+=2) {
165 | x0 = (int)boxes->landmark[i].landmark_p[j];
166 | y0 = (int)boxes->landmark[i].landmark_p[j+1];
167 | fb_gfx_fillRect(&fb, x0, y0, 3, 3, color);
168 | }
169 | #endif
170 | }
171 | }
172 |
173 | static int run_face_recognition(dl_matrix3du_t *image_matrix, box_array_t *net_boxes){
174 | dl_matrix3du_t *aligned_face = NULL;
175 | int matched_id = 0;
176 |
177 | aligned_face = dl_matrix3du_alloc(1, FACE_WIDTH, FACE_HEIGHT, 3);
178 | if(!aligned_face){
179 | Serial.println("Could not allocate face recognition buffer");
180 | return matched_id;
181 | }
182 | if (align_face(net_boxes, image_matrix, aligned_face) == ESP_OK){
183 | if (is_enrolling == 1){
184 | int8_t left_sample_face = enroll_face(&id_list, aligned_face);
185 |
186 | if(left_sample_face == (ENROLL_CONFIRM_TIMES - 1)){
187 | Serial.printf("Enrolling Face ID: %d\n", id_list.tail);
188 | }
189 | Serial.printf("Enrolling Face ID: %d sample %d\n", id_list.tail, ENROLL_CONFIRM_TIMES - left_sample_face);
190 | rgb_printf(image_matrix, FACE_COLOR_CYAN, "ID[%u] Sample[%u]", id_list.tail, ENROLL_CONFIRM_TIMES - left_sample_face);
191 | if (left_sample_face == 0){
192 | is_enrolling = 0;
193 | Serial.printf("Enrolled Face ID: %d\n", id_list.tail);
194 | }
195 | } else {
196 | matched_id = recognize_face(&id_list, aligned_face);
197 | if (matched_id >= 0) {
198 | Serial.printf("Match Face ID: %u\n", matched_id);
199 | rgb_printf(image_matrix, FACE_COLOR_GREEN, "Hello Subject %u", matched_id);
200 | } else {
201 | Serial.println("No Match Found");
202 | rgb_print(image_matrix, FACE_COLOR_RED, "Intruder Alert!");
203 | matched_id = -1;
204 | }
205 | }
206 | } else {
207 | Serial.println("Face Not Aligned");
208 | //rgb_print(image_matrix, FACE_COLOR_YELLOW, "Human Detected");
209 | }
210 |
211 | dl_matrix3du_free(aligned_face);
212 | return matched_id;
213 | }
214 |
215 | static size_t jpg_encode_stream(void * arg, size_t index, const void* data, size_t len){
216 | jpg_chunking_t *j = (jpg_chunking_t *)arg;
217 | if(!index){
218 | j->len = 0;
219 | }
220 | if(httpd_resp_send_chunk(j->req, (const char *)data, len) != ESP_OK){
221 | return 0;
222 | }
223 | j->len += len;
224 | return len;
225 | }
226 |
227 | static esp_err_t capture_handler(httpd_req_t *req){
228 | camera_fb_t * fb = NULL;
229 | esp_err_t res = ESP_OK;
230 | int64_t fr_start = esp_timer_get_time();
231 |
232 | fb = esp_camera_fb_get();
233 | if (!fb) {
234 | Serial.println("Camera capture failed");
235 | httpd_resp_send_500(req);
236 | return ESP_FAIL;
237 | }
238 |
239 | httpd_resp_set_type(req, "image/jpeg");
240 | httpd_resp_set_hdr(req, "Content-Disposition", "inline; filename=capture.jpg");
241 | httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
242 |
243 | size_t out_len, out_width, out_height;
244 | uint8_t * out_buf;
245 | bool s;
246 | bool detected = false;
247 | int face_id = 0;
248 | if(!detection_enabled || fb->width > 400){
249 | size_t fb_len = 0;
250 | if(fb->format == PIXFORMAT_JPEG){
251 | fb_len = fb->len;
252 | res = httpd_resp_send(req, (const char *)fb->buf, fb->len);
253 | } else {
254 | jpg_chunking_t jchunk = {req, 0};
255 | res = frame2jpg_cb(fb, 80, jpg_encode_stream, &jchunk)?ESP_OK:ESP_FAIL;
256 | httpd_resp_send_chunk(req, NULL, 0);
257 | fb_len = jchunk.len;
258 | }
259 | esp_camera_fb_return(fb);
260 | int64_t fr_end = esp_timer_get_time();
261 | Serial.printf("JPG: %uB %ums\n", (uint32_t)(fb_len), (uint32_t)((fr_end - fr_start)/1000));
262 | return res;
263 | }
264 |
265 | dl_matrix3du_t *image_matrix = dl_matrix3du_alloc(1, fb->width, fb->height, 3);
266 | if (!image_matrix) {
267 | esp_camera_fb_return(fb);
268 | Serial.println("dl_matrix3du_alloc failed");
269 | httpd_resp_send_500(req);
270 | return ESP_FAIL;
271 | }
272 |
273 | out_buf = image_matrix->item;
274 | out_len = fb->width * fb->height * 3;
275 | out_width = fb->width;
276 | out_height = fb->height;
277 |
278 | s = fmt2rgb888(fb->buf, fb->len, fb->format, out_buf);
279 | esp_camera_fb_return(fb);
280 | if(!s){
281 | dl_matrix3du_free(image_matrix);
282 | Serial.println("to rgb888 failed");
283 | httpd_resp_send_500(req);
284 | return ESP_FAIL;
285 | }
286 |
287 | box_array_t *net_boxes = face_detect(image_matrix, &mtmn_config);
288 |
289 | if (net_boxes){
290 | detected = true;
291 | if(recognition_enabled){
292 | face_id = run_face_recognition(image_matrix, net_boxes);
293 | }
294 | draw_face_boxes(image_matrix, net_boxes, face_id);
295 | free(net_boxes->score);
296 | free(net_boxes->box);
297 | free(net_boxes->landmark);
298 | free(net_boxes);
299 | }
300 |
301 | jpg_chunking_t jchunk = {req, 0};
302 | s = fmt2jpg_cb(out_buf, out_len, out_width, out_height, PIXFORMAT_RGB888, 90, jpg_encode_stream, &jchunk);
303 | dl_matrix3du_free(image_matrix);
304 | if(!s){
305 | Serial.println("JPEG compression failed");
306 | return ESP_FAIL;
307 | }
308 |
309 | int64_t fr_end = esp_timer_get_time();
310 | Serial.printf("FACE: %uB %ums %s%d\n", (uint32_t)(jchunk.len), (uint32_t)((fr_end - fr_start)/1000), detected?"DETECTED ":"", face_id);
311 | return res;
312 | }
313 |
314 | static esp_err_t stream_handler(httpd_req_t *req){
315 | camera_fb_t * fb = NULL;
316 | esp_err_t res = ESP_OK;
317 | size_t _jpg_buf_len = 0;
318 | uint8_t * _jpg_buf = NULL;
319 | char * part_buf[64];
320 | dl_matrix3du_t *image_matrix = NULL;
321 | bool detected = false;
322 | int face_id = 0;
323 | int64_t fr_start = 0;
324 | int64_t fr_ready = 0;
325 | int64_t fr_face = 0;
326 | int64_t fr_recognize = 0;
327 | int64_t fr_encode = 0;
328 |
329 | static int64_t last_frame = 0;
330 | if(!last_frame) {
331 | last_frame = esp_timer_get_time();
332 | }
333 |
334 | res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);
335 | if(res != ESP_OK){
336 | return res;
337 | }
338 |
339 | httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
340 |
341 | while(true){
342 | detected = false;
343 | face_id = 0;
344 | fb = esp_camera_fb_get();
345 | if (!fb) {
346 | Serial.println("Camera capture failed");
347 | res = ESP_FAIL;
348 | } else {
349 | fr_start = esp_timer_get_time();
350 | fr_ready = fr_start;
351 | fr_face = fr_start;
352 | fr_encode = fr_start;
353 | fr_recognize = fr_start;
354 | if(!detection_enabled || fb->width > 400){
355 | if(fb->format != PIXFORMAT_JPEG){
356 | bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len);
357 | esp_camera_fb_return(fb);
358 | fb = NULL;
359 | if(!jpeg_converted){
360 | Serial.println("JPEG compression failed");
361 | res = ESP_FAIL;
362 | }
363 | } else {
364 | _jpg_buf_len = fb->len;
365 | _jpg_buf = fb->buf;
366 | }
367 | } else {
368 |
369 | image_matrix = dl_matrix3du_alloc(1, fb->width, fb->height, 3);
370 |
371 | if (!image_matrix) {
372 | Serial.println("dl_matrix3du_alloc failed");
373 | res = ESP_FAIL;
374 | } else {
375 | if(!fmt2rgb888(fb->buf, fb->len, fb->format, image_matrix->item)){
376 | Serial.println("fmt2rgb888 failed");
377 | res = ESP_FAIL;
378 | } else {
379 | fr_ready = esp_timer_get_time();
380 | box_array_t *net_boxes = NULL;
381 | if(detection_enabled){
382 | net_boxes = face_detect(image_matrix, &mtmn_config);
383 | }
384 | fr_face = esp_timer_get_time();
385 | fr_recognize = fr_face;
386 | if (net_boxes || fb->format != PIXFORMAT_JPEG){
387 | if(net_boxes){
388 | detected = true;
389 | if(recognition_enabled){
390 | face_id = run_face_recognition(image_matrix, net_boxes);
391 | }
392 | fr_recognize = esp_timer_get_time();
393 | draw_face_boxes(image_matrix, net_boxes, face_id);
394 | free(net_boxes->score);
395 | free(net_boxes->box);
396 | free(net_boxes->landmark);
397 | free(net_boxes);
398 | }
399 | if(!fmt2jpg(image_matrix->item, fb->width*fb->height*3, fb->width, fb->height, PIXFORMAT_RGB888, 90, &_jpg_buf, &_jpg_buf_len)){
400 | Serial.println("fmt2jpg failed");
401 | res = ESP_FAIL;
402 | }
403 | esp_camera_fb_return(fb);
404 | fb = NULL;
405 | } else {
406 | _jpg_buf = fb->buf;
407 | _jpg_buf_len = fb->len;
408 | }
409 | fr_encode = esp_timer_get_time();
410 | }
411 | dl_matrix3du_free(image_matrix);
412 | }
413 | }
414 | }
415 | if(res == ESP_OK){
416 | size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len);
417 | res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);
418 | }
419 | if(res == ESP_OK){
420 | res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);
421 | }
422 | if(res == ESP_OK){
423 | res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));
424 | }
425 | if(fb){
426 | esp_camera_fb_return(fb);
427 | fb = NULL;
428 | _jpg_buf = NULL;
429 | } else if(_jpg_buf){
430 | free(_jpg_buf);
431 | _jpg_buf = NULL;
432 | }
433 | if(res != ESP_OK){
434 | break;
435 | }
436 | int64_t fr_end = esp_timer_get_time();
437 |
438 | int64_t ready_time = (fr_ready - fr_start)/1000;
439 | int64_t face_time = (fr_face - fr_ready)/1000;
440 | int64_t recognize_time = (fr_recognize - fr_face)/1000;
441 | int64_t encode_time = (fr_encode - fr_recognize)/1000;
442 | int64_t process_time = (fr_encode - fr_start)/1000;
443 |
444 | int64_t frame_time = fr_end - last_frame;
445 | last_frame = fr_end;
446 | frame_time /= 1000;
447 | uint32_t avg_frame_time = ra_filter_run(&ra_filter, frame_time);
448 | Serial.printf("MJPG: %uB %ums (%.1ffps), AVG: %ums (%.1ffps), %u+%u+%u+%u=%u %s%d\n",
449 | (uint32_t)(_jpg_buf_len),
450 | (uint32_t)frame_time, 1000.0 / (uint32_t)frame_time,
451 | avg_frame_time, 1000.0 / avg_frame_time,
452 | (uint32_t)ready_time, (uint32_t)face_time, (uint32_t)recognize_time, (uint32_t)encode_time, (uint32_t)process_time,
453 | (detected)?"DETECTED ":"", face_id
454 | );
455 | }
456 |
457 | last_frame = 0;
458 | return res;
459 | }
460 |
461 | static esp_err_t led_handler(httpd_req_t *req){
462 | char* buf;
463 | size_t buf_len;
464 | char variable[32] = {0,};
465 | char value[32] = {0,};
466 |
467 | buf_len = httpd_req_get_url_query_len(req) + 1;
468 | if (buf_len > 1) {
469 | buf = (char*)malloc(buf_len);
470 | if(!buf){
471 | httpd_resp_send_500(req);
472 | return ESP_FAIL;
473 | }
474 | if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) {
475 | if (httpd_query_key_value(buf, "var", variable, sizeof(variable)) == ESP_OK &&
476 | httpd_query_key_value(buf, "val", value, sizeof(value)) == ESP_OK) {
477 | } else {
478 | free(buf);
479 | httpd_resp_send_404(req);
480 | return ESP_FAIL;
481 | }
482 | } else {
483 | free(buf);
484 | httpd_resp_send_404(req);
485 | return ESP_FAIL;
486 | }
487 | free(buf);
488 | } else {
489 | httpd_resp_send_404(req);
490 | return ESP_FAIL;
491 | }
492 |
493 | int val = atoi(value);
494 | sensor_t * s = esp_camera_sensor_get();
495 | int res = 0;
496 |
497 |
498 | if(!strcmp(variable, "flash")) {
499 | if(val){
500 | pinMode(FLASH_LED, OUTPUT);
501 | digitalWrite(FLASH_LED, HIGH);
502 | }
503 | else{
504 | pinMode(FLASH_LED, OUTPUT);
505 | digitalWrite(FLASH_LED, LOW);
506 | }
507 | }
508 | else {
509 | res = -1;
510 | }
511 |
512 | if(res){
513 | return httpd_resp_send_500(req);
514 | }
515 |
516 | httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
517 | return httpd_resp_send(req, NULL, 0);
518 | }
519 |
520 | static esp_err_t cmd_handler(httpd_req_t *req){
521 | char* buf;
522 | size_t buf_len;
523 | char variable[32] = {0,};
524 | char value[32] = {0,};
525 |
526 | buf_len = httpd_req_get_url_query_len(req) + 1;
527 | if (buf_len > 1) {
528 | buf = (char*)malloc(buf_len);
529 | if(!buf){
530 | httpd_resp_send_500(req);
531 | return ESP_FAIL;
532 | }
533 | if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) {
534 | if (httpd_query_key_value(buf, "var", variable, sizeof(variable)) == ESP_OK &&
535 | httpd_query_key_value(buf, "val", value, sizeof(value)) == ESP_OK) {
536 | } else {
537 | free(buf);
538 | httpd_resp_send_404(req);
539 | return ESP_FAIL;
540 | }
541 | } else {
542 | free(buf);
543 | httpd_resp_send_404(req);
544 | return ESP_FAIL;
545 | }
546 | free(buf);
547 | } else {
548 | httpd_resp_send_404(req);
549 | return ESP_FAIL;
550 | }
551 |
552 | int val = atoi(value);
553 | sensor_t * s = esp_camera_sensor_get();
554 | int res = 0;
555 |
556 | if(!strcmp(variable, "framesize")) {
557 | if(s->pixformat == PIXFORMAT_JPEG) res = s->set_framesize(s, (framesize_t)val);
558 | }
559 | else if(!strcmp(variable, "quality")) res = s->set_quality(s, val);
560 | else if(!strcmp(variable, "contrast")) res = s->set_contrast(s, val);
561 | else if(!strcmp(variable, "brightness")) res = s->set_brightness(s, val);
562 | else if(!strcmp(variable, "saturation")) res = s->set_saturation(s, val);
563 | else if(!strcmp(variable, "gainceiling")) res = s->set_gainceiling(s, (gainceiling_t)val);
564 | else if(!strcmp(variable, "colorbar")) res = s->set_colorbar(s, val);
565 | else if(!strcmp(variable, "awb")) res = s->set_whitebal(s, val);
566 | else if(!strcmp(variable, "agc")) res = s->set_gain_ctrl(s, val);
567 | else if(!strcmp(variable, "aec")) res = s->set_exposure_ctrl(s, val);
568 | else if(!strcmp(variable, "hmirror")) res = s->set_hmirror(s, val);
569 | else if(!strcmp(variable, "vflip")) res = s->set_vflip(s, val);
570 | else if(!strcmp(variable, "awb_gain")) res = s->set_awb_gain(s, val);
571 | else if(!strcmp(variable, "agc_gain")) res = s->set_agc_gain(s, val);
572 | else if(!strcmp(variable, "aec_value")) res = s->set_aec_value(s, val);
573 | else if(!strcmp(variable, "aec2")) res = s->set_aec2(s, val);
574 | else if(!strcmp(variable, "dcw")) res = s->set_dcw(s, val);
575 | else if(!strcmp(variable, "bpc")) res = s->set_bpc(s, val);
576 | else if(!strcmp(variable, "wpc")) res = s->set_wpc(s, val);
577 | else if(!strcmp(variable, "raw_gma")) res = s->set_raw_gma(s, val);
578 | else if(!strcmp(variable, "lenc")) res = s->set_lenc(s, val);
579 | else if(!strcmp(variable, "special_effect")) res = s->set_special_effect(s, val);
580 | else if(!strcmp(variable, "wb_mode")) res = s->set_wb_mode(s, val);
581 | else if(!strcmp(variable, "ae_level")) res = s->set_ae_level(s, val);
582 | else if(!strcmp(variable, "face_detect")) {
583 | detection_enabled = val;
584 | if(!detection_enabled) {
585 | recognition_enabled = 0;
586 | }
587 | }
588 | else if(!strcmp(variable, "face_enroll")) is_enrolling = val;
589 | else if(!strcmp(variable, "face_recognize")) {
590 | recognition_enabled = val;
591 | if(recognition_enabled){
592 | detection_enabled = val;
593 | }
594 | }
595 | else {
596 | res = -1;
597 | }
598 |
599 | if(res){
600 | return httpd_resp_send_500(req);
601 | }
602 |
603 | httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
604 | return httpd_resp_send(req, NULL, 0);
605 | }
606 |
607 | static esp_err_t status_handler(httpd_req_t *req){
608 | static char json_response[1024];
609 |
610 | sensor_t * s = esp_camera_sensor_get();
611 | char * p = json_response;
612 | *p++ = '{';
613 |
614 | p+=sprintf(p, "\"framesize\":%u,", s->status.framesize);
615 | p+=sprintf(p, "\"quality\":%u,", s->status.quality);
616 | p+=sprintf(p, "\"brightness\":%d,", s->status.brightness);
617 | p+=sprintf(p, "\"contrast\":%d,", s->status.contrast);
618 | p+=sprintf(p, "\"saturation\":%d,", s->status.saturation);
619 | p+=sprintf(p, "\"sharpness\":%d,", s->status.sharpness);
620 | p+=sprintf(p, "\"special_effect\":%u,", s->status.special_effect);
621 | p+=sprintf(p, "\"wb_mode\":%u,", s->status.wb_mode);
622 | p+=sprintf(p, "\"awb\":%u,", s->status.awb);
623 | p+=sprintf(p, "\"awb_gain\":%u,", s->status.awb_gain);
624 | p+=sprintf(p, "\"aec\":%u,", s->status.aec);
625 | p+=sprintf(p, "\"aec2\":%u,", s->status.aec2);
626 | p+=sprintf(p, "\"ae_level\":%d,", s->status.ae_level);
627 | p+=sprintf(p, "\"aec_value\":%u,", s->status.aec_value);
628 | p+=sprintf(p, "\"agc\":%u,", s->status.agc);
629 | p+=sprintf(p, "\"agc_gain\":%u,", s->status.agc_gain);
630 | p+=sprintf(p, "\"gainceiling\":%u,", s->status.gainceiling);
631 | p+=sprintf(p, "\"bpc\":%u,", s->status.bpc);
632 | p+=sprintf(p, "\"wpc\":%u,", s->status.wpc);
633 | p+=sprintf(p, "\"raw_gma\":%u,", s->status.raw_gma);
634 | p+=sprintf(p, "\"lenc\":%u,", s->status.lenc);
635 | p+=sprintf(p, "\"vflip\":%u,", s->status.vflip);
636 | p+=sprintf(p, "\"hmirror\":%u,", s->status.hmirror);
637 | p+=sprintf(p, "\"dcw\":%u,", s->status.dcw);
638 | p+=sprintf(p, "\"colorbar\":%u,", s->status.colorbar);
639 | p+=sprintf(p, "\"face_detect\":%u,", detection_enabled);
640 | p+=sprintf(p, "\"face_enroll\":%u,", is_enrolling);
641 | p+=sprintf(p, "\"face_recognize\":%u", recognition_enabled);
642 | *p++ = '}';
643 | *p++ = 0;
644 | httpd_resp_set_type(req, "application/json");
645 | httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
646 | return httpd_resp_send(req, json_response, strlen(json_response));
647 | }
648 |
649 | static esp_err_t RSSI_handler(httpd_req_t *req){
650 | static char json_response[1024];
651 |
652 | char * p = json_response;
653 |
654 | p+=sprintf(p, "%ddB", rssi);
655 | *p++ = 0;
656 | httpd_resp_set_type(req, "application/json");
657 | httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
658 | return httpd_resp_send(req, json_response, strlen(json_response));
659 | }
660 |
661 |
662 | static esp_err_t index_handler(httpd_req_t *req){
663 | httpd_resp_set_type(req, "text/html");
664 | httpd_resp_set_hdr(req, "Content-Encoding", "gzip");
665 | sensor_t * s = esp_camera_sensor_get();
666 | if (s->id.PID == OV3660_PID) {
667 | return httpd_resp_send(req, (const char *)index_ov3660_html_gz, index_ov3660_html_gz_len);
668 | }
669 | return httpd_resp_send(req, (const char *)index_ov2640_html_gz, index_ov2640_html_gz_len);
670 | }
671 |
672 | void startCameraServer(){
673 | httpd_config_t config = HTTPD_DEFAULT_CONFIG();
674 |
675 | httpd_uri_t index_uri = {
676 | .uri = "/",
677 | .method = HTTP_GET,
678 | .handler = index_handler,
679 | .user_ctx = NULL
680 | };
681 |
682 | httpd_uri_t status_uri = {
683 | .uri = "/status",
684 | .method = HTTP_GET,
685 | .handler = status_handler,
686 | .user_ctx = NULL
687 | };
688 |
689 | httpd_uri_t cmd_uri = {
690 | .uri = "/control",
691 | .method = HTTP_GET,
692 | .handler = cmd_handler,
693 | .user_ctx = NULL
694 | };
695 |
696 | httpd_uri_t led_uri = {
697 | .uri = "/led",
698 | .method = HTTP_GET,
699 | .handler = led_handler,
700 | .user_ctx = NULL
701 | };
702 |
703 | httpd_uri_t RSSI_uri = {
704 | .uri = "/RSSI",
705 | .method = HTTP_GET,
706 | .handler = RSSI_handler,
707 | .user_ctx = NULL
708 | };
709 |
710 | httpd_uri_t capture_uri = {
711 | .uri = "/capture",
712 | .method = HTTP_GET,
713 | .handler = capture_handler,
714 | .user_ctx = NULL
715 | };
716 |
717 | httpd_uri_t stream_uri = {
718 | .uri = "/stream",
719 | .method = HTTP_GET,
720 | .handler = stream_handler,
721 | .user_ctx = NULL
722 | };
723 |
724 |
725 | ra_filter_init(&ra_filter, 20);
726 |
727 | mtmn_config.type = FAST;
728 | mtmn_config.min_face = 80;
729 | mtmn_config.pyramid = 0.707;
730 | mtmn_config.pyramid_times = 4;
731 | mtmn_config.p_threshold.score = 0.6;
732 | mtmn_config.p_threshold.nms = 0.7;
733 | mtmn_config.p_threshold.candidate_number = 20;
734 | mtmn_config.r_threshold.score = 0.7;
735 | mtmn_config.r_threshold.nms = 0.7;
736 | mtmn_config.r_threshold.candidate_number = 10;
737 | mtmn_config.o_threshold.score = 0.7;
738 | mtmn_config.o_threshold.nms = 0.7;
739 | mtmn_config.o_threshold.candidate_number = 1;
740 |
741 | face_id_init(&id_list, FACE_ID_SAVE_NUMBER, ENROLL_CONFIRM_TIMES);
742 |
743 | Serial.printf("Starting web server on port: '%d'\n", config.server_port);
744 | if (httpd_start(&camera_httpd, &config) == ESP_OK) {
745 | httpd_register_uri_handler(camera_httpd, &index_uri);
746 | httpd_register_uri_handler(camera_httpd, &cmd_uri);
747 | httpd_register_uri_handler(camera_httpd, &led_uri);
748 | httpd_register_uri_handler(camera_httpd, &RSSI_uri);
749 | httpd_register_uri_handler(camera_httpd, &status_uri);
750 | httpd_register_uri_handler(camera_httpd, &capture_uri);
751 | }
752 |
753 | config.server_port += 1;
754 | config.ctrl_port += 1;
755 | Serial.printf("Starting stream server on port: '%d'\n", config.server_port);
756 | if (httpd_start(&stream_httpd, &config) == ESP_OK) {
757 | httpd_register_uri_handler(stream_httpd, &stream_uri);
758 | }
759 | }
760 |
--------------------------------------------------------------------------------
/Firmware/ESP32-CAM/camera_index.h:
--------------------------------------------------------------------------------
1 |
2 | //File: index_ov2640.html.gz, Size: 4316
3 | #define index_ov2640_html_gz_len 4316
4 | const uint8_t index_ov2640_html_gz[] = {
5 | 0x1F, 0x8B, 0x08, 0x08, 0x50, 0x5C, 0xAE, 0x5C, 0x00, 0x03, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x5F,
6 | 0x6F, 0x76, 0x32, 0x36, 0x34, 0x30, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x00, 0xE5, 0x5D, 0x7B, 0x73,
7 | 0xD3, 0xC6, 0x16, 0xFF, 0x9F, 0x4F, 0x21, 0x04, 0x25, 0xF6, 0x34, 0x76, 0x6C, 0xC7, 0x84, 0xE0,
8 | 0xDA, 0xE2, 0x42, 0x08, 0xD0, 0x19, 0x5E, 0x25, 0x2D, 0x74, 0xA6, 0xD3, 0x81, 0xB5, 0xB4, 0xB2,
9 | 0x55, 0x64, 0xC9, 0x95, 0x56, 0x76, 0x52, 0x26, 0x9F, 0xE3, 0x7E, 0xA0, 0xFB, 0xC5, 0xEE, 0xD9,
10 | 0x87, 0xA4, 0x95, 0xBC, 0x7A, 0xD8, 0x26, 0x36, 0x97, 0xEB, 0xCC, 0x14, 0xD9, 0xDA, 0x73, 0xF6,
11 | 0x9C, 0xF3, 0x3B, 0xAF, 0x5D, 0x3D, 0x3A, 0xBC, 0x6D, 0xF9, 0x26, 0xB9, 0x9A, 0x63, 0x6D, 0x4A,
12 | 0x66, 0xAE, 0x71, 0x6B, 0xC8, 0xFF, 0xD1, 0xE0, 0x33, 0x9C, 0x62, 0x64, 0xF1, 0x43, 0xF6, 0x75,
13 | 0x86, 0x09, 0xD2, 0xCC, 0x29, 0x0A, 0x42, 0x4C, 0x46, 0x7A, 0x44, 0xEC, 0xD6, 0xA9, 0x9E, 0x3F,
14 | 0xED, 0xA1, 0x19, 0x1E, 0xE9, 0x0B, 0x07, 0x2F, 0xE7, 0x7E, 0x40, 0x74, 0xCD, 0xF4, 0x3D, 0x82,
15 | 0x3D, 0x18, 0xBE, 0x74, 0x2C, 0x32, 0x1D, 0x59, 0x78, 0xE1, 0x98, 0xB8, 0xC5, 0xBE, 0x1C, 0x3A,
16 | 0x9E, 0x43, 0x1C, 0xE4, 0xB6, 0x42, 0x13, 0xB9, 0x78, 0xD4, 0x95, 0x79, 0x11, 0x87, 0xB8, 0xD8,
17 | 0x38, 0xBF, 0x78, 0x7B, 0xDC, 0xD3, 0xDE, 0xBC, 0xEF, 0xF5, 0x4F, 0x3A, 0xC3, 0x23, 0xFE, 0x5B,
18 | 0x3A, 0x26, 0x24, 0x57, 0xF2, 0x77, 0xFA, 0x19, 0xFB, 0xD6, 0x95, 0xF6, 0x25, 0xF3, 0x13, 0xFD,
19 | 0xD8, 0x20, 0x44, 0xCB, 0x46, 0x33, 0xC7, 0xBD, 0x1A, 0x68, 0x8F, 0x03, 0x98, 0xF3, 0xF0, 0x05,
20 | 0x76, 0x17, 0x98, 0x38, 0x26, 0x3A, 0x0C, 0x91, 0x17, 0xB6, 0x42, 0x1C, 0x38, 0xF6, 0x4F, 0x2B,
21 | 0x84, 0x63, 0x64, 0x7E, 0x9E, 0x04, 0x7E, 0xE4, 0x59, 0x03, 0xED, 0x4E, 0xF7, 0x94, 0xFE, 0xAD,
22 | 0x0E, 0x32, 0x7D, 0xD7, 0x0F, 0xE0, 0xFC, 0xF9, 0x33, 0xFA, 0xB7, 0x7A, 0x9E, 0xCD, 0x1E, 0x3A,
23 | 0xFF, 0xE0, 0x81, 0xD6, 0x3D, 0x99, 0x5F, 0x66, 0xCE, 0x5F, 0xDF, 0xCA, 0x7C, 0x9D, 0xF6, 0x8A,
24 | 0xA4, 0x17, 0xF4, 0xA7, 0xE5, 0xF4, 0x21, 0x36, 0x89, 0xE3, 0x7B, 0xED, 0x19, 0x72, 0x3C, 0x05,
25 | 0x27, 0xCB, 0x09, 0xE7, 0x2E, 0x02, 0x1B, 0xD8, 0x2E, 0x2E, 0xE5, 0x73, 0x67, 0x86, 0xBD, 0xE8,
26 | 0xB0, 0x82, 0x1B, 0x65, 0xD2, 0xB2, 0x9C, 0x80, 0x8F, 0x1A, 0x50, 0x3B, 0x44, 0x33, 0xAF, 0x92,
27 | 0x6D, 0x99, 0x5C, 0x9E, 0xEF, 0x61, 0x85, 0x01, 0xE9, 0x44, 0xCB, 0x00, 0xCD, 0xE9, 0x00, 0xFA,
28 | 0xEF, 0xEA, 0x90, 0x99, 0xE3, 0x71, 0xA7, 0x1A, 0x68, 0xC7, 0xFD, 0xCE, 0xFC, 0xB2, 0x02, 0xCA,
29 | 0xE3, 0x13, 0xFA, 0xB7, 0x3A, 0x68, 0x8E, 0x2C, 0xCB, 0xF1, 0x26, 0x03, 0xED, 0x54, 0xC9, 0xC2,
30 | 0x0F, 0x2C, 0x1C, 0xB4, 0x02, 0x64, 0x39, 0x51, 0x38, 0xD0, 0xFA, 0xAA, 0x31, 0x33, 0x14, 0x4C,
31 | 0x40, 0x16, 0xE2, 0x83, 0xB0, 0xAD, 0xAE, 0x52, 0x12, 0x31, 0x24, 0x70, 0x26, 0x53, 0x02, 0x90,
32 | 0xAE, 0x8C, 0xC9, 0x1B, 0x4D, 0x84, 0x50, 0x15, 0x9E, 0xA5, 0x76, 0x53, 0x5B, 0x0D, 0xB9, 0xCE,
33 | 0xC4, 0x6B, 0x39, 0x04, 0xCF, 0x40, 0x9D, 0x90, 0x04, 0x98, 0x98, 0xD3, 0x32, 0x51, 0x6C, 0x67,
34 | 0x12, 0x05, 0x58, 0x21, 0x48, 0x62, 0xB7, 0x12, 0x85, 0xE1, 0xE4, 0xEA, 0xA9, 0xD6, 0x12, 0x8F,
35 | 0x3F, 0x3B, 0xA4, 0x25, 0x6C, 0x32, 0xC6, 0xB6, 0x1F, 0x60, 0xE5, 0xC8, 0x78, 0x84, 0xEB, 0x9B,
36 | 0x9F, 0x5B, 0x21, 0x41, 0x01, 0xA9, 0xC3, 0x10, 0xD9, 0x04, 0x07, 0xD5, 0xFC, 0x30, 0xF5, 0x8A,
37 | 0x6A, 0x6E, 0xC5, 0xD3, 0x8A, 0x01, 0x8E, 0xE7, 0x3A, 0x1E, 0xAE, 0x2F, 0x5E, 0xD1, 0xBC, 0x59,
38 | 0x76, 0x7C, 0x54, 0x0D, 0x60, 0x9C, 0xD9, 0xA4, 0xCC, 0x4B, 0x98, 0xAE, 0xAB, 0x93, 0x89, 0xB8,
39 | 0xE9, 0x76, 0x3A, 0x3F, 0xAC, 0x9E, 0x9C, 0x62, 0xEE, 0xA6, 0x28, 0x22, 0xFE, 0xF6, 0x11, 0xB1,
40 | 0x12, 0x56, 0x39, 0x3D, 0xFE, 0x35, 0xC3, 0x96, 0x83, 0xB4, 0x86, 0x14, 0xCE, 0xA7, 0x1D, 0xF0,
41 | 0xA9, 0xA6, 0x86, 0x3C, 0x4B, 0x6B, 0xF8, 0x81, 0x03, 0x81, 0x80, 0x58, 0xBA, 0x71, 0xE1, 0x17,
42 | 0x28, 0x1C, 0x73, 0xDC, 0x54, 0xA8, 0x5C, 0x12, 0x33, 0xB2, 0x45, 0xD4, 0x61, 0x43, 0x3F, 0x35,
43 | 0x52, 0x0E, 0xFD, 0x54, 0x06, 0x90, 0x42, 0x47, 0xC6, 0xBE, 0x0C, 0x2F, 0x59, 0xC2, 0x22, 0xCC,
44 | 0xE8, 0x67, 0x86, 0x2E, 0x5B, 0xA5, 0xD8, 0xC5, 0x83, 0x62, 0x0C, 0xA1, 0xCC, 0x9A, 0x0D, 0x18,
45 | 0xBA, 0x98, 0x6A, 0x2D, 0x8D, 0x66, 0xC9, 0xA6, 0x9A, 0x46, 0x30, 0x55, 0x43, 0x4E, 0x3F, 0xB2,
46 | 0x53, 0xAC, 0xA1, 0xAE, 0x5A, 0xD5, 0x34, 0x77, 0xF0, 0x3F, 0x95, 0x0F, 0x71, 0x4D, 0x0A, 0xB3,
47 | 0x08, 0xFD, 0xD4, 0xCF, 0x24, 0x29, 0xB3, 0xCA, 0x6C, 0xA2, 0x60, 0x5C, 0x9C, 0x51, 0x56, 0xF8,
48 | 0x16, 0x45, 0xB7, 0x82, 0x6B, 0xB9, 0x08, 0x75, 0xB3, 0x8B, 0x82, 0x71, 0x99, 0x0C, 0x95, 0x59,
49 | 0x86, 0x7E, 0xAE, 0x6B, 0xF4, 0x1B, 0x77, 0xC6, 0x11, 0x21, 0xBE, 0x17, 0x6E, 0x55, 0xA2, 0x8A,
50 | 0xE2, 0xEC, 0xAF, 0x28, 0x24, 0x8E, 0x7D, 0xD5, 0x12, 0x21, 0x0D, 0x71, 0x36, 0x47, 0xD0, 0x42,
51 | 0x8E, 0x31, 0x59, 0x62, 0x5C, 0xDE, 0x6E, 0x78, 0x68, 0x01, 0x79, 0x67, 0x32, 0x71, 0x55, 0xBE,
52 | 0x67, 0x46, 0x41, 0x48, 0xFB, 0xB6, 0xB9, 0xEF, 0x00, 0xE3, 0x60, 0x75, 0xE2, 0x6C, 0x0C, 0xD6,
53 | 0x9C, 0xA8, 0x65, 0x8E, 0x15, 0x73, 0xF9, 0x11, 0xA1, 0x36, 0x56, 0x22, 0xE1, 0x83, 0x3A, 0x0E,
54 | 0xB9, 0x52, 0x9E, 0x13, 0x91, 0xA8, 0x38, 0x13, 0x87, 0x60, 0x69, 0x59, 0xC8, 0xCA, 0x35, 0x30,
55 | 0xA7, 0xD8, 0xFC, 0x8C, 0xAD, 0x1F, 0x2B, 0xDB, 0xB0, 0xAA, 0xF6, 0xB0, 0xED, 0x78, 0xF3, 0x88,
56 | 0xB4, 0x68, 0x3B, 0x35, 0xBF, 0x11, 0xCC, 0x99, 0x43, 0xC6, 0x2A, 0xF6, 0x7A, 0x65, 0x4D, 0xC5,
57 | 0xFD, 0xF9, 0x65, 0xB9, 0x11, 0x64, 0x61, 0x0D, 0x17, 0x8D, 0xB1, 0x5B, 0x26, 0xB2, 0x08, 0x86,
58 | 0x82, 0xB4, 0x2B, 0x72, 0x55, 0x71, 0xEF, 0xC6, 0x24, 0x4B, 0x8B, 0x57, 0xFF, 0xC1, 0x0F, 0xB5,
59 | 0xED, 0xC8, 0x8E, 0x0F, 0x33, 0x3F, 0x85, 0xD8, 0x85, 0x00, 0x2B, 0x6A, 0xBD, 0x61, 0xCC, 0x12,
60 | 0x64, 0x28, 0x9D, 0x20, 0x40, 0xDE, 0x04, 0x43, 0x2E, 0xB8, 0x3C, 0x8C, 0x0F, 0xCB, 0x17, 0x06,
61 | 0xB5, 0xD4, 0xA7, 0xA9, 0xFA, 0x7E, 0xF9, 0x42, 0x84, 0x27, 0x84, 0x0D, 0x9A, 0x11, 0x09, 0xD6,
62 | 0xD2, 0xF9, 0xBB, 0x4A, 0xA7, 0xE0, 0xFD, 0x88, 0x32, 0x60, 0xB2, 0x2E, 0xA5, 0xEC, 0xEF, 0x2B,
63 | 0x33, 0x42, 0xBC, 0xD2, 0xB3, 0xED, 0xAA, 0xB5, 0xA2, 0x6D, 0x1F, 0x77, 0x8E, 0xFB, 0x95, 0x0D,
64 | 0x93, 0x52, 0xCB, 0xDC, 0x7A, 0x51, 0x91, 0x31, 0x92, 0x6C, 0x52, 0x0D, 0xC1, 0x60, 0xEA, 0x2F,
65 | 0x70, 0xA0, 0x00, 0x22, 0x27, 0x6E, 0xFF, 0x61, 0xDF, 0xAA, 0xC1, 0x0D, 0x41, 0xBE, 0x5F, 0xA8,
66 | 0xB2, 0x69, 0x96, 0x5D, 0xAF, 0x6B, 0xF6, 0x4A, 0x1D, 0x93, 0xB3, 0x6B, 0x83, 0x37, 0xA0, 0xB1,
67 | 0x8B, 0xAD, 0x92, 0xF4, 0x6C, 0x61, 0x1B, 0x45, 0x2E, 0xA9, 0xB0, 0x37, 0xEA, 0xD0, 0xBF, 0xB2,
68 | 0x19, 0x59, 0x5C, 0xFD, 0x41, 0x37, 0x3A, 0x46, 0x2C, 0x12, 0xFE, 0x54, 0xCC, 0x19, 0xD7, 0x4E,
69 | 0x34, 0x9F, 0x63, 0x04, 0xA3, 0x4C, 0x5C, 0xB4, 0x24, 0xAD, 0xD5, 0x33, 0xAB, 0x13, 0x57, 0xAD,
70 | 0x85, 0x68, 0xA5, 0x2B, 0x26, 0xDD, 0xD0, 0x5A, 0x3A, 0x0F, 0x6C, 0xDF, 0x8C, 0x54, 0x65, 0xBA,
71 | 0x9E, 0x4B, 0xAD, 0xF2, 0x1B, 0xC4, 0x26, 0x0B, 0x5D, 0x87, 0x39, 0x76, 0xE4, 0x79, 0x14, 0xD1,
72 | 0x16, 0x09, 0x40, 0x4D, 0xC5, 0x44, 0xF5, 0x0C, 0xB7, 0x51, 0x74, 0x66, 0x0C, 0x5B, 0xB4, 0x19,
73 | 0x93, 0x0B, 0x40, 0x45, 0xA2, 0x48, 0x72, 0x88, 0x16, 0xFA, 0xA0, 0x54, 0xCC, 0x6A, 0x3B, 0xBB,
74 | 0x90, 0x69, 0x34, 0x53, 0x35, 0x06, 0xF1, 0x64, 0x5D, 0xA8, 0x62, 0x7C, 0xBA, 0x60, 0x32, 0x46,
75 | 0x8D, 0xCE, 0x61, 0xE7, 0xF0, 0x18, 0xFE, 0xA3, 0x68, 0xD0, 0xCB, 0x9D, 0x4B, 0x98, 0xB7, 0xC0,
76 | 0xF3, 0x72, 0xC9, 0xA7, 0x7A, 0x9F, 0xA4, 0x28, 0x8D, 0x55, 0x62, 0x51, 0x3F, 0x92, 0xB2, 0x1B,
77 | 0x26, 0xDD, 0x76, 0x45, 0x61, 0x29, 0x70, 0xE9, 0xF5, 0x1D, 0x51, 0xE1, 0x2D, 0xEB, 0x42, 0x3C,
78 | 0xF3, 0xFF, 0x69, 0xF1, 0xAA, 0xFA, 0x7F, 0xEF, 0xED, 0x92, 0x29, 0xBE, 0x6B, 0x4F, 0x5F, 0xDB,
79 | 0x2E, 0xE1, 0xBE, 0x7D, 0xA3, 0x53, 0x8C, 0x7A, 0x4B, 0xF4, 0x33, 0x20, 0xA1, 0x07, 0x8B, 0xAA,
80 | 0x00, 0x56, 0x57, 0x85, 0x3D, 0x8F, 0x34, 0x66, 0x03, 0x1B, 0xD8, 0x8E, 0xEB, 0xB6, 0x5C, 0x7F,
81 | 0x59, 0xDD, 0x89, 0x94, 0x7B, 0xF2, 0x8A, 0x9F, 0x56, 0xBB, 0xFC, 0xA6, 0xD2, 0x46, 0x90, 0xB9,
82 | 0xFE, 0x27, 0xA4, 0xFD, 0xBE, 0x03, 0xAE, 0x34, 0x34, 0x36, 0x2B, 0x14, 0x1B, 0xF8, 0xE3, 0x76,
83 | 0x13, 0xD5, 0x72, 0x25, 0xDE, 0x09, 0x96, 0x2E, 0xE6, 0xC2, 0xA5, 0x43, 0xCC, 0xE9, 0x06, 0x8B,
84 | 0xAA, 0xB9, 0x1F, 0x3A, 0xFC, 0x1A, 0x4D, 0x80, 0x5D, 0x44, 0x3B, 0xF8, 0x8D, 0x96, 0xDC, 0x95,
85 | 0x0B, 0x13, 0x99, 0xBC, 0x8E, 0x26, 0xCC, 0x74, 0xDF, 0xCE, 0x76, 0x49, 0x9B, 0xF7, 0x0E, 0xC5,
86 | 0xB9, 0x5A, 0xED, 0xD6, 0x15, 0xED, 0x7E, 0x36, 0x32, 0xD4, 0x83, 0xD6, 0xC8, 0xE8, 0x71, 0xD2,
87 | 0x9E, 0x04, 0xF8, 0xAA, 0x86, 0x32, 0x87, 0xE2, 0xDF, 0x01, 0xDF, 0x10, 0xDD, 0x7C, 0xED, 0xCF,
88 | 0x0A, 0x80, 0xF0, 0xA2, 0x76, 0x3F, 0xAC, 0x31, 0x75, 0xF1, 0x94, 0x75, 0xFC, 0x31, 0xD9, 0xEE,
89 | 0xD3, 0xF5, 0x1A, 0xE9, 0xA6, 0xA4, 0x84, 0xAA, 0x5D, 0x35, 0xAE, 0xBE, 0xCA, 0x93, 0x2E, 0xB6,
90 | 0x49, 0xC1, 0xD5, 0x0C, 0xD6, 0xA7, 0x1E, 0x97, 0x67, 0xB7, 0x96, 0xB4, 0x4F, 0x50, 0x99, 0x39,
91 | 0x92, 0x5D, 0xB9, 0x62, 0xEF, 0x53, 0x72, 0xA6, 0xD9, 0x73, 0x6D, 0xE6, 0xC5, 0x90, 0xC4, 0xED,
92 | 0x33, 0x83, 0x19, 0xC6, 0xCC, 0x44, 0xC9, 0x07, 0x78, 0xF0, 0xEF, 0x8D, 0xDE, 0x89, 0xF2, 0x62,
93 | 0x41, 0xC9, 0xE0, 0x32, 0xD1, 0x0A, 0xB7, 0xB5, 0x56, 0x4B, 0x56, 0xE1, 0x02, 0x59, 0xCE, 0x45,
94 | 0x4A, 0xA0, 0xCA, 0xA3, 0xB2, 0x2C, 0xC3, 0xAC, 0xEE, 0xD1, 0x94, 0x3A, 0xBB, 0x33, 0x43, 0xD0,
95 | 0xF6, 0x52, 0x77, 0x45, 0xC0, 0x51, 0x85, 0x5F, 0x1D, 0x77, 0x97, 0x36, 0x0D, 0xBB, 0x27, 0x9D,
96 | 0x8A, 0x29, 0x4D, 0xD7, 0x0F, 0xCB, 0xE3, 0x0A, 0x8D, 0xC1, 0x7E, 0x11, 0x51, 0x4C, 0x24, 0xB6,
97 | 0x2E, 0x95, 0x3B, 0x4F, 0xCC, 0xB9, 0x95, 0x67, 0x6A, 0x95, 0xEE, 0xD2, 0x98, 0x2A, 0x0F, 0xC7,
98 | 0x9C, 0xCD, 0xBB, 0x1D, 0x65, 0xA6, 0x2D, 0xDD, 0x7F, 0x23, 0xF8, 0x12, 0xD6, 0x9B, 0xF4, 0x82,
99 | 0xDC, 0x40, 0x33, 0xB1, 0x3A, 0x8D, 0x66, 0x8A, 0x5C, 0xB7, 0xCE, 0x26, 0x60, 0x29, 0x0E, 0x53,
100 | 0xC7, 0xB2, 0x70, 0xE9, 0x2E, 0x27, 0x5D, 0xF3, 0xE6, 0x58, 0xC4, 0x47, 0xC3, 0x23, 0xE9, 0x06,
101 | 0x96, 0xE1, 0x51, 0x7A, 0xAF, 0xCD, 0x90, 0xDE, 0xC5, 0x22, 0xDF, 0xE7, 0xC2, 0x2F, 0xB2, 0x68,
102 | 0xA6, 0x8B, 0xC2, 0x70, 0xA4, 0xD3, 0xBB, 0x31, 0xF4, 0xEC, 0x6D, 0x2F, 0x43, 0xCB, 0x59, 0x68,
103 | 0x8E, 0x35, 0xD2, 0x5D, 0x7F, 0xE2, 0xE7, 0xCE, 0xB1, 0xF3, 0x7C, 0xDB, 0x1B, 0x22, 0x75, 0xA4,
104 | 0x67, 0x2E, 0x09, 0xE8, 0x8C, 0x2A, 0xFD, 0x49, 0x37, 0xEE, 0xDD, 0x79, 0xF8, 0xE0, 0xC1, 0xC9,
105 | 0x4F, 0xF7, 0xBC, 0x71, 0x38, 0x17, 0xFF, 0xFD, 0x95, 0x5F, 0x41, 0x79, 0xF3, 0xBE, 0x77, 0xD2,
106 | 0x87, 0x86, 0x16, 0x13, 0xE2, 0x78, 0x93, 0x70, 0x78, 0xC4, 0x98, 0xE6, 0x04, 0x39, 0x02, 0x49,
107 | 0x0A, 0x64, 0x13, 0x09, 0x5D, 0x25, 0x5E, 0x3C, 0x24, 0x84, 0x1C, 0x35, 0x46, 0x81, 0x62, 0x08,
108 | 0x1B, 0xC6, 0xDB, 0x05, 0xD6, 0x69, 0xE9, 0x2C, 0xB1, 0x8D, 0xFD, 0xCB, 0xBC, 0x06, 0x4C, 0x29,
109 | 0x91, 0xF5, 0xC4, 0x28, 0x6C, 0x15, 0x31, 0x04, 0x32, 0x46, 0x4E, 0xAF, 0x87, 0x14, 0x8C, 0x49,
110 | 0xE4, 0x13, 0xD6, 0x97, 0xB6, 0xE7, 0xF9, 0xD4, 0x76, 0x80, 0x66, 0x98, 0x26, 0x22, 0xF1, 0x63,
111 | 0x31, 0x9B, 0x3C, 0x12, 0x09, 0xA5, 0x6E, 0xBC, 0xC3, 0x2C, 0x5C, 0x01, 0x65, 0xA5, 0x59, 0x57,
112 | 0xB8, 0x88, 0x0C, 0x9A, 0x99, 0x5F, 0x8F, 0x45, 0x14, 0x3B, 0xA6, 0x2D, 0xC4, 0xDC, 0xA6, 0x42,
113 | 0x20, 0xC6, 0xCE, 0x9F, 0x33, 0x07, 0x5B, 0x20, 0x37, 0x02, 0xD3, 0x76, 0x3B, 0xBA, 0xF1, 0xDB,
114 | 0xEF, 0xCF, 0x1F, 0x37, 0x20, 0x11, 0x75, 0x2E, 0xBB, 0xBD, 0x4E, 0xA7, 0x39, 0x3C, 0xE2, 0x43,
115 | 0xD6, 0xE6, 0xF5, 0x50, 0x37, 0x2E, 0x18, 0xAB, 0xDE, 0x29, 0xB0, 0xEA, 0xF4, 0xFA, 0x9B, 0xB3,
116 | 0x3A, 0xD5, 0x0D, 0xC6, 0x09, 0x98, 0x5C, 0x3E, 0x38, 0x39, 0xDD, 0x9C, 0xD1, 0x03, 0x90, 0xE9,
117 | 0x3D, 0x70, 0x3A, 0x05, 0xED, 0x4E, 0xB6, 0x51, 0xEE, 0x44, 0x37, 0x28, 0x1F, 0x88, 0x8A, 0xCB,
118 | 0xFE, 0xE9, 0x16, 0x7C, 0xEE, 0xEB, 0xA2, 0x24, 0x52, 0x97, 0x8D, 0x8F, 0x74, 0xE3, 0xEC, 0xE7,
119 | 0x67, 0x8D, 0x3E, 0xC8, 0xD8, 0x7B, 0x78, 0xB2, 0x39, 0xEF, 0xBE, 0x6E, 0xFC, 0x42, 0x85, 0x3C,
120 | 0xEE, 0x01, 0xA3, 0xFE, 0x16, 0x42, 0x1E, 0xEB, 0xC6, 0x0B, 0xC6, 0x09, 0xB8, 0x5C, 0x76, 0x1F,
121 | 0x6C, 0x21, 0x12, 0xB8, 0xD7, 0x2F, 0x8C, 0x13, 0xF8, 0x17, 0x75, 0xAF, 0x9A, 0x9C, 0x20, 0x5F,
122 | 0x32, 0xD3, 0x94, 0xC4, 0xE9, 0x6A, 0xF6, 0xC9, 0x9C, 0x2E, 0x0B, 0xE3, 0xBF, 0x23, 0x28, 0x1D,
123 | 0xE4, 0x6A, 0xED, 0x20, 0x16, 0x74, 0xA0, 0x12, 0x3F, 0xA8, 0x17, 0xBF, 0x92, 0x24, 0xC9, 0x65,
124 | 0x39, 0xDD, 0xE8, 0x76, 0x2A, 0x34, 0x60, 0xB4, 0x72, 0x16, 0x64, 0xC4, 0x19, 0x05, 0x74, 0xDA,
125 | 0x49, 0xB0, 0x18, 0xA6, 0xB7, 0x7E, 0x80, 0x8F, 0x1E, 0xEB, 0x52, 0x5C, 0x6F, 0x94, 0x22, 0x14,
126 | 0xD2, 0xA2, 0x4B, 0xDD, 0x38, 0x39, 0xAE, 0xB2, 0xF7, 0x16, 0x70, 0x8C, 0x59, 0x9B, 0xE2, 0xE1,
127 | 0x30, 0x5C, 0x1B, 0x91, 0x94, 0x54, 0x37, 0x9E, 0x24, 0xC7, 0xDB, 0xE0, 0xD2, 0xEA, 0x6D, 0x81,
128 | 0x8B, 0x24, 0x0E, 0x87, 0xA6, 0xD5, 0x13, 0xD0, 0xF4, 0xF4, 0x34, 0x22, 0xBE, 0x26, 0x30, 0x55,
129 | 0xD2, 0x6E, 0x83, 0x0B, 0x2D, 0xE2, 0x01, 0x0A, 0xC9, 0xDA, 0xA8, 0xC4, 0x84, 0x90, 0xD6, 0xC4,
130 | 0xD1, 0xDE, 0x10, 0x49, 0x44, 0xF9, 0x0E, 0xF0, 0x08, 0x11, 0x89, 0x02, 0x76, 0x43, 0xDC, 0xDA,
131 | 0x88, 0xA4, 0xA4, 0x50, 0x0F, 0x93, 0xE3, 0xBD, 0xA1, 0x22, 0x89, 0xF3, 0x3D, 0xE0, 0x32, 0xC7,
132 | 0xA6, 0x83, 0xDC, 0x8F, 0xD8, 0xB6, 0xA1, 0x64, 0xAD, 0x8F, 0x4D, 0x86, 0x1C, 0xF0, 0xE1, 0xDF,
133 | 0xB5, 0x73, 0xF6, 0x7D, 0xED, 0x1E, 0x31, 0xC7, 0xEE, 0x6B, 0x35, 0x8A, 0x1D, 0x75, 0xDF, 0xF2,
134 | 0xDA, 0x4F, 0xE4, 0xDC, 0xB0, 0x43, 0xE8, 0x02, 0x13, 0x3C, 0x61, 0x2B, 0xE5, 0x8D, 0x79, 0xF4,
135 | 0x74, 0xE3, 0x79, 0x80, 0xAE, 0xD8, 0xB3, 0x05, 0xDB, 0x34, 0x3D, 0xEF, 0xB0, 0xA5, 0xFD, 0x0A,
136 | 0x4B, 0xC1, 0x6D, 0x3A, 0xB0, 0xE7, 0x01, 0x86, 0x65, 0xE2, 0x56, 0x5C, 0xEE, 0x43, 0x31, 0x83,
137 | 0x83, 0xED, 0x98, 0x40, 0xC3, 0x7A, 0x81, 0xE7, 0x0E, 0xFA, 0x16, 0x1A, 0x2E, 0xB4, 0x1C, 0xAF,
138 | 0x1D, 0x16, 0x40, 0xA3, 0x1B, 0x8F, 0x3F, 0x3C, 0x59, 0x3B, 0x49, 0xF1, 0xFD, 0xE6, 0x3A, 0x1E,
139 | 0xCE, 0xB3, 0x93, 0x10, 0x50, 0x5F, 0x59, 0x6C, 0xAA, 0x23, 0xA7, 0xEE, 0x82, 0x53, 0xA1, 0x57,
140 | 0x2C, 0x20, 0xDB, 0x9E, 0xD3, 0x25, 0x35, 0xEB, 0xE9, 0x78, 0x73, 0x19, 0x0C, 0x84, 0xF8, 0x38,
141 | 0x41, 0xCE, 0xFA, 0x75, 0x25, 0x26, 0x64, 0x48, 0x69, 0xCF, 0xE1, 0x68, 0x57, 0x70, 0xF1, 0x69,
142 | 0xF7, 0x86, 0x99, 0xD0, 0x7A, 0xDF, 0xC0, 0x81, 0x20, 0x33, 0xDF, 0x5A, 0x7F, 0x3B, 0x42, 0xD0,
143 | 0xE9, 0x06, 0xA0, 0xF6, 0x0A, 0x0E, 0xD6, 0xAE, 0x32, 0x31, 0x83, 0x1B, 0x2E, 0x2F, 0x8F, 0x23,
144 | 0xE2, 0x6F, 0x53, 0x59, 0x2E, 0x22, 0xCF, 0xBB, 0xDA, 0xA6, 0xAC, 0x9C, 0xB9, 0x7E, 0x64, 0x6D,
145 | 0xCE, 0x01, 0x6A, 0xCA, 0x1B, 0xDB, 0x76, 0xCC, 0xCD, 0xAB, 0x12, 0x54, 0x94, 0x17, 0xFE, 0xAC,
146 | 0x26, 0xFD, 0x0D, 0x67, 0x71, 0x6C, 0xAE, 0x9F, 0x20, 0xB0, 0x09, 0x28, 0x9E, 0x9F, 0x69, 0x17,
147 | 0xE7, 0xAF, 0x2F, 0xDE, 0xBC, 0xDB, 0x4D, 0x76, 0x80, 0x39, 0xF7, 0x94, 0x18, 0xA8, 0xB6, 0xFB,
148 | 0xCE, 0x09, 0x20, 0x44, 0x6F, 0x13, 0x9C, 0x7A, 0x1C, 0xA8, 0xA7, 0x17, 0x6F, 0x77, 0x85, 0x52,
149 | 0x6F, 0x7F, 0x30, 0xF5, 0xBE, 0x05, 0x9C, 0x3E, 0xBA, 0x78, 0x81, 0xDD, 0x0D, 0xB0, 0xE2, 0x84,
150 | 0x14, 0x2F, 0xED, 0x25, 0x3D, 0xDA, 0xDB, 0x42, 0x2E, 0x11, 0xE5, 0x3B, 0x58, 0xC6, 0x81, 0x57,
151 | 0x7C, 0x64, 0x42, 0x6F, 0x12, 0x3C, 0x9C, 0x52, 0x37, 0xCE, 0x2F, 0xE7, 0x7E, 0x18, 0x05, 0x35,
152 | 0x0B, 0xAA, 0x1A, 0x91, 0x6D, 0x76, 0x06, 0x53, 0x51, 0x38, 0x22, 0xF1, 0xD6, 0x20, 0xDD, 0xD9,
153 | 0x4F, 0x30, 0xE9, 0x75, 0xFA, 0x5F, 0x15, 0x15, 0xCA, 0xFC, 0x26, 0x81, 0x99, 0x6C, 0x50, 0x77,
154 | 0x26, 0xB4, 0xEE, 0x3C, 0x3F, 0xDB, 0x4D, 0x2A, 0x9B, 0xEC, 0xAD, 0xE0, 0x4C, 0xF6, 0x5A, 0x70,
155 | 0x34, 0x7E, 0x51, 0x34, 0x81, 0x69, 0xC3, 0x45, 0x84, 0x20, 0x84, 0xB5, 0xF3, 0x26, 0x0B, 0x08,
156 | 0x79, 0x53, 0xFD, 0x72, 0x9B, 0xD0, 0x89, 0xC5, 0xC8, 0x46, 0xCE, 0x71, 0x1A, 0x37, 0xF7, 0xBF,
157 | 0x6A, 0xD4, 0x1C, 0x57, 0x4A, 0xBB, 0x4D, 0xD0, 0x50, 0x4D, 0x4C, 0xEC, 0xB8, 0xF4, 0x09, 0xA6,
158 | 0x75, 0x01, 0x91, 0x68, 0x39, 0x26, 0xDA, 0x19, 0xFF, 0xB6, 0x0D, 0x36, 0xBD, 0x6D, 0xB0, 0x91,
159 | 0x25, 0xCA, 0xC2, 0x73, 0x72, 0x43, 0x95, 0xA6, 0xDB, 0x3B, 0xBD, 0x49, 0x78, 0xC6, 0xF3, 0xF5,
160 | 0x73, 0x1A, 0xD0, 0xE8, 0xC6, 0x93, 0xB7, 0xBB, 0xC9, 0x69, 0x74, 0xB2, 0x9A, 0x39, 0x6D, 0xAB,
161 | 0x0C, 0xC6, 0x94, 0xDA, 0x77, 0x2B, 0xB6, 0xDC, 0x00, 0x8D, 0x25, 0x15, 0xFC, 0xC3, 0x8E, 0xD0,
162 | 0x58, 0xD6, 0x47, 0xE3, 0x2B, 0x57, 0x98, 0xE5, 0xB7, 0x80, 0x4F, 0x80, 0x96, 0x1F, 0x27, 0x33,
163 | 0xB4, 0x36, 0x46, 0x82, 0x4E, 0x37, 0xDE, 0xA1, 0xA5, 0xF6, 0xFC, 0xD5, 0xE3, 0x9D, 0x60, 0x15,
164 | 0x4F, 0xBA, 0x1F, 0xBC, 0x12, 0x95, 0xF7, 0x8D, 0x99, 0x8B, 0xBD, 0xF5, 0x83, 0x8A, 0x12, 0xE9,
165 | 0xC6, 0x4B, 0xEC, 0x85, 0xDA, 0x99, 0x1F, 0x88, 0xB7, 0xCD, 0xEC, 0x04, 0x35, 0x36, 0xF3, 0x7E,
166 | 0x20, 0xE3, 0x4A, 0xEF, 0x1B, 0xAF, 0xE9, 0xCC, 0x09, 0x02, 0x3F, 0x58, 0x1B, 0x32, 0x41, 0xA7,
167 | 0x1B, 0x2F, 0x5A, 0xAF, 0xD8, 0xD1, 0x4E, 0xE0, 0x8A, 0x67, 0xDD, 0x0F, 0x62, 0x89, 0xCE, 0xFB,
168 | 0x06, 0x6D, 0x61, 0xBB, 0xCE, 0x7C, 0x6D, 0xC8, 0x18, 0x95, 0x6E, 0xBC, 0x6F, 0x3D, 0x83, 0x7F,
169 | 0x77, 0x02, 0x17, 0x9F, 0x71, 0x3F, 0x60, 0x09, 0x6D, 0xF7, 0x0D, 0x95, 0x65, 0x2E, 0xD7, 0x06,
170 | 0x0A, 0x68, 0x74, 0xE3, 0xE9, 0xD9, 0x07, 0xAD, 0xF1, 0xD4, 0x5F, 0x7A, 0xF4, 0xC6, 0x3F, 0xED,
171 | 0xFC, 0x75, 0x73, 0x27, 0x88, 0xD1, 0xA9, 0xF7, 0x83, 0x17, 0x53, 0x7A, 0xDF, 0x68, 0xB1, 0xBB,
172 | 0x8F, 0xC7, 0x68, 0xFD, 0x74, 0x18, 0x13, 0xD2, 0x7B, 0x5F, 0xE0, 0x48, 0x7B, 0x82, 0x76, 0x93,
173 | 0x10, 0x93, 0x79, 0x77, 0xD1, 0xB4, 0xA7, 0x4A, 0xEE, 0x1B, 0x27, 0x1B, 0x99, 0xF8, 0xA3, 0x85,
174 | 0xC9, 0x26, 0x37, 0x5E, 0x48, 0xB4, 0xBA, 0xF1, 0x0C, 0xBE, 0x68, 0x4F, 0xD9, 0x97, 0x5D, 0xB5,
175 | 0x1C, 0xF2, 0xFC, 0xBB, 0x40, 0x2D, 0xA3, 0xEF, 0x37, 0x01, 0x1C, 0x34, 0x78, 0xFE, 0xC4, 0xDB,
176 | 0xE8, 0x7E, 0xEA, 0x0C, 0xB9, 0x80, 0xEF, 0x1D, 0xFF, 0xBE, 0x5B, 0x00, 0x53, 0x21, 0x76, 0x86,
177 | 0xA1, 0xA4, 0xF7, 0x2E, 0x60, 0x8C, 0x9F, 0x49, 0x60, 0xDB, 0x02, 0xFC, 0xE5, 0x4F, 0x55, 0x48,
178 | 0x89, 0x57, 0xC2, 0xB0, 0xAD, 0x1B, 0x4C, 0x5A, 0x21, 0x71, 0x5C, 0x57, 0x37, 0x9E, 0x63, 0xA2,
179 | 0x5D, 0xD0, 0xC3, 0xE1, 0x11, 0x1F, 0x50, 0x9F, 0x8B, 0xB8, 0xE1, 0x9F, 0xBE, 0x76, 0x0D, 0xCD,
180 | 0x74, 0xE3, 0x82, 0xBE, 0x16, 0x0B, 0x78, 0xD1, 0x6F, 0xEB, 0x33, 0x63, 0x46, 0xC4, 0x5E, 0xE0,
181 | 0x83, 0x50, 0x09, 0x48, 0xE2, 0xED, 0x24, 0xBA, 0x16, 0x1F, 0x49, 0xBF, 0x19, 0xE7, 0x6C, 0xB0,
182 | 0x46, 0xBD, 0xAC, 0x7A, 0x3A, 0x7A, 0x15, 0xD6, 0x2C, 0xBE, 0x58, 0x3B, 0x3C, 0xF2, 0x90, 0xC2,
183 | 0xDC, 0x05, 0x28, 0x0C, 0xF9, 0xFB, 0xD4, 0x0A, 0x58, 0x25, 0x0F, 0x53, 0x30, 0x4B, 0xA4, 0x0F,
184 | 0x26, 0x25, 0x6A, 0xE5, 0x1F, 0x58, 0x12, 0x1B, 0xB6, 0xF5, 0x82, 0x96, 0x3D, 0x7A, 0x24, 0xEA,
185 | 0x21, 0x3D, 0x4C, 0xCC, 0xFF, 0x9F, 0x7F, 0x57, 0xF9, 0x0C, 0x7D, 0xDB, 0x5D, 0x2A, 0x98, 0xAE,
186 | 0x85, 0x81, 0x39, 0xD2, 0x8B, 0x1E, 0xCD, 0x28, 0xD0, 0xFC, 0x48, 0xA5, 0x7A, 0x6E, 0xB0, 0xC2,
187 | 0xD6, 0xC3, 0xD0, 0x0C, 0x9C, 0x39, 0x31, 0x6E, 0x59, 0xBE, 0x19, 0xCD, 0xB0, 0x47, 0xDA, 0xC8,
188 | 0xB2, 0xCE, 0x17, 0x70, 0xF0, 0xD2, 0x09, 0x09, 0x06, 0x2B, 0x34, 0x0E, 0x9E, 0xBE, 0x79, 0x75,
189 | 0xC6, 0x1F, 0x51, 0x79, 0xE9, 0x23, 0x0B, 0x5B, 0x07, 0x87, 0x9A, 0x1D, 0x79, 0xDC, 0xCD, 0x1B,
190 | 0x98, 0x8E, 0xE5, 0x6F, 0x1A, 0x5C, 0xA0, 0x40, 0x1B, 0xA3, 0x10, 0xBF, 0xF0, 0x43, 0xA2, 0x8D,
191 | 0xB4, 0x84, 0xA3, 0xEB, 0x9B, 0xEC, 0xF6, 0xC5, 0xB6, 0x1F, 0x38, 0x13, 0xC7, 0x13, 0x23, 0xB9,
192 | 0xB2, 0xBF, 0x05, 0x2E, 0x0C, 0x4D, 0xA8, 0x7E, 0xD4, 0x0E, 0x06, 0xA7, 0xDD, 0x03, 0xFA, 0x34,
193 | 0x11, 0xC0, 0x00, 0x3F, 0x00, 0x04, 0x18, 0x06, 0x40, 0x80, 0x8F, 0x0C, 0xF1, 0x38, 0x11, 0x76,
194 | 0xDB, 0xCC, 0xE4, 0x54, 0x40, 0x2A, 0x6D, 0xE3, 0x80, 0xE3, 0x74, 0x40, 0x1F, 0xAD, 0xBB, 0x4E,
195 | 0x28, 0xC3, 0xA9, 0xBF, 0x2C, 0xA3, 0x0C, 0xF0, 0xCC, 0x5F, 0xE0, 0x1C, 0x71, 0x42, 0x2D, 0xBC,
196 | 0xB9, 0x72, 0xEA, 0xD8, 0xEB, 0x0F, 0x9A, 0xF1, 0x80, 0xE4, 0xCD, 0x3D, 0x23, 0x8D, 0x04, 0x11,
197 | 0xCE, 0xB2, 0xC5, 0x5E, 0x15, 0xD7, 0x58, 0xAC, 0x52, 0xC6, 0x36, 0x72, 0xC3, 0x1C, 0xE7, 0x68,
198 | 0x6E, 0x21, 0x82, 0xDF, 0xD3, 0xDD, 0x5D, 0x18, 0xD0, 0xC0, 0xEE, 0x21, 0xDF, 0xEA, 0x3D, 0x14,
199 | 0x67, 0xDE, 0x01, 0x5F, 0x82, 0x9B, 0xE9, 0xAC, 0xF2, 0xCF, 0x40, 0x91, 0xFD, 0x3A, 0xD2, 0xBC,
200 | 0x08, 0x42, 0xF8, 0x11, 0x53, 0x41, 0x1B, 0x64, 0xCE, 0x32, 0x6A, 0x17, 0xB2, 0x93, 0x78, 0x4B,
201 | 0x31, 0x9B, 0x93, 0xFD, 0xE8, 0xD8, 0x74, 0xE2, 0x36, 0x7B, 0x67, 0xF2, 0x08, 0x78, 0x1C, 0xC4,
202 | 0xD9, 0xFD, 0x20, 0x7D, 0x15, 0xA5, 0x4C, 0xC4, 0xEC, 0xD0, 0x16, 0x7D, 0xB0, 0x38, 0xBF, 0x10,
203 | 0x27, 0x6E, 0xDF, 0x5E, 0x24, 0x7C, 0x35, 0x69, 0x18, 0x9C, 0x4A, 0x4F, 0x5C, 0xC3, 0x09, 0xE9,
204 | 0x79, 0xBF, 0x55, 0xDE, 0x39, 0x1E, 0x31, 0x73, 0x89, 0xC3, 0xAD, 0x44, 0xF2, 0x8C, 0x05, 0xEE,
205 | 0xDD, 0xCB, 0x72, 0xBB, 0x3D, 0x12, 0x54, 0xA9, 0x26, 0x7C, 0x3C, 0x44, 0x06, 0x44, 0x1E, 0xA8,
206 | 0x2D, 0x9E, 0x02, 0x15, 0x22, 0x39, 0x76, 0xE3, 0x76, 0xC6, 0xF0, 0x89, 0x8C, 0x36, 0x35, 0x91,
207 | 0x63, 0x31, 0x03, 0xB1, 0x7B, 0x20, 0x9A, 0xE9, 0x53, 0x72, 0x5C, 0xBE, 0x47, 0xCC, 0xEB, 0x1B,
208 | 0x58, 0x5C, 0x1D, 0x6D, 0x82, 0xFD, 0xA9, 0x33, 0xA7, 0x3F, 0x88, 0xF1, 0xE9, 0x54, 0x32, 0xC7,
209 | 0x49, 0x86, 0x23, 0x55, 0x2C, 0x27, 0x37, 0xFD, 0x30, 0x7E, 0xF4, 0x3A, 0x81, 0xB8, 0x56, 0x21,
210 | 0x3F, 0x95, 0xCA, 0x26, 0x07, 0x36, 0xF4, 0x5A, 0x46, 0xFA, 0x7B, 0xCE, 0xD4, 0xC9, 0xC0, 0x02,
211 | 0x26, 0x6C, 0x82, 0x55, 0x26, 0xA5, 0x92, 0xC7, 0x37, 0x8A, 0x29, 0x0C, 0xC2, 0xD8, 0x2D, 0xC7,
212 | 0xD4, 0x14, 0x6C, 0x56, 0x38, 0x2C, 0x63, 0x95, 0x2B, 0xFC, 0x0A, 0x86, 0x3C, 0x10, 0x1B, 0xBC,
213 | 0xAE, 0x3D, 0x61, 0x35, 0x8A, 0x32, 0x17, 0x31, 0x96, 0xFD, 0xFD, 0x96, 0x2C, 0xFC, 0x75, 0x1C,
214 | 0x76, 0x49, 0x0A, 0x94, 0xFD, 0x80, 0xFA, 0x7F, 0x6C, 0x69, 0x1A, 0x22, 0xA9, 0xA3, 0x89, 0x07,
215 | 0xFB, 0xE3, 0xF8, 0x48, 0xE1, 0x30, 0x21, 0xF7, 0x49, 0x91, 0x32, 0xC8, 0x89, 0x2A, 0x87, 0x08,
216 | 0xC8, 0xDD, 0xD5, 0xE4, 0x47, 0xF5, 0xC7, 0x90, 0x42, 0x3F, 0x67, 0xF8, 0xB0, 0x8B, 0x32, 0x09,
217 | 0x13, 0xFE, 0x1B, 0xBF, 0xCD, 0xA9, 0xE5, 0x7B, 0x58, 0xCD, 0x5D, 0x0E, 0x12, 0x15, 0x4F, 0x5E,
218 | 0xC2, 0xF3, 0x4C, 0xA3, 0xF1, 0xCC, 0x21, 0x0A, 0x86, 0x07, 0x90, 0xBE, 0x55, 0xBC, 0x44, 0x63,
219 | 0x97, 0x12, 0x04, 0x98, 0x44, 0x81, 0x27, 0x47, 0x21, 0xCF, 0x64, 0x7F, 0x47, 0x38, 0xB8, 0x02,
220 | 0x46, 0x9F, 0xEE, 0x7E, 0x89, 0xEB, 0xC2, 0xF5, 0x11, 0x7B, 0x34, 0xC1, 0x77, 0x1F, 0x41, 0xE5,
221 | 0x18, 0xDD, 0xFD, 0xC2, 0xA0, 0xBE, 0xBE, 0x07, 0x53, 0xC2, 0x17, 0x36, 0xF1, 0xF5, 0x27, 0xCE,
222 | 0xC2, 0xA6, 0x2F, 0x9A, 0x6D, 0x30, 0x16, 0x31, 0x6E, 0x6D, 0x32, 0xC5, 0x5E, 0x23, 0xC0, 0xE1,
223 | 0x1C, 0xD8, 0xE3, 0x34, 0x01, 0xC6, 0x33, 0xFA, 0x2E, 0x86, 0x12, 0x35, 0x69, 0x7C, 0x0A, 0x30,
224 | 0xD0, 0x81, 0x00, 0xC4, 0xD7, 0xEE, 0x7E, 0x61, 0x2C, 0xAE, 0x35, 0x1B, 0xB2, 0x40, 0x38, 0xC5,
225 | 0xD6, 0x21, 0xD4, 0x2B, 0x44, 0xE8, 0x13, 0xB8, 0x77, 0xBF, 0xC4, 0xAC, 0xDA, 0xFC, 0xA7, 0xEB,
226 | 0x4F, 0x89, 0x87, 0x24, 0x45, 0x24, 0xAE, 0x7D, 0xEC, 0x44, 0x9B, 0xF1, 0xBA, 0x60, 0x28, 0xF8,
227 | 0xC1, 0x63, 0xD7, 0x6D, 0x1C, 0xF0, 0x07, 0x95, 0x45, 0x6E, 0x6F, 0x43, 0xB3, 0x7A, 0x8E, 0x40,
228 | 0x6C, 0xB9, 0x28, 0xB0, 0x7C, 0xE5, 0x7B, 0xA6, 0xEB, 0x98, 0x9F, 0x69, 0x42, 0x6F, 0x66, 0x05,
229 | 0xE7, 0x19, 0xC2, 0x6D, 0xF3, 0x17, 0xCF, 0xBC, 0xF6, 0x2D, 0x9C, 0x73, 0xD3, 0x26, 0x15, 0xE3,
230 | 0xE8, 0x08, 0xAC, 0x8C, 0xAC, 0x38, 0x95, 0x71, 0x8C, 0xE8, 0x1B, 0x0A, 0xB8, 0x99, 0x32, 0x16,
231 | 0xE6, 0xCA, 0x08, 0x5D, 0xB8, 0xCD, 0xD2, 0x2A, 0x1F, 0xAB, 0x9C, 0xBA, 0x2D, 0x47, 0x4F, 0x4B,
232 | 0x6C, 0xF1, 0x57, 0xE8, 0x7B, 0x8D, 0xE6, 0xAD, 0xC4, 0x0C, 0xAB, 0x3C, 0xE8, 0x04, 0x12, 0x83,
233 | 0x8C, 0x89, 0x8A, 0xCC, 0x94, 0x5D, 0x0D, 0x1C, 0xA4, 0x99, 0xA4, 0xC0, 0x66, 0xF4, 0x23, 0x55,
234 | 0x42, 0x56, 0x06, 0xD9, 0xBC, 0x7F, 0x30, 0x97, 0xF9, 0xF3, 0x90, 0x97, 0x4E, 0x29, 0x23, 0x35,
235 | 0x25, 0x73, 0x71, 0xFF, 0xA3, 0xAF, 0xE8, 0x97, 0xDB, 0x17, 0xE8, 0xC9, 0xCF, 0x5D, 0x4C, 0x0F,
236 | 0x9F, 0x5C, 0xFD, 0x0C, 0x25, 0x9F, 0x37, 0x2E, 0x4C, 0x96, 0x94, 0xE0, 0x2C, 0x69, 0x1A, 0x2B,
237 | 0x29, 0xD3, 0x06, 0x53, 0xE2, 0xC1, 0x9A, 0x7E, 0x9E, 0x6F, 0xCA, 0x38, 0x24, 0xEB, 0x83, 0x0C,
238 | 0x29, 0xE5, 0x5A, 0x4D, 0x9B, 0x59, 0x15, 0x48, 0xF4, 0x72, 0xAE, 0x2B, 0xA3, 0x97, 0x16, 0x02,
239 | 0x12, 0x35, 0x73, 0xE4, 0x6A, 0x62, 0xB9, 0x25, 0x3E, 0x90, 0x8C, 0x1D, 0x12, 0x7F, 0xCE, 0x57,
240 | 0x26, 0x39, 0x27, 0x5F, 0x3A, 0x9E, 0xE5, 0x2F, 0xDB, 0xF4, 0x7C, 0x43, 0x94, 0x56, 0x59, 0xD1,
241 | 0xB6, 0xE3, 0x81, 0x01, 0x5F, 0xFC, 0xFA, 0xEA, 0x25, 0x4D, 0x39, 0xF2, 0x0A, 0xE7, 0x20, 0xDB,
242 | 0x17, 0xB1, 0x77, 0x02, 0x2B, 0x67, 0xA0, 0xB0, 0xB5, 0xA1, 0xD5, 0xE6, 0xA9, 0x26, 0x69, 0x47,
243 | 0x69, 0x24, 0xD0, 0xC3, 0x4F, 0x7C, 0x4E, 0x5A, 0x78, 0x32, 0x00, 0x37, 0x2B, 0x65, 0xF1, 0xE7,
244 | 0x79, 0x51, 0x20, 0x0E, 0x1F, 0x13, 0x02, 0xEE, 0xAA, 0x71, 0x47, 0x0E, 0x69, 0x8E, 0x11, 0xAB,
245 | 0xC3, 0x5B, 0x9A, 0x0C, 0x7E, 0x41, 0xC8, 0xA7, 0x66, 0x12, 0x31, 0x96, 0x15, 0x5E, 0xCA, 0x93,
246 | 0x68, 0x0E, 0x71, 0x89, 0x1F, 0x7D, 0x34, 0xC7, 0x90, 0x1A, 0x9F, 0x82, 0xE7, 0xB7, 0x3D, 0xD0,
247 | 0xA0, 0x79, 0x5D, 0xA6, 0x0E, 0x37, 0x57, 0x0A, 0x64, 0x5D, 0x21, 0x58, 0x12, 0x52, 0x73, 0xCB,
248 | 0xD8, 0x47, 0xCD, 0x4E, 0xF6, 0xDE, 0x73, 0x2F, 0x6E, 0x6D, 0x8B, 0x0C, 0x3B, 0x5A, 0x35, 0x2D,
249 | 0xEF, 0x6E, 0x32, 0x0C, 0xD2, 0xF4, 0xB2, 0x22, 0x6C, 0xAE, 0x81, 0x91, 0xFC, 0x22, 0x1E, 0x10,
250 | 0xCB, 0x2E, 0x07, 0x44, 0x81, 0xEC, 0xD9, 0xDE, 0x2F, 0xD7, 0x2C, 0xE4, 0x20, 0x17, 0x39, 0x4C,
251 | 0xA3, 0x2F, 0x2A, 0x98, 0xD2, 0xF2, 0x2C, 0x9C, 0xA0, 0x4E, 0x99, 0x50, 0xE6, 0xBF, 0xD2, 0x7A,
252 | 0xC1, 0x67, 0x88, 0xA5, 0xCD, 0xF7, 0xA8, 0xD9, 0xDA, 0x70, 0x16, 0x81, 0x95, 0x66, 0xB1, 0x4F,
253 | 0xF2, 0xDF, 0x68, 0xC3, 0x96, 0x04, 0x0F, 0x34, 0x70, 0x65, 0x41, 0x0D, 0xA7, 0xA5, 0x4C, 0x20,
254 | 0xBA, 0xBD, 0x0A, 0x02, 0xE9, 0xAE, 0x27, 0x89, 0x56, 0xEA, 0x22, 0x4B, 0xD3, 0x5F, 0xFE, 0x3E,
255 | 0x1D, 0xC6, 0x02, 0xB8, 0xAE, 0x6A, 0xAE, 0xC0, 0x09, 0xC6, 0x35, 0x13, 0xB7, 0xA1, 0x44, 0xA2,
256 | 0xAD, 0x92, 0x9C, 0xA6, 0xA0, 0x2D, 0x5E, 0x6D, 0x89, 0x73, 0xDE, 0x54, 0xD4, 0x0A, 0xAF, 0xB6,
257 | 0xC1, 0xD7, 0x92, 0x83, 0xC4, 0xF7, 0x3F, 0xA6, 0x26, 0xC4, 0xE5, 0xF6, 0xC6, 0xB2, 0xBD, 0xE3,
258 | 0xE5, 0x40, 0x05, 0x85, 0x7C, 0x9B, 0x26, 0x37, 0x17, 0xAE, 0x69, 0x2E, 0x2C, 0xCC, 0x45, 0x09,
259 | 0xD2, 0x0E, 0xB4, 0x7A, 0x6D, 0x92, 0xF8, 0xFF, 0x87, 0x27, 0xA9, 0x66, 0xCB, 0x71, 0xA9, 0x9C,
260 | 0xA2, 0xF7, 0x97, 0xD4, 0x2B, 0x27, 0xC8, 0x3C, 0xCB, 0xC1, 0xD5, 0x5A, 0x8E, 0xEB, 0xA9, 0x15,
261 | 0xAF, 0x1D, 0x28, 0x41, 0xAA, 0x96, 0x7A, 0x85, 0x11, 0xAB, 0x92, 0xEC, 0x75, 0xB3, 0xFF, 0xDD,
262 | 0x42, 0xF2, 0x66, 0x89, 0x44, 0x58, 0xBE, 0x51, 0x5C, 0x59, 0x3D, 0xF9, 0x30, 0x49, 0xC9, 0x64,
263 | 0x8D, 0x52, 0x49, 0x9A, 0x8C, 0x94, 0xA8, 0x13, 0x39, 0x4A, 0xA9, 0xE3, 0x41, 0xBC, 0xEC, 0x26,
264 | 0x5F, 0x6B, 0x19, 0x2B, 0x19, 0x9D, 0x06, 0x4E, 0xCA, 0x80, 0x77, 0xFC, 0x86, 0x76, 0x3F, 0xBF,
265 | 0x26, 0xE6, 0xBD, 0x17, 0x57, 0x36, 0xD7, 0x71, 0xC9, 0x03, 0x12, 0x95, 0x32, 0x63, 0x92, 0x00,
266 | 0xE1, 0xF4, 0x45, 0x62, 0x56, 0x8A, 0x82, 0x5C, 0x1C, 0x90, 0x86, 0xFE, 0xD6, 0xC5, 0x74, 0xBD,
267 | 0x22, 0x9E, 0xC6, 0x39, 0xFB, 0xF9, 0x99, 0xE6, 0x07, 0x1A, 0x7F, 0xC1, 0x5D, 0x90, 0xBC, 0x5B,
268 | 0x44, 0x13, 0x6F, 0x7F, 0x62, 0xAB, 0x42, 0x9A, 0x83, 0xC8, 0xD4, 0x09, 0xA1, 0x49, 0xA6, 0x4F,
269 | 0xDE, 0xE2, 0xDB, 0x7A, 0xF2, 0x82, 0xA7, 0x4A, 0xF5, 0x78, 0x57, 0xFC, 0x53, 0xA2, 0x48, 0xCE,
270 | 0x9C, 0x9C, 0x26, 0xB5, 0xE5, 0x6D, 0xA1, 0xE3, 0x4A, 0x22, 0x2A, 0x5B, 0x87, 0xAE, 0x61, 0xC2,
271 | 0xE4, 0xF4, 0x37, 0x6B, 0x45, 0xB5, 0x02, 0x95, 0x86, 0x4C, 0xC8, 0x52, 0x5B, 0xA6, 0xBA, 0xAE,
272 | 0x58, 0x53, 0xB5, 0xD8, 0x2F, 0x41, 0x94, 0xEE, 0x79, 0x29, 0xB3, 0x7C, 0x31, 0x2A, 0xDC, 0xE2,
273 | 0xBC, 0xB0, 0xF2, 0xCF, 0xF0, 0x28, 0xDE, 0x59, 0xE5, 0xDF, 0xF8, 0xAB, 0x8B, 0x86, 0x47, 0xFC,
274 | 0x7F, 0x22, 0xF6, 0x5F, 0x04, 0x9C, 0x39, 0x76, 0x5C, 0x6C, 0x00, 0x00
275 | };
276 |
277 |
278 | //File: index_ov3660.html.gz, Size: 4408
279 | #define index_ov3660_html_gz_len 4408
280 | const uint8_t index_ov3660_html_gz[] = {
281 | 0x1F, 0x8B, 0x08, 0x08, 0x28, 0x5C, 0xAE, 0x5C, 0x00, 0x03, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x5F,
282 | 0x6F, 0x76, 0x33, 0x36, 0x36, 0x30, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x00, 0xE5, 0x5D, 0xEB, 0x92,
283 | 0xD3, 0xC6, 0x12, 0xFE, 0xCF, 0x53, 0x08, 0x41, 0x58, 0x6F, 0x65, 0xED, 0xF5, 0x6D, 0xCD, 0xE2,
284 | 0xD8, 0xE6, 0xC0, 0xB2, 0x84, 0x54, 0x01, 0x49, 0x20, 0x21, 0xA9, 0x4A, 0xA5, 0x60, 0x2C, 0x8D,
285 | 0xED, 0x09, 0xB2, 0xE4, 0x48, 0x23, 0x7B, 0x37, 0xD4, 0x3E, 0xC7, 0x79, 0xA0, 0xF3, 0x62, 0xA7,
286 | 0xE7, 0x22, 0x69, 0x24, 0x8F, 0x2E, 0xB6, 0x59, 0x9B, 0xC3, 0x31, 0x55, 0x20, 0x5B, 0xD3, 0x3D,
287 | 0xDD, 0xFD, 0xF5, 0x6D, 0x46, 0x17, 0x06, 0x77, 0x6D, 0xCF, 0xA2, 0xD7, 0x0B, 0x6C, 0xCC, 0xE8,
288 | 0xDC, 0x19, 0xDD, 0x19, 0x88, 0x7F, 0x0C, 0xF8, 0x0C, 0x66, 0x18, 0xD9, 0xE2, 0x90, 0x7F, 0x9D,
289 | 0x63, 0x8A, 0x0C, 0x6B, 0x86, 0xFC, 0x00, 0xD3, 0xA1, 0x19, 0xD2, 0x49, 0xFD, 0xDC, 0xCC, 0x9E,
290 | 0x76, 0xD1, 0x1C, 0x0F, 0xCD, 0x25, 0xC1, 0xAB, 0x85, 0xE7, 0x53, 0xD3, 0xB0, 0x3C, 0x97, 0x62,
291 | 0x17, 0x86, 0xAF, 0x88, 0x4D, 0x67, 0x43, 0x1B, 0x2F, 0x89, 0x85, 0xEB, 0xFC, 0xCB, 0x09, 0x71,
292 | 0x09, 0x25, 0xC8, 0xA9, 0x07, 0x16, 0x72, 0xF0, 0xB0, 0xA5, 0xF2, 0xA2, 0x84, 0x3A, 0x78, 0x74,
293 | 0xF9, 0xF6, 0xA7, 0x4E, 0xDB, 0xF8, 0xF1, 0x5D, 0xA7, 0xD7, 0x6B, 0x0E, 0x4E, 0xC5, 0x6F, 0xC9,
294 | 0x98, 0x80, 0x5E, 0xAB, 0xDF, 0xD9, 0x67, 0xEC, 0xD9, 0xD7, 0xC6, 0xA7, 0xD4, 0x4F, 0xEC, 0x33,
295 | 0x01, 0x21, 0xEA, 0x13, 0x34, 0x27, 0xCE, 0x75, 0xDF, 0x78, 0xE2, 0xC3, 0x9C, 0x27, 0x2F, 0xB0,
296 | 0xB3, 0xC4, 0x94, 0x58, 0xE8, 0x24, 0x40, 0x6E, 0x50, 0x0F, 0xB0, 0x4F, 0x26, 0xDF, 0xAD, 0x11,
297 | 0x8E, 0x91, 0xF5, 0x71, 0xEA, 0x7B, 0xA1, 0x6B, 0xF7, 0x8D, 0x7B, 0xAD, 0x73, 0xF6, 0x67, 0x7D,
298 | 0x90, 0xE5, 0x39, 0x9E, 0x0F, 0xE7, 0x2F, 0x9F, 0xB3, 0x3F, 0xEB, 0xE7, 0xF9, 0xEC, 0x01, 0xF9,
299 | 0x07, 0xF7, 0x8D, 0x56, 0x6F, 0x71, 0x95, 0x3A, 0x7F, 0x73, 0x27, 0xF5, 0x75, 0xD6, 0xCE, 0x93,
300 | 0x5E, 0xD2, 0x9F, 0x17, 0xD3, 0x07, 0xD8, 0xA2, 0xC4, 0x73, 0x1B, 0x73, 0x44, 0x5C, 0x0D, 0x27,
301 | 0x9B, 0x04, 0x0B, 0x07, 0x81, 0x0D, 0x26, 0x0E, 0x2E, 0xE4, 0x73, 0x6F, 0x8E, 0xDD, 0xF0, 0xA4,
302 | 0x84, 0x1B, 0x63, 0x52, 0xB7, 0x89, 0x2F, 0x46, 0xF5, 0x99, 0x1D, 0xC2, 0xB9, 0x5B, 0xCA, 0xB6,
303 | 0x48, 0x2E, 0xD7, 0x73, 0xB1, 0xC6, 0x80, 0x6C, 0xA2, 0x95, 0x8F, 0x16, 0x6C, 0x00, 0xFB, 0x77,
304 | 0x7D, 0xC8, 0x9C, 0xB8, 0xC2, 0xA9, 0xFA, 0x46, 0xA7, 0xDB, 0x5C, 0x5C, 0x95, 0x40, 0xD9, 0xE9,
305 | 0xB1, 0x3F, 0xEB, 0x83, 0x16, 0xC8, 0xB6, 0x89, 0x3B, 0xED, 0x1B, 0xE7, 0x5A, 0x16, 0x9E, 0x6F,
306 | 0x63, 0xBF, 0xEE, 0x23, 0x9B, 0x84, 0x41, 0xDF, 0xE8, 0xEA, 0xC6, 0xCC, 0x91, 0x3F, 0x05, 0x59,
307 | 0xA8, 0x07, 0xC2, 0xD6, 0x5B, 0x5A, 0x49, 0xE4, 0x10, 0x9F, 0x4C, 0x67, 0x14, 0x20, 0x5D, 0x1B,
308 | 0x93, 0x35, 0x9A, 0x0C, 0xA1, 0x32, 0x3C, 0x0B, 0xED, 0xA6, 0xB7, 0x1A, 0x72, 0xC8, 0xD4, 0xAD,
309 | 0x13, 0x8A, 0xE7, 0xA0, 0x4E, 0x40, 0x7D, 0x4C, 0xAD, 0x59, 0x91, 0x28, 0x13, 0x32, 0x0D, 0x7D,
310 | 0xAC, 0x11, 0x24, 0xB6, 0x5B, 0x81, 0xC2, 0x70, 0x72, 0xFD, 0x54, 0x7D, 0x85, 0xC7, 0x1F, 0x09,
311 | 0xAD, 0x4B, 0x9B, 0x8C, 0xF1, 0xC4, 0xF3, 0xB1, 0x76, 0x64, 0x34, 0xC2, 0xF1, 0xAC, 0x8F, 0xF5,
312 | 0x80, 0x22, 0x9F, 0x56, 0x61, 0x88, 0x26, 0x14, 0xFB, 0xE5, 0xFC, 0x30, 0xF3, 0x8A, 0x72, 0x6E,
313 | 0xF9, 0xD3, 0xCA, 0x01, 0xC4, 0x75, 0x88, 0x8B, 0xAB, 0x8B, 0x97, 0x37, 0x6F, 0x9A, 0x9D, 0x18,
314 | 0x55, 0x01, 0x18, 0x32, 0x9F, 0x16, 0x79, 0x09, 0xD7, 0x75, 0x7D, 0x32, 0x19, 0x37, 0xAD, 0x66,
315 | 0xF3, 0x9B, 0xF5, 0x93, 0x33, 0x2C, 0xDC, 0x14, 0x85, 0xD4, 0xDB, 0x3D, 0x22, 0xD6, 0xC2, 0x2A,
316 | 0xA3, 0xC7, 0xBF, 0xE6, 0xD8, 0x26, 0xC8, 0xA8, 0x29, 0xE1, 0x7C, 0xDE, 0x04, 0x9F, 0x3A, 0x36,
317 | 0x90, 0x6B, 0x1B, 0x35, 0xCF, 0x27, 0x10, 0x08, 0x88, 0xA7, 0x1B, 0x07, 0x7E, 0x81, 0xC2, 0xB1,
318 | 0xC0, 0xC7, 0x1A, 0x95, 0x0B, 0x62, 0x46, 0xB5, 0x88, 0x3E, 0x6C, 0xD8, 0xA7, 0x42, 0xCA, 0x61,
319 | 0x9F, 0xD2, 0x00, 0xD2, 0xE8, 0xC8, 0xD9, 0x17, 0xE1, 0xA5, 0x4A, 0x98, 0x87, 0x19, 0xFB, 0xCC,
320 | 0xD1, 0x55, 0xBD, 0x10, 0xBB, 0x68, 0x50, 0x84, 0x21, 0x94, 0x59, 0xAB, 0x06, 0x43, 0x97, 0x33,
321 | 0xA3, 0x6E, 0xB0, 0x2C, 0x79, 0xAC, 0xA7, 0x91, 0x4C, 0xF5, 0x90, 0xB3, 0x8F, 0xEA, 0x14, 0x1B,
322 | 0xA8, 0xAB, 0x57, 0x35, 0xC9, 0x1D, 0xE2, 0x8F, 0xCE, 0x87, 0x84, 0x26, 0xB9, 0x59, 0x84, 0x7D,
323 | 0xAA, 0x67, 0x92, 0x84, 0x59, 0x69, 0x36, 0xD1, 0x30, 0xCE, 0xCF, 0x28, 0x6B, 0x7C, 0xF3, 0xA2,
324 | 0x5B, 0xC3, 0xB5, 0x58, 0x84, 0xAA, 0xD9, 0x45, 0xC3, 0xB8, 0x48, 0x86, 0xD2, 0x2C, 0xC3, 0x3E,
325 | 0x37, 0x15, 0xFA, 0x8D, 0x7B, 0xE3, 0x90, 0x52, 0xCF, 0x0D, 0x76, 0x2A, 0x51, 0x79, 0x71, 0xF6,
326 | 0x57, 0x18, 0x50, 0x32, 0xB9, 0xAE, 0xCB, 0x90, 0x86, 0x38, 0x5B, 0x20, 0x68, 0x21, 0xC7, 0x98,
327 | 0xAE, 0x30, 0x2E, 0x6E, 0x37, 0x5C, 0xB4, 0x84, 0xBC, 0x33, 0x9D, 0x3A, 0x3A, 0xDF, 0xB3, 0x42,
328 | 0x3F, 0x60, 0x7D, 0xDB, 0xC2, 0x23, 0xC0, 0xD8, 0x5F, 0x9F, 0x38, 0x1D, 0x83, 0x15, 0x27, 0xAA,
329 | 0x5B, 0x63, 0xCD, 0x5C, 0x5E, 0x48, 0x99, 0x8D, 0xB5, 0x48, 0x78, 0xA0, 0x0E, 0xA1, 0xD7, 0xDA,
330 | 0x73, 0x32, 0x12, 0x35, 0x67, 0xA2, 0x10, 0x2C, 0x2C, 0x0B, 0x69, 0xB9, 0xFA, 0xD6, 0x0C, 0x5B,
331 | 0x1F, 0xB1, 0xFD, 0x6D, 0x69, 0x1B, 0x56, 0xD6, 0x1E, 0x36, 0x88, 0xBB, 0x08, 0x69, 0x9D, 0xB5,
332 | 0x53, 0x8B, 0x5B, 0xC1, 0x9C, 0x3B, 0x64, 0xA4, 0x62, 0xBB, 0x5D, 0xD4, 0x54, 0x9C, 0x2D, 0xAE,
333 | 0x8A, 0x8D, 0xA0, 0x0A, 0x3B, 0x72, 0xD0, 0x18, 0x3B, 0x45, 0x22, 0xCB, 0x60, 0xC8, 0x49, 0xBB,
334 | 0x32, 0x57, 0xE5, 0xF7, 0x6E, 0x5C, 0xB2, 0xA4, 0x78, 0x75, 0x1F, 0x7E, 0x53, 0xD9, 0x8E, 0xFC,
335 | 0xF8, 0x24, 0xF5, 0x53, 0x80, 0x1D, 0x08, 0xB0, 0xBC, 0xD6, 0x1B, 0xC6, 0xAC, 0x40, 0x86, 0xC2,
336 | 0x09, 0x7C, 0xE4, 0x4E, 0x31, 0xE4, 0x82, 0xAB, 0x93, 0xE8, 0xB0, 0x78, 0x61, 0x50, 0x49, 0x7D,
337 | 0x96, 0xAA, 0xCF, 0x8A, 0x17, 0x22, 0x22, 0x21, 0x6C, 0xD1, 0x8C, 0x28, 0xB0, 0x16, 0xCE, 0xDF,
338 | 0xD2, 0x3A, 0x85, 0xE8, 0x47, 0xB4, 0x01, 0x93, 0x76, 0x29, 0x6D, 0x7F, 0x5F, 0x9A, 0x11, 0xA2,
339 | 0x95, 0xDE, 0x64, 0x52, 0xB6, 0x56, 0x9C, 0x4C, 0x3A, 0xCD, 0x4E, 0xB7, 0xB4, 0x61, 0xD2, 0x6A,
340 | 0x99, 0x59, 0x2F, 0x6A, 0x32, 0x46, 0x9C, 0x4D, 0xCA, 0x21, 0xE8, 0xCF, 0xBC, 0x25, 0xF6, 0x35,
341 | 0x40, 0x64, 0xC4, 0xED, 0x3E, 0xEA, 0xDA, 0x15, 0xB8, 0x21, 0xC8, 0xF7, 0x4B, 0x5D, 0x36, 0x4D,
342 | 0xB3, 0x6B, 0xB7, 0xAC, 0x76, 0xA1, 0x63, 0x0A, 0x76, 0x0D, 0xF0, 0x06, 0x34, 0x76, 0xB0, 0x5D,
343 | 0x90, 0x9E, 0x6D, 0x3C, 0x41, 0xA1, 0x43, 0x4B, 0xEC, 0x8D, 0x9A, 0xEC, 0x4F, 0xD1, 0x8C, 0x3C,
344 | 0xAE, 0xFE, 0x60, 0x1B, 0x1D, 0x43, 0x1E, 0x09, 0x7F, 0x6A, 0xE6, 0x8C, 0x6A, 0x27, 0x5A, 0x2C,
345 | 0x30, 0x82, 0x51, 0x16, 0xCE, 0x5B, 0x92, 0x56, 0xEA, 0x99, 0xF5, 0x89, 0xAB, 0xD2, 0x42, 0xB4,
346 | 0xD4, 0x15, 0xE3, 0x6E, 0x68, 0x23, 0x9D, 0xFB, 0x13, 0xCF, 0x0A, 0x75, 0x65, 0xBA, 0x9A, 0x4B,
347 | 0xAD, 0xF3, 0xEB, 0x47, 0x26, 0x0B, 0x1C, 0xC2, 0x1D, 0x3B, 0x74, 0x5D, 0x86, 0x68, 0x9D, 0xFA,
348 | 0xA0, 0xA6, 0x66, 0xA2, 0x6A, 0x86, 0xDB, 0x2A, 0x3A, 0x53, 0x86, 0xCD, 0xDB, 0x8C, 0xC9, 0x04,
349 | 0xA0, 0x26, 0x51, 0xC4, 0x39, 0xC4, 0x08, 0x3C, 0x50, 0x2A, 0x62, 0xB5, 0x9B, 0x5D, 0xE8, 0x2C,
350 | 0x9C, 0xEB, 0x1A, 0x83, 0x68, 0xB2, 0x16, 0x54, 0x31, 0x31, 0x9D, 0x3F, 0x1D, 0xA3, 0x5A, 0xF3,
351 | 0xA4, 0x79, 0xD2, 0x81, 0xBF, 0x34, 0x0D, 0x7A, 0xB1, 0x73, 0x49, 0xF3, 0xE6, 0x78, 0x5E, 0x26,
352 | 0xF9, 0x94, 0xEF, 0x93, 0xE4, 0xA5, 0xB1, 0x52, 0x2C, 0xAA, 0x47, 0x52, 0x7A, 0xC3, 0xA4, 0xD5,
353 | 0x28, 0x29, 0x2C, 0x39, 0x2E, 0xBD, 0xB9, 0x23, 0x6A, 0xBC, 0x65, 0x53, 0x88, 0xE7, 0xDE, 0x3F,
354 | 0x75, 0x51, 0x55, 0xFF, 0xEF, 0xBD, 0x5D, 0x31, 0xC5, 0x57, 0xED, 0xE9, 0x1B, 0xDB, 0x25, 0x38,
355 | 0xB4, 0x6F, 0x34, 0xF3, 0x51, 0xAF, 0xCB, 0x7E, 0x06, 0x24, 0x74, 0x61, 0x51, 0xE5, 0xC3, 0xEA,
356 | 0x2A, 0xB7, 0xE7, 0x51, 0xC6, 0x6C, 0x61, 0x83, 0x09, 0x71, 0x9C, 0xBA, 0xE3, 0xAD, 0xCA, 0x3B,
357 | 0x91, 0x62, 0x4F, 0x5E, 0xF3, 0xD3, 0x72, 0x97, 0xDF, 0x56, 0xDA, 0x10, 0x32, 0xD7, 0xFF, 0x84,
358 | 0xB4, 0x5F, 0x77, 0xC0, 0x15, 0x86, 0xC6, 0x76, 0x85, 0x62, 0x0B, 0x7F, 0xDC, 0x6D, 0xA2, 0x4A,
359 | 0xAE, 0x24, 0x3A, 0xC1, 0xC2, 0xC5, 0x5C, 0xB0, 0x22, 0xD4, 0x9A, 0x6D, 0xB1, 0xA8, 0x5A, 0x78,
360 | 0x01, 0x11, 0xD7, 0x68, 0x7C, 0xEC, 0x20, 0xD6, 0xC1, 0x6F, 0xB5, 0xE4, 0x2E, 0x5D, 0x98, 0xA8,
361 | 0xE4, 0x55, 0x34, 0xE1, 0xA6, 0xFB, 0x72, 0xB6, 0x4B, 0x1A, 0xA2, 0x77, 0xC8, 0xCF, 0xD5, 0x7A,
362 | 0xB7, 0x2E, 0x69, 0xF7, 0xD3, 0x91, 0xA1, 0x1F, 0xB4, 0x41, 0x46, 0x8F, 0x92, 0xF6, 0xD4, 0xC7,
363 | 0xD7, 0x15, 0x94, 0x39, 0x91, 0xFF, 0xF6, 0xC5, 0x86, 0xE8, 0xF6, 0x6B, 0x7F, 0x5E, 0x00, 0xA4,
364 | 0x17, 0x35, 0xBA, 0x41, 0x85, 0xA9, 0xF3, 0xA7, 0xAC, 0xE2, 0x8F, 0xF1, 0x76, 0x9F, 0x69, 0x56,
365 | 0x48, 0x37, 0x05, 0x25, 0x54, 0xEF, 0xAA, 0x51, 0xF5, 0xD5, 0x9E, 0x74, 0xF0, 0x84, 0xE6, 0x5C,
366 | 0xCD, 0xE0, 0x7D, 0x6A, 0xA7, 0x38, 0xBB, 0xD5, 0x95, 0x7D, 0x82, 0xD2, 0xCC, 0x11, 0xEF, 0xCA,
367 | 0xE5, 0x7B, 0x9F, 0x96, 0x33, 0xCB, 0x9E, 0x1B, 0x33, 0xCF, 0x87, 0x24, 0x6A, 0x9F, 0x39, 0xCC,
368 | 0x30, 0x66, 0x2E, 0x4B, 0x3E, 0xC0, 0x83, 0x7F, 0xAF, 0xB5, 0x7B, 0xDA, 0x8B, 0x05, 0x05, 0x83,
369 | 0x8B, 0x44, 0xCB, 0xDD, 0xD6, 0x5A, 0x2F, 0x59, 0xB9, 0x0B, 0x64, 0x35, 0x17, 0x69, 0x81, 0x2A,
370 | 0x8E, 0xCA, 0xA2, 0x0C, 0xB3, 0xBE, 0x47, 0x53, 0xE8, 0xEC, 0x64, 0x8E, 0xA0, 0xED, 0x65, 0xEE,
371 | 0x8A, 0x80, 0xA3, 0x0E, 0xBF, 0x2A, 0xEE, 0xAE, 0x6C, 0x1A, 0xB6, 0x7A, 0xCD, 0x92, 0x29, 0x2D,
372 | 0xC7, 0x0B, 0x8A, 0xE3, 0x0A, 0x8D, 0xC1, 0x7E, 0x21, 0xD5, 0x4C, 0x24, 0xB7, 0x2E, 0xB5, 0x3B,
373 | 0x4F, 0xDC, 0xB9, 0xB5, 0x67, 0x2A, 0x95, 0xEE, 0xC2, 0x98, 0x2A, 0x0E, 0xC7, 0x8C, 0xCD, 0x5B,
374 | 0x4D, 0x6D, 0xA6, 0x2D, 0xDC, 0x7F, 0xA3, 0xF8, 0x0A, 0xD6, 0x9B, 0xEC, 0x82, 0x5C, 0xDF, 0xB0,
375 | 0xB0, 0x3E, 0x8D, 0xA6, 0x8A, 0x5C, 0xAB, 0xCA, 0x26, 0x60, 0x21, 0x0E, 0x33, 0x62, 0xDB, 0xB8,
376 | 0x70, 0x97, 0x93, 0xAD, 0x79, 0x2B, 0x36, 0x0F, 0x4C, 0x7E, 0xDD, 0xA6, 0xD4, 0xAD, 0x04, 0x45,
377 | 0xE1, 0x75, 0xFA, 0xD6, 0x6D, 0x47, 0x8C, 0x2C, 0x34, 0x79, 0x7B, 0xC4, 0xE9, 0x56, 0xA4, 0x50,
378 | 0x54, 0x6D, 0x70, 0xC7, 0xDB, 0xC4, 0xCC, 0x64, 0x60, 0x07, 0x36, 0x6A, 0x3D, 0x9B, 0x2B, 0x52,
379 | 0x0D, 0x4E, 0x95, 0x7B, 0x89, 0x06, 0xA7, 0xC9, 0x6D, 0x4F, 0x03, 0x76, 0x43, 0x91, 0x7A, 0xCB,
380 | 0x91, 0xB8, 0xDE, 0x65, 0x58, 0x0E, 0x0A, 0x82, 0xA1, 0xC9, 0x6E, 0x8C, 0x31, 0xD3, 0x77, 0x20,
381 | 0x0D, 0x6C, 0xB2, 0x34, 0x88, 0x3D, 0x34, 0x1D, 0x6F, 0xEA, 0x65, 0xCE, 0xF1, 0xF3, 0xE2, 0x0A,
382 | 0x04, 0x24, 0xCD, 0xA1, 0x99, 0xBA, 0x3A, 0x63, 0x72, 0xAA, 0xE4, 0x27, 0x73, 0xF4, 0xE0, 0xDE,
383 | 0xA3, 0x87, 0x0F, 0x7B, 0xDF, 0x3D, 0x70, 0xC7, 0xC1, 0x42, 0xFE, 0xFD, 0x8B, 0xB8, 0x98, 0x25,
384 | 0xEE, 0x88, 0x82, 0x3C, 0x4A, 0x29, 0xE8, 0x19, 0x0C, 0x4E, 0x39, 0xD3, 0x8C, 0x20, 0xA7, 0x20,
385 | 0x49, 0x8E, 0x6C, 0xB2, 0xB6, 0xEA, 0xC4, 0x8B, 0x86, 0x04, 0x50, 0x2E, 0xC6, 0xC8, 0xD7, 0x0C,
386 | 0xE1, 0xC3, 0x44, 0xE7, 0xC6, 0xFD, 0xD6, 0xE4, 0x35, 0x66, 0xEC, 0x5D, 0x65, 0x35, 0xE0, 0x4A,
387 | 0xC9, 0x02, 0x24, 0x47, 0x61, 0x3B, 0x8F, 0x21, 0x90, 0x71, 0x72, 0x76, 0x69, 0x2A, 0x67, 0x4C,
388 | 0x2C, 0x9F, 0xB4, 0xBE, 0x72, 0xA5, 0x44, 0x4C, 0x3D, 0xF1, 0xD1, 0x1C, 0x33, 0xF7, 0x97, 0x3F,
389 | 0xE6, 0xB3, 0xC9, 0x22, 0x11, 0x53, 0x9A, 0xA3, 0x37, 0x98, 0x67, 0x4E, 0x40, 0x59, 0x6B, 0xD6,
390 | 0x35, 0x2E, 0xB2, 0x98, 0xA5, 0xE6, 0x37, 0x23, 0x11, 0xE5, 0xE6, 0x75, 0x1D, 0x71, 0xB7, 0x29,
391 | 0x11, 0x88, 0xB3, 0xF3, 0x16, 0xDC, 0xC1, 0x96, 0xC8, 0x09, 0xC1, 0xB4, 0xAD, 0x96, 0x39, 0xFA,
392 | 0xF9, 0xF7, 0xEF, 0x9F, 0xD4, 0xDA, 0xCD, 0xEE, 0xF9, 0x55, 0xEB, 0xAC, 0xD7, 0x3D, 0x1E, 0x9C,
393 | 0x8A, 0x21, 0x9B, 0xF3, 0x6A, 0x9A, 0xA3, 0x5F, 0x19, 0x2F, 0xA8, 0x2F, 0xCD, 0xAB, 0x56, 0xBB,
394 | 0xD9, 0xDC, 0x9E, 0xD7, 0x23, 0x73, 0xF4, 0x96, 0xB3, 0x6A, 0x9F, 0x03, 0xAB, 0x66, 0x7B, 0x07,
395 | 0xB1, 0xCE, 0xCD, 0x11, 0xE7, 0x04, 0x4C, 0xAE, 0x1E, 0xF6, 0xCE, 0xB7, 0x67, 0xF4, 0x10, 0x64,
396 | 0x7A, 0x07, 0x9C, 0xCE, 0x41, 0xBB, 0xDE, 0x2E, 0xCA, 0xF5, 0xCC, 0x11, 0xE3, 0xD3, 0xEB, 0x36,
397 | 0xAF, 0xBA, 0xE7, 0x3B, 0xF0, 0x39, 0x33, 0x65, 0xA7, 0xC3, 0xDC, 0x3F, 0x3A, 0x32, 0x47, 0x17,
398 | 0x3F, 0x3C, 0xAF, 0x75, 0x41, 0xC6, 0xF6, 0xA3, 0xDE, 0xF6, 0xBC, 0xBB, 0xE0, 0x17, 0x4C, 0xC8,
399 | 0x4E, 0x1B, 0x18, 0x75, 0x77, 0x10, 0xB2, 0x63, 0x8E, 0x5E, 0x70, 0x4E, 0xC0, 0xE5, 0xAA, 0xF5,
400 | 0x70, 0x07, 0x91, 0xC0, 0xBD, 0x7E, 0xE6, 0x9C, 0xC0, 0xBF, 0x98, 0x7B, 0x55, 0xE4, 0x04, 0xB9,
401 | 0x97, 0x9B, 0xA6, 0x20, 0xE6, 0xD7, 0x33, 0x59, 0xEA, 0x74, 0x51, 0x4A, 0xF8, 0x3B, 0x84, 0x8E,
402 | 0x80, 0x5E, 0x6F, 0x9C, 0x10, 0x24, 0x1D, 0xA8, 0x24, 0x0E, 0xAA, 0xE5, 0x02, 0x45, 0x92, 0xF8,
403 | 0x6A, 0xAB, 0x39, 0xEA, 0x96, 0x28, 0xC0, 0x49, 0xD5, 0x84, 0xCA, 0x69, 0x53, 0xF2, 0x9B, 0xAC,
404 | 0x3F, 0x64, 0xA8, 0xB3, 0xFB, 0x79, 0xC0, 0x43, 0x3B, 0xA6, 0x12, 0xD5, 0x5B, 0x25, 0x1B, 0x8D,
405 | 0xAC, 0xE8, 0xCA, 0x1C, 0xF5, 0x3A, 0x65, 0xD6, 0xDE, 0x01, 0x8C, 0x31, 0xEF, 0x3D, 0x5D, 0x1C,
406 | 0x04, 0x1B, 0xE3, 0x91, 0x90, 0x9A, 0xA3, 0xA7, 0xF1, 0xF1, 0x2E, 0xA8, 0xD4, 0xCB, 0x34, 0xE5,
407 | 0xB4, 0x39, 0xB0, 0x28, 0xE2, 0x08, 0x64, 0xEA, 0x1D, 0x09, 0x4D, 0x82, 0xCC, 0xE7, 0x05, 0xE6,
408 | 0x36, 0x71, 0x61, 0xED, 0x80, 0x8F, 0x02, 0xBA, 0x31, 0x2A, 0x11, 0x21, 0x24, 0x35, 0x79, 0x74,
409 | 0x30, 0x44, 0x62, 0x51, 0xBE, 0x02, 0x3C, 0x02, 0x44, 0x43, 0x9F, 0xDF, 0xE5, 0xB8, 0x31, 0x22,
410 | 0x09, 0x29, 0x54, 0xC3, 0xF8, 0x78, 0x27, 0x54, 0x76, 0x49, 0x5F, 0x8A, 0x38, 0x12, 0x97, 0x28,
411 | 0x85, 0x75, 0x6F, 0x09, 0x97, 0x32, 0x69, 0x77, 0xC2, 0x65, 0x86, 0xFC, 0xC5, 0x56, 0xE9, 0x2B,
412 | 0xA6, 0x04, 0x54, 0xA2, 0xC3, 0x83, 0x85, 0x4A, 0x22, 0xCC, 0x57, 0x10, 0x2B, 0xB0, 0xFE, 0xF6,
413 | 0x48, 0xB0, 0x79, 0xC7, 0x2F, 0xE9, 0xCC, 0xD1, 0x33, 0x5C, 0x7F, 0xCD, 0x8E, 0x76, 0x81, 0xE3,
414 | 0x49, 0x48, 0xBD, 0x1D, 0x00, 0x89, 0x64, 0x11, 0x70, 0x34, 0x25, 0x1A, 0xE7, 0xB7, 0x84, 0xC6,
415 | 0xF9, 0x2D, 0xA2, 0x81, 0xF0, 0x7B, 0x07, 0x2F, 0xB1, 0xB3, 0x31, 0x1C, 0x11, 0xA1, 0x39, 0xBA,
416 | 0xBC, 0x5A, 0x78, 0x01, 0xBB, 0x5B, 0xF8, 0x25, 0xFB, 0xBE, 0x53, 0x90, 0x9C, 0xED, 0x80, 0x49,
417 | 0x2C, 0x90, 0x8C, 0x91, 0x33, 0x89, 0xCA, 0xD9, 0x2D, 0xA1, 0x52, 0x26, 0xEB, 0x2E, 0xA8, 0x4C,
418 | 0x11, 0x71, 0x2D, 0x4C, 0x1C, 0x76, 0xE7, 0xE2, 0xA6, 0xC0, 0x28, 0xB4, 0xE6, 0xE8, 0xFB, 0xE4,
419 | 0xCB, 0x2E, 0xC0, 0x34, 0x77, 0xC0, 0x45, 0x95, 0x27, 0x1D, 0x2F, 0x67, 0xB0, 0x58, 0xBE, 0x25,
420 | 0x6C, 0x5A, 0xAD, 0xDB, 0xAC, 0x2A, 0x0B, 0x6C, 0x11, 0xE4, 0xBC, 0xC7, 0x93, 0x09, 0x2C, 0x83,
421 | 0x36, 0x2F, 0x2D, 0x29, 0x72, 0xA8, 0x2F, 0xE2, 0xBB, 0x71, 0xC9, 0xBF, 0x6F, 0xBC, 0x87, 0x91,
422 | 0x61, 0xF7, 0xB9, 0x36, 0x32, 0x9A, 0xFA, 0xB5, 0xF0, 0x6B, 0x2F, 0x96, 0x73, 0xDB, 0x5D, 0x0D,
423 | 0x60, 0x82, 0xA7, 0x7C, 0x53, 0x7D, 0x6B, 0x1E, 0x6D, 0xF0, 0x6C, 0x1F, 0x5D, 0xF3, 0xC7, 0x10,
424 | 0x77, 0x59, 0x48, 0xBF, 0xC1, 0xB6, 0xF1, 0x0B, 0x71, 0xB7, 0x57, 0xA6, 0xCB, 0x04, 0xC1, 0xD8,
425 | 0xDD, 0x8D, 0xCB, 0x19, 0x2C, 0x91, 0xE0, 0x60, 0x37, 0x26, 0x3D, 0xF0, 0x24, 0xBC, 0x20, 0xE8,
426 | 0x4B, 0x58, 0xC4, 0xA3, 0xD5, 0x78, 0xF3, 0x82, 0xB2, 0x1A, 0x43, 0x5D, 0xFE, 0xED, 0xA9, 0x71,
427 | 0xC9, 0x6F, 0x03, 0xDB, 0x38, 0x5D, 0x89, 0x2B, 0xD4, 0x55, 0x1C, 0x5D, 0x24, 0x2A, 0x29, 0xA7,
428 | 0xB9, 0xB6, 0x27, 0xAA, 0x0F, 0xA0, 0xAA, 0xFB, 0xA2, 0x1A, 0xF5, 0x22, 0x01, 0xF9, 0x05, 0x3D,
429 | 0x53, 0xD1, 0xB6, 0x9A, 0x8E, 0xB7, 0xD8, 0x8A, 0x59, 0xAB, 0xCD, 0xDB, 0x30, 0x6B, 0x05, 0x30,
430 | 0xD9, 0x4B, 0x76, 0x87, 0xA0, 0x6D, 0x00, 0x5E, 0x7B, 0x01, 0x8A, 0xCD, 0x7A, 0x18, 0xA0, 0xB8,
431 | 0xBE, 0x87, 0x06, 0x0A, 0xBC, 0xE5, 0x3D, 0xAB, 0xA3, 0xDB, 0x04, 0x15, 0x27, 0x34, 0x47, 0xAF,
432 | 0x90, 0x1B, 0x42, 0x91, 0xD9, 0x17, 0x60, 0xF1, 0xC4, 0x07, 0x0B, 0x2F, 0xA9, 0xF7, 0xA1, 0xA1,
433 | 0x03, 0x41, 0xE6, 0x9E, 0xBD, 0xF9, 0x72, 0x47, 0xD2, 0x89, 0x94, 0xF8, 0x0A, 0x8E, 0x36, 0x6E,
434 | 0x0C, 0x22, 0x0E, 0xB7, 0xDC, 0x11, 0x88, 0xA5, 0xD4, 0xF6, 0xCD, 0xC0, 0xDB, 0xD0, 0x75, 0xAF,
435 | 0x77, 0xE9, 0x04, 0x2E, 0x1C, 0x2F, 0xB4, 0xB7, 0xE7, 0x00, 0x6D, 0xC0, 0x8F, 0x93, 0x09, 0xB1,
436 | 0xB6, 0x6F, 0x24, 0xA0, 0x09, 0x78, 0xE1, 0xCD, 0x2B, 0xD2, 0xDF, 0x72, 0xE1, 0xC5, 0xD6, 0x16,
437 | 0x2B, 0x39, 0x0B, 0x50, 0xBC, 0xBC, 0xD8, 0x6B, 0xE1, 0x85, 0x39, 0x0F, 0x94, 0x19, 0x98, 0xB6,
438 | 0x87, 0x4E, 0x0A, 0x20, 0xC4, 0x7B, 0xEE, 0x3C, 0xDB, 0x80, 0x25, 0x28, 0xE3, 0x8C, 0x1E, 0x2D,
439 | 0xBF, 0x0F, 0xB5, 0xBE, 0x4B, 0x24, 0x4A, 0xAF, 0xEE, 0x5A, 0x67, 0x9D, 0x5E, 0xBC, 0xBC, 0xEB,
440 | 0xB4, 0x3F, 0xEF, 0x02, 0x8F, 0x31, 0xBF, 0x5D, 0x7C, 0xDA, 0xDB, 0x40, 0x03, 0xD9, 0xE8, 0x35,
441 | 0xBB, 0xCE, 0xB0, 0x41, 0xC2, 0xDE, 0x3D, 0x90, 0xDA, 0x87, 0x8B, 0xA4, 0xF6, 0x17, 0x10, 0x4A,
442 | 0xD3, 0x2D, 0x32, 0xDE, 0x94, 0x65, 0xBC, 0xEF, 0x2F, 0xF6, 0x83, 0xD0, 0xF4, 0x60, 0xA9, 0x6E,
443 | 0x7A, 0xD0, 0x54, 0x67, 0x88, 0x9B, 0xAD, 0x62, 0x98, 0xB6, 0xEC, 0x60, 0x25, 0xA1, 0xD8, 0xCB,
444 | 0xDA, 0x25, 0xC9, 0xB5, 0xAE, 0x76, 0xC9, 0x72, 0x91, 0x18, 0xE9, 0x24, 0xD7, 0x4B, 0xAE, 0x8A,
445 | 0x9C, 0x7D, 0xDE, 0xCB, 0xBA, 0xDD, 0x32, 0x69, 0x77, 0x09, 0x1A, 0x1F, 0xAD, 0xDE, 0x4F, 0xE7,
446 | 0x68, 0x63, 0x30, 0x24, 0x1D, 0x60, 0xF1, 0xEA, 0xC9, 0x3E, 0xDB, 0x85, 0x68, 0xDE, 0xC3, 0xC4,
447 | 0x51, 0xAC, 0xF5, 0xA1, 0x73, 0x9D, 0x83, 0xDD, 0xCD, 0x93, 0x1D, 0x23, 0x32, 0x47, 0x2F, 0xB1,
448 | 0x1B, 0x18, 0x17, 0x9E, 0x2F, 0xDF, 0xFD, 0xB4, 0x17, 0xD4, 0xF8, 0xCC, 0x87, 0x81, 0x4C, 0x28,
449 | 0x7D, 0x68, 0xBC, 0x66, 0x73, 0xE2, 0xFB, 0x9E, 0xBF, 0x31, 0x64, 0x92, 0x0E, 0x96, 0x15, 0xF5,
450 | 0x57, 0xFC, 0x68, 0x2F, 0x70, 0x45, 0xB3, 0x1E, 0x06, 0xB1, 0x58, 0xE7, 0x43, 0x83, 0xB6, 0x9C,
451 | 0x38, 0x64, 0xB1, 0x31, 0x64, 0x9C, 0xCA, 0x1C, 0xBD, 0xAB, 0x3F, 0x87, 0x7F, 0xF7, 0x02, 0x97,
452 | 0x98, 0xF1, 0x30, 0x60, 0x49, 0x6D, 0x0F, 0x0D, 0xD5, 0x78, 0xB1, 0x79, 0x3A, 0x04, 0x1A, 0x73,
453 | 0xF4, 0xF4, 0xA7, 0xFD, 0xF4, 0x7E, 0x6C, 0xB2, 0x8A, 0x08, 0xED, 0x84, 0x07, 0x57, 0xEA, 0xD0,
454 | 0x68, 0xAC, 0xB6, 0x40, 0x63, 0xC5, 0x04, 0xFF, 0x6D, 0x4F, 0x68, 0xAC, 0xAA, 0xA3, 0xF1, 0x99,
455 | 0xE3, 0x65, 0xF5, 0x25, 0xE0, 0xC3, 0x9F, 0xC5, 0x18, 0xA3, 0xCD, 0xCB, 0x51, 0x44, 0xC8, 0x6E,
456 | 0x1A, 0x83, 0x23, 0xE3, 0x29, 0xDA, 0x4F, 0x41, 0x8A, 0xE7, 0xDD, 0x47, 0x08, 0x25, 0x4A, 0x1E,
457 | 0x1A, 0xA7, 0x09, 0xB2, 0xF0, 0x7B, 0x1B, 0xD3, 0x6D, 0xAE, 0x2D, 0x2B, 0xB4, 0xE6, 0xE8, 0x39,
458 | 0x7C, 0x31, 0x9E, 0xF1, 0x2F, 0xFB, 0x6A, 0xF9, 0xD4, 0xF9, 0xF7, 0x81, 0x5A, 0x4A, 0xDF, 0x2F,
459 | 0x02, 0x38, 0x68, 0xB0, 0xBD, 0xA9, 0xBB, 0xD5, 0x23, 0x0D, 0x29, 0x72, 0x09, 0xDF, 0x1B, 0xF1,
460 | 0x7D, 0xBF, 0x00, 0x26, 0x42, 0xEC, 0x0D, 0x43, 0x45, 0xEF, 0x7D, 0xC0, 0x18, 0x3D, 0x16, 0xC4,
461 | 0x8B, 0xB4, 0x78, 0x15, 0x5E, 0x19, 0x52, 0xF2, 0xE1, 0x27, 0x7E, 0x4B, 0x0B, 0xA6, 0xF5, 0x80,
462 | 0x12, 0xC7, 0x81, 0x85, 0x30, 0xA6, 0xC6, 0x5B, 0x76, 0x38, 0x38, 0x15, 0x03, 0xAA, 0x73, 0x91,
463 | 0xCF, 0xDC, 0xB0, 0x97, 0x50, 0xA2, 0xB9, 0x39, 0x7A, 0xCB, 0x5E, 0x12, 0x08, 0xBC, 0xD8, 0xB7,
464 | 0xCD, 0x99, 0x71, 0x23, 0x62, 0xD7, 0xF7, 0x40, 0xA8, 0x18, 0x24, 0xF9, 0xAE, 0x26, 0xD3, 0x88,
465 | 0x8E, 0x94, 0xDF, 0x46, 0x97, 0x7C, 0xB0, 0xC1, 0xBC, 0xAC, 0x7C, 0x3A, 0x76, 0xD5, 0xC2, 0xCA,
466 | 0xBF, 0xB8, 0x31, 0x38, 0x75, 0x91, 0xC6, 0xDC, 0x39, 0x28, 0x0C, 0xC4, 0xDB, 0x25, 0x73, 0x58,
467 | 0xC5, 0xCF, 0x33, 0x71, 0x4B, 0x24, 0x8F, 0x69, 0xC6, 0x6A, 0x65, 0x1F, 0xDF, 0x94, 0xDB, 0x4C,
468 | 0xD5, 0x82, 0x96, 0x3F, 0x88, 0x29, 0xEB, 0x21, 0x3B, 0x8C, 0xCD, 0xFF, 0x9F, 0x7F, 0x97, 0xF9,
469 | 0x0C, 0x7B, 0xF7, 0x67, 0x22, 0x98, 0x69, 0x04, 0xBE, 0x35, 0x34, 0xF3, 0x9E, 0x8E, 0xCA, 0xD1,
470 | 0xFC, 0x54, 0xA7, 0x7A, 0x66, 0xB0, 0xC6, 0xD6, 0x83, 0xC0, 0xF2, 0xC9, 0x82, 0x8E, 0xEE, 0xD8,
471 | 0x9E, 0x15, 0xCE, 0xB1, 0x4B, 0x1B, 0xC8, 0xB6, 0x2F, 0x97, 0x70, 0xF0, 0x92, 0x04, 0x14, 0x83,
472 | 0x15, 0x6A, 0x47, 0xCF, 0x7E, 0x7C, 0x75, 0x21, 0x9E, 0x12, 0x7B, 0xE9, 0x21, 0x1B, 0xDB, 0x47,
473 | 0x27, 0xC6, 0x24, 0x74, 0x85, 0x9B, 0xD7, 0x30, 0x1B, 0x2B, 0xDE, 0xBB, 0xBA, 0x44, 0xBE, 0x31,
474 | 0x46, 0x01, 0x7E, 0xE1, 0x05, 0xD4, 0x18, 0x1A, 0x31, 0x47, 0xC7, 0xB3, 0xF8, 0x7D, 0xBF, 0x0D,
475 | 0xCF, 0x27, 0x53, 0xE2, 0xCA, 0x91, 0x42, 0xD9, 0x5F, 0x7D, 0x07, 0x86, 0xC6, 0x54, 0xDF, 0x1A,
476 | 0x47, 0xFD, 0xF3, 0xD6, 0x11, 0x7B, 0x1C, 0x0F, 0x60, 0x80, 0x1F, 0x00, 0x02, 0x0C, 0x03, 0x20,
477 | 0xC0, 0x87, 0x23, 0xF9, 0x78, 0x20, 0x76, 0x1A, 0xDC, 0xE4, 0x4C, 0x40, 0x26, 0x6D, 0xED, 0x48,
478 | 0xE0, 0x74, 0xC4, 0x1E, 0x34, 0xBE, 0x89, 0x29, 0x83, 0x99, 0xB7, 0x2A, 0xA2, 0xF4, 0xF1, 0xDC,
479 | 0x5B, 0xE2, 0x0C, 0x71, 0x4C, 0x2D, 0xBD, 0xB9, 0x74, 0xEA, 0xC8, 0xEB, 0x8F, 0x8E, 0xA3, 0x01,
480 | 0xF1, 0x7B, 0xCC, 0x86, 0x06, 0xF5, 0x43, 0x9C, 0x66, 0x8B, 0xDD, 0x32, 0xAE, 0x91, 0x58, 0x85,
481 | 0x8C, 0x27, 0xC8, 0x09, 0x32, 0x9C, 0xC3, 0x85, 0x8D, 0x28, 0x7E, 0xC7, 0x76, 0x0C, 0x61, 0x40,
482 | 0x0D, 0x3B, 0x27, 0x62, 0xFB, 0xF0, 0x44, 0x9E, 0x79, 0x03, 0x7C, 0x29, 0x3E, 0x4E, 0x66, 0x55,
483 | 0x7F, 0x06, 0x8A, 0xF4, 0xD7, 0xA1, 0xE1, 0x86, 0x10, 0xC2, 0x8F, 0xB9, 0x0A, 0x46, 0x3F, 0x75,
484 | 0x96, 0x53, 0x3B, 0x90, 0x9D, 0xE4, 0x3B, 0xDB, 0xF9, 0x9C, 0xFC, 0x47, 0x32, 0x61, 0x13, 0x37,
485 | 0xF8, 0x1B, 0xE4, 0x87, 0xC0, 0xE3, 0x28, 0xCA, 0xEE, 0x47, 0xC9, 0x8B, 0x79, 0x55, 0x22, 0x6E,
486 | 0x87, 0x86, 0xEC, 0x83, 0xE5, 0xF9, 0xA5, 0x3C, 0x71, 0xF7, 0xEE, 0x32, 0xE6, 0x6B, 0x28, 0xC3,
487 | 0xE0, 0x54, 0x72, 0xE2, 0x06, 0x4E, 0x28, 0x4F, 0x3F, 0xAF, 0xF3, 0xCE, 0xF0, 0x88, 0x98, 0x2B,
488 | 0x1C, 0xEE, 0xC4, 0x92, 0xA7, 0x2C, 0xF0, 0xE0, 0x41, 0x9A, 0xDB, 0xDD, 0xA1, 0xA4, 0x4A, 0x34,
489 | 0x11, 0xE3, 0x21, 0x32, 0x20, 0xF2, 0x40, 0x6D, 0xF9, 0x4C, 0xBC, 0x14, 0x89, 0x4C, 0x6A, 0x77,
490 | 0x53, 0x86, 0x8F, 0x65, 0x9C, 0x30, 0x13, 0x11, 0x9B, 0x1B, 0x88, 0x5F, 0x33, 0x3C, 0x4E, 0x9E,
491 | 0x7A, 0x15, 0xF2, 0x3D, 0xE6, 0x5E, 0x5F, 0xC3, 0xF2, 0xF2, 0xDB, 0x31, 0xD8, 0x9F, 0x39, 0x73,
492 | 0xF2, 0x83, 0x1C, 0x9F, 0x4C, 0xA5, 0x72, 0x9C, 0xA6, 0x38, 0x32, 0xC5, 0x32, 0x72, 0xB3, 0x0F,
493 | 0x9F, 0x00, 0x86, 0xB2, 0x9D, 0xEF, 0xE4, 0xF9, 0xFC, 0x8C, 0x39, 0xD9, 0x87, 0x4F, 0xBC, 0x3E,
494 | 0xB0, 0x50, 0x82, 0xE8, 0x0E, 0x09, 0x8D, 0x62, 0x9C, 0xDD, 0x6A, 0xCC, 0x54, 0xE2, 0x22, 0xC0,
495 | 0x61, 0x11, 0xAB, 0x4C, 0x01, 0xD7, 0x30, 0x14, 0x01, 0x55, 0x13, 0xF5, 0xE9, 0x29, 0xAF, 0x35,
496 | 0x8C, 0xB9, 0x8C, 0x95, 0xF4, 0xEF, 0x77, 0x54, 0xE1, 0x6F, 0xA2, 0xF0, 0x89, 0x53, 0x99, 0x8A,
497 | 0x27, 0xF3, 0xE3, 0xC8, 0x62, 0xCC, 0xD5, 0x13, 0x87, 0x91, 0xAF, 0x2B, 0x89, 0xFC, 0x3C, 0x31,
498 | 0xAB, 0x05, 0x39, 0x4C, 0xF1, 0xF8, 0x7E, 0x46, 0x54, 0xD5, 0xD5, 0x41, 0xEE, 0x96, 0xA1, 0xBE,
499 | 0x80, 0x64, 0x0C, 0xA9, 0xF0, 0x63, 0x8A, 0x0F, 0xDF, 0xB0, 0x8F, 0x99, 0x88, 0xDF, 0xC4, 0xE5,
500 | 0xFD, 0xBA, 0xE7, 0x62, 0x3D, 0x77, 0xD5, 0xD9, 0x75, 0x3C, 0x45, 0x29, 0xCE, 0x32, 0x0D, 0xC7,
501 | 0x73, 0x42, 0x35, 0x0C, 0x8F, 0x20, 0x0D, 0xEB, 0x78, 0xC9, 0x06, 0x2D, 0x21, 0xF0, 0x31, 0x0D,
502 | 0x7D, 0x57, 0x8D, 0x26, 0x91, 0x91, 0xFE, 0x0E, 0xB1, 0x7F, 0x0D, 0x8C, 0x3E, 0xDC, 0xFF, 0x14,
503 | 0xE5, 0xF7, 0x9B, 0x53, 0xFE, 0x6C, 0x8E, 0xE7, 0x3C, 0x86, 0x0A, 0x30, 0xBC, 0xFF, 0x89, 0x43,
504 | 0x7D, 0xF3, 0x00, 0xA6, 0x84, 0x2F, 0x7C, 0xE2, 0x9B, 0x0F, 0x82, 0xC5, 0x84, 0xBD, 0x3E, 0xBB,
505 | 0xC6, 0x59, 0x44, 0xB8, 0x35, 0xE8, 0x0C, 0xBB, 0x35, 0x1F, 0x07, 0x0B, 0x60, 0x8F, 0x93, 0x44,
506 | 0x16, 0xCD, 0xE8, 0x39, 0x18, 0x4A, 0xCD, 0xB4, 0xF6, 0xC1, 0xC7, 0x40, 0x07, 0x02, 0x50, 0xCF,
507 | 0xB8, 0xFF, 0x89, 0xB3, 0xB8, 0x31, 0x26, 0x10, 0xCD, 0xC1, 0x0C, 0xDB, 0x27, 0x50, 0x77, 0x10,
508 | 0x65, 0x4F, 0xA6, 0xDF, 0xFF, 0x14, 0xB1, 0x6A, 0x88, 0x9F, 0x6E, 0x3E, 0xC4, 0x1E, 0x12, 0x17,
509 | 0x83, 0xA8, 0x86, 0xF1, 0x13, 0x0D, 0xCE, 0xEB, 0x2D, 0x47, 0xC1, 0xF3, 0x9F, 0x38, 0x4E, 0xED,
510 | 0x48, 0xBC, 0x7E, 0x41, 0xE6, 0xE8, 0x06, 0x34, 0x9D, 0x97, 0x08, 0xC4, 0x56, 0x93, 0x3B, 0xCF,
511 | 0x3B, 0x9E, 0x6B, 0x39, 0xC4, 0xFA, 0xC8, 0x12, 0xF3, 0x71, 0x5A, 0x70, 0x11, 0xE9, 0x4E, 0x43,
512 | 0xBC, 0x4E, 0xEB, 0xB5, 0x67, 0xE3, 0x8C, 0x9B, 0x1E, 0x33, 0x31, 0x4E, 0x4F, 0xC1, 0xCA, 0xC8,
513 | 0x8E, 0x52, 0x92, 0xC0, 0x88, 0xBD, 0x77, 0x45, 0x98, 0x29, 0x65, 0x61, 0xA1, 0x8C, 0xD4, 0x45,
514 | 0xD8, 0x2C, 0xA9, 0xD6, 0x91, 0xCA, 0x89, 0xDB, 0x0A, 0xF4, 0x8C, 0xD8, 0x16, 0x7F, 0x05, 0x9E,
515 | 0x5B, 0x3B, 0xBE, 0x13, 0x9B, 0x61, 0x9D, 0x07, 0x9B, 0x40, 0x61, 0x90, 0x32, 0x51, 0x9E, 0x99,
516 | 0xD2, 0x5D, 0xFD, 0x51, 0x92, 0x49, 0x72, 0x6C, 0x26, 0x3E, 0x4A, 0x4D, 0xE3, 0x05, 0x8D, 0xCF,
517 | 0xFC, 0x07, 0x77, 0x9A, 0x3F, 0x4F, 0x44, 0x11, 0x54, 0x72, 0xD2, 0xB1, 0x62, 0x30, 0xE1, 0x81,
518 | 0xEC, 0xBF, 0x1E, 0x51, 0x1B, 0x11, 0xE8, 0xAE, 0x2F, 0x1D, 0xCC, 0x0E, 0x9F, 0x5E, 0xFF, 0x00,
519 | 0xC5, 0x5B, 0xB4, 0x20, 0x5C, 0x9A, 0x84, 0xE0, 0x22, 0x6E, 0xFF, 0x4A, 0x29, 0x93, 0x56, 0x51,
520 | 0xE1, 0xC1, 0xDB, 0x77, 0x91, 0x71, 0x8A, 0x38, 0xC4, 0x9D, 0x7E, 0x8A, 0x94, 0x71, 0x2D, 0xA7,
521 | 0x4D, 0xF5, 0xF7, 0x0A, 0xBD, 0x9A, 0xED, 0x8A, 0xE8, 0x95, 0x96, 0x5E, 0xA1, 0xE6, 0xAE, 0x5C,
522 | 0x4E, 0xAC, 0x36, 0xB7, 0x47, 0x8A, 0xB1, 0x03, 0xEA, 0x2D, 0xC4, 0x1A, 0x23, 0xE3, 0xE6, 0x2B,
523 | 0xE2, 0xDA, 0xDE, 0xAA, 0xC1, 0xCE, 0xD7, 0x64, 0x91, 0x54, 0x15, 0x6D, 0x10, 0x17, 0x0C, 0xF8,
524 | 0xE2, 0x97, 0x57, 0x2F, 0x59, 0xD2, 0x51, 0xD7, 0x2A, 0x47, 0xE9, 0x0E, 0x87, 0xBF, 0xEB, 0x5C,
525 | 0x3B, 0x03, 0x83, 0xAD, 0x01, 0x4D, 0xB3, 0x48, 0x36, 0x71, 0x63, 0xC9, 0x62, 0x81, 0x1D, 0x7E,
526 | 0x10, 0x73, 0xB2, 0xD2, 0x93, 0x02, 0xF8, 0xB8, 0x54, 0x16, 0x6F, 0x91, 0x15, 0x05, 0x22, 0xF1,
527 | 0x09, 0xA5, 0xE0, 0xB0, 0x86, 0x70, 0xE5, 0x80, 0x65, 0x19, 0xB9, 0xCE, 0xBB, 0x63, 0xA8, 0xE0,
528 | 0xE7, 0x04, 0x7D, 0x62, 0x26, 0x19, 0x65, 0x69, 0xE1, 0x95, 0x4C, 0x89, 0x16, 0x10, 0x99, 0xF8,
529 | 0xF1, 0x7B, 0x6B, 0x0C, 0xC9, 0xF1, 0x19, 0x78, 0x7E, 0xC3, 0x05, 0x0D, 0x8E, 0x6F, 0x8A, 0xD4,
530 | 0x11, 0xE6, 0x4A, 0x80, 0xAC, 0x2A, 0x04, 0x4F, 0x43, 0x7A, 0x6E, 0x29, 0xFB, 0xE8, 0xD9, 0xA9,
531 | 0xDE, 0x2B, 0xAE, 0xDD, 0xB2, 0x36, 0x2D, 0xCF, 0xB0, 0xC3, 0x75, 0xD3, 0x8A, 0x3E, 0x25, 0xC5,
532 | 0x20, 0x49, 0x30, 0x6B, 0xC2, 0x66, 0xDA, 0x14, 0xC5, 0x2F, 0xA2, 0x01, 0x91, 0xEC, 0x6A, 0x40,
533 | 0xE4, 0xC8, 0x9E, 0xEE, 0xE2, 0x32, 0xED, 0x42, 0x06, 0x72, 0x99, 0xC5, 0x0C, 0xF6, 0xD6, 0x8F,
534 | 0x19, 0x2B, 0xD0, 0xD2, 0x09, 0xAA, 0x14, 0x0A, 0x6D, 0x06, 0x2C, 0xAC, 0x18, 0x62, 0x86, 0x48,
535 | 0xDA, 0x6C, 0xB7, 0x99, 0xAE, 0x0E, 0x17, 0x21, 0x58, 0x69, 0x1E, 0xF9, 0xA4, 0xF8, 0x8D, 0xB5,
536 | 0x6C, 0x71, 0xF0, 0x40, 0x0B, 0x57, 0x14, 0xD4, 0x70, 0x5A, 0xC9, 0x04, 0xB2, 0xDF, 0x2B, 0x21,
537 | 0x50, 0xEE, 0xBA, 0xE0, 0xB4, 0xF0, 0xD3, 0xBA, 0xD8, 0x1A, 0x23, 0xC3, 0xB8, 0xE3, 0x18, 0x73,
538 | 0x46, 0x24, 0xBB, 0xA2, 0x04, 0xF1, 0xF5, 0xEE, 0x34, 0x0B, 0xF9, 0x5A, 0x57, 0x7A, 0xA3, 0xA0,
539 | 0x15, 0xDD, 0xB7, 0x96, 0xE8, 0x83, 0x8B, 0x95, 0xC7, 0xAA, 0xF2, 0x51, 0x97, 0x5D, 0x42, 0xA1,
540 | 0xDE, 0x65, 0x27, 0xD4, 0xC7, 0x15, 0xD5, 0xC7, 0x52, 0x7D, 0x46, 0x90, 0x34, 0x84, 0xE5, 0x2D,
541 | 0x7F, 0xEC, 0x8C, 0xBF, 0x3D, 0x4D, 0x34, 0x5B, 0x8D, 0x0B, 0xE5, 0x94, 0xAD, 0xB8, 0xA2, 0x5E,
542 | 0x31, 0x41, 0xEA, 0x9E, 0x62, 0xA1, 0xD6, 0x6A, 0x5C, 0x4D, 0xAD, 0xA8, 0x95, 0x67, 0x04, 0x89,
543 | 0x5A, 0xFA, 0x86, 0x3F, 0x52, 0x25, 0xDE, 0x42, 0xE6, 0xFF, 0xA7, 0x4B, 0xFC, 0xCE, 0x94, 0x58,
544 | 0x58, 0xB1, 0xFF, 0x5A, 0x5A, 0xCA, 0xC4, 0x30, 0x45, 0xC9, 0x78, 0xC9, 0x50, 0x4A, 0x1A, 0x8F,
545 | 0x54, 0xA8, 0x63, 0x39, 0x0A, 0xA9, 0xA3, 0x41, 0xA2, 0x06, 0xC6, 0x5F, 0x2B, 0x19, 0x2B, 0x1E,
546 | 0x9D, 0x04, 0x42, 0xC2, 0x40, 0x34, 0xE0, 0x23, 0xE3, 0x2C, 0xBB, 0xD4, 0x14, 0x8D, 0x90, 0x50,
547 | 0x36, 0xD3, 0xFE, 0xA8, 0x03, 0x62, 0x95, 0x52, 0x63, 0xE2, 0x00, 0x11, 0xF4, 0x79, 0x62, 0x96,
548 | 0x8A, 0x82, 0x1C, 0xEC, 0xD3, 0x9A, 0xF9, 0x93, 0x83, 0xD9, 0xF2, 0x41, 0xDE, 0x14, 0x7E, 0xF1,
549 | 0xC3, 0x73, 0xC3, 0xF3, 0x0D, 0xF1, 0x16, 0x4D, 0x3F, 0x7E, 0x6B, 0x8E, 0x21, 0x5F, 0x31, 0xC7,
550 | 0x17, 0x69, 0xC4, 0x9D, 0x1A, 0x74, 0x46, 0x02, 0xE8, 0x59, 0xD9, 0x93, 0xE0, 0xF8, 0xAE, 0x19,
551 | 0xBF, 0x45, 0xAE, 0x54, 0x3D, 0xD1, 0xA4, 0x7E, 0x17, 0x2B, 0x92, 0x31, 0xA7, 0xA0, 0x49, 0x6C,
552 | 0x79, 0x57, 0xEA, 0xB8, 0x96, 0x58, 0x8A, 0x96, 0x85, 0x1B, 0x98, 0x30, 0x3E, 0xFD, 0xC5, 0x5A,
553 | 0x51, 0xAF, 0x40, 0xA9, 0x21, 0x63, 0xB2, 0xC4, 0x96, 0x89, 0xAE, 0x6B, 0xD6, 0xD4, 0xAD, 0xBD,
554 | 0x0B, 0x10, 0x65, 0x5B, 0x49, 0xDA, 0x6C, 0x9E, 0x8F, 0x8A, 0xB0, 0xB8, 0xA8, 0x72, 0xE2, 0x33,
555 | 0x38, 0x8D, 0x36, 0x2C, 0xC5, 0x37, 0xF1, 0x52, 0xAE, 0xC1, 0xA9, 0xF8, 0x9F, 0x0A, 0xFF, 0x0B,
556 | 0x9B, 0xFC, 0x8E, 0x51, 0xC1, 0x70, 0x00, 0x00
557 | };
558 |
559 |
--------------------------------------------------------------------------------
/Firmware/ESP32-CAM/camera_pins.h:
--------------------------------------------------------------------------------
1 |
2 | #if defined(CAMERA_MODEL_WROVER_KIT)
3 | #define PWDN_GPIO_NUM -1
4 | #define RESET_GPIO_NUM -1
5 | #define XCLK_GPIO_NUM 21
6 | #define SIOD_GPIO_NUM 26
7 | #define SIOC_GPIO_NUM 27
8 |
9 | #define Y9_GPIO_NUM 35
10 | #define Y8_GPIO_NUM 34
11 | #define Y7_GPIO_NUM 39
12 | #define Y6_GPIO_NUM 36
13 | #define Y5_GPIO_NUM 19
14 | #define Y4_GPIO_NUM 18
15 | #define Y3_GPIO_NUM 5
16 | #define Y2_GPIO_NUM 4
17 | #define VSYNC_GPIO_NUM 25
18 | #define HREF_GPIO_NUM 23
19 | #define PCLK_GPIO_NUM 22
20 |
21 | #elif defined(CAMERA_MODEL_ESP_EYE)
22 | #define PWDN_GPIO_NUM -1
23 | #define RESET_GPIO_NUM -1
24 | #define XCLK_GPIO_NUM 4
25 | #define SIOD_GPIO_NUM 18
26 | #define SIOC_GPIO_NUM 23
27 |
28 | #define Y9_GPIO_NUM 36
29 | #define Y8_GPIO_NUM 37
30 | #define Y7_GPIO_NUM 38
31 | #define Y6_GPIO_NUM 39
32 | #define Y5_GPIO_NUM 35
33 | #define Y4_GPIO_NUM 14
34 | #define Y3_GPIO_NUM 13
35 | #define Y2_GPIO_NUM 34
36 | #define VSYNC_GPIO_NUM 5
37 | #define HREF_GPIO_NUM 27
38 | #define PCLK_GPIO_NUM 25
39 |
40 | #elif defined(CAMERA_MODEL_M5STACK_PSRAM)
41 | #define PWDN_GPIO_NUM -1
42 | #define RESET_GPIO_NUM 15
43 | #define XCLK_GPIO_NUM 27
44 | #define SIOD_GPIO_NUM 25
45 | #define SIOC_GPIO_NUM 23
46 |
47 | #define Y9_GPIO_NUM 19
48 | #define Y8_GPIO_NUM 36
49 | #define Y7_GPIO_NUM 18
50 | #define Y6_GPIO_NUM 39
51 | #define Y5_GPIO_NUM 5
52 | #define Y4_GPIO_NUM 34
53 | #define Y3_GPIO_NUM 35
54 | #define Y2_GPIO_NUM 32
55 | #define VSYNC_GPIO_NUM 22
56 | #define HREF_GPIO_NUM 26
57 | #define PCLK_GPIO_NUM 21
58 |
59 | #elif defined(CAMERA_MODEL_M5STACK_WIDE)
60 | #define PWDN_GPIO_NUM -1
61 | #define RESET_GPIO_NUM 15
62 | #define XCLK_GPIO_NUM 27
63 | #define SIOD_GPIO_NUM 22
64 | #define SIOC_GPIO_NUM 23
65 |
66 | #define Y9_GPIO_NUM 19
67 | #define Y8_GPIO_NUM 36
68 | #define Y7_GPIO_NUM 18
69 | #define Y6_GPIO_NUM 39
70 | #define Y5_GPIO_NUM 5
71 | #define Y4_GPIO_NUM 34
72 | #define Y3_GPIO_NUM 35
73 | #define Y2_GPIO_NUM 32
74 | #define VSYNC_GPIO_NUM 25
75 | #define HREF_GPIO_NUM 26
76 | #define PCLK_GPIO_NUM 21
77 |
78 | #elif defined(CAMERA_MODEL_AI_THINKER)
79 | #define PWDN_GPIO_NUM 32
80 | #define RESET_GPIO_NUM -1
81 | #define XCLK_GPIO_NUM 0
82 | #define SIOD_GPIO_NUM 26
83 | #define SIOC_GPIO_NUM 27
84 |
85 | #define Y9_GPIO_NUM 35
86 | #define Y8_GPIO_NUM 34
87 | #define Y7_GPIO_NUM 39
88 | #define Y6_GPIO_NUM 36
89 | #define Y5_GPIO_NUM 21
90 | #define Y4_GPIO_NUM 19
91 | #define Y3_GPIO_NUM 18
92 | #define Y2_GPIO_NUM 5
93 | #define VSYNC_GPIO_NUM 25
94 | #define HREF_GPIO_NUM 23
95 | #define PCLK_GPIO_NUM 22
96 |
97 | #else
98 | #error "Camera model not selected"
99 | #endif
100 |
--------------------------------------------------------------------------------
/Firmware/ESP32-CAM/define.h:
--------------------------------------------------------------------------------
1 | #ifndef __DEFINE__
2 | #define __DEFINE__
3 |
4 | #define RED_LED 33
5 | #define FLASH_LED 4
6 |
7 | extern int rssi;
8 |
9 | #endif
10 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Tony Guo
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Android-ESP32-CAM-MJPEG-Viewer
2 |
3 |
4 | ESP32-CAM MJPEG viewer example for Android.
5 |
6 | Import the project into Android Studio and update the SDK version.
7 |
8 |
9 |
10 |
11 |
12 | LICENSE
13 | -------
14 |
15 | MIT License
16 |
17 | Copyright (c) 2021 Tony Guo
18 |
19 | Permission is hereby granted, free of charge, to any person obtaining a copy
20 | of this software and associated documentation files (the "Software"), to deal
21 | in the Software without restriction, including without limitation the rights
22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
23 | copies of the Software, and to permit persons to whom the Software is
24 | furnished to do so, subject to the following conditions:
25 |
26 | The above copyright notice and this permission notice shall be included in all
27 | copies or substantial portions of the Software.
28 |
29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
35 | SOFTWARE.
36 |
--------------------------------------------------------------------------------
/res/demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GCY/Android-ESP32-CAM-MJPEG-Viewer/67527f921b905c0bb49f86b6b90c124482cceb68/res/demo.gif
--------------------------------------------------------------------------------