├── Body segementation └── README.md ├── Image classification └── README.md ├── Object detection ├── app_httpd.cpp ├── camera_index.h ├── camera_pins.h ├── esp32-cam-tensorflowjs.ino └── index.html └── README.md /Body segementation/README.md: -------------------------------------------------------------------------------- 1 | ``` On Progress ``` 2 | -------------------------------------------------------------------------------- /Image classification/README.md: -------------------------------------------------------------------------------- 1 | ``` On Progress ``` 2 | -------------------------------------------------------------------------------- /Object detection/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 | #define ENROLL_CONFIRM_TIMES 5 26 | #define FACE_ID_SAVE_NUMBER 7 27 | 28 | #define FACE_COLOR_WHITE 0x00FFFFFF 29 | #define FACE_COLOR_BLACK 0x00000000 30 | #define FACE_COLOR_RED 0x000000FF 31 | #define FACE_COLOR_GREEN 0x0000FF00 32 | #define FACE_COLOR_BLUE 0x00FF0000 33 | #define FACE_COLOR_YELLOW (FACE_COLOR_RED | FACE_COLOR_GREEN) 34 | #define FACE_COLOR_CYAN (FACE_COLOR_BLUE | FACE_COLOR_GREEN) 35 | #define FACE_COLOR_PURPLE (FACE_COLOR_BLUE | FACE_COLOR_RED) 36 | 37 | typedef struct { 38 | size_t size; //number of values used for filtering 39 | size_t index; //current value index 40 | size_t count; //value count 41 | int sum; 42 | int * values; //array to be filled with values 43 | } ra_filter_t; 44 | 45 | typedef struct { 46 | httpd_req_t *req; 47 | size_t len; 48 | } jpg_chunking_t; 49 | 50 | #define PART_BOUNDARY "123456789000000000000987654321" 51 | static const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY; 52 | static const char* _STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n"; 53 | static const char* _STREAM_PART = "Content-Type: image/jpeg\r\nContent-Length: %u\r\n\r\n"; 54 | 55 | static ra_filter_t ra_filter; 56 | httpd_handle_t stream_httpd = NULL; 57 | httpd_handle_t camera_httpd = NULL; 58 | 59 | static mtmn_config_t mtmn_config = {0}; 60 | static int8_t detection_enabled = 0; 61 | static int8_t recognition_enabled = 0; 62 | static int8_t is_enrolling = 0; 63 | static face_id_list id_list = {0}; 64 | 65 | static ra_filter_t * ra_filter_init(ra_filter_t * filter, size_t sample_size){ 66 | memset(filter, 0, sizeof(ra_filter_t)); 67 | 68 | filter->values = (int *)malloc(sample_size * sizeof(int)); 69 | if(!filter->values){ 70 | return NULL; 71 | } 72 | memset(filter->values, 0, sample_size * sizeof(int)); 73 | 74 | filter->size = sample_size; 75 | return filter; 76 | } 77 | 78 | static int ra_filter_run(ra_filter_t * filter, int value){ 79 | if(!filter->values){ 80 | return value; 81 | } 82 | filter->sum -= filter->values[filter->index]; 83 | filter->values[filter->index] = value; 84 | filter->sum += filter->values[filter->index]; 85 | filter->index++; 86 | filter->index = filter->index % filter->size; 87 | if (filter->count < filter->size) { 88 | filter->count++; 89 | } 90 | return filter->sum / filter->count; 91 | } 92 | 93 | static void rgb_print(dl_matrix3du_t *image_matrix, uint32_t color, const char * str){ 94 | fb_data_t fb; 95 | fb.width = image_matrix->w; 96 | fb.height = image_matrix->h; 97 | fb.data = image_matrix->item; 98 | fb.bytes_per_pixel = 3; 99 | fb.format = FB_BGR888; 100 | fb_gfx_print(&fb, (fb.width - (strlen(str) * 14)) / 2, 10, color, str); 101 | } 102 | 103 | static int rgb_printf(dl_matrix3du_t *image_matrix, uint32_t color, const char *format, ...){ 104 | char loc_buf[64]; 105 | char * temp = loc_buf; 106 | int len; 107 | va_list arg; 108 | va_list copy; 109 | va_start(arg, format); 110 | va_copy(copy, arg); 111 | len = vsnprintf(loc_buf, sizeof(loc_buf), format, arg); 112 | va_end(copy); 113 | if(len >= sizeof(loc_buf)){ 114 | temp = (char*)malloc(len+1); 115 | if(temp == NULL) { 116 | return 0; 117 | } 118 | } 119 | vsnprintf(temp, len+1, format, arg); 120 | va_end(arg); 121 | rgb_print(image_matrix, color, temp); 122 | if(len > 64){ 123 | free(temp); 124 | } 125 | return len; 126 | } 127 | 128 | static void draw_face_boxes(dl_matrix3du_t *image_matrix, box_array_t *boxes, int face_id){ 129 | int x, y, w, h, i; 130 | uint32_t color = FACE_COLOR_YELLOW; 131 | if(face_id < 0){ 132 | color = FACE_COLOR_RED; 133 | } else if(face_id > 0){ 134 | color = FACE_COLOR_GREEN; 135 | } 136 | fb_data_t fb; 137 | fb.width = image_matrix->w; 138 | fb.height = image_matrix->h; 139 | fb.data = image_matrix->item; 140 | fb.bytes_per_pixel = 3; 141 | fb.format = FB_BGR888; 142 | for (i = 0; i < boxes->len; i++){ 143 | // rectangle box 144 | x = (int)boxes->box[i].box_p[0]; 145 | y = (int)boxes->box[i].box_p[1]; 146 | w = (int)boxes->box[i].box_p[2] - x + 1; 147 | h = (int)boxes->box[i].box_p[3] - y + 1; 148 | fb_gfx_drawFastHLine(&fb, x, y, w, color); 149 | fb_gfx_drawFastHLine(&fb, x, y+h-1, w, color); 150 | fb_gfx_drawFastVLine(&fb, x, y, h, color); 151 | fb_gfx_drawFastVLine(&fb, x+w-1, y, h, color); 152 | #if 0 153 | // landmark 154 | int x0, y0, j; 155 | for (j = 0; j < 10; j+=2) { 156 | x0 = (int)boxes->landmark[i].landmark_p[j]; 157 | y0 = (int)boxes->landmark[i].landmark_p[j+1]; 158 | fb_gfx_fillRect(&fb, x0, y0, 3, 3, color); 159 | } 160 | #endif 161 | } 162 | } 163 | 164 | static int run_face_recognition(dl_matrix3du_t *image_matrix, box_array_t *net_boxes){ 165 | dl_matrix3du_t *aligned_face = NULL; 166 | int matched_id = 0; 167 | 168 | aligned_face = dl_matrix3du_alloc(1, FACE_WIDTH, FACE_HEIGHT, 3); 169 | if(!aligned_face){ 170 | Serial.println("Could not allocate face recognition buffer"); 171 | return matched_id; 172 | } 173 | if (align_face(net_boxes, image_matrix, aligned_face) == ESP_OK){ 174 | if (is_enrolling == 1){ 175 | int8_t left_sample_face = enroll_face(&id_list, aligned_face); 176 | 177 | if(left_sample_face == (ENROLL_CONFIRM_TIMES - 1)){ 178 | Serial.printf("Enrolling Face ID: %d\n", id_list.tail); 179 | } 180 | Serial.printf("Enrolling Face ID: %d sample %d\n", id_list.tail, ENROLL_CONFIRM_TIMES - left_sample_face); 181 | rgb_printf(image_matrix, FACE_COLOR_CYAN, "ID[%u] Sample[%u]", id_list.tail, ENROLL_CONFIRM_TIMES - left_sample_face); 182 | if (left_sample_face == 0){ 183 | is_enrolling = 0; 184 | Serial.printf("Enrolled Face ID: %d\n", id_list.tail); 185 | } 186 | } else { 187 | matched_id = recognize_face(&id_list, aligned_face); 188 | if (matched_id >= 0) { 189 | Serial.printf("Match Face ID: %u\n", matched_id); 190 | rgb_printf(image_matrix, FACE_COLOR_GREEN, "Hello Subject %u", matched_id); 191 | } else { 192 | Serial.println("No Match Found"); 193 | rgb_print(image_matrix, FACE_COLOR_RED, "Intruder Alert!"); 194 | matched_id = -1; 195 | } 196 | } 197 | } else { 198 | Serial.println("Face Not Aligned"); 199 | //rgb_print(image_matrix, FACE_COLOR_YELLOW, "Human Detected"); 200 | } 201 | 202 | dl_matrix3du_free(aligned_face); 203 | return matched_id; 204 | } 205 | 206 | static size_t jpg_encode_stream(void * arg, size_t index, const void* data, size_t len){ 207 | jpg_chunking_t *j = (jpg_chunking_t *)arg; 208 | if(!index){ 209 | j->len = 0; 210 | } 211 | if(httpd_resp_send_chunk(j->req, (const char *)data, len) != ESP_OK){ 212 | return 0; 213 | } 214 | j->len += len; 215 | return len; 216 | } 217 | 218 | static esp_err_t capture_handler(httpd_req_t *req){ 219 | camera_fb_t * fb = NULL; 220 | esp_err_t res = ESP_OK; 221 | int64_t fr_start = esp_timer_get_time(); 222 | 223 | fb = esp_camera_fb_get(); 224 | if (!fb) { 225 | Serial.println("Camera capture failed"); 226 | httpd_resp_send_500(req); 227 | return ESP_FAIL; 228 | } 229 | 230 | httpd_resp_set_type(req, "image/jpeg"); 231 | httpd_resp_set_hdr(req, "Content-Disposition", "inline; filename=capture.jpg"); 232 | httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); 233 | 234 | size_t out_len, out_width, out_height; 235 | uint8_t * out_buf; 236 | bool s; 237 | bool detected = false; 238 | int face_id = 0; 239 | if(!detection_enabled || fb->width > 400){ 240 | size_t fb_len = 0; 241 | if(fb->format == PIXFORMAT_JPEG){ 242 | fb_len = fb->len; 243 | res = httpd_resp_send(req, (const char *)fb->buf, fb->len); 244 | } else { 245 | jpg_chunking_t jchunk = {req, 0}; 246 | res = frame2jpg_cb(fb, 80, jpg_encode_stream, &jchunk)?ESP_OK:ESP_FAIL; 247 | httpd_resp_send_chunk(req, NULL, 0); 248 | fb_len = jchunk.len; 249 | } 250 | esp_camera_fb_return(fb); 251 | int64_t fr_end = esp_timer_get_time(); 252 | Serial.printf("JPG: %uB %ums\n", (uint32_t)(fb_len), (uint32_t)((fr_end - fr_start)/1000)); 253 | return res; 254 | } 255 | 256 | dl_matrix3du_t *image_matrix = dl_matrix3du_alloc(1, fb->width, fb->height, 3); 257 | if (!image_matrix) { 258 | esp_camera_fb_return(fb); 259 | Serial.println("dl_matrix3du_alloc failed"); 260 | httpd_resp_send_500(req); 261 | return ESP_FAIL; 262 | } 263 | 264 | out_buf = image_matrix->item; 265 | out_len = fb->width * fb->height * 3; 266 | out_width = fb->width; 267 | out_height = fb->height; 268 | 269 | s = fmt2rgb888(fb->buf, fb->len, fb->format, out_buf); 270 | esp_camera_fb_return(fb); 271 | if(!s){ 272 | dl_matrix3du_free(image_matrix); 273 | Serial.println("to rgb888 failed"); 274 | httpd_resp_send_500(req); 275 | return ESP_FAIL; 276 | } 277 | 278 | box_array_t *net_boxes = face_detect(image_matrix, &mtmn_config); 279 | 280 | if (net_boxes){ 281 | detected = true; 282 | if(recognition_enabled){ 283 | face_id = run_face_recognition(image_matrix, net_boxes); 284 | } 285 | draw_face_boxes(image_matrix, net_boxes, face_id); 286 | free(net_boxes->score); 287 | free(net_boxes->box); 288 | free(net_boxes->landmark); 289 | free(net_boxes); 290 | } 291 | 292 | jpg_chunking_t jchunk = {req, 0}; 293 | s = fmt2jpg_cb(out_buf, out_len, out_width, out_height, PIXFORMAT_RGB888, 90, jpg_encode_stream, &jchunk); 294 | dl_matrix3du_free(image_matrix); 295 | if(!s){ 296 | Serial.println("JPEG compression failed"); 297 | return ESP_FAIL; 298 | } 299 | 300 | int64_t fr_end = esp_timer_get_time(); 301 | Serial.printf("FACE: %uB %ums %s%d\n", (uint32_t)(jchunk.len), (uint32_t)((fr_end - fr_start)/1000), detected?"DETECTED ":"", face_id); 302 | return res; 303 | } 304 | 305 | static esp_err_t stream_handler(httpd_req_t *req){ 306 | camera_fb_t * fb = NULL; 307 | esp_err_t res = ESP_OK; 308 | size_t _jpg_buf_len = 0; 309 | uint8_t * _jpg_buf = NULL; 310 | char * part_buf[64]; 311 | dl_matrix3du_t *image_matrix = NULL; 312 | bool detected = false; 313 | int face_id = 0; 314 | int64_t fr_start = 0; 315 | int64_t fr_ready = 0; 316 | int64_t fr_face = 0; 317 | int64_t fr_recognize = 0; 318 | int64_t fr_encode = 0; 319 | 320 | static int64_t last_frame = 0; 321 | if(!last_frame) { 322 | last_frame = esp_timer_get_time(); 323 | } 324 | 325 | res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE); 326 | if(res != ESP_OK){ 327 | return res; 328 | } 329 | 330 | httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); 331 | 332 | while(true){ 333 | detected = false; 334 | face_id = 0; 335 | fb = esp_camera_fb_get(); 336 | if (!fb) { 337 | Serial.println("Camera capture failed"); 338 | res = ESP_FAIL; 339 | } else { 340 | fr_start = esp_timer_get_time(); 341 | fr_ready = fr_start; 342 | fr_face = fr_start; 343 | fr_encode = fr_start; 344 | fr_recognize = fr_start; 345 | if(!detection_enabled || fb->width > 400){ 346 | if(fb->format != PIXFORMAT_JPEG){ 347 | bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len); 348 | esp_camera_fb_return(fb); 349 | fb = NULL; 350 | if(!jpeg_converted){ 351 | Serial.println("JPEG compression failed"); 352 | res = ESP_FAIL; 353 | } 354 | } else { 355 | _jpg_buf_len = fb->len; 356 | _jpg_buf = fb->buf; 357 | } 358 | } else { 359 | 360 | image_matrix = dl_matrix3du_alloc(1, fb->width, fb->height, 3); 361 | 362 | if (!image_matrix) { 363 | Serial.println("dl_matrix3du_alloc failed"); 364 | res = ESP_FAIL; 365 | } else { 366 | if(!fmt2rgb888(fb->buf, fb->len, fb->format, image_matrix->item)){ 367 | Serial.println("fmt2rgb888 failed"); 368 | res = ESP_FAIL; 369 | } else { 370 | fr_ready = esp_timer_get_time(); 371 | box_array_t *net_boxes = NULL; 372 | if(detection_enabled){ 373 | net_boxes = face_detect(image_matrix, &mtmn_config); 374 | } 375 | fr_face = esp_timer_get_time(); 376 | fr_recognize = fr_face; 377 | if (net_boxes || fb->format != PIXFORMAT_JPEG){ 378 | if(net_boxes){ 379 | detected = true; 380 | if(recognition_enabled){ 381 | face_id = run_face_recognition(image_matrix, net_boxes); 382 | } 383 | fr_recognize = esp_timer_get_time(); 384 | draw_face_boxes(image_matrix, net_boxes, face_id); 385 | free(net_boxes->score); 386 | free(net_boxes->box); 387 | free(net_boxes->landmark); 388 | free(net_boxes); 389 | } 390 | if(!fmt2jpg(image_matrix->item, fb->width*fb->height*3, fb->width, fb->height, PIXFORMAT_RGB888, 90, &_jpg_buf, &_jpg_buf_len)){ 391 | Serial.println("fmt2jpg failed"); 392 | res = ESP_FAIL; 393 | } 394 | esp_camera_fb_return(fb); 395 | fb = NULL; 396 | } else { 397 | _jpg_buf = fb->buf; 398 | _jpg_buf_len = fb->len; 399 | } 400 | fr_encode = esp_timer_get_time(); 401 | } 402 | dl_matrix3du_free(image_matrix); 403 | } 404 | } 405 | } 406 | if(res == ESP_OK){ 407 | res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY)); 408 | } 409 | if(res == ESP_OK){ 410 | size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len); 411 | res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen); 412 | } 413 | if(res == ESP_OK){ 414 | res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len); 415 | } 416 | if(fb){ 417 | esp_camera_fb_return(fb); 418 | fb = NULL; 419 | _jpg_buf = NULL; 420 | } else if(_jpg_buf){ 421 | free(_jpg_buf); 422 | _jpg_buf = NULL; 423 | } 424 | if(res != ESP_OK){ 425 | break; 426 | } 427 | int64_t fr_end = esp_timer_get_time(); 428 | 429 | int64_t ready_time = (fr_ready - fr_start)/1000; 430 | int64_t face_time = (fr_face - fr_ready)/1000; 431 | int64_t recognize_time = (fr_recognize - fr_face)/1000; 432 | int64_t encode_time = (fr_encode - fr_recognize)/1000; 433 | int64_t process_time = (fr_encode - fr_start)/1000; 434 | 435 | int64_t frame_time = fr_end - last_frame; 436 | last_frame = fr_end; 437 | frame_time /= 1000; 438 | uint32_t avg_frame_time = ra_filter_run(&ra_filter, frame_time); 439 | Serial.printf("MJPG: %uB %ums (%.1ffps), AVG: %ums (%.1ffps), %u+%u+%u+%u=%u %s%d\n", 440 | (uint32_t)(_jpg_buf_len), 441 | (uint32_t)frame_time, 1000.0 / (uint32_t)frame_time, 442 | avg_frame_time, 1000.0 / avg_frame_time, 443 | (uint32_t)ready_time, (uint32_t)face_time, (uint32_t)recognize_time, (uint32_t)encode_time, (uint32_t)process_time, 444 | (detected)?"DETECTED ":"", face_id 445 | ); 446 | } 447 | 448 | last_frame = 0; 449 | return res; 450 | } 451 | 452 | static esp_err_t cmd_handler(httpd_req_t *req){ 453 | char* buf; 454 | size_t buf_len; 455 | char variable[32] = {0,}; 456 | char value[32] = {0,}; 457 | 458 | buf_len = httpd_req_get_url_query_len(req) + 1; 459 | if (buf_len > 1) { 460 | buf = (char*)malloc(buf_len); 461 | if(!buf){ 462 | httpd_resp_send_500(req); 463 | return ESP_FAIL; 464 | } 465 | if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) { 466 | if (httpd_query_key_value(buf, "var", variable, sizeof(variable)) == ESP_OK && 467 | httpd_query_key_value(buf, "val", value, sizeof(value)) == ESP_OK) { 468 | } else { 469 | free(buf); 470 | httpd_resp_send_404(req); 471 | return ESP_FAIL; 472 | } 473 | } else { 474 | free(buf); 475 | httpd_resp_send_404(req); 476 | return ESP_FAIL; 477 | } 478 | free(buf); 479 | } else { 480 | httpd_resp_send_404(req); 481 | return ESP_FAIL; 482 | } 483 | 484 | int val = atoi(value); 485 | sensor_t * s = esp_camera_sensor_get(); 486 | int res = 0; 487 | 488 | if(!strcmp(variable, "framesize")) { 489 | if(s->pixformat == PIXFORMAT_JPEG) res = s->set_framesize(s, (framesize_t)val); 490 | } 491 | else if(!strcmp(variable, "quality")) res = s->set_quality(s, val); 492 | else if(!strcmp(variable, "contrast")) res = s->set_contrast(s, val); 493 | else if(!strcmp(variable, "brightness")) res = s->set_brightness(s, val); 494 | else if(!strcmp(variable, "saturation")) res = s->set_saturation(s, val); 495 | else if(!strcmp(variable, "gainceiling")) res = s->set_gainceiling(s, (gainceiling_t)val); 496 | else if(!strcmp(variable, "colorbar")) res = s->set_colorbar(s, val); 497 | else if(!strcmp(variable, "awb")) res = s->set_whitebal(s, val); 498 | else if(!strcmp(variable, "agc")) res = s->set_gain_ctrl(s, val); 499 | else if(!strcmp(variable, "aec")) res = s->set_exposure_ctrl(s, val); 500 | else if(!strcmp(variable, "hmirror")) res = s->set_hmirror(s, val); 501 | else if(!strcmp(variable, "vflip")) res = s->set_vflip(s, val); 502 | else if(!strcmp(variable, "awb_gain")) res = s->set_awb_gain(s, val); 503 | else if(!strcmp(variable, "agc_gain")) res = s->set_agc_gain(s, val); 504 | else if(!strcmp(variable, "aec_value")) res = s->set_aec_value(s, val); 505 | else if(!strcmp(variable, "aec2")) res = s->set_aec2(s, val); 506 | else if(!strcmp(variable, "dcw")) res = s->set_dcw(s, val); 507 | else if(!strcmp(variable, "bpc")) res = s->set_bpc(s, val); 508 | else if(!strcmp(variable, "wpc")) res = s->set_wpc(s, val); 509 | else if(!strcmp(variable, "raw_gma")) res = s->set_raw_gma(s, val); 510 | else if(!strcmp(variable, "lenc")) res = s->set_lenc(s, val); 511 | else if(!strcmp(variable, "special_effect")) res = s->set_special_effect(s, val); 512 | else if(!strcmp(variable, "wb_mode")) res = s->set_wb_mode(s, val); 513 | else if(!strcmp(variable, "ae_level")) res = s->set_ae_level(s, val); 514 | else if(!strcmp(variable, "face_detect")) { 515 | detection_enabled = val; 516 | if(!detection_enabled) { 517 | recognition_enabled = 0; 518 | } 519 | } 520 | else if(!strcmp(variable, "face_enroll")) is_enrolling = val; 521 | else if(!strcmp(variable, "face_recognize")) { 522 | recognition_enabled = val; 523 | if(recognition_enabled){ 524 | detection_enabled = val; 525 | } 526 | } 527 | else { 528 | res = -1; 529 | } 530 | 531 | if(res){ 532 | return httpd_resp_send_500(req); 533 | } 534 | 535 | httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); 536 | return httpd_resp_send(req, NULL, 0); 537 | } 538 | 539 | static esp_err_t status_handler(httpd_req_t *req){ 540 | static char json_response[1024]; 541 | 542 | sensor_t * s = esp_camera_sensor_get(); 543 | char * p = json_response; 544 | *p++ = '{'; 545 | 546 | p+=sprintf(p, "\"framesize\":%u,", s->status.framesize); 547 | p+=sprintf(p, "\"quality\":%u,", s->status.quality); 548 | p+=sprintf(p, "\"brightness\":%d,", s->status.brightness); 549 | p+=sprintf(p, "\"contrast\":%d,", s->status.contrast); 550 | p+=sprintf(p, "\"saturation\":%d,", s->status.saturation); 551 | p+=sprintf(p, "\"sharpness\":%d,", s->status.sharpness); 552 | p+=sprintf(p, "\"special_effect\":%u,", s->status.special_effect); 553 | p+=sprintf(p, "\"wb_mode\":%u,", s->status.wb_mode); 554 | p+=sprintf(p, "\"awb\":%u,", s->status.awb); 555 | p+=sprintf(p, "\"awb_gain\":%u,", s->status.awb_gain); 556 | p+=sprintf(p, "\"aec\":%u,", s->status.aec); 557 | p+=sprintf(p, "\"aec2\":%u,", s->status.aec2); 558 | p+=sprintf(p, "\"ae_level\":%d,", s->status.ae_level); 559 | p+=sprintf(p, "\"aec_value\":%u,", s->status.aec_value); 560 | p+=sprintf(p, "\"agc\":%u,", s->status.agc); 561 | p+=sprintf(p, "\"agc_gain\":%u,", s->status.agc_gain); 562 | p+=sprintf(p, "\"gainceiling\":%u,", s->status.gainceiling); 563 | p+=sprintf(p, "\"bpc\":%u,", s->status.bpc); 564 | p+=sprintf(p, "\"wpc\":%u,", s->status.wpc); 565 | p+=sprintf(p, "\"raw_gma\":%u,", s->status.raw_gma); 566 | p+=sprintf(p, "\"lenc\":%u,", s->status.lenc); 567 | p+=sprintf(p, "\"vflip\":%u,", s->status.vflip); 568 | p+=sprintf(p, "\"hmirror\":%u,", s->status.hmirror); 569 | p+=sprintf(p, "\"dcw\":%u,", s->status.dcw); 570 | p+=sprintf(p, "\"colorbar\":%u,", s->status.colorbar); 571 | p+=sprintf(p, "\"face_detect\":%u,", detection_enabled); 572 | p+=sprintf(p, "\"face_enroll\":%u,", is_enrolling); 573 | p+=sprintf(p, "\"face_recognize\":%u", recognition_enabled); 574 | *p++ = '}'; 575 | *p++ = 0; 576 | httpd_resp_set_type(req, "application/json"); 577 | httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); 578 | return httpd_resp_send(req, json_response, strlen(json_response)); 579 | } 580 | 581 | static esp_err_t index_handler(httpd_req_t *req){ 582 | httpd_resp_set_type(req, "text/html"); 583 | httpd_resp_set_hdr(req, "Content-Encoding", "gzip"); 584 | sensor_t * s = esp_camera_sensor_get(); 585 | if (s->id.PID == OV3660_PID) { 586 | return httpd_resp_send(req, (const char *)index_ov3660_html_gz, index_ov3660_html_gz_len); 587 | } 588 | return httpd_resp_send(req, (const char *)index_ov2640_html_gz, index_ov2640_html_gz_len); 589 | } 590 | 591 | void startCameraServer(){ 592 | httpd_config_t config = HTTPD_DEFAULT_CONFIG(); 593 | 594 | httpd_uri_t index_uri = { 595 | .uri = "/", 596 | .method = HTTP_GET, 597 | .handler = index_handler, 598 | .user_ctx = NULL 599 | }; 600 | 601 | httpd_uri_t status_uri = { 602 | .uri = "/status", 603 | .method = HTTP_GET, 604 | .handler = status_handler, 605 | .user_ctx = NULL 606 | }; 607 | 608 | httpd_uri_t cmd_uri = { 609 | .uri = "/control", 610 | .method = HTTP_GET, 611 | .handler = cmd_handler, 612 | .user_ctx = NULL 613 | }; 614 | 615 | httpd_uri_t capture_uri = { 616 | .uri = "/capture", 617 | .method = HTTP_GET, 618 | .handler = capture_handler, 619 | .user_ctx = NULL 620 | }; 621 | 622 | httpd_uri_t stream_uri = { 623 | .uri = "/stream", 624 | .method = HTTP_GET, 625 | .handler = stream_handler, 626 | .user_ctx = NULL 627 | }; 628 | 629 | 630 | ra_filter_init(&ra_filter, 20); 631 | 632 | mtmn_config.type = FAST; 633 | mtmn_config.min_face = 80; 634 | mtmn_config.pyramid = 0.707; 635 | mtmn_config.pyramid_times = 4; 636 | mtmn_config.p_threshold.score = 0.6; 637 | mtmn_config.p_threshold.nms = 0.7; 638 | mtmn_config.p_threshold.candidate_number = 20; 639 | mtmn_config.r_threshold.score = 0.7; 640 | mtmn_config.r_threshold.nms = 0.7; 641 | mtmn_config.r_threshold.candidate_number = 10; 642 | mtmn_config.o_threshold.score = 0.7; 643 | mtmn_config.o_threshold.nms = 0.7; 644 | mtmn_config.o_threshold.candidate_number = 1; 645 | 646 | face_id_init(&id_list, FACE_ID_SAVE_NUMBER, ENROLL_CONFIRM_TIMES); 647 | 648 | Serial.printf("Starting web server on port: '%d'\n", config.server_port); 649 | if (httpd_start(&camera_httpd, &config) == ESP_OK) { 650 | httpd_register_uri_handler(camera_httpd, &index_uri); 651 | httpd_register_uri_handler(camera_httpd, &cmd_uri); 652 | httpd_register_uri_handler(camera_httpd, &status_uri); 653 | httpd_register_uri_handler(camera_httpd, &capture_uri); 654 | } 655 | 656 | config.server_port += 1; 657 | config.ctrl_port += 1; 658 | Serial.printf("Starting stream server on port: '%d'\n", config.server_port); 659 | if (httpd_start(&stream_httpd, &config) == ESP_OK) { 660 | httpd_register_uri_handler(stream_httpd, &stream_uri); 661 | } 662 | } 663 | -------------------------------------------------------------------------------- /Object detection/camera_index.h: -------------------------------------------------------------------------------- 1 | 2 | //File: index_ov2640.html.gz, Size: 4316 3 | #define index_ov2640_html_gz_len 3343 4 | const uint8_t index_ov2640_html_gz[] = { 5 | 0x1f,0x8b,0x08,0x08,0x72,0xd4,0xc5,0x60,0x00,0xff,0x69,0x6e,0x64,0x65,0x78,0x2e,0x68,0x74,0x6d,0x6c,0x2e,0x67,0x7a,0x00,0xed,0x1b,0x69,0x73,0x1b,0xb7,0xf5,0xbb,0x7f,0x05,0x4c,0x25,0x0d,0xe5,0x8a,0xa7,0x24,0x8a,0x62,0x44,0xd5,0x71,0x12,0x37,0x9e,0x49,0x9b,0xc4,0x49,0x7a,0x4c,0x27,0x63,0x63,0x77,0xb1,0x24,0xec,0xbd,0x8a,0x05,0x29,0x2a,0x1e,0xff,0xf7,0xbc,0x07,0xec,0x01,0xec,0x62,0x29,0x5a,0xd6,0x4c,0x8f,0x09,0x8f,0x21,0x09,0xbc,0x0b,0xef,0x02,0xf0,0x00,0x5e,0x3d,0xfe,0xea,0xbb,0x2f,0x7f,0xfa,0xe7,0xf7,0x5f,0x93,0xb5,0x8c,0xa3,0xeb,0x47,0x57,0xf8,0x41,0x22,0x9a,0xac,0x96,0x3d,0x96,0xf4,0xae,0x1f,0x41,0x0b,0xa3,0xc1,0xf5,0x23,0x02,0x8f,0xab,0x98,0x49,0x4a,0xfc,0x35,0x15,0x39,0x93,0xcb,0xde,0xcf,0x3f,0x3d,0x1f,0xcc,0x7b,0x64,0x64,0x76,0x26,0x34,0x66,0xcb,0xde,0x96,0xb3,0x9b,0x2c,0x15,0xb2,0x47,0xfc,0x34,0x91,0x2c,0x01,0xe0,0x1b,0x1e,0xc8,0xf5,0x32,0x60,0x5b,0xee,0xb3,0x81,0xfa,0x71,0x42,0x78,0xc2,0x25,0xa7,0xd1,0x20,0xf7,0x69,0xc4,0x96,0x93,0xe1,0xb8,0x26,0x26,0xb9,0x8c,0xd8,0xf5,0x57,0xa9,0xbf,0x89,0x01,0xfd,0x6a,0xa4,0x7f,0xeb,0xbe,0xdc,0x17,0x3c,0x93,0x24,0x17,0xfe,0xb2,0xb7,0x96,0x32,0xcb,0x17,0xa3,0x91,0x1f,0x24,0xc3,0x37,0x79,0xc0,0x22,0xbe,0x15,0xc3,0x84,0xc9,0x51,0x92,0xc5,0xa3,0xa7,0xc0,0x3a,0x4f,0x45,0x18,0xa5,0x37,0x23,0x19,0xbe,0xc9,0x7b,0xd7,0x57,0x23,0x8d,0x5c,0x50,0x7a,0x3c,0x18,0x90,0x6f,0x53,0x1a,0x10,0xb9,0x66,0x20,0xaa,0x9f,0x0e,0xf2,0x3c,0x20,0x71,0x0a,0x74,0x86,0x64,0x30,0xf8,0x08,0x7e,0x03,0x45,0x24,0x1f,0x95,0x44,0x4d,0xd6,0x57,0x23,0xad,0xd2,0xab,0x5c,0xde,0x96,0x83,0x7a,0x1a,0x82,0xa2,0x06,0x21,0xf5,0x19,0x79,0xa7,0x1a,0xf0,0x51,0xb4,0xc5,0x3c,0xba,0x5d,0x90,0xde,0x5f,0x37,0xa0,0xae,0xb4,0xf7,0x79,0xd5,0x0d,0x02,0x2d,0xc8,0x46,0x44,0xfd,0xa2,0x6b,0xf0,0x92,0xad,0x36,0x11,0x15,0x43,0x29,0xc3,0xde,0xb1,0x02,0x7b,0xff,0x48,0x7d,0x28,0xa3,0xd6,0x74,0x41,0x90,0x34,0x8a,0x06,0x1e,0x5b,0xd3,0x2d,0x4f,0xc5,0x82,0xe4,0x71,0x9a,0xca,0xb5,0x89,0xf1,0xc4,0x00,0xf7,0xd2,0xdd,0x20,0xe7,0xbf,0xf2,0x64,0xb5,0x80,0xef,0x22,0x60,0x62,0x00,0x4d,0x26,0x34,0xa5,0x84,0x9e,0xe8,0x6f,0x8b,0x88,0x27,0x6f,0xcb,0xef,0x5b,0x9e,0x73,0xc9,0x82,0xf2,0xe7,0x3a,0xdd,0x32,0x51,0xfe,0xa0,0xbe,0xe4,0x5b,0x73,0xb4,0x7e,0x1a,0xa1,0x2c,0x3c,0x59,0x33,0xc1,0x65,0x3d,0x4c,0xc9,0x76,0x72,0x10,0x30,0x3f,0x15,0x54,0xf2,0x34,0x59,0x90,0x24,0x4d,0x98,0xc9,0x3d,0x33,0x88,0x28,0x60,0x9e,0x04,0xe0,0x34,0x0b,0x32,0xce,0x2c,0x29,0xbd,0x34,0xb8,0xbd,0x4b,0xbb,0x27,0x24,0xa7,0x49,0x3e,0xc8,0x41,0x84,0xb0,0x16,0xc1,0xa3,0xfe,0xdb,0x95,0x48,0x37,0x49,0x30,0x28,0xa4,0x3c,0x0a,0x43,0xa3,0x3f,0xa6,0x62,0xc5,0x41,0x32,0x60,0x58,0x37,0x66,0x34,0x08,0x94,0xce,0xac,0xd6,0x12,0xff,0xfc,0xfc,0xdc,0x94,0x4d,0x52,0x2f,0x32,0x95,0xa1,0xf5,0xac,0xc7,0x5a,0x23,0xab,0xb8,0x59,0x90,0xc9,0x78,0xfc,0xa9,0x21,0x9c,0x36,0x09,0x10,0x8e,0x68,0x96,0xb3,0x05,0xb2,0x50,0xdf,0x5a,0x20,0x32,0xcd,0x00,0x39,0xdb,0x91,0x3c,0x8d,0x78,0x40,0x8e,0xd8,0x18,0x9f,0x96,0x18,0xeb,0x96,0x0c,0x60,0x6b,0x29,0xd3,0xd8,0x81,0xe8,0x18,0xea,0x04,0xc6,0x4a,0xce,0xcd,0xf1,0x2a,0x2d,0x83,0xf7,0x80,0x5c,0x93,0x33,0xb3,0xc3,0xa5,0xd3,0x29,0x3e,0x2d,0x79,0x02,0x43,0x9e,0x3d,0x5c,0x0e,0x17,0xd5,0x94,0x67,0x6a,0xfb,0xc7,0x10,0x93,0x15,0xe5,0x09,0x13,0x26,0xd3,0x14,0x5c,0x58,0xb9,0x9d,0x60,0x11,0x38,0xe0,0xf6,0x2e,0x73,0x54,0xbe,0x40,0xe8,0x46,0xa6,0x0e,0x1d,0x81,0xe0,0x6e,0xae,0x83,0x80,0xe6,0xa6,0xfe,0x0f,0x60,0x7d,0x79,0x69,0x70,0x0e,0x78,0x9e,0x45,0x14,0x9c,0x79,0x25,0x78,0x50,0x37,0xe3,0xaf,0x81,0x64,0x31,0xf4,0x49,0x86,0xba,0xde,0xc4,0x49,0xbe,0x20,0xd3,0x31,0x6a,0xd1,0x96,0x51,0xcb,0xae,0xfd,0x64,0x6a,0xb9,0x6d,0xd1,0x13,0xb1,0x10,0xe2,0xca,0x89,0x24,0xf8,0x6a,0xdd,0xd5,0x57,0xda,0xa5,0x11,0x90,0x8d,0xa1,0x5f,0x07,0x7c,0xeb,0x32,0x77,0x61,0xed,0x7d,0x98,0x8b,0x44,0xae,0x07,0xfe,0x9a,0x47,0x41,0x7f,0x72,0x0c,0xbd,0x54,0x04,0x64,0xd8,0x88,0xf7,0xd2,0x30,0xb3,0xfb,0x92,0x8a,0xb8,0x83,0xda,0x05,0x08,0xd7,0x19,0xf6,0xf7,0x17,0x7b,0x63,0xe6,0xeb,0x88,0xe7,0xe0,0xb3,0x38,0x59,0x0c,0xe4,0x6d,0x06,0x9e,0x6b,0x67,0x85,0xca,0xe3,0x5c,0x42,0x74,0x46,0xe2,0x7d,0x75,0xa0,0xb3,0x78,0x3b,0x4d,0x68,0xd7,0x30,0x22,0x2f,0x64,0x67,0xe3,0xd9,0xcc,0x64,0x93,0x50,0xa7,0x7d,0x31,0x0e,0xc9,0xb9,0xa5,0xc4,0xbb,0x12,0x2e,0x8a,0x80,0xd3,0xac,0xdb,0xdf,0x9a,0xad,0x25,0x89,0xf9,0x7c,0x6e,0x8d,0x1a,0xe4,0x51,0x62,0x9b,0x93,0x42,0x94,0x52,0x18,0x06,0xb6,0xb6,0x40,0x95,0x87,0xb7,0x61,0x55,0xb3,0x23,0x0a,0x6d,0x23,0x19,0xda,0x9f,0x36,0xf3,0x4e,0x25,0xc7,0xbd,0xac,0x7e,0xf7,0x9c,0x53,0x89,0xc4,0x13,0x98,0x9d,0xd9,0xc0,0x8b,0x52,0xff,0xad,0x5b,0x02,0xcb,0xc7,0x9d,0x78,0x4e,0x09,0x08,0x0c,0xc9,0x35,0x1d,0x40,0x0f,0x26,0x6b,0xc3,0x14,0x1b,0x01,0x2b,0xa4,0x05,0xe4,0x36,0x0e,0x0b,0x43,0x51,0x77,0x44,0x4c,0xc2,0xef,0x41,0x9e,0x51,0x5f,0xa1,0x0e,0x27,0x82,0xc5,0x8d,0x45,0x80,0x14,0x30,0x37,0x87,0xa9,0x80,0x4c,0xb2,0xc9,0x32,0x26,0x7c,0x6a,0x4e,0x72,0xce,0x75,0x82,0x91,0x31,0xd7,0xb0,0x14,0x51,0xf4,0x95,0x2a,0x6f,0x04,0xcd,0xf6,0xf9,0x9b,0xe2,0x95,0x51,0x01,0x0b,0x89,0x03,0x26,0x33,0xd5,0x71,0xc3,0x74,0x0a,0x3c,0x1b,0x5b,0x73,0x6a,0xad,0xdc,0x61,0x94,0xae,0xd2,0x0f,0xd5,0x6f,0x99,0x58,0xcf,0x2c,0x3d,0x36,0xdc,0xe9,0x30,0x49,0x30,0xfe,0xc0,0xc5,0x8a,0x85,0xd8,0x41,0x33,0x7d,0x3b,0x88,0x9f,0xc6,0x2c,0xe0,0xb4,0x1f,0x83,0x64,0xe5,0xfc,0x37,0x9d,0x03,0xc6,0xb1,0x41,0xcf,0x39,0x93,0x1a,0xd3,0xd6,0xc5,0xf8,0xd3,0xaa,0xb9,0x20,0xbb,0x7f,0x2a,0x34,0x70,0xe7,0x1d,0xb8,0xee,0x20,0xea,0x54,0x33,0x79,0xcc,0x63,0xdc,0xa2,0xd0,0x44,0x07,0xba,0x26,0xb7,0x7f,0x9c,0xe3,0x29,0xe4,0xf3,0x63,0x9a,0x04,0xa4,0x1f,0xd3,0x9d,0x31,0x7c,0x30,0xcd,0x07,0x0d,0xff,0xfc,0x7f,0x71,0xf8,0x17,0xb3,0xb9,0x6b,0xf4,0xe3,0x29,0x44,0xc2,0x87,0x8c,0xbe,0x6b,0x04,0x07,0x8d,0xbe,0x43,0x73,0xff,0xe1,0xd1,0xab,0xe6,0x54,0x70,0x48,0x16,0x45,0xee,0x81,0x1d,0x74,0x00,0xdb,0xda,0x8c,0xfd,0xff,0x6b,0xe6,0x4c,0x45,0x7f,0x53,0x33,0x17,0x33,0x58,0x19,0x7d,0xc8,0xe0,0x2f,0x3f,0x62,0xf0,0x80,0x5b,0x67,0xc0,0x3d,0x6b,0x5e,0x7b,0x46,0xb0,0x94,0x50,0xcf,0x89,0xfb,0x05,0x68,0xac,0x8d,0x3a,0x54,0xda,0x4d,0xed,0x00,0x7b,0x54,0xfb,0xdb,0x06,0xae,0xbd,0x7c,0x32,0x26,0xda,0x62,0xed,0x65,0xaf,0xd8,0xcd,0xfe,0x62,0x0a,0x41,0x80,0xfd,0x42,0x59,0xd3,0x7f,0x7b,0x44,0x4e,0xea,0x10,0x05,0x90,0x16,0xd5,0x3c,0xdf,0x49,0xbc,0xb9,0x74,0x3a,0x50,0x59,0x22,0x6f,0x8e,0xd8,0x46,0x72,0x7b,0x6b,0x8d,0xbf,0xe6,0x81,0xb9,0xa9,0x6e,0x69,0xf9,0x1e,0xde,0x7e,0x8a,0x4a,0x6c,0x79,0xfb,0xd9,0x87,0x4e,0x01,0x97,0x1f,0x31,0x05,0x00,0xee,0xef,0xde,0xfe,0xbb,0xb7,0x3f,0xbc,0xb7,0x0f,0xe5,0x4a,0x30,0x96,0xb4,0x6b,0x72,0x47,0x73,0x16,0x84,0x33,0xaf,0x49,0xa0,0x42,0xbb,0x65,0x11,0x6c,0xc6,0x1c,0x78,0xe1,0x2c,0xf0,0x2e,0xba,0xf1,0x04,0x33,0xeb,0x3b,0x15,0x92,0x5a,0x73,0x76,0x22,0x79,0xd1,0xc6,0x51,0x36,0x3c,0x3a,0xf5,0x28,0x0d,0xe7,0x9d,0x58,0x2b,0x41,0x6f,0x73,0x07,0x9a,0xae,0x0f,0xed,0x45,0x8b,0x5d,0x0a,0x99,0xef,0x67,0x65,0xba,0xbb,0x51,0xf2,0xeb,0xc4,0x51,0xbb,0x13,0x97,0x2e,0xc2,0xb0,0x0b,0xc7,0x6b,0x1a,0xcb,0xb1,0x69,0xde,0x6f,0x37,0xaf,0x65,0x37,0xd7,0xbe,0x7b,0xaf,0x09,0x3d,0xdb,0x84,0x2e,0xfc,0xbd,0xd6,0xf4,0x1a,0xd6,0x74,0x10,0xd8,0x6f,0x58,0xd0,0x82,0x6d,0x58,0x07,0x85,0xfd,0x36,0x56,0x14,0x4c,0x1b,0xbb,0xf4,0xd8,0x6d,0x6e,0x85,0x6e,0x9a,0xdb,0x81,0xbe,0xc7,0xf2,0x5e,0xd3,0xf2,0xee,0xd2,0x47,0x27,0xfa,0x06,0xb6,0x6c,0x89,0xae,0xa9,0x9b,0xdf,0x79,0x92,0x6d,0xcc,0x14,0x54,0xee,0xd5,0xad,0xbd,0xa2,0x21,0xde,0x1d,0xc5,0x82,0xae,0x52,0xaf,0x9d,0x84,0xd5,0x0e,0x9c,0x46,0x7c,0x05,0x8c,0x7c,0x58,0x0b,0x9b,0xfb,0xfb,0x46,0xdd,0x75,0xcf,0xc6,0x7f,0x7c,0xde,0xde,0xf9,0x77,0x6f,0xeb,0xef,0xaa,0x14,0x15,0x5b,0x5b,0x41,0x03,0xbe,0x81,0x39,0xd1,0x2e,0x41,0x17,0x45,0x76,0x63,0xbf,0xeb,0x79,0xde,0x01,0xc5,0x0a,0xf7,0x89,0x48,0xc7,0x26,0x7c,0x36,0x6e,0x16,0xe1,0xf6,0x1d,0x3a,0x38,0xac,0x6b,0x9e,0x9b,0xb4,0x5b,0x94,0xa5,0xcd,0x86,0x12,0x2b,0x84,0xc3,0xb3,0xdc,0xc2,0x32,0x5a,0x34,0x96,0x6a,0x70,0xe5,0xd2,0xd3,0x53,0xd7,0xf9,0x42,0x19,0x0a,0x46,0x1d,0x6e,0x23,0xd1,0x49,0xa0,0x06,0x64,0xca,0xdd,0x74,0x3e,0x67,0x9d,0xdc,0xac,0x87,0xb7,0x6b,0x4a,0x60,0x92,0xc3,0xd5,0xed,0x14,0xed,0x63,0x0c,0x6f,0x3a,0xb2,0x5a,0x29,0xec,0x8d,0xbe,0x62,0xe7,0xe4,0xa8,0xeb,0x34,0x62,0xc7,0xd0,0x83,0x5d,0x7d,0xc5,0xfa,0x6a,0x3b,0x56,0x71,0x9d,0xe1,0xae,0xee,0x61,0xd8,0xa9,0x75,0xc8,0xbd,0xe3,0xa0,0x75,0xf4,0xa1,0x4a,0xbc,0x78,0x2e,0xe9,0xaa,0xd0,0x62,0x81,0xb6,0xab,0xfc,0x34,0x81,0x7d,0x71,0x87,0xe7,0x7b,0x69,0x04,0x3c,0xdb,0x76,0x02,0xf7,0x72,0x30,0x6f,0x94,0xeb,0xcd,0x22,0xa2,0x9b,0x31,0x14,0xf2,0xdd,0x26,0x7b,0xb3,0xc9,0x25,0x0f,0x6f,0x1d,0x5e,0x85,0x7a,0x03,0x79,0x6d,0x23,0x2a,0xcd,0x38,0xce,0xde,0xf6,0x9e,0x94,0x0d,0x75,0x82,0x6b,0x1e,0x3d,0x5a,0xd9,0xaf,0xcb,0x6d,0x1a,0x35,0xe7,0x43,0xbd,0xad,0xb9,0xac,0x34,0xf1,0x74,0x5f,0x07,0x62,0xbe,0xa6,0x41,0x7a,0x63,0x4d,0x92,0x18,0x51,0xaa,0x15,0x0f,0xaa,0x86,0x93,0x29,0xe6,0x5c,0x32,0xd4,0x1f,0x62,0xe5,0xd1,0xfe,0xf8,0x84,0xe8,0xd7,0x70,0x7c,0x71,0x7e,0xdc,0x45,0x39,0x96,0x26,0x55,0xf3,0xf8,0x08,0xcb,0xb7,0x36,0x68,0x1b,0xd2,0x05,0x25,0x1c,0x04,0x8b,0x05,0x7d,0x1b,0x38,0x72,0x00,0x17,0xe7,0x10,0x2d,0x58,0xcf,0x01,0x5b,0x15,0x3c,0x9b,0xd0,0x99,0x09,0x5c,0x79,0xe2,0x10,0xd5,0x63,0xc1,0x85,0x93,0x69,0xf3,0x44,0xb9,0xe3,0x6c,0x31,0x9c,0x9c,0x75,0x40,0x36,0xcf,0x62,0xc2,0xc9,0xac,0x03,0xb2,0x71,0x72,0x85,0xf6,0x87,0x02,0x35,0x3d,0xc4,0x75,0x3b,0x13,0x81,0x95,0x44,0x9c,0x89,0x5a,0x30,0xcd,0xde,0x9e,0x77,0xad,0x75,0x40,0x47,0x95,0x3d,0x13,0xd6,0x39,0x3d,0xec,0x2d,0xad,0x0d,0xca,0xba,0x48,0x13,0xcd,0x23,0x1c,0xa3,0xba,0x66,0xca,0x51,0x9e,0xf9,0x0c,0x76,0x70,0x61,0x41,0xdd,0x60,0x38,0xb4,0xb8,0x7f,0xb7,0x52,0xea,0x4c,0xa7,0x36,0x77,0xae,0xb3,0xe5,0x52,0x61,0xa7,0x5d,0xe9,0xc8,0x5a,0xd5,0x58,0x19,0xa7,0x79,0xec,0xa9,0xf7,0xeb,0x37,0xce,0xa3,0x80,0x83,0xce,0x6e,0xcf,0xc7,0x9f,0xe2,0xdb,0x41,0x74,0x0d,0x7b,0x82,0x7b,0x93,0x9d,0x84,0xa2,0x7c,0x3b,0xe5,0xed,0x3a,0xa0,0x6d,0x9e,0x72,0xd6,0xa2,0x1c,0x8a,0x81,0x2a,0x6c,0x2f,0x18,0xe6,0x78,0x44,0x5d,0x4b,0xdd,0xf6,0x97,0x02,0x7d,0xf4,0xe4,0x08,0x0c,0xbb,0x11,0x3e,0xfb,0x0b,0xcd,0x32,0x60,0xf0,0xf3,0xcb,0x6f,0x97,0x50,0xb3,0xe1,0x72,0xe8,0xe7,0xf9,0x30,0xa6,0x19,0x79,0x32,0x82,0x6b,0x37,0xc5,0x7d,0x9b,0x47,0x57,0x38,0xd5,0x94,0x97,0x7b,0x18,0xdc,0x43,0x49,0x13,0xfd,0x4b,0xb5,0xa0,0xc8,0x7e,0x44,0xf3,0x7c,0xd9,0xab,0x8a,0x21,0x70,0x11,0xca,0xdc,0x56,0x23,0x8c,0xdd,0xa2,0x5a,0xd7,0x93,0xeb,0xef,0xbc,0x37,0x40,0x90,0x7c,0xc5,0xa4,0xa6,0x0b,0x77,0x7d,0x26,0x6d,0xc8,0xef,0xd3,0x1b,0x86,0x1b,0xa7,0x67,0xb7,0x20,0x40,0x46,0x93,0x92,0x1f,0x6e,0x88,0xe1,0xa6,0x90,0x77,0xfd,0x34,0xa4,0xbf,0x52,0x9e,0x5e,0x8d,0x3c,0xbc,0x37,0x04,0x10,0x0d,0xfe,0xa3,0x96,0x00,0x4a,0x6c,0x35,0xc0,0x65,0xcf,0xcc,0xc3,0xea,0x5c,0xb5,0x21,0x7e,0x35,0x04,0xe0,0xf4,0x92,0x41,0x48,0x6c,0x50,0x54,0xb2,0xd0,0xec,0xdc,0x63,0x43,0xf2,0x3c,0x58,0xf6,0xf4,0x91,0xd8,0x2b,0x4f,0xe2,0xe5,0xb0,0x26,0x94,0x82,0xd4,0x8b,0x22,0x92,0x26,0x7e,0xc4,0xfd,0xb7,0xa0,0xc4,0x35,0xdc,0x26,0x63,0xaf,0x20,0x8d,0x14,0x8c,0xfa,0x9f,0x4d,0xc6,0x9f,0x1d,0xf7,0x14,0xb9,0x70,0x02,0x97,0xbe,0x8a,0xd1,0x6b,0xc4,0xde,0xf5,0xcf,0xff,0xf8,0xf3,0x17,0xa4,0x3f,0x81,0x75,0x73,0xb6,0x7b,0x32,0x51,0xf7,0x14,0x8e,0x61,0xc8,0xba,0xfb,0xfe,0x4c,0x2f,0x2b,0x9e,0x97,0x2d,0x96,0x3f,0x02,0xcb,0x3e,0x1e,0xe4,0xec,0xb0,0xa2,0xff,0x10,0xdc,0xe6,0x15,0x37,0xb8,0x22,0xd7,0xe0,0xa6,0x98,0x01,0x9f,0x1d,0x1c,0x2a,0x3c,0x04,0xaf,0x8b,0x8a,0xd7,0x45,0x7b,0x64,0x7f,0x03,0x66,0x10,0x48,0x3b,0x50,0xe7,0x43,0xf0,0x9a,0x55,0xbc,0x66,0x2d,0x5e,0xc8,0x6a,0x76,0x36,0xde,0x41,0x35,0xf4,0x21,0x58,0x9d,0x57,0xac,0xce,0x5b,0xac,0xbe,0x7c,0xf1,0xbc,0x0f,0xa7,0x9b,0xbb,0xe9,0xe5,0xec,0x21,0x58,0x9d,0x55,0xac,0xce,0x5a,0xac,0x7e,0xc0,0x61,0x41,0xd9,0x77,0x37,0x3d,0x7b,0x90,0x61,0x9d,0x56,0xbc,0x4e,0x5b,0xbc,0xbe,0x51,0xcc,0x80,0xd1,0x6e,0x72,0xf1,0x20,0x03,0xab,0x03,0xad,0x1d,0x67,0x3f,0x28,0x66,0x10,0x67,0x3b,0x08,0xb2,0x7d,0xcc,0x5c,0xe9,0xc6,0x6e,0x32,0x7e,0x42,0xbe,0x32,0x53,0x6a,0x99,0x60,0xf7,0xa5,0xd4,0x76,0x3a,0xed,0x48,0xb0,0xd8,0xaa,0x37,0x97,0x90,0xab,0xdc,0x20,0x3c,0x5e,0x95,0xac,0x70,0x52,0xd1,0x83,0x87,0xc6,0x5e,0x7d,0x7f,0x13,0xae,0x6f,0x4e,0x2e,0xa7,0xc3,0xc9,0x6c,0x3e,0x9c,0x0c,0x27,0xe3,0xc5,0x7c,0x02,0x33,0x03,0xac,0xa3,0xe2,0x1e,0xa1,0x11,0x5c,0x55,0xad,0x6e,0xa1,0xde,0x91,0x6e,0x3b,0x04,0x84,0x3d,0xf1,0x5e,0x09,0x7d,0x9a,0x6c,0x69,0xde,0x16,0x52,0xb7,0xe3,0x45,0x51,0xfd,0xed,0x1e,0x0a,0x07,0x13,0xaa,0x99,0x0d,0xaf,0x98,0xea,0xeb,0xbc,0xe6,0x75,0x57,0x50,0x7d,0x2e,0x61,0xa3,0x98,0xb3,0x6f,0x52,0xf8,0xb2,0x24,0x41,0x71,0xbd,0x16,0xee,0x25,0xf8,0xaa,0xb8,0x32,0x84,0x33,0x4c,0x98,0x39,0x0c,0x68,0xad,0x98,0x57,0x70,0xcb,0x14,0xe0,0x5f,0x7f,0xf2,0xae,0xc4,0x7e,0x5f,0x6b,0xed,0x75,0x1b,0x3c,0x87,0x63,0xd0,0x4d,0xee,0xc0,0x02,0x14,0xec,0x79,0xad,0xe7,0x6d,0x8d,0x83,0x16,0x33,0x64,0x59,0x31,0xf9,0x75,0xc4,0xf0,0xeb,0xb3,0xdb,0x17,0x41,0x5f,0xd9,0xee,0x58,0x4f,0xf7,0xf0,0x75,0x08,0x0b,0xbf,0x3c,0xff,0x4e,0x89,0x09,0x58,0x3d,0x0a,0xab,0xd2,0xdb,0x38,0xdd,0xe4,0x70,0x2f,0xb6,0x82,0xd1,0x0b,0x05,0xe8,0x3e,0x2f,0x0b,0x02,0xd8,0xaa,0x16,0x15,0xd0,0x08,0xc9,0xb0,0x80,0x0d,0x37,0x89,0xf6,0xcd,0x42,0xec,0x34,0x81,0x1b,0x3d,0x41,0xdf,0x3c,0xe7,0x10,0x4c,0x6e,0x44,0x42,0x12,0x76,0x43,0xbe,0x17,0x69,0xcc,0x73,0xd6,0xef,0xab,0xf8,0xda,0xc2,0xc9,0xee,0xf2,0xba,0x51,0x6e,0x47,0x36,0x9a,0x08,0xf0,0x29,0xc0,0xe0,0xdc,0xc4,0x01,0xc3,0x84,0x48,0x85,0x01,0x34,0xae,0x81,0xde,0x5b,0x57,0x77,0x0d,0x19,0x51,0x73,0x1f,0x21,0x5c,0xc8,0xa4,0xbf,0xee,0xb7,0x2c,0x64,0x4b,0xa7,0xab,0xd1,0x6b,0x96,0x20,0x21,0xa4,0x01,0x1f,0x70,0xd1,0x19,0x52,0xc9,0x71,0x17,0x60,0x40,0xe1,0xde,0x77,0x8b,0x9b,0xb1,0x7b,0x50,0x03,0x44,0xa8,0x36,0x85,0x62,0xac,0xed,0x61,0xd3,0xfc,0x36,0xf1,0xeb,0xc1,0x07,0x6a,0x3d,0xd5,0x57,0x97,0xaa,0x4d,0x0d,0x68,0x0f,0x82,0x7d,0x46,0xc0,0x7d,0xd0,0x26,0xbd,0xa1,0x5c,0x16,0xf7,0xb7,0x0b,0x14,0x50,0x77,0xe1,0x3d,0x4a,0xf9,0x61,0x5f,0x03,0xc3,0x1e,0x3c,0x59,0x81,0x3b,0x5c,0x2f,0xc9,0xe4,0xd8,0x96,0x1c,0x69,0xa6,0x11,0xc3,0xcb,0x3a,0x05,0xb0,0x41,0x40,0x9f,0x97,0xe8,0x81,0xc1,0x2d,0x63,0xb8,0x82,0x84,0xa1,0xda,0x86,0x13,0xec,0xdf,0x1b,0x96,0xcb,0x2f,0x12,0x1e,0xab,0xc8,0x7a,0x2e,0xe0,0x62,0x7c,0x1f,0xac,0xd7,0x52,0x94,0x35,0x34,0x83,0x51,0xf1,0xbd,0xe9,0x06,0x71,0xea,0x71,0x90,0x9d,0xc9,0x8f,0xf0,0x04,0x73,0x84,0x3d,0xf0,0x04,0x21,0x09,0x83,0x78,0x62,0x44,0x79,0xae,0x92,0xe4,0x71,0x19,0x73,0x35,0x8e,0x9f,0xfe,0x98,0x07,0x80,0x03,0x11,0xd2,0xab,0xa4,0x78,0xb5,0x9d,0xf6,0x8e,0xb5,0x1f,0x94,0xd6,0x71,0xba,0x82,0xc5,0x52,0x01,0x2a,0x66,0x2c,0x68,0x31,0x32,0x9d,0x46,0x53,0xb4,0xba,0x4b,0xbd,0xec,0x89,0x94,0xf6,0x34,0x68,0x1d,0xcd,0x6a,0x9f,0x01,0xf3,0x88,0xdb,0x66,0x76,0xc2,0xc9,0x09,0x36,0x96,0x7f,0xda,0x52,0xb1,0x0c,0xd1,0x62,0x98,0x9d,0xff,0xb0,0xa5,0xd1,0xf2,0x93,0x77,0xbb,0xf7,0x3a,0xd1,0xd5,0xa1,0xa4,0x48,0xd8,0xd2,0x55,0xa1,0x93,0x01,0x13,0x76,0xb7,0x2a,0x5e,0x17,0x7e,0x42,0x64,0x4a,0x3e,0x79,0xa7,0x08,0xbe,0x27,0x21,0xec,0x5c,0xf2,0x35,0x5c,0x9b,0x2f,0x62,0x7e,0x01,0x5d,0x25,0xc9,0xa1,0x6e,0x7a,0xff,0xba,0xa9,0x95,0x3d,0xc1,0x03,0x51,0x11,0x59,0xde,0xa2,0x35,0x00,0x79,0x00,0x0a,0x6e,0x65,0xd0,0x34,0x52,0x60,0x03,0xd6,0xa7,0xb1,0x01,0xa9,0x13,0x51,0x03,0x44,0x1b,0xb5,0x8e,0xc1,0xca,0x4d,0x8d,0xe0,0x23,0xa0,0x1a,0x60,0xda,0x3c,0x48,0x36,0x35,0x02,0x9c,0x1a,0x0e,0x61,0x05,0x88,0xfb,0xe0,0xb2,0x1a,0xaa,0x23,0x28,0xb1,0x3d,0x6f,0x8f,0xbe,0x98,0x85,0xf7,0x4c,0x3c,0xc5,0x7c,0x6c,0x48,0x53,0x60,0xca,0x1d,0xa0,0xe9,0x5e,0x44,0xfa,0x12,0xff,0xe2,0xb2,0x93,0xfd,0xde,0x34,0x30,0x81,0x47,0x23,0x12,0x08,0x7a,0x03,0x1b,0x53,0xf8,0x63,0xcc,0x1a,0x36,0xa5,0xb0,0x4e,0x2b,0xb0,0x6a,0x82,0x9a,0x48,0x39,0x33,0xa9,0xf9,0x2d,0xc2,0x5b,0x44,0x7f,0xc7,0x16,0x83,0xb1,0x86,0xab,0xe6,0xb5,0x1a,0xf0,0x1b,0xd5,0x64,0x40,0xca,0x1d,0xf4,0x30,0x2a,0x5e,0xa2,0xce,0x74,0x05,0x4f,0xb5,0x19,0x9c,0xac,0x16,0x4d,0xf3,0xf8,0x73,0x94,0xf7,0x39,0x8c,0xc4,0x10,0x4e,0x8d,0x16,0x2b,0x1c,0x38,0xd1,0x62,0xf1,0xc9,0x38,0xa6,0x30,0xfe,0x86,0x82,0xc4,0x0a,0x28,0xfc,0xb0,0x3b,0x50,0x33,0xcf,0x20,0xbe,0xf0,0x94,0x00,0xc9,0xc0,0x9e,0xb4,0x81,0x8a,0x4a,0x7a,0x11,0xd3,0x15,0xc3,0x54,0x5d,0x16,0x1d,0xab,0xf9,0x5a,0x7f,0x2d,0x85,0xac,0x0b,0x09,0xb5,0x69,0x81,0xb7,0xf8,0x9a,0x42,0x38,0x1a,0xf6,0xee,0xc8,0x79,0x92,0xa0,0xe5,0x6a,0x30,0x38,0x7d,0x4c,0x77,0xff,0x1a,0xff,0xd2,0xcc,0x74,0x08,0x89,0x91,0xd1,0x84,0x9c,0x38,0x21,0x4b,0xeb,0x35,0xa1,0xa7,0x4e,0xe8,0xca,0x86,0x4d,0xf0,0xd3,0x5f,0x94,0x0d,0x9e,0x61,0x09,0x1f,0xbd,0xa5,0xfc,0x8b,0x8d,0xa9,0x2b,0x08,0xd2,0xf4,0x2d,0xfb,0x11,0x77,0xf9,0xa8,0xcc,0xa3,0xf1,0xf8,0x39,0x3c,0x0c,0x85,0x96,0x80,0xa8,0x6e,0xe5,0x43,0x00,0x36,0x6d,0x77,0x6b,0x3a,0xca,0x45,0x76,0x27,0xe4,0xf6,0x44,0x8f,0xe1,0xa4,0x10,0x4e,0x3b,0xc3,0xb7,0xd4,0x83,0x78,0xae,0x8f,0x15,0x5a,0x44,0x42,0x1e,0x45,0x77,0x89,0xa2,0x86,0x8c,0x3e,0x50,0x0a,0x83,0x88,0x31,0xa3,0xf9,0x46,0xb0,0x9f,0x30,0x68,0x0c,0x2d,0xa8,0x05,0xf1,0xb1,0x36,0x7b,0x17,0x19,0xed,0xee,0xa8,0x3d,0xfc,0x0f,0xda,0x8b,0x44,0xf6,0xd1,0xe5,0x4e,0xa0,0xcc,0xa6,0x85,0xc6,0x54,0x0e,0x3f,0x9c,0xb2,0x1a,0xc3,0xad,0x25,0xfa,0x23,0x39,0xd3,0x3f,0x0b,0xca,0xf0,0xdb,0x31,0x09,0xff,0x17,0xb9,0x9c,0x43,0xf1,0xf8,0x70,0xf8,0x00,0x82,0x39,0x75,0x7c,0x42,0x50,0x0b,0xdd,0x6b,0x0d,0x3d,0x5f,0x7c,0x8e,0x05,0x33,0xbd,0x7b,0xf8,0x0d,0x13,0xe6,0x56,0xd7,0x25,0x38,0x00,0x00 6 | }; 7 | 8 | 9 | //File: index_ov3660.html.gz, Size: 4408 10 | #define index_ov3660_html_gz_len 4408 11 | const uint8_t index_ov3660_html_gz[] = { 12 | 0x1F, 0x8B, 0x08, 0x08, 0x28, 0x5C, 0xAE, 0x5C, 0x00, 0x03, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x5F, 13 | 0x6F, 0x76, 0x33, 0x36, 0x36, 0x30, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x00, 0xE5, 0x5D, 0xEB, 0x92, 14 | 0xD3, 0xC6, 0x12, 0xFE, 0xCF, 0x53, 0x08, 0x41, 0x58, 0x6F, 0x65, 0xED, 0xF5, 0x6D, 0xCD, 0xE2, 15 | 0xD8, 0xE6, 0xC0, 0xB2, 0x84, 0x54, 0x01, 0x49, 0x20, 0x21, 0xA9, 0x4A, 0xA5, 0x60, 0x2C, 0x8D, 16 | 0xED, 0x09, 0xB2, 0xE4, 0x48, 0x23, 0x7B, 0x37, 0xD4, 0x3E, 0xC7, 0x79, 0xA0, 0xF3, 0x62, 0xA7, 17 | 0xE7, 0x22, 0x69, 0x24, 0x8F, 0x2E, 0xB6, 0x59, 0x9B, 0xC3, 0x31, 0x55, 0x20, 0x5B, 0xD3, 0x3D, 18 | 0xDD, 0xFD, 0xF5, 0x6D, 0x46, 0x17, 0x06, 0x77, 0x6D, 0xCF, 0xA2, 0xD7, 0x0B, 0x6C, 0xCC, 0xE8, 19 | 0xDC, 0x19, 0xDD, 0x19, 0x88, 0x7F, 0x0C, 0xF8, 0x0C, 0x66, 0x18, 0xD9, 0xE2, 0x90, 0x7F, 0x9D, 20 | 0x63, 0x8A, 0x0C, 0x6B, 0x86, 0xFC, 0x00, 0xD3, 0xA1, 0x19, 0xD2, 0x49, 0xFD, 0xDC, 0xCC, 0x9E, 21 | 0x76, 0xD1, 0x1C, 0x0F, 0xCD, 0x25, 0xC1, 0xAB, 0x85, 0xE7, 0x53, 0xD3, 0xB0, 0x3C, 0x97, 0x62, 22 | 0x17, 0x86, 0xAF, 0x88, 0x4D, 0x67, 0x43, 0x1B, 0x2F, 0x89, 0x85, 0xEB, 0xFC, 0xCB, 0x09, 0x71, 23 | 0x09, 0x25, 0xC8, 0xA9, 0x07, 0x16, 0x72, 0xF0, 0xB0, 0xA5, 0xF2, 0xA2, 0x84, 0x3A, 0x78, 0x74, 24 | 0xF9, 0xF6, 0xA7, 0x4E, 0xDB, 0xF8, 0xF1, 0x5D, 0xA7, 0xD7, 0x6B, 0x0E, 0x4E, 0xC5, 0x6F, 0xC9, 25 | 0x98, 0x80, 0x5E, 0xAB, 0xDF, 0xD9, 0x67, 0xEC, 0xD9, 0xD7, 0xC6, 0xA7, 0xD4, 0x4F, 0xEC, 0x33, 26 | 0x01, 0x21, 0xEA, 0x13, 0x34, 0x27, 0xCE, 0x75, 0xDF, 0x78, 0xE2, 0xC3, 0x9C, 0x27, 0x2F, 0xB0, 27 | 0xB3, 0xC4, 0x94, 0x58, 0xE8, 0x24, 0x40, 0x6E, 0x50, 0x0F, 0xB0, 0x4F, 0x26, 0xDF, 0xAD, 0x11, 28 | 0x8E, 0x91, 0xF5, 0x71, 0xEA, 0x7B, 0xA1, 0x6B, 0xF7, 0x8D, 0x7B, 0xAD, 0x73, 0xF6, 0x67, 0x7D, 29 | 0x90, 0xE5, 0x39, 0x9E, 0x0F, 0xE7, 0x2F, 0x9F, 0xB3, 0x3F, 0xEB, 0xE7, 0xF9, 0xEC, 0x01, 0xF9, 30 | 0x07, 0xF7, 0x8D, 0x56, 0x6F, 0x71, 0x95, 0x3A, 0x7F, 0x73, 0x27, 0xF5, 0x75, 0xD6, 0xCE, 0x93, 31 | 0x5E, 0xD2, 0x9F, 0x17, 0xD3, 0x07, 0xD8, 0xA2, 0xC4, 0x73, 0x1B, 0x73, 0x44, 0x5C, 0x0D, 0x27, 32 | 0x9B, 0x04, 0x0B, 0x07, 0x81, 0x0D, 0x26, 0x0E, 0x2E, 0xE4, 0x73, 0x6F, 0x8E, 0xDD, 0xF0, 0xA4, 33 | 0x84, 0x1B, 0x63, 0x52, 0xB7, 0x89, 0x2F, 0x46, 0xF5, 0x99, 0x1D, 0xC2, 0xB9, 0x5B, 0xCA, 0xB6, 34 | 0x48, 0x2E, 0xD7, 0x73, 0xB1, 0xC6, 0x80, 0x6C, 0xA2, 0x95, 0x8F, 0x16, 0x6C, 0x00, 0xFB, 0x77, 35 | 0x7D, 0xC8, 0x9C, 0xB8, 0xC2, 0xA9, 0xFA, 0x46, 0xA7, 0xDB, 0x5C, 0x5C, 0x95, 0x40, 0xD9, 0xE9, 36 | 0xB1, 0x3F, 0xEB, 0x83, 0x16, 0xC8, 0xB6, 0x89, 0x3B, 0xED, 0x1B, 0xE7, 0x5A, 0x16, 0x9E, 0x6F, 37 | 0x63, 0xBF, 0xEE, 0x23, 0x9B, 0x84, 0x41, 0xDF, 0xE8, 0xEA, 0xC6, 0xCC, 0x91, 0x3F, 0x05, 0x59, 38 | 0xA8, 0x07, 0xC2, 0xD6, 0x5B, 0x5A, 0x49, 0xE4, 0x10, 0x9F, 0x4C, 0x67, 0x14, 0x20, 0x5D, 0x1B, 39 | 0x93, 0x35, 0x9A, 0x0C, 0xA1, 0x32, 0x3C, 0x0B, 0xED, 0xA6, 0xB7, 0x1A, 0x72, 0xC8, 0xD4, 0xAD, 40 | 0x13, 0x8A, 0xE7, 0xA0, 0x4E, 0x40, 0x7D, 0x4C, 0xAD, 0x59, 0x91, 0x28, 0x13, 0x32, 0x0D, 0x7D, 41 | 0xAC, 0x11, 0x24, 0xB6, 0x5B, 0x81, 0xC2, 0x70, 0x72, 0xFD, 0x54, 0x7D, 0x85, 0xC7, 0x1F, 0x09, 42 | 0xAD, 0x4B, 0x9B, 0x8C, 0xF1, 0xC4, 0xF3, 0xB1, 0x76, 0x64, 0x34, 0xC2, 0xF1, 0xAC, 0x8F, 0xF5, 43 | 0x80, 0x22, 0x9F, 0x56, 0x61, 0x88, 0x26, 0x14, 0xFB, 0xE5, 0xFC, 0x30, 0xF3, 0x8A, 0x72, 0x6E, 44 | 0xF9, 0xD3, 0xCA, 0x01, 0xC4, 0x75, 0x88, 0x8B, 0xAB, 0x8B, 0x97, 0x37, 0x6F, 0x9A, 0x9D, 0x18, 45 | 0x55, 0x01, 0x18, 0x32, 0x9F, 0x16, 0x79, 0x09, 0xD7, 0x75, 0x7D, 0x32, 0x19, 0x37, 0xAD, 0x66, 46 | 0xF3, 0x9B, 0xF5, 0x93, 0x33, 0x2C, 0xDC, 0x14, 0x85, 0xD4, 0xDB, 0x3D, 0x22, 0xD6, 0xC2, 0x2A, 47 | 0xA3, 0xC7, 0xBF, 0xE6, 0xD8, 0x26, 0xC8, 0xA8, 0x29, 0xE1, 0x7C, 0xDE, 0x04, 0x9F, 0x3A, 0x36, 48 | 0x90, 0x6B, 0x1B, 0x35, 0xCF, 0x27, 0x10, 0x08, 0x88, 0xA7, 0x1B, 0x07, 0x7E, 0x81, 0xC2, 0xB1, 49 | 0xC0, 0xC7, 0x1A, 0x95, 0x0B, 0x62, 0x46, 0xB5, 0x88, 0x3E, 0x6C, 0xD8, 0xA7, 0x42, 0xCA, 0x61, 50 | 0x9F, 0xD2, 0x00, 0xD2, 0xE8, 0xC8, 0xD9, 0x17, 0xE1, 0xA5, 0x4A, 0x98, 0x87, 0x19, 0xFB, 0xCC, 51 | 0xD1, 0x55, 0xBD, 0x10, 0xBB, 0x68, 0x50, 0x84, 0x21, 0x94, 0x59, 0xAB, 0x06, 0x43, 0x97, 0x33, 52 | 0xA3, 0x6E, 0xB0, 0x2C, 0x79, 0xAC, 0xA7, 0x91, 0x4C, 0xF5, 0x90, 0xB3, 0x8F, 0xEA, 0x14, 0x1B, 53 | 0xA8, 0xAB, 0x57, 0x35, 0xC9, 0x1D, 0xE2, 0x8F, 0xCE, 0x87, 0x84, 0x26, 0xB9, 0x59, 0x84, 0x7D, 54 | 0xAA, 0x67, 0x92, 0x84, 0x59, 0x69, 0x36, 0xD1, 0x30, 0xCE, 0xCF, 0x28, 0x6B, 0x7C, 0xF3, 0xA2, 55 | 0x5B, 0xC3, 0xB5, 0x58, 0x84, 0xAA, 0xD9, 0x45, 0xC3, 0xB8, 0x48, 0x86, 0xD2, 0x2C, 0xC3, 0x3E, 56 | 0x37, 0x15, 0xFA, 0x8D, 0x7B, 0xE3, 0x90, 0x52, 0xCF, 0x0D, 0x76, 0x2A, 0x51, 0x79, 0x71, 0xF6, 57 | 0x57, 0x18, 0x50, 0x32, 0xB9, 0xAE, 0xCB, 0x90, 0x86, 0x38, 0x5B, 0x20, 0x68, 0x21, 0xC7, 0x98, 58 | 0xAE, 0x30, 0x2E, 0x6E, 0x37, 0x5C, 0xB4, 0x84, 0xBC, 0x33, 0x9D, 0x3A, 0x3A, 0xDF, 0xB3, 0x42, 59 | 0x3F, 0x60, 0x7D, 0xDB, 0xC2, 0x23, 0xC0, 0xD8, 0x5F, 0x9F, 0x38, 0x1D, 0x83, 0x15, 0x27, 0xAA, 60 | 0x5B, 0x63, 0xCD, 0x5C, 0x5E, 0x48, 0x99, 0x8D, 0xB5, 0x48, 0x78, 0xA0, 0x0E, 0xA1, 0xD7, 0xDA, 61 | 0x73, 0x32, 0x12, 0x35, 0x67, 0xA2, 0x10, 0x2C, 0x2C, 0x0B, 0x69, 0xB9, 0xFA, 0xD6, 0x0C, 0x5B, 62 | 0x1F, 0xB1, 0xFD, 0x6D, 0x69, 0x1B, 0x56, 0xD6, 0x1E, 0x36, 0x88, 0xBB, 0x08, 0x69, 0x9D, 0xB5, 63 | 0x53, 0x8B, 0x5B, 0xC1, 0x9C, 0x3B, 0x64, 0xA4, 0x62, 0xBB, 0x5D, 0xD4, 0x54, 0x9C, 0x2D, 0xAE, 64 | 0x8A, 0x8D, 0xA0, 0x0A, 0x3B, 0x72, 0xD0, 0x18, 0x3B, 0x45, 0x22, 0xCB, 0x60, 0xC8, 0x49, 0xBB, 65 | 0x32, 0x57, 0xE5, 0xF7, 0x6E, 0x5C, 0xB2, 0xA4, 0x78, 0x75, 0x1F, 0x7E, 0x53, 0xD9, 0x8E, 0xFC, 66 | 0xF8, 0x24, 0xF5, 0x53, 0x80, 0x1D, 0x08, 0xB0, 0xBC, 0xD6, 0x1B, 0xC6, 0xAC, 0x40, 0x86, 0xC2, 67 | 0x09, 0x7C, 0xE4, 0x4E, 0x31, 0xE4, 0x82, 0xAB, 0x93, 0xE8, 0xB0, 0x78, 0x61, 0x50, 0x49, 0x7D, 68 | 0x96, 0xAA, 0xCF, 0x8A, 0x17, 0x22, 0x22, 0x21, 0x6C, 0xD1, 0x8C, 0x28, 0xB0, 0x16, 0xCE, 0xDF, 69 | 0xD2, 0x3A, 0x85, 0xE8, 0x47, 0xB4, 0x01, 0x93, 0x76, 0x29, 0x6D, 0x7F, 0x5F, 0x9A, 0x11, 0xA2, 70 | 0x95, 0xDE, 0x64, 0x52, 0xB6, 0x56, 0x9C, 0x4C, 0x3A, 0xCD, 0x4E, 0xB7, 0xB4, 0x61, 0xD2, 0x6A, 71 | 0x99, 0x59, 0x2F, 0x6A, 0x32, 0x46, 0x9C, 0x4D, 0xCA, 0x21, 0xE8, 0xCF, 0xBC, 0x25, 0xF6, 0x35, 72 | 0x40, 0x64, 0xC4, 0xED, 0x3E, 0xEA, 0xDA, 0x15, 0xB8, 0x21, 0xC8, 0xF7, 0x4B, 0x5D, 0x36, 0x4D, 73 | 0xB3, 0x6B, 0xB7, 0xAC, 0x76, 0xA1, 0x63, 0x0A, 0x76, 0x0D, 0xF0, 0x06, 0x34, 0x76, 0xB0, 0x5D, 74 | 0x90, 0x9E, 0x6D, 0x3C, 0x41, 0xA1, 0x43, 0x4B, 0xEC, 0x8D, 0x9A, 0xEC, 0x4F, 0xD1, 0x8C, 0x3C, 75 | 0xAE, 0xFE, 0x60, 0x1B, 0x1D, 0x43, 0x1E, 0x09, 0x7F, 0x6A, 0xE6, 0x8C, 0x6A, 0x27, 0x5A, 0x2C, 76 | 0x30, 0x82, 0x51, 0x16, 0xCE, 0x5B, 0x92, 0x56, 0xEA, 0x99, 0xF5, 0x89, 0xAB, 0xD2, 0x42, 0xB4, 77 | 0xD4, 0x15, 0xE3, 0x6E, 0x68, 0x23, 0x9D, 0xFB, 0x13, 0xCF, 0x0A, 0x75, 0x65, 0xBA, 0x9A, 0x4B, 78 | 0xAD, 0xF3, 0xEB, 0x47, 0x26, 0x0B, 0x1C, 0xC2, 0x1D, 0x3B, 0x74, 0x5D, 0x86, 0x68, 0x9D, 0xFA, 79 | 0xA0, 0xA6, 0x66, 0xA2, 0x6A, 0x86, 0xDB, 0x2A, 0x3A, 0x53, 0x86, 0xCD, 0xDB, 0x8C, 0xC9, 0x04, 80 | 0xA0, 0x26, 0x51, 0xC4, 0x39, 0xC4, 0x08, 0x3C, 0x50, 0x2A, 0x62, 0xB5, 0x9B, 0x5D, 0xE8, 0x2C, 81 | 0x9C, 0xEB, 0x1A, 0x83, 0x68, 0xB2, 0x16, 0x54, 0x31, 0x31, 0x9D, 0x3F, 0x1D, 0xA3, 0x5A, 0xF3, 82 | 0xA4, 0x79, 0xD2, 0x81, 0xBF, 0x34, 0x0D, 0x7A, 0xB1, 0x73, 0x49, 0xF3, 0xE6, 0x78, 0x5E, 0x26, 83 | 0xF9, 0x94, 0xEF, 0x93, 0xE4, 0xA5, 0xB1, 0x52, 0x2C, 0xAA, 0x47, 0x52, 0x7A, 0xC3, 0xA4, 0xD5, 84 | 0x28, 0x29, 0x2C, 0x39, 0x2E, 0xBD, 0xB9, 0x23, 0x6A, 0xBC, 0x65, 0x53, 0x88, 0xE7, 0xDE, 0x3F, 85 | 0x75, 0x51, 0x55, 0xFF, 0xEF, 0xBD, 0x5D, 0x31, 0xC5, 0x57, 0xED, 0xE9, 0x1B, 0xDB, 0x25, 0x38, 86 | 0xB4, 0x6F, 0x34, 0xF3, 0x51, 0xAF, 0xCB, 0x7E, 0x06, 0x24, 0x74, 0x61, 0x51, 0xE5, 0xC3, 0xEA, 87 | 0x2A, 0xB7, 0xE7, 0x51, 0xC6, 0x6C, 0x61, 0x83, 0x09, 0x71, 0x9C, 0xBA, 0xE3, 0xAD, 0xCA, 0x3B, 88 | 0x91, 0x62, 0x4F, 0x5E, 0xF3, 0xD3, 0x72, 0x97, 0xDF, 0x56, 0xDA, 0x10, 0x32, 0xD7, 0xFF, 0x84, 89 | 0xB4, 0x5F, 0x77, 0xC0, 0x15, 0x86, 0xC6, 0x76, 0x85, 0x62, 0x0B, 0x7F, 0xDC, 0x6D, 0xA2, 0x4A, 90 | 0xAE, 0x24, 0x3A, 0xC1, 0xC2, 0xC5, 0x5C, 0xB0, 0x22, 0xD4, 0x9A, 0x6D, 0xB1, 0xA8, 0x5A, 0x78, 91 | 0x01, 0x11, 0xD7, 0x68, 0x7C, 0xEC, 0x20, 0xD6, 0xC1, 0x6F, 0xB5, 0xE4, 0x2E, 0x5D, 0x98, 0xA8, 92 | 0xE4, 0x55, 0x34, 0xE1, 0xA6, 0xFB, 0x72, 0xB6, 0x4B, 0x1A, 0xA2, 0x77, 0xC8, 0xCF, 0xD5, 0x7A, 93 | 0xB7, 0x2E, 0x69, 0xF7, 0xD3, 0x91, 0xA1, 0x1F, 0xB4, 0x41, 0x46, 0x8F, 0x92, 0xF6, 0xD4, 0xC7, 94 | 0xD7, 0x15, 0x94, 0x39, 0x91, 0xFF, 0xF6, 0xC5, 0x86, 0xE8, 0xF6, 0x6B, 0x7F, 0x5E, 0x00, 0xA4, 95 | 0x17, 0x35, 0xBA, 0x41, 0x85, 0xA9, 0xF3, 0xA7, 0xAC, 0xE2, 0x8F, 0xF1, 0x76, 0x9F, 0x69, 0x56, 96 | 0x48, 0x37, 0x05, 0x25, 0x54, 0xEF, 0xAA, 0x51, 0xF5, 0xD5, 0x9E, 0x74, 0xF0, 0x84, 0xE6, 0x5C, 97 | 0xCD, 0xE0, 0x7D, 0x6A, 0xA7, 0x38, 0xBB, 0xD5, 0x95, 0x7D, 0x82, 0xD2, 0xCC, 0x11, 0xEF, 0xCA, 98 | 0xE5, 0x7B, 0x9F, 0x96, 0x33, 0xCB, 0x9E, 0x1B, 0x33, 0xCF, 0x87, 0x24, 0x6A, 0x9F, 0x39, 0xCC, 99 | 0x30, 0x66, 0x2E, 0x4B, 0x3E, 0xC0, 0x83, 0x7F, 0xAF, 0xB5, 0x7B, 0xDA, 0x8B, 0x05, 0x05, 0x83, 100 | 0x8B, 0x44, 0xCB, 0xDD, 0xD6, 0x5A, 0x2F, 0x59, 0xB9, 0x0B, 0x64, 0x35, 0x17, 0x69, 0x81, 0x2A, 101 | 0x8E, 0xCA, 0xA2, 0x0C, 0xB3, 0xBE, 0x47, 0x53, 0xE8, 0xEC, 0x64, 0x8E, 0xA0, 0xED, 0x65, 0xEE, 102 | 0x8A, 0x80, 0xA3, 0x0E, 0xBF, 0x2A, 0xEE, 0xAE, 0x6C, 0x1A, 0xB6, 0x7A, 0xCD, 0x92, 0x29, 0x2D, 103 | 0xC7, 0x0B, 0x8A, 0xE3, 0x0A, 0x8D, 0xC1, 0x7E, 0x21, 0xD5, 0x4C, 0x24, 0xB7, 0x2E, 0xB5, 0x3B, 104 | 0x4F, 0xDC, 0xB9, 0xB5, 0x67, 0x2A, 0x95, 0xEE, 0xC2, 0x98, 0x2A, 0x0E, 0xC7, 0x8C, 0xCD, 0x5B, 105 | 0x4D, 0x6D, 0xA6, 0x2D, 0xDC, 0x7F, 0xA3, 0xF8, 0x0A, 0xD6, 0x9B, 0xEC, 0x82, 0x5C, 0xDF, 0xB0, 106 | 0xB0, 0x3E, 0x8D, 0xA6, 0x8A, 0x5C, 0xAB, 0xCA, 0x26, 0x60, 0x21, 0x0E, 0x33, 0x62, 0xDB, 0xB8, 107 | 0x70, 0x97, 0x93, 0xAD, 0x79, 0x2B, 0x36, 0x0F, 0x4C, 0x7E, 0xDD, 0xA6, 0xD4, 0xAD, 0x04, 0x45, 108 | 0xE1, 0x75, 0xFA, 0xD6, 0x6D, 0x47, 0x8C, 0x2C, 0x34, 0x79, 0x7B, 0xC4, 0xE9, 0x56, 0xA4, 0x50, 109 | 0x54, 0x6D, 0x70, 0xC7, 0xDB, 0xC4, 0xCC, 0x64, 0x60, 0x07, 0x36, 0x6A, 0x3D, 0x9B, 0x2B, 0x52, 110 | 0x0D, 0x4E, 0x95, 0x7B, 0x89, 0x06, 0xA7, 0xC9, 0x6D, 0x4F, 0x03, 0x76, 0x43, 0x91, 0x7A, 0xCB, 111 | 0x91, 0xB8, 0xDE, 0x65, 0x58, 0x0E, 0x0A, 0x82, 0xA1, 0xC9, 0x6E, 0x8C, 0x31, 0xD3, 0x77, 0x20, 112 | 0x0D, 0x6C, 0xB2, 0x34, 0x88, 0x3D, 0x34, 0x1D, 0x6F, 0xEA, 0x65, 0xCE, 0xF1, 0xF3, 0xE2, 0x0A, 113 | 0x04, 0x24, 0xCD, 0xA1, 0x99, 0xBA, 0x3A, 0x63, 0x72, 0xAA, 0xE4, 0x27, 0x73, 0xF4, 0xE0, 0xDE, 114 | 0xA3, 0x87, 0x0F, 0x7B, 0xDF, 0x3D, 0x70, 0xC7, 0xC1, 0x42, 0xFE, 0xFD, 0x8B, 0xB8, 0x98, 0x25, 115 | 0xEE, 0x88, 0x82, 0x3C, 0x4A, 0x29, 0xE8, 0x19, 0x0C, 0x4E, 0x39, 0xD3, 0x8C, 0x20, 0xA7, 0x20, 116 | 0x49, 0x8E, 0x6C, 0xB2, 0xB6, 0xEA, 0xC4, 0x8B, 0x86, 0x04, 0x50, 0x2E, 0xC6, 0xC8, 0xD7, 0x0C, 117 | 0xE1, 0xC3, 0x44, 0xE7, 0xC6, 0xFD, 0xD6, 0xE4, 0x35, 0x66, 0xEC, 0x5D, 0x65, 0x35, 0xE0, 0x4A, 118 | 0xC9, 0x02, 0x24, 0x47, 0x61, 0x3B, 0x8F, 0x21, 0x90, 0x71, 0x72, 0x76, 0x69, 0x2A, 0x67, 0x4C, 119 | 0x2C, 0x9F, 0xB4, 0xBE, 0x72, 0xA5, 0x44, 0x4C, 0x3D, 0xF1, 0xD1, 0x1C, 0x33, 0xF7, 0x97, 0x3F, 120 | 0xE6, 0xB3, 0xC9, 0x22, 0x11, 0x53, 0x9A, 0xA3, 0x37, 0x98, 0x67, 0x4E, 0x40, 0x59, 0x6B, 0xD6, 121 | 0x35, 0x2E, 0xB2, 0x98, 0xA5, 0xE6, 0x37, 0x23, 0x11, 0xE5, 0xE6, 0x75, 0x1D, 0x71, 0xB7, 0x29, 122 | 0x11, 0x88, 0xB3, 0xF3, 0x16, 0xDC, 0xC1, 0x96, 0xC8, 0x09, 0xC1, 0xB4, 0xAD, 0x96, 0x39, 0xFA, 123 | 0xF9, 0xF7, 0xEF, 0x9F, 0xD4, 0xDA, 0xCD, 0xEE, 0xF9, 0x55, 0xEB, 0xAC, 0xD7, 0x3D, 0x1E, 0x9C, 124 | 0x8A, 0x21, 0x9B, 0xF3, 0x6A, 0x9A, 0xA3, 0x5F, 0x19, 0x2F, 0xA8, 0x2F, 0xCD, 0xAB, 0x56, 0xBB, 125 | 0xD9, 0xDC, 0x9E, 0xD7, 0x23, 0x73, 0xF4, 0x96, 0xB3, 0x6A, 0x9F, 0x03, 0xAB, 0x66, 0x7B, 0x07, 126 | 0xB1, 0xCE, 0xCD, 0x11, 0xE7, 0x04, 0x4C, 0xAE, 0x1E, 0xF6, 0xCE, 0xB7, 0x67, 0xF4, 0x10, 0x64, 127 | 0x7A, 0x07, 0x9C, 0xCE, 0x41, 0xBB, 0xDE, 0x2E, 0xCA, 0xF5, 0xCC, 0x11, 0xE3, 0xD3, 0xEB, 0x36, 128 | 0xAF, 0xBA, 0xE7, 0x3B, 0xF0, 0x39, 0x33, 0x65, 0xA7, 0xC3, 0xDC, 0x3F, 0x3A, 0x32, 0x47, 0x17, 129 | 0x3F, 0x3C, 0xAF, 0x75, 0x41, 0xC6, 0xF6, 0xA3, 0xDE, 0xF6, 0xBC, 0xBB, 0xE0, 0x17, 0x4C, 0xC8, 130 | 0x4E, 0x1B, 0x18, 0x75, 0x77, 0x10, 0xB2, 0x63, 0x8E, 0x5E, 0x70, 0x4E, 0xC0, 0xE5, 0xAA, 0xF5, 131 | 0x70, 0x07, 0x91, 0xC0, 0xBD, 0x7E, 0xE6, 0x9C, 0xC0, 0xBF, 0x98, 0x7B, 0x55, 0xE4, 0x04, 0xB9, 132 | 0x97, 0x9B, 0xA6, 0x20, 0xE6, 0xD7, 0x33, 0x59, 0xEA, 0x74, 0x51, 0x4A, 0xF8, 0x3B, 0x84, 0x8E, 133 | 0x80, 0x5E, 0x6F, 0x9C, 0x10, 0x24, 0x1D, 0xA8, 0x24, 0x0E, 0xAA, 0xE5, 0x02, 0x45, 0x92, 0xF8, 134 | 0x6A, 0xAB, 0x39, 0xEA, 0x96, 0x28, 0xC0, 0x49, 0xD5, 0x84, 0xCA, 0x69, 0x53, 0xF2, 0x9B, 0xAC, 135 | 0x3F, 0x64, 0xA8, 0xB3, 0xFB, 0x79, 0xC0, 0x43, 0x3B, 0xA6, 0x12, 0xD5, 0x5B, 0x25, 0x1B, 0x8D, 136 | 0xAC, 0xE8, 0xCA, 0x1C, 0xF5, 0x3A, 0x65, 0xD6, 0xDE, 0x01, 0x8C, 0x31, 0xEF, 0x3D, 0x5D, 0x1C, 137 | 0x04, 0x1B, 0xE3, 0x91, 0x90, 0x9A, 0xA3, 0xA7, 0xF1, 0xF1, 0x2E, 0xA8, 0xD4, 0xCB, 0x34, 0xE5, 138 | 0xB4, 0x39, 0xB0, 0x28, 0xE2, 0x08, 0x64, 0xEA, 0x1D, 0x09, 0x4D, 0x82, 0xCC, 0xE7, 0x05, 0xE6, 139 | 0x36, 0x71, 0x61, 0xED, 0x80, 0x8F, 0x02, 0xBA, 0x31, 0x2A, 0x11, 0x21, 0x24, 0x35, 0x79, 0x74, 140 | 0x30, 0x44, 0x62, 0x51, 0xBE, 0x02, 0x3C, 0x02, 0x44, 0x43, 0x9F, 0xDF, 0xE5, 0xB8, 0x31, 0x22, 141 | 0x09, 0x29, 0x54, 0xC3, 0xF8, 0x78, 0x27, 0x54, 0x76, 0x49, 0x5F, 0x8A, 0x38, 0x12, 0x97, 0x28, 142 | 0x85, 0x75, 0x6F, 0x09, 0x97, 0x32, 0x69, 0x77, 0xC2, 0x65, 0x86, 0xFC, 0xC5, 0x56, 0xE9, 0x2B, 143 | 0xA6, 0x04, 0x54, 0xA2, 0xC3, 0x83, 0x85, 0x4A, 0x22, 0xCC, 0x57, 0x10, 0x2B, 0xB0, 0xFE, 0xF6, 144 | 0x48, 0xB0, 0x79, 0xC7, 0x2F, 0xE9, 0xCC, 0xD1, 0x33, 0x5C, 0x7F, 0xCD, 0x8E, 0x76, 0x81, 0xE3, 145 | 0x49, 0x48, 0xBD, 0x1D, 0x00, 0x89, 0x64, 0x11, 0x70, 0x34, 0x25, 0x1A, 0xE7, 0xB7, 0x84, 0xC6, 146 | 0xF9, 0x2D, 0xA2, 0x81, 0xF0, 0x7B, 0x07, 0x2F, 0xB1, 0xB3, 0x31, 0x1C, 0x11, 0xA1, 0x39, 0xBA, 147 | 0xBC, 0x5A, 0x78, 0x01, 0xBB, 0x5B, 0xF8, 0x25, 0xFB, 0xBE, 0x53, 0x90, 0x9C, 0xED, 0x80, 0x49, 148 | 0x2C, 0x90, 0x8C, 0x91, 0x33, 0x89, 0xCA, 0xD9, 0x2D, 0xA1, 0x52, 0x26, 0xEB, 0x2E, 0xA8, 0x4C, 149 | 0x11, 0x71, 0x2D, 0x4C, 0x1C, 0x76, 0xE7, 0xE2, 0xA6, 0xC0, 0x28, 0xB4, 0xE6, 0xE8, 0xFB, 0xE4, 150 | 0xCB, 0x2E, 0xC0, 0x34, 0x77, 0xC0, 0x45, 0x95, 0x27, 0x1D, 0x2F, 0x67, 0xB0, 0x58, 0xBE, 0x25, 151 | 0x6C, 0x5A, 0xAD, 0xDB, 0xAC, 0x2A, 0x0B, 0x6C, 0x11, 0xE4, 0xBC, 0xC7, 0x93, 0x09, 0x2C, 0x83, 152 | 0x36, 0x2F, 0x2D, 0x29, 0x72, 0xA8, 0x2F, 0xE2, 0xBB, 0x71, 0xC9, 0xBF, 0x6F, 0xBC, 0x87, 0x91, 153 | 0x61, 0xF7, 0xB9, 0x36, 0x32, 0x9A, 0xFA, 0xB5, 0xF0, 0x6B, 0x2F, 0x96, 0x73, 0xDB, 0x5D, 0x0D, 154 | 0x60, 0x82, 0xA7, 0x7C, 0x53, 0x7D, 0x6B, 0x1E, 0x6D, 0xF0, 0x6C, 0x1F, 0x5D, 0xF3, 0xC7, 0x10, 155 | 0x77, 0x59, 0x48, 0xBF, 0xC1, 0xB6, 0xF1, 0x0B, 0x71, 0xB7, 0x57, 0xA6, 0xCB, 0x04, 0xC1, 0xD8, 156 | 0xDD, 0x8D, 0xCB, 0x19, 0x2C, 0x91, 0xE0, 0x60, 0x37, 0x26, 0x3D, 0xF0, 0x24, 0xBC, 0x20, 0xE8, 157 | 0x4B, 0x58, 0xC4, 0xA3, 0xD5, 0x78, 0xF3, 0x82, 0xB2, 0x1A, 0x43, 0x5D, 0xFE, 0xED, 0xA9, 0x71, 158 | 0xC9, 0x6F, 0x03, 0xDB, 0x38, 0x5D, 0x89, 0x2B, 0xD4, 0x55, 0x1C, 0x5D, 0x24, 0x2A, 0x29, 0xA7, 159 | 0xB9, 0xB6, 0x27, 0xAA, 0x0F, 0xA0, 0xAA, 0xFB, 0xA2, 0x1A, 0xF5, 0x22, 0x01, 0xF9, 0x05, 0x3D, 160 | 0x53, 0xD1, 0xB6, 0x9A, 0x8E, 0xB7, 0xD8, 0x8A, 0x59, 0xAB, 0xCD, 0xDB, 0x30, 0x6B, 0x05, 0x30, 161 | 0xD9, 0x4B, 0x76, 0x87, 0xA0, 0x6D, 0x00, 0x5E, 0x7B, 0x01, 0x8A, 0xCD, 0x7A, 0x18, 0xA0, 0xB8, 162 | 0xBE, 0x87, 0x06, 0x0A, 0xBC, 0xE5, 0x3D, 0xAB, 0xA3, 0xDB, 0x04, 0x15, 0x27, 0x34, 0x47, 0xAF, 163 | 0x90, 0x1B, 0x42, 0x91, 0xD9, 0x17, 0x60, 0xF1, 0xC4, 0x07, 0x0B, 0x2F, 0xA9, 0xF7, 0xA1, 0xA1, 164 | 0x03, 0x41, 0xE6, 0x9E, 0xBD, 0xF9, 0x72, 0x47, 0xD2, 0x89, 0x94, 0xF8, 0x0A, 0x8E, 0x36, 0x6E, 165 | 0x0C, 0x22, 0x0E, 0xB7, 0xDC, 0x11, 0x88, 0xA5, 0xD4, 0xF6, 0xCD, 0xC0, 0xDB, 0xD0, 0x75, 0xAF, 166 | 0x77, 0xE9, 0x04, 0x2E, 0x1C, 0x2F, 0xB4, 0xB7, 0xE7, 0x00, 0x6D, 0xC0, 0x8F, 0x93, 0x09, 0xB1, 167 | 0xB6, 0x6F, 0x24, 0xA0, 0x09, 0x78, 0xE1, 0xCD, 0x2B, 0xD2, 0xDF, 0x72, 0xE1, 0xC5, 0xD6, 0x16, 168 | 0x2B, 0x39, 0x0B, 0x50, 0xBC, 0xBC, 0xD8, 0x6B, 0xE1, 0x85, 0x39, 0x0F, 0x94, 0x19, 0x98, 0xB6, 169 | 0x87, 0x4E, 0x0A, 0x20, 0xC4, 0x7B, 0xEE, 0x3C, 0xDB, 0x80, 0x25, 0x28, 0xE3, 0x8C, 0x1E, 0x2D, 170 | 0xBF, 0x0F, 0xB5, 0xBE, 0x4B, 0x24, 0x4A, 0xAF, 0xEE, 0x5A, 0x67, 0x9D, 0x5E, 0xBC, 0xBC, 0xEB, 171 | 0xB4, 0x3F, 0xEF, 0x02, 0x8F, 0x31, 0xBF, 0x5D, 0x7C, 0xDA, 0xDB, 0x40, 0x03, 0xD9, 0xE8, 0x35, 172 | 0xBB, 0xCE, 0xB0, 0x41, 0xC2, 0xDE, 0x3D, 0x90, 0xDA, 0x87, 0x8B, 0xA4, 0xF6, 0x17, 0x10, 0x4A, 173 | 0xD3, 0x2D, 0x32, 0xDE, 0x94, 0x65, 0xBC, 0xEF, 0x2F, 0xF6, 0x83, 0xD0, 0xF4, 0x60, 0xA9, 0x6E, 174 | 0x7A, 0xD0, 0x54, 0x67, 0x88, 0x9B, 0xAD, 0x62, 0x98, 0xB6, 0xEC, 0x60, 0x25, 0xA1, 0xD8, 0xCB, 175 | 0xDA, 0x25, 0xC9, 0xB5, 0xAE, 0x76, 0xC9, 0x72, 0x91, 0x18, 0xE9, 0x24, 0xD7, 0x4B, 0xAE, 0x8A, 176 | 0x9C, 0x7D, 0xDE, 0xCB, 0xBA, 0xDD, 0x32, 0x69, 0x77, 0x09, 0x1A, 0x1F, 0xAD, 0xDE, 0x4F, 0xE7, 177 | 0x68, 0x63, 0x30, 0x24, 0x1D, 0x60, 0xF1, 0xEA, 0xC9, 0x3E, 0xDB, 0x85, 0x68, 0xDE, 0xC3, 0xC4, 178 | 0x51, 0xAC, 0xF5, 0xA1, 0x73, 0x9D, 0x83, 0xDD, 0xCD, 0x93, 0x1D, 0x23, 0x32, 0x47, 0x2F, 0xB1, 179 | 0x1B, 0x18, 0x17, 0x9E, 0x2F, 0xDF, 0xFD, 0xB4, 0x17, 0xD4, 0xF8, 0xCC, 0x87, 0x81, 0x4C, 0x28, 180 | 0x7D, 0x68, 0xBC, 0x66, 0x73, 0xE2, 0xFB, 0x9E, 0xBF, 0x31, 0x64, 0x92, 0x0E, 0x96, 0x15, 0xF5, 181 | 0x57, 0xFC, 0x68, 0x2F, 0x70, 0x45, 0xB3, 0x1E, 0x06, 0xB1, 0x58, 0xE7, 0x43, 0x83, 0xB6, 0x9C, 182 | 0x38, 0x64, 0xB1, 0x31, 0x64, 0x9C, 0xCA, 0x1C, 0xBD, 0xAB, 0x3F, 0x87, 0x7F, 0xF7, 0x02, 0x97, 183 | 0x98, 0xF1, 0x30, 0x60, 0x49, 0x6D, 0x0F, 0x0D, 0xD5, 0x78, 0xB1, 0x79, 0x3A, 0x04, 0x1A, 0x73, 184 | 0xF4, 0xF4, 0xA7, 0xFD, 0xF4, 0x7E, 0x6C, 0xB2, 0x8A, 0x08, 0xED, 0x84, 0x07, 0x57, 0xEA, 0xD0, 185 | 0x68, 0xAC, 0xB6, 0x40, 0x63, 0xC5, 0x04, 0xFF, 0x6D, 0x4F, 0x68, 0xAC, 0xAA, 0xA3, 0xF1, 0x99, 186 | 0xE3, 0x65, 0xF5, 0x25, 0xE0, 0xC3, 0x9F, 0xC5, 0x18, 0xA3, 0xCD, 0xCB, 0x51, 0x44, 0xC8, 0x6E, 187 | 0x1A, 0x83, 0x23, 0xE3, 0x29, 0xDA, 0x4F, 0x41, 0x8A, 0xE7, 0xDD, 0x47, 0x08, 0x25, 0x4A, 0x1E, 188 | 0x1A, 0xA7, 0x09, 0xB2, 0xF0, 0x7B, 0x1B, 0xD3, 0x6D, 0xAE, 0x2D, 0x2B, 0xB4, 0xE6, 0xE8, 0x39, 189 | 0x7C, 0x31, 0x9E, 0xF1, 0x2F, 0xFB, 0x6A, 0xF9, 0xD4, 0xF9, 0xF7, 0x81, 0x5A, 0x4A, 0xDF, 0x2F, 190 | 0x02, 0x38, 0x68, 0xB0, 0xBD, 0xA9, 0xBB, 0xD5, 0x23, 0x0D, 0x29, 0x72, 0x09, 0xDF, 0x1B, 0xF1, 191 | 0x7D, 0xBF, 0x00, 0x26, 0x42, 0xEC, 0x0D, 0x43, 0x45, 0xEF, 0x7D, 0xC0, 0x18, 0x3D, 0x16, 0xC4, 192 | 0x8B, 0xB4, 0x78, 0x15, 0x5E, 0x19, 0x52, 0xF2, 0xE1, 0x27, 0x7E, 0x4B, 0x0B, 0xA6, 0xF5, 0x80, 193 | 0x12, 0xC7, 0x81, 0x85, 0x30, 0xA6, 0xC6, 0x5B, 0x76, 0x38, 0x38, 0x15, 0x03, 0xAA, 0x73, 0x91, 194 | 0xCF, 0xDC, 0xB0, 0x97, 0x50, 0xA2, 0xB9, 0x39, 0x7A, 0xCB, 0x5E, 0x12, 0x08, 0xBC, 0xD8, 0xB7, 195 | 0xCD, 0x99, 0x71, 0x23, 0x62, 0xD7, 0xF7, 0x40, 0xA8, 0x18, 0x24, 0xF9, 0xAE, 0x26, 0xD3, 0x88, 196 | 0x8E, 0x94, 0xDF, 0x46, 0x97, 0x7C, 0xB0, 0xC1, 0xBC, 0xAC, 0x7C, 0x3A, 0x76, 0xD5, 0xC2, 0xCA, 197 | 0xBF, 0xB8, 0x31, 0x38, 0x75, 0x91, 0xC6, 0xDC, 0x39, 0x28, 0x0C, 0xC4, 0xDB, 0x25, 0x73, 0x58, 198 | 0xC5, 0xCF, 0x33, 0x71, 0x4B, 0x24, 0x8F, 0x69, 0xC6, 0x6A, 0x65, 0x1F, 0xDF, 0x94, 0xDB, 0x4C, 199 | 0xD5, 0x82, 0x96, 0x3F, 0x88, 0x29, 0xEB, 0x21, 0x3B, 0x8C, 0xCD, 0xFF, 0x9F, 0x7F, 0x97, 0xF9, 200 | 0x0C, 0x7B, 0xF7, 0x67, 0x22, 0x98, 0x69, 0x04, 0xBE, 0x35, 0x34, 0xF3, 0x9E, 0x8E, 0xCA, 0xD1, 201 | 0xFC, 0x54, 0xA7, 0x7A, 0x66, 0xB0, 0xC6, 0xD6, 0x83, 0xC0, 0xF2, 0xC9, 0x82, 0x8E, 0xEE, 0xD8, 202 | 0x9E, 0x15, 0xCE, 0xB1, 0x4B, 0x1B, 0xC8, 0xB6, 0x2F, 0x97, 0x70, 0xF0, 0x92, 0x04, 0x14, 0x83, 203 | 0x15, 0x6A, 0x47, 0xCF, 0x7E, 0x7C, 0x75, 0x21, 0x9E, 0x12, 0x7B, 0xE9, 0x21, 0x1B, 0xDB, 0x47, 204 | 0x27, 0xC6, 0x24, 0x74, 0x85, 0x9B, 0xD7, 0x30, 0x1B, 0x2B, 0xDE, 0xBB, 0xBA, 0x44, 0xBE, 0x31, 205 | 0x46, 0x01, 0x7E, 0xE1, 0x05, 0xD4, 0x18, 0x1A, 0x31, 0x47, 0xC7, 0xB3, 0xF8, 0x7D, 0xBF, 0x0D, 206 | 0xCF, 0x27, 0x53, 0xE2, 0xCA, 0x91, 0x42, 0xD9, 0x5F, 0x7D, 0x07, 0x86, 0xC6, 0x54, 0xDF, 0x1A, 207 | 0x47, 0xFD, 0xF3, 0xD6, 0x11, 0x7B, 0x1C, 0x0F, 0x60, 0x80, 0x1F, 0x00, 0x02, 0x0C, 0x03, 0x20, 208 | 0xC0, 0x87, 0x23, 0xF9, 0x78, 0x20, 0x76, 0x1A, 0xDC, 0xE4, 0x4C, 0x40, 0x26, 0x6D, 0xED, 0x48, 209 | 0xE0, 0x74, 0xC4, 0x1E, 0x34, 0xBE, 0x89, 0x29, 0x83, 0x99, 0xB7, 0x2A, 0xA2, 0xF4, 0xF1, 0xDC, 210 | 0x5B, 0xE2, 0x0C, 0x71, 0x4C, 0x2D, 0xBD, 0xB9, 0x74, 0xEA, 0xC8, 0xEB, 0x8F, 0x8E, 0xA3, 0x01, 211 | 0xF1, 0x7B, 0xCC, 0x86, 0x06, 0xF5, 0x43, 0x9C, 0x66, 0x8B, 0xDD, 0x32, 0xAE, 0x91, 0x58, 0x85, 212 | 0x8C, 0x27, 0xC8, 0x09, 0x32, 0x9C, 0xC3, 0x85, 0x8D, 0x28, 0x7E, 0xC7, 0x76, 0x0C, 0x61, 0x40, 213 | 0x0D, 0x3B, 0x27, 0x62, 0xFB, 0xF0, 0x44, 0x9E, 0x79, 0x03, 0x7C, 0x29, 0x3E, 0x4E, 0x66, 0x55, 214 | 0x7F, 0x06, 0x8A, 0xF4, 0xD7, 0xA1, 0xE1, 0x86, 0x10, 0xC2, 0x8F, 0xB9, 0x0A, 0x46, 0x3F, 0x75, 215 | 0x96, 0x53, 0x3B, 0x90, 0x9D, 0xE4, 0x3B, 0xDB, 0xF9, 0x9C, 0xFC, 0x47, 0x32, 0x61, 0x13, 0x37, 216 | 0xF8, 0x1B, 0xE4, 0x87, 0xC0, 0xE3, 0x28, 0xCA, 0xEE, 0x47, 0xC9, 0x8B, 0x79, 0x55, 0x22, 0x6E, 217 | 0x87, 0x86, 0xEC, 0x83, 0xE5, 0xF9, 0xA5, 0x3C, 0x71, 0xF7, 0xEE, 0x32, 0xE6, 0x6B, 0x28, 0xC3, 218 | 0xE0, 0x54, 0x72, 0xE2, 0x06, 0x4E, 0x28, 0x4F, 0x3F, 0xAF, 0xF3, 0xCE, 0xF0, 0x88, 0x98, 0x2B, 219 | 0x1C, 0xEE, 0xC4, 0x92, 0xA7, 0x2C, 0xF0, 0xE0, 0x41, 0x9A, 0xDB, 0xDD, 0xA1, 0xA4, 0x4A, 0x34, 220 | 0x11, 0xE3, 0x21, 0x32, 0x20, 0xF2, 0x40, 0x6D, 0xF9, 0x4C, 0xBC, 0x14, 0x89, 0x4C, 0x6A, 0x77, 221 | 0x53, 0x86, 0x8F, 0x65, 0x9C, 0x30, 0x13, 0x11, 0x9B, 0x1B, 0x88, 0x5F, 0x33, 0x3C, 0x4E, 0x9E, 222 | 0x7A, 0x15, 0xF2, 0x3D, 0xE6, 0x5E, 0x5F, 0xC3, 0xF2, 0xF2, 0xDB, 0x31, 0xD8, 0x9F, 0x39, 0x73, 223 | 0xF2, 0x83, 0x1C, 0x9F, 0x4C, 0xA5, 0x72, 0x9C, 0xA6, 0x38, 0x32, 0xC5, 0x32, 0x72, 0xB3, 0x0F, 224 | 0x9F, 0x00, 0x86, 0xB2, 0x9D, 0xEF, 0xE4, 0xF9, 0xFC, 0x8C, 0x39, 0xD9, 0x87, 0x4F, 0xBC, 0x3E, 225 | 0xB0, 0x50, 0x82, 0xE8, 0x0E, 0x09, 0x8D, 0x62, 0x9C, 0xDD, 0x6A, 0xCC, 0x54, 0xE2, 0x22, 0xC0, 226 | 0x61, 0x11, 0xAB, 0x4C, 0x01, 0xD7, 0x30, 0x14, 0x01, 0x55, 0x13, 0xF5, 0xE9, 0x29, 0xAF, 0x35, 227 | 0x8C, 0xB9, 0x8C, 0x95, 0xF4, 0xEF, 0x77, 0x54, 0xE1, 0x6F, 0xA2, 0xF0, 0x89, 0x53, 0x99, 0x8A, 228 | 0x27, 0xF3, 0xE3, 0xC8, 0x62, 0xCC, 0xD5, 0x13, 0x87, 0x91, 0xAF, 0x2B, 0x89, 0xFC, 0x3C, 0x31, 229 | 0xAB, 0x05, 0x39, 0x4C, 0xF1, 0xF8, 0x7E, 0x46, 0x54, 0xD5, 0xD5, 0x41, 0xEE, 0x96, 0xA1, 0xBE, 230 | 0x80, 0x64, 0x0C, 0xA9, 0xF0, 0x63, 0x8A, 0x0F, 0xDF, 0xB0, 0x8F, 0x99, 0x88, 0xDF, 0xC4, 0xE5, 231 | 0xFD, 0xBA, 0xE7, 0x62, 0x3D, 0x77, 0xD5, 0xD9, 0x75, 0x3C, 0x45, 0x29, 0xCE, 0x32, 0x0D, 0xC7, 232 | 0x73, 0x42, 0x35, 0x0C, 0x8F, 0x20, 0x0D, 0xEB, 0x78, 0xC9, 0x06, 0x2D, 0x21, 0xF0, 0x31, 0x0D, 233 | 0x7D, 0x57, 0x8D, 0x26, 0x91, 0x91, 0xFE, 0x0E, 0xB1, 0x7F, 0x0D, 0x8C, 0x3E, 0xDC, 0xFF, 0x14, 234 | 0xE5, 0xF7, 0x9B, 0x53, 0xFE, 0x6C, 0x8E, 0xE7, 0x3C, 0x86, 0x0A, 0x30, 0xBC, 0xFF, 0x89, 0x43, 235 | 0x7D, 0xF3, 0x00, 0xA6, 0x84, 0x2F, 0x7C, 0xE2, 0x9B, 0x0F, 0x82, 0xC5, 0x84, 0xBD, 0x3E, 0xBB, 236 | 0xC6, 0x59, 0x44, 0xB8, 0x35, 0xE8, 0x0C, 0xBB, 0x35, 0x1F, 0x07, 0x0B, 0x60, 0x8F, 0x93, 0x44, 237 | 0x16, 0xCD, 0xE8, 0x39, 0x18, 0x4A, 0xCD, 0xB4, 0xF6, 0xC1, 0xC7, 0x40, 0x07, 0x02, 0x50, 0xCF, 238 | 0xB8, 0xFF, 0x89, 0xB3, 0xB8, 0x31, 0x26, 0x10, 0xCD, 0xC1, 0x0C, 0xDB, 0x27, 0x50, 0x77, 0x10, 239 | 0x65, 0x4F, 0xA6, 0xDF, 0xFF, 0x14, 0xB1, 0x6A, 0x88, 0x9F, 0x6E, 0x3E, 0xC4, 0x1E, 0x12, 0x17, 240 | 0x83, 0xA8, 0x86, 0xF1, 0x13, 0x0D, 0xCE, 0xEB, 0x2D, 0x47, 0xC1, 0xF3, 0x9F, 0x38, 0x4E, 0xED, 241 | 0x48, 0xBC, 0x7E, 0x41, 0xE6, 0xE8, 0x06, 0x34, 0x9D, 0x97, 0x08, 0xC4, 0x56, 0x93, 0x3B, 0xCF, 242 | 0x3B, 0x9E, 0x6B, 0x39, 0xC4, 0xFA, 0xC8, 0x12, 0xF3, 0x71, 0x5A, 0x70, 0x11, 0xE9, 0x4E, 0x43, 243 | 0xBC, 0x4E, 0xEB, 0xB5, 0x67, 0xE3, 0x8C, 0x9B, 0x1E, 0x33, 0x31, 0x4E, 0x4F, 0xC1, 0xCA, 0xC8, 244 | 0x8E, 0x52, 0x92, 0xC0, 0x88, 0xBD, 0x77, 0x45, 0x98, 0x29, 0x65, 0x61, 0xA1, 0x8C, 0xD4, 0x45, 245 | 0xD8, 0x2C, 0xA9, 0xD6, 0x91, 0xCA, 0x89, 0xDB, 0x0A, 0xF4, 0x8C, 0xD8, 0x16, 0x7F, 0x05, 0x9E, 246 | 0x5B, 0x3B, 0xBE, 0x13, 0x9B, 0x61, 0x9D, 0x07, 0x9B, 0x40, 0x61, 0x90, 0x32, 0x51, 0x9E, 0x99, 247 | 0xD2, 0x5D, 0xFD, 0x51, 0x92, 0x49, 0x72, 0x6C, 0x26, 0x3E, 0x4A, 0x4D, 0xE3, 0x05, 0x8D, 0xCF, 248 | 0xFC, 0x07, 0x77, 0x9A, 0x3F, 0x4F, 0x44, 0x11, 0x54, 0x72, 0xD2, 0xB1, 0x62, 0x30, 0xE1, 0x81, 249 | 0xEC, 0xBF, 0x1E, 0x51, 0x1B, 0x11, 0xE8, 0xAE, 0x2F, 0x1D, 0xCC, 0x0E, 0x9F, 0x5E, 0xFF, 0x00, 250 | 0xC5, 0x5B, 0xB4, 0x20, 0x5C, 0x9A, 0x84, 0xE0, 0x22, 0x6E, 0xFF, 0x4A, 0x29, 0x93, 0x56, 0x51, 251 | 0xE1, 0xC1, 0xDB, 0x77, 0x91, 0x71, 0x8A, 0x38, 0xC4, 0x9D, 0x7E, 0x8A, 0x94, 0x71, 0x2D, 0xA7, 252 | 0x4D, 0xF5, 0xF7, 0x0A, 0xBD, 0x9A, 0xED, 0x8A, 0xE8, 0x95, 0x96, 0x5E, 0xA1, 0xE6, 0xAE, 0x5C, 253 | 0x4E, 0xAC, 0x36, 0xB7, 0x47, 0x8A, 0xB1, 0x03, 0xEA, 0x2D, 0xC4, 0x1A, 0x23, 0xE3, 0xE6, 0x2B, 254 | 0xE2, 0xDA, 0xDE, 0xAA, 0xC1, 0xCE, 0xD7, 0x64, 0x91, 0x54, 0x15, 0x6D, 0x10, 0x17, 0x0C, 0xF8, 255 | 0xE2, 0x97, 0x57, 0x2F, 0x59, 0xD2, 0x51, 0xD7, 0x2A, 0x47, 0xE9, 0x0E, 0x87, 0xBF, 0xEB, 0x5C, 256 | 0x3B, 0x03, 0x83, 0xAD, 0x01, 0x4D, 0xB3, 0x48, 0x36, 0x71, 0x63, 0xC9, 0x62, 0x81, 0x1D, 0x7E, 257 | 0x10, 0x73, 0xB2, 0xD2, 0x93, 0x02, 0xF8, 0xB8, 0x54, 0x16, 0x6F, 0x91, 0x15, 0x05, 0x22, 0xF1, 258 | 0x09, 0xA5, 0xE0, 0xB0, 0x86, 0x70, 0xE5, 0x80, 0x65, 0x19, 0xB9, 0xCE, 0xBB, 0x63, 0xA8, 0xE0, 259 | 0xE7, 0x04, 0x7D, 0x62, 0x26, 0x19, 0x65, 0x69, 0xE1, 0x95, 0x4C, 0x89, 0x16, 0x10, 0x99, 0xF8, 260 | 0xF1, 0x7B, 0x6B, 0x0C, 0xC9, 0xF1, 0x19, 0x78, 0x7E, 0xC3, 0x05, 0x0D, 0x8E, 0x6F, 0x8A, 0xD4, 261 | 0x11, 0xE6, 0x4A, 0x80, 0xAC, 0x2A, 0x04, 0x4F, 0x43, 0x7A, 0x6E, 0x29, 0xFB, 0xE8, 0xD9, 0xA9, 262 | 0xDE, 0x2B, 0xAE, 0xDD, 0xB2, 0x36, 0x2D, 0xCF, 0xB0, 0xC3, 0x75, 0xD3, 0x8A, 0x3E, 0x25, 0xC5, 263 | 0x20, 0x49, 0x30, 0x6B, 0xC2, 0x66, 0xDA, 0x14, 0xC5, 0x2F, 0xA2, 0x01, 0x91, 0xEC, 0x6A, 0x40, 264 | 0xE4, 0xC8, 0x9E, 0xEE, 0xE2, 0x32, 0xED, 0x42, 0x06, 0x72, 0x99, 0xC5, 0x0C, 0xF6, 0xD6, 0x8F, 265 | 0x19, 0x2B, 0xD0, 0xD2, 0x09, 0xAA, 0x14, 0x0A, 0x6D, 0x06, 0x2C, 0xAC, 0x18, 0x62, 0x86, 0x48, 266 | 0xDA, 0x6C, 0xB7, 0x99, 0xAE, 0x0E, 0x17, 0x21, 0x58, 0x69, 0x1E, 0xF9, 0xA4, 0xF8, 0x8D, 0xB5, 267 | 0x6C, 0x71, 0xF0, 0x40, 0x0B, 0x57, 0x14, 0xD4, 0x70, 0x5A, 0xC9, 0x04, 0xB2, 0xDF, 0x2B, 0x21, 268 | 0x50, 0xEE, 0xBA, 0xE0, 0xB4, 0xF0, 0xD3, 0xBA, 0xD8, 0x1A, 0x23, 0xC3, 0xB8, 0xE3, 0x18, 0x73, 269 | 0x46, 0x24, 0xBB, 0xA2, 0x04, 0xF1, 0xF5, 0xEE, 0x34, 0x0B, 0xF9, 0x5A, 0x57, 0x7A, 0xA3, 0xA0, 270 | 0x15, 0xDD, 0xB7, 0x96, 0xE8, 0x83, 0x8B, 0x95, 0xC7, 0xAA, 0xF2, 0x51, 0x97, 0x5D, 0x42, 0xA1, 271 | 0xDE, 0x65, 0x27, 0xD4, 0xC7, 0x15, 0xD5, 0xC7, 0x52, 0x7D, 0x46, 0x90, 0x34, 0x84, 0xE5, 0x2D, 272 | 0x7F, 0xEC, 0x8C, 0xBF, 0x3D, 0x4D, 0x34, 0x5B, 0x8D, 0x0B, 0xE5, 0x94, 0xAD, 0xB8, 0xA2, 0x5E, 273 | 0x31, 0x41, 0xEA, 0x9E, 0x62, 0xA1, 0xD6, 0x6A, 0x5C, 0x4D, 0xAD, 0xA8, 0x95, 0x67, 0x04, 0x89, 274 | 0x5A, 0xFA, 0x86, 0x3F, 0x52, 0x25, 0xDE, 0x42, 0xE6, 0xFF, 0xA7, 0x4B, 0xFC, 0xCE, 0x94, 0x58, 275 | 0x58, 0xB1, 0xFF, 0x5A, 0x5A, 0xCA, 0xC4, 0x30, 0x45, 0xC9, 0x78, 0xC9, 0x50, 0x4A, 0x1A, 0x8F, 276 | 0x54, 0xA8, 0x63, 0x39, 0x0A, 0xA9, 0xA3, 0x41, 0xA2, 0x06, 0xC6, 0x5F, 0x2B, 0x19, 0x2B, 0x1E, 277 | 0x9D, 0x04, 0x42, 0xC2, 0x40, 0x34, 0xE0, 0x23, 0xE3, 0x2C, 0xBB, 0xD4, 0x14, 0x8D, 0x90, 0x50, 278 | 0x36, 0xD3, 0xFE, 0xA8, 0x03, 0x62, 0x95, 0x52, 0x63, 0xE2, 0x00, 0x11, 0xF4, 0x79, 0x62, 0x96, 279 | 0x8A, 0x82, 0x1C, 0xEC, 0xD3, 0x9A, 0xF9, 0x93, 0x83, 0xD9, 0xF2, 0x41, 0xDE, 0x14, 0x7E, 0xF1, 280 | 0xC3, 0x73, 0xC3, 0xF3, 0x0D, 0xF1, 0x16, 0x4D, 0x3F, 0x7E, 0x6B, 0x8E, 0x21, 0x5F, 0x31, 0xC7, 281 | 0x17, 0x69, 0xC4, 0x9D, 0x1A, 0x74, 0x46, 0x02, 0xE8, 0x59, 0xD9, 0x93, 0xE0, 0xF8, 0xAE, 0x19, 282 | 0xBF, 0x45, 0xAE, 0x54, 0x3D, 0xD1, 0xA4, 0x7E, 0x17, 0x2B, 0x92, 0x31, 0xA7, 0xA0, 0x49, 0x6C, 283 | 0x79, 0x57, 0xEA, 0xB8, 0x96, 0x58, 0x8A, 0x96, 0x85, 0x1B, 0x98, 0x30, 0x3E, 0xFD, 0xC5, 0x5A, 284 | 0x51, 0xAF, 0x40, 0xA9, 0x21, 0x63, 0xB2, 0xC4, 0x96, 0x89, 0xAE, 0x6B, 0xD6, 0xD4, 0xAD, 0xBD, 285 | 0x0B, 0x10, 0x65, 0x5B, 0x49, 0xDA, 0x6C, 0x9E, 0x8F, 0x8A, 0xB0, 0xB8, 0xA8, 0x72, 0xE2, 0x33, 286 | 0x38, 0x8D, 0x36, 0x2C, 0xC5, 0x37, 0xF1, 0x52, 0xAE, 0xC1, 0xA9, 0xF8, 0x9F, 0x0A, 0xFF, 0x0B, 287 | 0x9B, 0xFC, 0x8E, 0x51, 0xC1, 0x70, 0x00, 0x00 288 | }; 289 | -------------------------------------------------------------------------------- /Object detection/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_V2_PSRAM) 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_M5STACK_WIDE) 79 | #define PWDN_GPIO_NUM -1 80 | #define RESET_GPIO_NUM 15 81 | #define XCLK_GPIO_NUM 27 82 | #define SIOD_GPIO_NUM 22 83 | #define SIOC_GPIO_NUM 23 84 | 85 | #define Y9_GPIO_NUM 19 86 | #define Y8_GPIO_NUM 36 87 | #define Y7_GPIO_NUM 18 88 | #define Y6_GPIO_NUM 39 89 | #define Y5_GPIO_NUM 5 90 | #define Y4_GPIO_NUM 34 91 | #define Y3_GPIO_NUM 35 92 | #define Y2_GPIO_NUM 32 93 | #define VSYNC_GPIO_NUM 25 94 | #define HREF_GPIO_NUM 26 95 | #define PCLK_GPIO_NUM 21 96 | 97 | #elif defined(CAMERA_MODEL_M5STACK_ESP32CAM) 98 | #define PWDN_GPIO_NUM -1 99 | #define RESET_GPIO_NUM 15 100 | #define XCLK_GPIO_NUM 27 101 | #define SIOD_GPIO_NUM 25 102 | #define SIOC_GPIO_NUM 23 103 | 104 | #define Y9_GPIO_NUM 19 105 | #define Y8_GPIO_NUM 36 106 | #define Y7_GPIO_NUM 18 107 | #define Y6_GPIO_NUM 39 108 | #define Y5_GPIO_NUM 5 109 | #define Y4_GPIO_NUM 34 110 | #define Y3_GPIO_NUM 35 111 | #define Y2_GPIO_NUM 17 112 | #define VSYNC_GPIO_NUM 22 113 | #define HREF_GPIO_NUM 26 114 | #define PCLK_GPIO_NUM 21 115 | 116 | #elif defined(CAMERA_MODEL_AI_THINKER) 117 | #define PWDN_GPIO_NUM 32 118 | #define RESET_GPIO_NUM -1 119 | #define XCLK_GPIO_NUM 0 120 | #define SIOD_GPIO_NUM 26 121 | #define SIOC_GPIO_NUM 27 122 | 123 | #define Y9_GPIO_NUM 35 124 | #define Y8_GPIO_NUM 34 125 | #define Y7_GPIO_NUM 39 126 | #define Y6_GPIO_NUM 36 127 | #define Y5_GPIO_NUM 21 128 | #define Y4_GPIO_NUM 19 129 | #define Y3_GPIO_NUM 18 130 | #define Y2_GPIO_NUM 5 131 | #define VSYNC_GPIO_NUM 25 132 | #define HREF_GPIO_NUM 23 133 | #define PCLK_GPIO_NUM 22 134 | 135 | #elif defined(CAMERA_MODEL_TTGO_T_JOURNAL) 136 | #define PWDN_GPIO_NUM 0 137 | #define RESET_GPIO_NUM 15 138 | #define XCLK_GPIO_NUM 27 139 | #define SIOD_GPIO_NUM 25 140 | #define SIOC_GPIO_NUM 23 141 | 142 | #define Y9_GPIO_NUM 19 143 | #define Y8_GPIO_NUM 36 144 | #define Y7_GPIO_NUM 18 145 | #define Y6_GPIO_NUM 39 146 | #define Y5_GPIO_NUM 5 147 | #define Y4_GPIO_NUM 34 148 | #define Y3_GPIO_NUM 35 149 | #define Y2_GPIO_NUM 17 150 | #define VSYNC_GPIO_NUM 22 151 | #define HREF_GPIO_NUM 26 152 | #define PCLK_GPIO_NUM 21 153 | 154 | #else 155 | #error "Camera model not selected" 156 | #endif 157 | -------------------------------------------------------------------------------- /Object detection/esp32-cam-tensorflowjs.ino: -------------------------------------------------------------------------------- 1 | #include "esp_camera.h" 2 | #include 3 | 4 | #define CAMERA_MODEL_AI_THINKER // Has PSRAM 5 | #include "camera_pins.h" 6 | 7 | const char* ssid = "Home"; 8 | const char* password = "wifirumah"; 9 | 10 | void startCameraServer(); 11 | 12 | void setup() { 13 | Serial.begin(115200); 14 | Serial.setDebugOutput(true); 15 | Serial.println(); 16 | 17 | camera_config_t config; 18 | config.ledc_channel = LEDC_CHANNEL_0; 19 | config.ledc_timer = LEDC_TIMER_0; 20 | config.pin_d0 = Y2_GPIO_NUM; 21 | config.pin_d1 = Y3_GPIO_NUM; 22 | config.pin_d2 = Y4_GPIO_NUM; 23 | config.pin_d3 = Y5_GPIO_NUM; 24 | config.pin_d4 = Y6_GPIO_NUM; 25 | config.pin_d5 = Y7_GPIO_NUM; 26 | config.pin_d6 = Y8_GPIO_NUM; 27 | config.pin_d7 = Y9_GPIO_NUM; 28 | config.pin_xclk = XCLK_GPIO_NUM; 29 | config.pin_pclk = PCLK_GPIO_NUM; 30 | config.pin_vsync = VSYNC_GPIO_NUM; 31 | config.pin_href = HREF_GPIO_NUM; 32 | config.pin_sscb_sda = SIOD_GPIO_NUM; 33 | config.pin_sscb_scl = SIOC_GPIO_NUM; 34 | config.pin_pwdn = PWDN_GPIO_NUM; 35 | config.pin_reset = RESET_GPIO_NUM; 36 | config.xclk_freq_hz = 20000000; 37 | config.pixel_format = PIXFORMAT_JPEG; 38 | 39 | // if PSRAM IC present, init with UXGA resolution and higher JPEG quality 40 | // for larger pre-allocated frame buffer. 41 | if(psramFound()){ 42 | config.frame_size = FRAMESIZE_UXGA; 43 | config.jpeg_quality = 10; 44 | config.fb_count = 2; 45 | } else { 46 | config.frame_size = FRAMESIZE_SVGA; 47 | config.jpeg_quality = 12; 48 | config.fb_count = 1; 49 | } 50 | 51 | #if defined(CAMERA_MODEL_ESP_EYE) 52 | pinMode(13, INPUT_PULLUP); 53 | pinMode(14, INPUT_PULLUP); 54 | #endif 55 | 56 | // camera init 57 | esp_err_t err = esp_camera_init(&config); 58 | if (err != ESP_OK) { 59 | Serial.printf("Camera init failed with error 0x%x", err); 60 | return; 61 | } 62 | 63 | sensor_t * s = esp_camera_sensor_get(); 64 | // initial sensors are flipped vertically and colors are a bit saturated 65 | if (s->id.PID == OV3660_PID) { 66 | s->set_vflip(s, 1); // flip it back 67 | s->set_brightness(s, 1); // up the brightness just a bit 68 | s->set_saturation(s, -2); // lower the saturation 69 | } 70 | // drop down frame size for higher initial frame rate 71 | s->set_framesize(s, FRAMESIZE_QVGA); 72 | 73 | #if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM) 74 | s->set_vflip(s, 1); 75 | s->set_hmirror(s, 1); 76 | #endif 77 | 78 | WiFi.begin(ssid, password); 79 | 80 | while (WiFi.status() != WL_CONNECTED) { 81 | delay(500); 82 | Serial.print("."); 83 | } 84 | Serial.println(""); 85 | Serial.println("WiFi connected"); 86 | 87 | startCameraServer(); 88 | 89 | Serial.print("Camera Ready! Use 'http://"); 90 | Serial.print(WiFi.localIP()); 91 | Serial.println("' to connect"); 92 | } 93 | 94 | void loop() { 95 | // put your main code here, to run repeatedly: 96 | delay(10000); 97 | } 98 | -------------------------------------------------------------------------------- /Object detection/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 | 11 | 12 | 533 | 534 | 535 |
536 |
537 |
538 |

Object Detection

539 | Powered By @fazaio 540 |
541 |
542 |
Resolution :
543 |
544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 |
554 |
555 |
556 |
557 |
558 |
559 |
560 |
input :
561 | 562 |
563 |
564 |
output :
565 | 566 |
567 |
568 |
569 | 570 | 571 | 572 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ESP32-CAM-Machine-Learning 2 | 3 | ## Introduction 4 | ESP32-CAM is board that support camera module & camera server, we can access the stream data from sensor using port 81, and i'm try to make esp32-cam more cool. 5 | This repository contains code to implementation Machine Learning use framework TensorflowJs. let's make ESP32-CAM can detect an object, image processing and etc. 6 | 7 |

8 | 9 |

10 |

Wiring diagram ESP32-CAM

11 | 12 | ![Screenshot 2021-07-07 01:06:00](https://user-images.githubusercontent.com/42485508/124646994-92538900-debf-11eb-9c23-da57479903e6.png) 13 | 14 | 15 | ## Object Detection 16 | With TensorflowJs (ML client-side), we can make ESP32-CAM possible to prediction and detect the object. 17 | like this 18 | ![ezgif com-gif-maker](https://user-images.githubusercontent.com/42485508/124645552-c8900900-debd-11eb-86dc-09a5ccd56116.gif) 19 | 20 | Full source: [ESP-32CAM-Object-detection!](https://github.com/fazaio/ESP32-CAM-Machine-Learning/tree/main/Object%20detection) 21 | > Easy To use : Visit link, download the code then set SSID & Wifi passord then upload. 22 | 23 | ## Image Classification 24 | Cooming Soon! 25 | 26 | ## Body Segmentation 27 | Cooming Soon! 28 | 29 |



30 | 31 | ### Buy me coffee | [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/fazaux?country.x=ID&locale.x=en_US) 32 | --------------------------------------------------------------------------------