Compare commits

...

13 Commits

Author SHA1 Message Date
8ee1be93c6 Added the music player UI mockup 2023-05-14 22:18:41 +02:00
c9f84fd5c1 Added missing strcasecmp function prototype in the include file 2023-05-14 22:17:55 +02:00
fa574d0baa Added some new words translation for the music player screen 2023-05-14 22:16:44 +02:00
47e31a1210 Rephrased some API comments 2023-05-14 22:15:14 +02:00
17164c722e Integrated the music player screen to the watch's firmware + minor other things 2023-05-14 22:14:38 +02:00
cf7c52c1eb Commented the API 2023-05-14 22:13:26 +02:00
df4ab1f790 Proper comments format 2023-05-14 22:12:26 +02:00
6df9ab5aad Added the music player icon + saving the menu list scroll position when leaving an app 2023-05-14 22:11:47 +02:00
edb127e626 Updated the gadget bridge parser 2023-05-14 22:10:13 +02:00
23f592bcc1 Finally added the music player used to control the music playback of the phone through the BLE connection. It works great, some minor adjustements to do though. 2023-05-14 22:09:43 +02:00
890e461b90 Finished the UI of the music player, still need to properly increment the current track play position 2023-05-14 22:08:12 +02:00
66fa33cde1 Now saving the scroll position of the menu to resum it when exiting an app 2023-05-14 22:06:58 +02:00
677c3f3a67 Made slights adjustement to the parser to correctly parse the artist song tag when the album tag is present 2023-05-14 22:06:09 +02:00
27 changed files with 1603 additions and 471 deletions

View File

@ -31,6 +31,9 @@ typedef enum gadget_bridge_parser_fsm
GADGET_BRIDGE_PARSER_FSM_FOUND_TITLE,
GADGET_BRIDGE_PARSER_FSM_PARSING_TITLE_CONTENT,
GADGET_BRIDGE_PARSER_FSM_FOUND_SUBJECT,
GADGET_BRIDGE_PARSER_FSM_PARSING_SUBJECT_BODY_CONTENT,
GADGET_BRIDGE_PARSER_FSM_FOUND_ID_SRC,
GADGET_BRIDGE_PARSER_FSM_FOUND_SRC_BODY,
GADGET_BRIDGE_PARSER_FSM_PARSING_BODY_CONTENT,
@ -244,7 +247,7 @@ static bool _parser_extract_bool(char *start, char *end, bool *data);
gadget_bridge_parser_code_e gadget_bridge_parser_run(void)
{
if(!_gadget_bridge_internals.new_data) return GADGET_BRIDGE_PARSER_CODE_OK;
char *start = NULL, *end = NULL;
char *start = NULL, *end = NULL, *end2 = NULL; // end2 is used when more than one next tag is possible
bool free_some_space = false;
gadget_bridge_parser_code_e to_return = GADGET_BRIDGE_PARSER_CODE_PARSING;
@ -427,10 +430,20 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void)
else to_return = GADGET_BRIDGE_PARSER_CODE_OK;
break;
case GADGET_BRIDGE_PARSER_FSM_FOUND_ID_SRC:
if((start = strstr(_gadget_bridge_internals.buffer, "src:"))
&& (end = strstr(_gadget_bridge_internals.buffer, ",title")))
if((start = strstr(_gadget_bridge_internals.buffer, "src:")) &&
((end = strstr(_gadget_bridge_internals.buffer, ",title")) || (end2 = strstr(_gadget_bridge_internals.buffer, ",subject"))))
{
//printf("###Found TITLE\n");
if((end && !end2) || (end != NULL && end < end2))
{
//printf("###Found TITLE\n");
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_FOUND_TITLE;
}
else if((!end && end2) || (end2 != NULL && end2 < end))
{
//printf("###Found SUBJECT\n");
end = end2;
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_FOUND_SUBJECT;
}
_parser_extract_src(start + 5, end - 1);
@ -439,7 +452,6 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void)
_parser_free_buffer(
end -_gadget_bridge_internals.buffer
);
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_FOUND_TITLE;
}
else if((start = strstr(_gadget_bridge_internals.buffer, "GB(")))
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE;
@ -486,7 +498,7 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void)
// Then we have a very long title, in this case we juste keep the max set up
else if(!end && _gadget_bridge_internals.buffer_content_size >= GADGET_BRIDGE_PARSER_MAX_TITLE_SIZE)
{
printf("###NOTIFICATION (MAX TITLE SIZE)\n");
//printf("###NOTIFICATION (MAX TITLE SIZE)\n");
_parser_extract_char_str(_gadget_bridge_internals.buffer, _gadget_bridge_internals.buffer + GADGET_BRIDGE_PARSER_MAX_TITLE_SIZE, &_gadget_bridge_internals.event_data.notification.title);
@ -511,6 +523,10 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void)
_parser_free_buffer(
start -_gadget_bridge_internals.buffer
);
if(_gadget_bridge_internals.event_data.notification.notification_type == GADGET_BRIDGE_NOTIFICATION_TYPE_GADGET_BRIDGE)
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_PARSING_SUBJECT_BODY_CONTENT;
else
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_PARSING_BODY_CONTENT;
}
else if((start = strstr(_gadget_bridge_internals.buffer, "GB(")))
@ -551,7 +567,64 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void)
// Then we have a very long body, in this case we juste keep the max set up
else if(!end && _gadget_bridge_internals.buffer_content_size >= GADGET_BRIDGE_PARSER_MAX_BODY_SIZE)
{
//printf("###NOTIFICATION (MAX BODY SIZE) Type done\n");
// printf("###NOTIFICATION (MAX BODY SIZE) Type done\n");
_parser_extract_char_str(_gadget_bridge_internals.buffer, _gadget_bridge_internals.buffer + GADGET_BRIDGE_PARSER_MAX_BODY_SIZE, &_gadget_bridge_internals.event_data.notification.body);
// We remove the parsed part from the buffer
_parser_free_buffer(
GADGET_BRIDGE_PARSER_MAX_BODY_SIZE + 1
);
// If a callback was registered, we call it and pass the data to it
if(_gadget_bridge_internals.parser_event_callback)
{
_gadget_bridge_internals.parser_event_callback(&_gadget_bridge_internals.event_data);
}
// Free the allocated data
_free_event_data();
// The end of the road for this object
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE;
}
else to_return = GADGET_BRIDGE_PARSER_CODE_OK;
}
break;
case GADGET_BRIDGE_PARSER_FSM_PARSING_SUBJECT_BODY_CONTENT:
{
end = strstr(_gadget_bridge_internals.buffer, ",sender");
if(end)
{
// We don't care about the sender nor the tel tag
//printf("###TEST NOTIFICATION Type done\n");
_parser_extract_char_str(_gadget_bridge_internals.buffer, end - 1, &_gadget_bridge_internals.event_data.notification.body);
// We remove the parsed part from the buffer
end += 7;
_parser_free_buffer(
end -_gadget_bridge_internals.buffer
);
// If a callback was registered, we call it and pass the data to it
if(_gadget_bridge_internals.parser_event_callback)
{
_gadget_bridge_internals.parser_event_callback(&_gadget_bridge_internals.event_data);
}
// Free the allocated data
_free_event_data();
// The end of the road for this object
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE;
}
else if((start = strstr(_gadget_bridge_internals.buffer, "GB(")))
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE;
// Then we have a very long body, in this case we juste keep the max set up
else if(!end && _gadget_bridge_internals.buffer_content_size >= GADGET_BRIDGE_PARSER_MAX_BODY_SIZE)
{
//printf("###TEST NOTIFICATION (MAX BODY SIZE) Type done\n");
_parser_extract_char_str(_gadget_bridge_internals.buffer, _gadget_bridge_internals.buffer + GADGET_BRIDGE_PARSER_MAX_BODY_SIZE, &_gadget_bridge_internals.event_data.notification.body);
@ -632,6 +705,24 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void)
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE;
break;*/
case GADGET_BRIDGE_PARSER_FSM_FOUND_SUBJECT:
if((start = strstr(_gadget_bridge_internals.buffer, "subject:")))
{
//printf("###Parsing SUBJECT content\n");
// We remove the parsed part from the buffer
start += 9;
_parser_free_buffer(
start -_gadget_bridge_internals.buffer
);
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_PARSING_TITLE_CONTENT;
}
else if((start = strstr(_gadget_bridge_internals.buffer, "GB(")))
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE;
else if(_gadget_bridge_internals.buffer_content_size > GADGET_BRIDGE_PARSER_BUFFER_THRESHOLD)
free_some_space = true;
else to_return = GADGET_BRIDGE_PARSER_CODE_OK;
break;
case GADGET_BRIDGE_PARSER_FSM_FOUND_CALL:
if((start = strstr(_gadget_bridge_internals.buffer, "cmd:"))
&& (end = strstr(_gadget_bridge_internals.buffer, ",name")))
@ -1024,10 +1115,14 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void)
else to_return = GADGET_BRIDGE_PARSER_CODE_OK;
break;
case GADGET_BRIDGE_PARSER_FSM_FOUND_MUSICINFO:
if((start = strstr(_gadget_bridge_internals.buffer, "artist:"))
&& (end = strstr(_gadget_bridge_internals.buffer, ",track")))
if((start = strstr(_gadget_bridge_internals.buffer, "artist:")) &&
(end = strstr(_gadget_bridge_internals.buffer, ",track")))
{
end2 = strstr(_gadget_bridge_internals.buffer, ",album");
//printf("###Found TRACK\n");
if(end2 != NULL && end2 < end)
_parser_extract_char_str(start + 8, end2 - 1, &_gadget_bridge_internals.event_data.music_info.artist);
else
_parser_extract_char_str(start + 8, end - 1, &_gadget_bridge_internals.event_data.music_info.artist);
// We remove the parsed part from the buffer
@ -1152,6 +1247,8 @@ const char *gadget_bridge_notification_type_2_str(gadget_bridge_notification_typ
{
CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_SMS)
CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_EMAIL)
CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_WHATSAPP)
CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_GADGET_BRIDGE)
CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_UNKNOWN)
default:
return "Unknown notification type";
@ -1164,6 +1261,7 @@ const char *gadget_bridge_music_state_2_str(gadget_bridge_music_state_e music_st
{
CASE_RETURN_STR(GADGET_BRIDGE_MUSIC_STATE_PAUSE)
CASE_RETURN_STR(GADGET_BRIDGE_MUSIC_STATE_PLAY)
CASE_RETURN_STR(GADGET_BRIDGE_MUSIC_STATE_STOP)
CASE_RETURN_STR(GADGET_BRIDGE_MUSIC_STATE_UNKNOWN)
default:
return "Unknown music state";
@ -1323,10 +1421,14 @@ static void _parser_extract_tel(char *start, char *end)
static void _parser_extract_src(char *start, char *end)
{
*end = '\0';
if(strcmp(start, "Messages") == 0)
if(strcasecmp(start, "Messages") == 0)
_gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_SMS;
else if(strcmp(start, "E-mail") == 0)
else if(strcasecmp(start, "E-mail") == 0)
_gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_EMAIL;
else if(strcasecmp(start, "WhatsApp") == 0)
_gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_WHATSAPP;
else if(strcasecmp(start, "Gadgetbridge") == 0)
_gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_GADGET_BRIDGE;
else
_gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_UNKNOWN;
@ -1363,6 +1465,8 @@ static void _parser_extract_state(char *start, char *end)
_gadget_bridge_internals.event_data.music_state.music_state = GADGET_BRIDGE_MUSIC_STATE_PLAY;
else if(strcmp(start, "pause") == 0)
_gadget_bridge_internals.event_data.music_state.music_state = GADGET_BRIDGE_MUSIC_STATE_PAUSE;
else if(strcmp(start, "stop") == 0)
_gadget_bridge_internals.event_data.music_state.music_state = GADGET_BRIDGE_MUSIC_STATE_STOP;
else
_gadget_bridge_internals.event_data.music_state.music_state = GADGET_BRIDGE_MUSIC_STATE_UNKNOWN;

View File

@ -129,6 +129,8 @@ typedef enum gadget_bridge_notification_type
{
GADGET_BRIDGE_NOTIFICATION_TYPE_SMS = 0,
GADGET_BRIDGE_NOTIFICATION_TYPE_EMAIL,
GADGET_BRIDGE_NOTIFICATION_TYPE_WHATSAPP,
GADGET_BRIDGE_NOTIFICATION_TYPE_GADGET_BRIDGE,
GADGET_BRIDGE_NOTIFICATION_TYPE_UNKNOWN,
} gadget_bridge_notification_type_e;
@ -136,6 +138,7 @@ typedef enum
{
GADGET_BRIDGE_MUSIC_STATE_PAUSE = 0,
GADGET_BRIDGE_MUSIC_STATE_PLAY,
GADGET_BRIDGE_MUSIC_STATE_STOP,
GADGET_BRIDGE_MUSIC_STATE_UNKNOWN,
} gadget_bridge_music_state_e;

View File

@ -193,6 +193,199 @@ const lv_img_dsc_t watch_menu_dialer_icon = {
.data = dialer_icon_map,
};
const LV_ATTRIBUTE_LARGE_CONST uint8_t music_player_icon_map[] = {
#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8
/*Pixel format: Red: 3 bit, Green: 3 bit, Blue: 2 bit*/
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xc9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9, 0xc9, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xc9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9, 0xc9, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xc9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9, 0xc9, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xc9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9, 0xc9, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xa5, 0x85, 0x89, 0x89, 0x85, 0xa5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xa5, 0x69, 0x49, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x49, 0x69, 0x85, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x85, 0x49, 0x29, 0x29, 0x29, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x29, 0x29, 0x29, 0x49, 0x85, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xc9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x69, 0x29, 0x29, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x29, 0x29, 0x69, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0xc9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x49, 0x29, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x29, 0x49, 0xa5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9, 0xc5, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x49, 0x29, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x29, 0x29, 0x49, 0x49, 0x29, 0x49, 0xa5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x69, 0x29, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x29, 0x29, 0x29, 0x4d, 0x92, 0xbb, 0x6e, 0x29, 0x49, 0x29, 0x69, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x1c, 0x1c,
0x1c, 0x1c, 0xc9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x89, 0x29, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x29, 0x29, 0x29, 0x49, 0x6e, 0xb7, 0xdb, 0xff, 0xff, 0xff, 0x6d, 0x29, 0x49, 0x49, 0x29, 0x89, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9, 0xc5, 0x1c,
0x1c, 0x1c, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xa5, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x29, 0x29, 0x4e, 0x92, 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0x25, 0x29, 0x49, 0x49, 0x49, 0xa5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9, 0x1c,
0x1c, 0x1c, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x69, 0x29, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x29, 0x72, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0x25, 0x29, 0x29, 0x49, 0x29, 0x69, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9, 0x1c,
0x1c, 0xc9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x49, 0x29, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x29, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xdb, 0xff, 0x6d, 0x25, 0x29, 0x29, 0x29, 0x49, 0x49, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9, 0xc9,
0x1c, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xa5, 0x29, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x29, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0x92, 0x49, 0x05, 0x92, 0xff, 0x4d, 0x25, 0x29, 0x29, 0x29, 0x29, 0x29, 0x85, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9,
0x1c, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x69, 0x29, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x29, 0xb7, 0xff, 0xdb, 0x92, 0x6d, 0x29, 0x25, 0x25, 0x29, 0x25, 0x92, 0xff, 0x4d, 0x25, 0x29, 0x29, 0x29, 0x29, 0x29, 0x69, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9,
0x1c, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x69, 0x29, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x29, 0xb7, 0xff, 0x49, 0x05, 0x25, 0x29, 0x29, 0x29, 0x29, 0x25, 0x92, 0xff, 0x4d, 0x25, 0x29, 0x29, 0x29, 0x29, 0x29, 0x49, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9,
0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x49, 0x29, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x29, 0xb7, 0xff, 0x49, 0x29, 0x29, 0x29, 0x29, 0x25, 0x25, 0x04, 0x92, 0xff, 0x4d, 0x25, 0x29, 0x29, 0x29, 0x29, 0x29, 0x45, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9,
0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x49, 0x29, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x29, 0xb7, 0xff, 0x49, 0x25, 0x29, 0x29, 0x25, 0x4d, 0x92, 0x6e, 0xb6, 0xff, 0x4d, 0x25, 0x29, 0x29, 0x29, 0x29, 0x29, 0x45, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9,
0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x49, 0x29, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x29, 0xb7, 0xff, 0x49, 0x25, 0x29, 0x25, 0x96, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0x25, 0x29, 0x29, 0x29, 0x29, 0x29, 0x45, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9,
0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x49, 0x29, 0x49, 0x49, 0x49, 0x49, 0x49, 0x29, 0x29, 0x25, 0xb7, 0xff, 0x49, 0x25, 0x25, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0x25, 0x29, 0x29, 0x29, 0x29, 0x29, 0x45, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9,
0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x69, 0x29, 0x49, 0x49, 0x49, 0x49, 0x49, 0x92, 0xbb, 0x96, 0xdb, 0xff, 0x49, 0x29, 0x25, 0x96, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6e, 0x25, 0x29, 0x29, 0x29, 0x29, 0x29, 0x45, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9,
0x1c, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x89, 0x29, 0x49, 0x49, 0x49, 0x49, 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x49, 0x29, 0x25, 0x92, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x49, 0x25, 0x29, 0x29, 0x29, 0x29, 0x29, 0x65, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9,
0x1c, 0xc9, 0xc5, 0xc5, 0xc5, 0xc5, 0xa5, 0x29, 0x49, 0x49, 0x29, 0x92, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x49, 0x25, 0x29, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0x25, 0x29, 0x29, 0x29, 0x29, 0x29, 0x25, 0x85, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9, 0xc9,
0x1c, 0xc9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x49, 0x29, 0x49, 0x29, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x49, 0x25, 0x29, 0x25, 0x4d, 0xdb, 0xff, 0xff, 0xb7, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x45, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc9, 0xa9,
0x1c, 0xc9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x89, 0x29, 0x49, 0x29, 0x96, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x29, 0x29, 0x29, 0x29, 0x25, 0x25, 0x49, 0x49, 0x25, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x25, 0x65, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xa9, 0xb2,
0x1c, 0x1c, 0xc9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x49, 0x29, 0x49, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x25, 0x29, 0x29, 0x29, 0x29, 0x29, 0x25, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x25, 0xa5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xae, 0x1c,
0x1c, 0x1c, 0xc9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x89, 0x29, 0x49, 0x29, 0x4d, 0xb7, 0xdb, 0xdb, 0x92, 0x25, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x25, 0x85, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xa9, 0xb2, 0x1c,
0x1c, 0x1c, 0xa5, 0xc9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x69, 0x29, 0x49, 0x29, 0x29, 0x25, 0x25, 0x25, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x25, 0x65, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xae, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0xa9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x69, 0x29, 0x49, 0x49, 0x49, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x45, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xad, 0x92, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0xa9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x69, 0x29, 0x49, 0x49, 0x49, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x25, 0x45, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xa9, 0x92, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0xa9, 0xa9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0x89, 0x29, 0x29, 0x49, 0x49, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x25, 0x65, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xb2, 0x92, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xa9, 0xc9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xa5, 0x69, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x25, 0x45, 0xa5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xb2, 0x92, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xa9, 0xa9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xa5, 0x69, 0x49, 0x49, 0x25, 0x25, 0x25, 0x25, 0x25, 0x45, 0x65, 0xa5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xae, 0x92, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xa9, 0xa9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xa5, 0x92, 0x92, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xa9, 0xa9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xa9, 0x92, 0x92, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xa9, 0xa9, 0xa9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xa9, 0x8e, 0x92, 0x92, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xa9, 0xa9, 0xa9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xa9, 0x89, 0x92, 0x92, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xa9, 0xa9, 0xa9, 0x8d, 0x8e, 0x92, 0xb6, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xa9, 0xa9, 0x8d, 0x8d, 0x8d, 0x8d, 0x89, 0x8d, 0x8d, 0x8d, 0x89, 0x8e, 0x92, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
#endif
#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0
/*Pixel format: Red: 5 bit, Green: 6 bit, Blue: 5 bit*/
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x88, 0xb9, 0x87, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x88, 0xb9, 0xa8, 0xb9, 0xc8, 0xb9, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x87, 0xb9, 0x87, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x88, 0xb9, 0xc8, 0xb9, 0xa8, 0xb9, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x88, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x88, 0xb9, 0x0a, 0xc2, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xa8, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x47, 0xb9, 0xc9, 0xb9, 0xe9, 0xc1, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x87, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xa1, 0x87, 0x91, 0x87, 0x89, 0x87, 0x89, 0x87, 0x91, 0x67, 0xa1, 0x67, 0xb1, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x47, 0xb9, 0x88, 0xb9, 0xe9, 0xc1, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xb9, 0x87, 0x91, 0xa8, 0x61, 0xe8, 0x41, 0x09, 0x32, 0x09, 0x2a, 0x09, 0x2a, 0x09, 0x2a, 0x09, 0x2a, 0x09, 0x32, 0xe8, 0x41, 0xa8, 0x61, 0x87, 0x91, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xc9, 0xb9, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x87, 0x91, 0xc8, 0x49, 0x09, 0x2a, 0x29, 0x2a, 0x2a, 0x32, 0x2a, 0x32, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x32, 0x2a, 0x32, 0x29, 0x2a, 0x09, 0x2a, 0xc8, 0x49, 0x87, 0x91, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xc8, 0xb9, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x88, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xb9, 0xa8, 0x61, 0x09, 0x2a, 0x29, 0x2a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x29, 0x2a, 0x09, 0x2a, 0xa8, 0x61, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x87, 0xb9, 0xa8, 0xb9, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xc8, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xb1, 0xc8, 0x49, 0x29, 0x2a, 0x29, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x2a, 0x3a, 0x29, 0x2a, 0xc8, 0x49, 0x67, 0xb1, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xa8, 0xb9, 0x47, 0xb9, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x47, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb1, 0xc8, 0x49, 0x29, 0x2a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x29, 0x32, 0xe8, 0x29, 0xe8, 0x29, 0x2a, 0x32, 0x2a, 0x3a, 0x29, 0x2a, 0xc8, 0x49, 0x67, 0xb1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xc8, 0xb9, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x88, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0xc8, 0x59, 0x29, 0x2a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x29, 0x32, 0xe9, 0x29, 0xc8, 0x29, 0x09, 0x32, 0xcc, 0x4a, 0x11, 0x74, 0xd7, 0xb5, 0xec, 0x52, 0x09, 0x32, 0x2a, 0x3a, 0x29, 0x2a, 0xc8, 0x51, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x88, 0xb9, 0x67, 0xb9, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xa8, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x87, 0x81, 0x09, 0x2a, 0x2a, 0x3a, 0x2a, 0x32, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x09, 0x32, 0xc8, 0x29, 0xc8, 0x29, 0x4a, 0x3a, 0x6e, 0x63, 0xf4, 0x94, 0x9a, 0xce, 0xbe, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xec, 0x52, 0xa8, 0x29, 0x4a, 0x3a, 0x29, 0x3a, 0x09, 0x2a, 0xa8, 0x79, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xa8, 0xb9, 0x67, 0xb9, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0x87, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb1, 0xe8, 0x39, 0x29, 0x32, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x32, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0xe9, 0x31, 0x09, 0x32, 0xcc, 0x4a, 0x31, 0x7c, 0xd8, 0xb5, 0x3d, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xec, 0x52, 0x46, 0x21, 0x09, 0x32, 0x4a, 0x3a, 0x29, 0x32, 0xe8, 0x31, 0x67, 0xa9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x87, 0xb9, 0x88, 0xb9, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0xa8, 0x71, 0x29, 0x2a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x32, 0x4a, 0x3a, 0xe9, 0x29, 0xf0, 0x73, 0xbb, 0xd6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x52, 0x66, 0x21, 0xa7, 0x29, 0xe9, 0x31, 0x2a, 0x3a, 0x29, 0x2a, 0xa8, 0x69, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xa8, 0xb9, 0xe0, 0x07,
0xe0, 0x07, 0xa8, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb1, 0xe8, 0x41, 0x29, 0x32, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x32, 0x4a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0xc8, 0x29, 0x55, 0xa5, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x59, 0xce, 0x79, 0xce, 0xff, 0xff, 0xcc, 0x52, 0x66, 0x21, 0xa7, 0x29, 0xa7, 0x29, 0xe9, 0x31, 0x2a, 0x32, 0xe8, 0x39, 0x67, 0xb1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xa8, 0xb9, 0x88, 0xb9,
0xe0, 0x07, 0x87, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x87, 0x91, 0x09, 0x2a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0xc8, 0x29, 0x15, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, 0xe7, 0x96, 0xb5, 0xd0, 0x73, 0x6a, 0x42, 0xe4, 0x10, 0x10, 0x7c, 0xff, 0xff, 0xab, 0x52, 0x66, 0x21, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xe8, 0x31, 0x09, 0x2a, 0x87, 0x91, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x88, 0xb9, 0xa8, 0xb9,
0xe0, 0x07, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0xa8, 0x71, 0x29, 0x2a, 0x2a, 0x3a, 0x4a, 0x3a, 0x2a, 0x32, 0x4a, 0x3a, 0x4a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0xc8, 0x29, 0x35, 0x9d, 0xff, 0xff, 0x59, 0xce, 0x92, 0x8c, 0xec, 0x52, 0xa7, 0x29, 0x25, 0x19, 0x25, 0x19, 0x87, 0x21, 0x26, 0x19, 0x72, 0x8c, 0xff, 0xff, 0xcb, 0x52, 0x66, 0x21, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0x87, 0x29, 0xe8, 0x21, 0xa8, 0x71, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xe9, 0xb9,
0xe0, 0x07, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0xc8, 0x59, 0x29, 0x2a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0xc8, 0x29, 0x35, 0x9d, 0xff, 0xff, 0x09, 0x32, 0x05, 0x11, 0x66, 0x21, 0xa7, 0x29, 0xc8, 0x29, 0xc8, 0x29, 0xe8, 0x31, 0x46, 0x19, 0x52, 0x84, 0xff, 0xff, 0xcb, 0x52, 0x66, 0x21, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0x87, 0x19, 0x87, 0x51, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xe9, 0xb9,
0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xc8, 0x49, 0x29, 0x32, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0xc8, 0x29, 0x35, 0x9d, 0xff, 0xff, 0x4a, 0x42, 0x87, 0x21, 0xc8, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0x66, 0x21, 0x46, 0x19, 0xc4, 0x08, 0x31, 0x84, 0xff, 0xff, 0xab, 0x52, 0x66, 0x21, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0x87, 0x21, 0x66, 0x39, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x2a, 0xba,
0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xe8, 0x49, 0x2a, 0x32, 0x2a, 0x3a, 0x2a, 0x32, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0xc8, 0x29, 0x35, 0x9d, 0xff, 0xff, 0x4a, 0x42, 0x66, 0x21, 0xa7, 0x29, 0xa7, 0x29, 0x46, 0x19, 0xab, 0x4a, 0x51, 0x84, 0x6e, 0x63, 0xd3, 0x94, 0xff, 0xff, 0xcb, 0x52, 0x66, 0x21, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x21, 0x67, 0x39, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xc9, 0xb9,
0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xe8, 0x49, 0x2a, 0x32, 0x2a, 0x3a, 0x2a, 0x32, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x6a, 0x3a, 0xe8, 0x29, 0x35, 0xa5, 0xff, 0xff, 0x4a, 0x42, 0x66, 0x21, 0xc8, 0x29, 0x46, 0x19, 0x92, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xec, 0x52, 0x66, 0x21, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x21, 0x66, 0x39, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xe9, 0xb9,
0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xc8, 0x49, 0x29, 0x32, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x32, 0x4a, 0x3a, 0x2a, 0x3a, 0xc8, 0x29, 0xe9, 0x29, 0x66, 0x19, 0x14, 0x9d, 0xff, 0xff, 0x4a, 0x3a, 0x87, 0x21, 0x66, 0x21, 0x0c, 0x53, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, 0x52, 0x66, 0x21, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0x87, 0x21, 0x66, 0x39, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x2a, 0xba,
0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0xc8, 0x59, 0x29, 0x2a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x29, 0x32, 0x29, 0x32, 0x52, 0x84, 0xd7, 0xb5, 0xf4, 0x94, 0xf8, 0xbd, 0xff, 0xff, 0x4a, 0x42, 0x87, 0x29, 0x25, 0x19, 0xb3, 0x94, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x52, 0x66, 0x21, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0x87, 0x19, 0x66, 0x51, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x4a, 0xba,
0xe0, 0x07, 0x87, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0xa8, 0x71, 0x29, 0x2a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x29, 0x32, 0x39, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x6a, 0x42, 0x87, 0x21, 0x26, 0x19, 0x52, 0x84, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6a, 0x42, 0x66, 0x21, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0x87, 0x19, 0x67, 0x69, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x87, 0xb9, 0x4a, 0xb2,
0xe0, 0x07, 0x88, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x87, 0x99, 0x09, 0x2a, 0x2a, 0x3a, 0x4a, 0x3a, 0xc8, 0x29, 0x52, 0x84, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x6a, 0x42, 0x87, 0x21, 0x87, 0x21, 0x09, 0x3a, 0x7e, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xb5, 0x46, 0x19, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0x87, 0x19, 0x67, 0x91, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xa8, 0xb9, 0x09, 0xba,
0xe0, 0x07, 0xa8, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xe8, 0x41, 0x29, 0x32, 0x4a, 0x3a, 0xc8, 0x29, 0xb7, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x6a, 0x42, 0x66, 0x21, 0xc8, 0x29, 0x66, 0x21, 0xab, 0x4a, 0x59, 0xce, 0x9e, 0xf7, 0x7d, 0xef, 0x55, 0xa5, 0xc8, 0x29, 0x87, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0x87, 0x21, 0x66, 0x39, 0x67, 0xb1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x47, 0xb9, 0xe9, 0xb9, 0x6b, 0xb2,
0xe0, 0x07, 0xc8, 0xb1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0xa8, 0x79, 0x09, 0x2a, 0x4a, 0x3a, 0xc8, 0x29, 0xd4, 0x94, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x7e, 0xef, 0xe8, 0x31, 0x87, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0x66, 0x21, 0x66, 0x21, 0x29, 0x3a, 0xe8, 0x31, 0x46, 0x19, 0x87, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0x87, 0x19, 0x67, 0x71, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x4a, 0xb2, 0xf0, 0xa3,
0xe0, 0x07, 0xe0, 0x07, 0xa8, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb1, 0xe8, 0x39, 0x2a, 0x32, 0x29, 0x32, 0x6b, 0x42, 0x3c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x51, 0x84, 0x46, 0x19, 0xc8, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0x87, 0x21, 0x87, 0x21, 0xc8, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0x87, 0x21, 0x66, 0x31, 0x67, 0xb1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x88, 0xb9, 0x2d, 0xa3, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xc9, 0xb1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x87, 0x89, 0x09, 0x2a, 0x2a, 0x3a, 0x09, 0x32, 0xab, 0x42, 0x76, 0xad, 0x7a, 0xce, 0x39, 0xc6, 0xd0, 0x73, 0x46, 0x21, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0x87, 0x19, 0x67, 0x81, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x47, 0xb9, 0x2a, 0xaa, 0x10, 0x9c, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0x88, 0xb1, 0xa8, 0xb1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0xa8, 0x61, 0x09, 0x22, 0x2a, 0x3a, 0x09, 0x32, 0xa8, 0x29, 0x66, 0x21, 0x46, 0x19, 0x46, 0x19, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0x87, 0x19, 0x66, 0x59, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x8e, 0x93, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x09, 0xaa, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xc8, 0x51, 0x29, 0x2a, 0x2a, 0x3a, 0x4a, 0x3a, 0x29, 0x32, 0xc8, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0x87, 0x19, 0x66, 0x49, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x87, 0xb9, 0x26, 0xb9, 0xcc, 0xa2, 0x31, 0x8c, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe9, 0xa9, 0x47, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xc8, 0x59, 0x09, 0x2a, 0x29, 0x32, 0x2a, 0x3a, 0x29, 0x32, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0x87, 0x19, 0x66, 0x49, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x47, 0xb9, 0xe9, 0xa9, 0x51, 0x8c, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x09, 0xaa, 0xa8, 0xb1, 0x47, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0xa8, 0x71, 0x09, 0x32, 0x29, 0x2a, 0x2a, 0x32, 0x29, 0x3a, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0x87, 0x19, 0x66, 0x21, 0x67, 0x69, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb1, 0x10, 0x94, 0x71, 0x8c, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x4a, 0xa2, 0x88, 0xb1, 0x47, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x87, 0xa1, 0xc8, 0x59, 0x09, 0x32, 0x29, 0x2a, 0x09, 0x2a, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x21, 0x87, 0x21, 0x87, 0x19, 0x86, 0x21, 0x66, 0x51, 0x67, 0x99, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x47, 0xb9, 0x8e, 0x93, 0x92, 0x8c, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x4a, 0xa2, 0x88, 0xb1, 0x47, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xc1, 0x87, 0xa1, 0xa8, 0x71, 0xe8, 0x49, 0xe8, 0x39, 0x87, 0x29, 0x87, 0x21, 0x87, 0x21, 0x87, 0x21, 0x66, 0x29, 0x66, 0x41, 0x67, 0x69, 0x67, 0x99, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x47, 0xb9, 0x6e, 0x93, 0x71, 0x84, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x4a, 0xa2, 0xc8, 0xa9, 0x47, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb1, 0x67, 0xa1, 0x67, 0xa1, 0x67, 0xa1, 0x67, 0xa1, 0x67, 0xa9, 0x67, 0xb9, 0x67, 0xc9, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x87, 0xb9, 0x47, 0xc1, 0x67, 0xb1, 0x8e, 0x93, 0x72, 0x8c, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x09, 0xa2, 0x09, 0x9a, 0x67, 0xb9, 0x47, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x26, 0xb9, 0x09, 0xa2, 0x10, 0x8c, 0x71, 0x8c, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x88, 0xa9, 0x4a, 0x9a, 0xc8, 0xa9, 0x67, 0xb9, 0x47, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x47, 0xb9, 0xa8, 0xa9, 0xec, 0x92, 0x51, 0x84, 0x51, 0x8c, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe8, 0xa1, 0x2a, 0x9a, 0xe8, 0xa1, 0x87, 0xb1, 0x47, 0xb9, 0x47, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x47, 0xc1, 0x47, 0xb9, 0x67, 0xb9, 0xa8, 0xa9, 0x8a, 0x8a, 0xaf, 0x7b, 0x51, 0x84, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xa8, 0xa9, 0x09, 0xa2, 0x2a, 0x92, 0x29, 0x92, 0xc8, 0xa1, 0xa8, 0xa9, 0x87, 0xb1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb1, 0xa8, 0xa9, 0xe8, 0xa1, 0x2a, 0x9a, 0xab, 0x82, 0x6e, 0x7b, 0x51, 0x84, 0xd3, 0x9c, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xc8, 0xb1, 0x29, 0x9a, 0x8b, 0x8a, 0xcb, 0x82, 0xec, 0x7a, 0x8b, 0x82, 0x8b, 0x82, 0xec, 0x7a, 0xec, 0x82, 0xcb, 0x8a, 0x6a, 0x8a, 0x0c, 0x7b, 0x10, 0x84, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
#endif
#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP != 0
/*Pixel format: Red: 5 bit, Green: 6 bit, Blue: 5 bit BUT the 2 bytes are swapped*/
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xb9, 0x88, 0xb9, 0x87, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x88, 0xb9, 0xa8, 0xb9, 0xc8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xb9, 0x87, 0xb9, 0x87, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x88, 0xb9, 0xc8, 0xb9, 0xa8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xb9, 0x88, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x88, 0xc2, 0x0a, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xb9, 0xa8, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x47, 0xb9, 0xc9, 0xc1, 0xe9, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xb9, 0x87, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xa1, 0x67, 0x91, 0x87, 0x89, 0x87, 0x89, 0x87, 0x91, 0x87, 0xa1, 0x67, 0xb1, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x47, 0xb9, 0x88, 0xc1, 0xe9, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0x91, 0x87, 0x61, 0xa8, 0x41, 0xe8, 0x32, 0x09, 0x2a, 0x09, 0x2a, 0x09, 0x2a, 0x09, 0x2a, 0x09, 0x32, 0x09, 0x41, 0xe8, 0x61, 0xa8, 0x91, 0x87, 0xb9, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xc9, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0x91, 0x87, 0x49, 0xc8, 0x2a, 0x09, 0x2a, 0x29, 0x32, 0x2a, 0x32, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x32, 0x2a, 0x32, 0x2a, 0x2a, 0x29, 0x2a, 0x09, 0x49, 0xc8, 0x91, 0x87, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xc8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xb9, 0x88, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0x61, 0xa8, 0x2a, 0x09, 0x2a, 0x29, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x2a, 0x29, 0x2a, 0x09, 0x61, 0xa8, 0xb9, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x87, 0xb9, 0xa8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xb9, 0xc8, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xb1, 0x67, 0x49, 0xc8, 0x2a, 0x29, 0x3a, 0x29, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x2a, 0x2a, 0x29, 0x49, 0xc8, 0xb1, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xa8, 0xb9, 0x47, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xb9, 0x47, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb1, 0x67, 0x49, 0xc8, 0x2a, 0x29, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x32, 0x29, 0x29, 0xe8, 0x29, 0xe8, 0x32, 0x2a, 0x3a, 0x2a, 0x2a, 0x29, 0x49, 0xc8, 0xb1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xc8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xb9, 0x88, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0x59, 0xc8, 0x2a, 0x29, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x32, 0x29, 0x29, 0xe9, 0x29, 0xc8, 0x32, 0x09, 0x4a, 0xcc, 0x74, 0x11, 0xb5, 0xd7, 0x52, 0xec, 0x32, 0x09, 0x3a, 0x2a, 0x2a, 0x29, 0x51, 0xc8, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x88, 0xb9, 0x67, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0xb9, 0xa8, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0x81, 0x87, 0x2a, 0x09, 0x3a, 0x2a, 0x32, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x32, 0x09, 0x29, 0xc8, 0x29, 0xc8, 0x3a, 0x4a, 0x63, 0x6e, 0x94, 0xf4, 0xce, 0x9a, 0xf7, 0xbe, 0xff, 0xff, 0xff, 0xff, 0x52, 0xec, 0x29, 0xa8, 0x3a, 0x4a, 0x3a, 0x29, 0x2a, 0x09, 0x79, 0xa8, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xa8, 0xb9, 0x67, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0xb9, 0x87, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb1, 0x67, 0x39, 0xe8, 0x32, 0x29, 0x3a, 0x2a, 0x3a, 0x2a, 0x32, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x31, 0xe9, 0x32, 0x09, 0x4a, 0xcc, 0x7c, 0x31, 0xb5, 0xd8, 0xe7, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x52, 0xec, 0x21, 0x46, 0x32, 0x09, 0x3a, 0x4a, 0x32, 0x29, 0x31, 0xe8, 0xa9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x87, 0xb9, 0x88, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0x71, 0xa8, 0x2a, 0x29, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x32, 0x2a, 0x3a, 0x4a, 0x29, 0xe9, 0x73, 0xf0, 0xd6, 0xbb, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x52, 0xec, 0x21, 0x66, 0x29, 0xa7, 0x31, 0xe9, 0x3a, 0x2a, 0x2a, 0x29, 0x69, 0xa8, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xa8, 0x07, 0xe0,
0x07, 0xe0, 0xb9, 0xa8, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb1, 0x67, 0x41, 0xe8, 0x32, 0x29, 0x3a, 0x2a, 0x3a, 0x2a, 0x32, 0x2a, 0x3a, 0x4a, 0x3a, 0x2a, 0x3a, 0x4a, 0x29, 0xc8, 0xa5, 0x55, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xce, 0x59, 0xce, 0x79, 0xff, 0xff, 0x52, 0xcc, 0x21, 0x66, 0x29, 0xa7, 0x29, 0xa7, 0x31, 0xe9, 0x32, 0x2a, 0x39, 0xe8, 0xb1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xa8, 0xb9, 0x88,
0x07, 0xe0, 0xb9, 0x87, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0x91, 0x87, 0x2a, 0x09, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x29, 0xc8, 0x9d, 0x15, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x3c, 0xb5, 0x96, 0x73, 0xd0, 0x42, 0x6a, 0x10, 0xe4, 0x7c, 0x10, 0xff, 0xff, 0x52, 0xab, 0x21, 0x66, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x31, 0xe8, 0x2a, 0x09, 0x91, 0x87, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x88, 0xb9, 0xa8,
0x07, 0xe0, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0x71, 0xa8, 0x2a, 0x29, 0x3a, 0x2a, 0x3a, 0x4a, 0x32, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x2a, 0x3a, 0x4a, 0x29, 0xc8, 0x9d, 0x35, 0xff, 0xff, 0xce, 0x59, 0x8c, 0x92, 0x52, 0xec, 0x29, 0xa7, 0x19, 0x25, 0x19, 0x25, 0x21, 0x87, 0x19, 0x26, 0x8c, 0x72, 0xff, 0xff, 0x52, 0xcb, 0x21, 0x66, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0x87, 0x21, 0xe8, 0x71, 0xa8, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xe9,
0x07, 0xe0, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0x59, 0xc8, 0x2a, 0x29, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x29, 0xc8, 0x9d, 0x35, 0xff, 0xff, 0x32, 0x09, 0x11, 0x05, 0x21, 0x66, 0x29, 0xa7, 0x29, 0xc8, 0x29, 0xc8, 0x31, 0xe8, 0x19, 0x46, 0x84, 0x52, 0xff, 0xff, 0x52, 0xcb, 0x21, 0x66, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x19, 0x87, 0x51, 0x87, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xe9,
0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0x49, 0xc8, 0x32, 0x29, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x4a, 0x29, 0xc8, 0x9d, 0x35, 0xff, 0xff, 0x42, 0x4a, 0x21, 0x87, 0x29, 0xc8, 0x29, 0xa7, 0x29, 0xa7, 0x21, 0x66, 0x19, 0x46, 0x08, 0xc4, 0x84, 0x31, 0xff, 0xff, 0x52, 0xab, 0x21, 0x66, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x21, 0x87, 0x39, 0x66, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xba, 0x2a,
0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0x49, 0xe8, 0x32, 0x2a, 0x3a, 0x2a, 0x32, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x29, 0xc8, 0x9d, 0x35, 0xff, 0xff, 0x42, 0x4a, 0x21, 0x66, 0x29, 0xa7, 0x29, 0xa7, 0x19, 0x46, 0x4a, 0xab, 0x84, 0x51, 0x63, 0x6e, 0x94, 0xd3, 0xff, 0xff, 0x52, 0xcb, 0x21, 0x66, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x21, 0xa7, 0x39, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xc9,
0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0x49, 0xe8, 0x32, 0x2a, 0x3a, 0x2a, 0x32, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x3a, 0x4a, 0x3a, 0x6a, 0x29, 0xe8, 0xa5, 0x35, 0xff, 0xff, 0x42, 0x4a, 0x21, 0x66, 0x29, 0xc8, 0x19, 0x46, 0x8c, 0x92, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x52, 0xec, 0x21, 0x66, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x21, 0xa7, 0x39, 0x66, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xe9,
0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0x49, 0xc8, 0x32, 0x29, 0x3a, 0x2a, 0x3a, 0x2a, 0x32, 0x2a, 0x3a, 0x4a, 0x3a, 0x2a, 0x29, 0xc8, 0x29, 0xe9, 0x19, 0x66, 0x9d, 0x14, 0xff, 0xff, 0x3a, 0x4a, 0x21, 0x87, 0x21, 0x66, 0x53, 0x0c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x52, 0xcc, 0x21, 0x66, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x21, 0x87, 0x39, 0x66, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xba, 0x2a,
0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0x59, 0xc8, 0x2a, 0x29, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x4a, 0x32, 0x29, 0x32, 0x29, 0x84, 0x52, 0xb5, 0xd7, 0x94, 0xf4, 0xbd, 0xf8, 0xff, 0xff, 0x42, 0x4a, 0x29, 0x87, 0x19, 0x25, 0x94, 0xb3, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x52, 0xec, 0x21, 0x66, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x19, 0x87, 0x51, 0x66, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xba, 0x4a,
0x07, 0xe0, 0xb9, 0x87, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0x71, 0xa8, 0x2a, 0x29, 0x3a, 0x2a, 0x3a, 0x2a, 0x3a, 0x2a, 0x32, 0x29, 0xc6, 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x42, 0x6a, 0x21, 0x87, 0x19, 0x26, 0x84, 0x52, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x42, 0x6a, 0x21, 0x66, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x19, 0x87, 0x69, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x87, 0xb2, 0x4a,
0x07, 0xe0, 0xb9, 0x88, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0x99, 0x87, 0x2a, 0x09, 0x3a, 0x2a, 0x3a, 0x4a, 0x29, 0xc8, 0x84, 0x52, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x42, 0x6a, 0x21, 0x87, 0x21, 0x87, 0x3a, 0x09, 0xef, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0xb7, 0x19, 0x46, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x19, 0x87, 0x91, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0xa8, 0xba, 0x09,
0x07, 0xe0, 0xb9, 0xa8, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0x41, 0xe8, 0x32, 0x29, 0x3a, 0x4a, 0x29, 0xc8, 0xb5, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x42, 0x6a, 0x21, 0x66, 0x29, 0xc8, 0x21, 0x66, 0x4a, 0xab, 0xce, 0x59, 0xf7, 0x9e, 0xef, 0x7d, 0xa5, 0x55, 0x29, 0xc8, 0x29, 0x87, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x21, 0x87, 0x39, 0x66, 0xb1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x47, 0xb9, 0xe9, 0xb2, 0x6b,
0x07, 0xe0, 0xb1, 0xc8, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0x79, 0xa8, 0x2a, 0x09, 0x3a, 0x4a, 0x29, 0xc8, 0x94, 0xd4, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xef, 0x7e, 0x31, 0xe8, 0x29, 0x87, 0x29, 0xa7, 0x29, 0xa7, 0x21, 0x66, 0x21, 0x66, 0x3a, 0x29, 0x31, 0xe8, 0x19, 0x46, 0x29, 0x87, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x19, 0x87, 0x71, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb2, 0x4a, 0xa3, 0xf0,
0x07, 0xe0, 0x07, 0xe0, 0xb9, 0xa8, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb1, 0x67, 0x39, 0xe8, 0x32, 0x2a, 0x32, 0x29, 0x42, 0x6b, 0xe7, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0x51, 0x19, 0x46, 0x29, 0xc8, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x21, 0x87, 0x21, 0x87, 0x29, 0xc8, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x21, 0x87, 0x31, 0x66, 0xb1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x88, 0xa3, 0x2d, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0xb1, 0xc9, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0x89, 0x87, 0x2a, 0x09, 0x3a, 0x2a, 0x32, 0x09, 0x42, 0xab, 0xad, 0x76, 0xce, 0x7a, 0xc6, 0x39, 0x73, 0xd0, 0x21, 0x46, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x19, 0x87, 0x81, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x47, 0xaa, 0x2a, 0x9c, 0x10, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0xb1, 0x88, 0xb1, 0xa8, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0x61, 0xa8, 0x22, 0x09, 0x3a, 0x2a, 0x32, 0x09, 0x29, 0xa8, 0x21, 0x66, 0x19, 0x46, 0x19, 0x46, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x19, 0x87, 0x59, 0x66, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0x93, 0x8e, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xaa, 0x09, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0x51, 0xc8, 0x2a, 0x29, 0x3a, 0x2a, 0x3a, 0x4a, 0x32, 0x29, 0x29, 0xc8, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x19, 0x87, 0x49, 0x66, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x87, 0xb9, 0x26, 0xa2, 0xcc, 0x8c, 0x31, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xa9, 0xe9, 0xb9, 0x47, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0x59, 0xc8, 0x2a, 0x09, 0x32, 0x29, 0x3a, 0x2a, 0x32, 0x29, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x19, 0x87, 0x49, 0x66, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x47, 0xa9, 0xe9, 0x8c, 0x51, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xaa, 0x09, 0xb1, 0xa8, 0xb9, 0x47, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0x71, 0xa8, 0x32, 0x09, 0x2a, 0x29, 0x32, 0x2a, 0x3a, 0x29, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x19, 0x87, 0x21, 0x66, 0x69, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb1, 0x67, 0x94, 0x10, 0x8c, 0x71, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xa2, 0x4a, 0xb1, 0x88, 0xb9, 0x47, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xa1, 0x87, 0x59, 0xc8, 0x32, 0x09, 0x2a, 0x29, 0x2a, 0x09, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x29, 0xa7, 0x21, 0xa7, 0x21, 0x87, 0x19, 0x87, 0x21, 0x86, 0x51, 0x66, 0x99, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x47, 0x93, 0x8e, 0x8c, 0x92, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xa2, 0x4a, 0xb1, 0x88, 0xc1, 0x47, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xa1, 0x87, 0x71, 0xa8, 0x49, 0xe8, 0x39, 0xe8, 0x29, 0x87, 0x21, 0x87, 0x21, 0x87, 0x21, 0x87, 0x29, 0x66, 0x41, 0x66, 0x69, 0x67, 0x99, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x47, 0x93, 0x6e, 0x84, 0x71, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xa2, 0x4a, 0xa9, 0xc8, 0xc1, 0x47, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb1, 0x67, 0xa1, 0x67, 0xa1, 0x67, 0xa1, 0x67, 0xa1, 0x67, 0xa9, 0x67, 0xb9, 0x67, 0xc9, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x87, 0xc1, 0x47, 0xb1, 0x67, 0x93, 0x8e, 0x8c, 0x72, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xa2, 0x09, 0x9a, 0x09, 0xb9, 0x67, 0xc1, 0x47, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xc1, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x26, 0xa2, 0x09, 0x8c, 0x10, 0x8c, 0x71, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xa9, 0x88, 0x9a, 0x4a, 0xa9, 0xc8, 0xb9, 0x67, 0xc1, 0x47, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x67, 0xb9, 0x47, 0xa9, 0xa8, 0x92, 0xec, 0x84, 0x51, 0x8c, 0x51, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xa1, 0xe8, 0x9a, 0x2a, 0xa1, 0xe8, 0xb1, 0x87, 0xb9, 0x47, 0xc1, 0x47, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xc1, 0x47, 0xb9, 0x47, 0xb9, 0x67, 0xa9, 0xa8, 0x8a, 0x8a, 0x7b, 0xaf, 0x84, 0x51, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xa9, 0xa8, 0xa2, 0x09, 0x92, 0x2a, 0x92, 0x29, 0xa1, 0xc8, 0xa9, 0xa8, 0xb1, 0x87, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb9, 0x67, 0xb1, 0x67, 0xa9, 0xa8, 0xa1, 0xe8, 0x9a, 0x2a, 0x82, 0xab, 0x7b, 0x6e, 0x84, 0x51, 0x9c, 0xd3, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xb1, 0xc8, 0x9a, 0x29, 0x8a, 0x8b, 0x82, 0xcb, 0x7a, 0xec, 0x82, 0x8b, 0x82, 0x8b, 0x7a, 0xec, 0x82, 0xec, 0x8a, 0xcb, 0x8a, 0x6a, 0x7b, 0x0c, 0x84, 0x10, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
#endif
#if LV_COLOR_DEPTH == 32
/*Pixel format: Fix 0xFF: 8 bit, Red: 8 bit, Green: 8 bit, Blue: 8 bit*/
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x3d, 0x31, 0xb9, 0xff, 0x3b, 0x2f, 0xb9, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x3c, 0x2f, 0xb9, 0xff, 0x3e, 0x32, 0xb9, 0xff, 0x43, 0x37, 0xba, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x3b, 0x31, 0xb9, 0xff, 0x3b, 0x2f, 0xb9, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x38, 0x2b, 0xb7, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x3a, 0x2d, 0xb9, 0xff, 0x3a, 0x2d, 0xb9, 0xff, 0x3a, 0x2d, 0xb9, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x38, 0x2a, 0xb7, 0xff, 0x39, 0x2b, 0xb8, 0xff, 0x3c, 0x2f, 0xb9, 0xff, 0x43, 0x38, 0xbb, 0xff, 0x41, 0x35, 0xbb, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x3d, 0x31, 0xb9, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2d, 0xb9, 0xff, 0x3a, 0x2d, 0xb9, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x3a, 0x2d, 0xb9, 0xff, 0x3a, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x37, 0x2a, 0xb7, 0xff, 0x3d, 0x30, 0xb9, 0xff, 0x4c, 0x40, 0xbd, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x3f, 0x33, 0xba, 0xff, 0x38, 0x2b, 0xb7, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x3a, 0x2d, 0xb6, 0xff, 0x3a, 0x2d, 0xb9, 0xff, 0x39, 0x2c, 0xbd, 0xff, 0x39, 0x2b, 0xc0, 0xff, 0x39, 0x2b, 0xc1, 0xff, 0x39, 0x2b, 0xc1, 0xff, 0x39, 0x2b, 0xc0, 0xff, 0x39, 0x2c, 0xbd, 0xff, 0x39, 0x2c, 0xb9, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2b, 0xb8, 0xff, 0x36, 0x29, 0xb7, 0xff, 0x44, 0x38, 0xbb, 0xff, 0x47, 0x3c, 0xbc, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x3b, 0x2e, 0xb8, 0xff, 0x38, 0x2a, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb6, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x38, 0x2b, 0xc0, 0xff, 0x38, 0x2a, 0xc1, 0xff, 0x38, 0x2c, 0xb4, 0xff, 0x39, 0x2d, 0xa1, 0xff, 0x3a, 0x2f, 0x8e, 0xff, 0x3b, 0x31, 0x89, 0xff, 0x3b, 0x30, 0x89, 0xff, 0x3a, 0x2f, 0x8d, 0xff, 0x39, 0x2d, 0xa0, 0xff, 0x38, 0x2b, 0xb3, 0xff, 0x38, 0x2a, 0xc1, 0xff, 0x38, 0x2b, 0xc0, 0xff, 0x39, 0x2d, 0xb9, 0xff, 0x39, 0x2c, 0xb6, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2d, 0xb8, 0xff, 0x36, 0x29, 0xb7, 0xff, 0x3c, 0x2f, 0xb8, 0xff, 0x46, 0x3a, 0xbc, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x39, 0x2d, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x39, 0x2d, 0xb7, 0xff, 0x38, 0x2b, 0xbf, 0xff, 0x38, 0x2a, 0xba, 0xff, 0x3a, 0x2f, 0x90, 0xff, 0x3e, 0x35, 0x5f, 0xff, 0x43, 0x3b, 0x3e, 0xff, 0x45, 0x3e, 0x2e, 0xff, 0x48, 0x40, 0x28, 0xff, 0x48, 0x41, 0x27, 0xff, 0x48, 0x41, 0x27, 0xff, 0x47, 0x40, 0x28, 0xff, 0x45, 0x3e, 0x2e, 0xff, 0x43, 0x3b, 0x3d, 0xff, 0x3f, 0x35, 0x5e, 0xff, 0x3a, 0x2f, 0x8f, 0xff, 0x38, 0x2b, 0xb9, 0xff, 0x38, 0x2b, 0xc0, 0xff, 0x39, 0x2c, 0xb6, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x3a, 0x2c, 0xb8, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x39, 0x2d, 0xb8, 0xff, 0x45, 0x39, 0xbb, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb6, 0xff, 0x39, 0x2c, 0xb9, 0xff, 0x38, 0x2b, 0xbf, 0xff, 0x3a, 0x2f, 0x8f, 0xff, 0x41, 0x39, 0x48, 0xff, 0x47, 0x40, 0x28, 0xff, 0x4a, 0x43, 0x28, 0xff, 0x4c, 0x44, 0x2f, 0xff, 0x4c, 0x44, 0x33, 0xff, 0x4c, 0x44, 0x35, 0xff, 0x4d, 0x45, 0x36, 0xff, 0x4d, 0x44, 0x35, 0xff, 0x4c, 0x44, 0x35, 0xff, 0x4c, 0x44, 0x33, 0xff, 0x4c, 0x44, 0x2f, 0xff, 0x4a, 0x42, 0x28, 0xff, 0x47, 0x40, 0x28, 0xff, 0x41, 0x39, 0x47, 0xff, 0x3a, 0x2f, 0x8d, 0xff, 0x38, 0x2b, 0xbf, 0xff, 0x39, 0x2c, 0xb9, 0xff, 0x39, 0x2c, 0xb6, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2b, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x43, 0x38, 0xbb, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x3c, 0x30, 0xb9, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2d, 0xb7, 0xff, 0x39, 0x2b, 0xbc, 0xff, 0x38, 0x2b, 0xb6, 0xff, 0x3d, 0x35, 0x63, 0xff, 0x46, 0x3f, 0x27, 0xff, 0x4b, 0x43, 0x2b, 0xff, 0x4c, 0x44, 0x34, 0xff, 0x4d, 0x45, 0x36, 0xff, 0x4d, 0x45, 0x35, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x35, 0xff, 0x4d, 0x45, 0x36, 0xff, 0x4c, 0x44, 0x35, 0xff, 0x4b, 0x43, 0x2b, 0xff, 0x46, 0x3f, 0x26, 0xff, 0x3e, 0x35, 0x61, 0xff, 0x38, 0x2b, 0xb6, 0xff, 0x39, 0x2b, 0xbc, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2d, 0xb8, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x3b, 0x2e, 0xb8, 0xff, 0x41, 0x35, 0xba, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x43, 0x37, 0xba, 0xff, 0x37, 0x2a, 0xb7, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x39, 0x2b, 0xb8, 0xff, 0x3a, 0x2d, 0xb6, 0xff, 0x39, 0x2b, 0xbc, 0xff, 0x38, 0x2b, 0xb0, 0xff, 0x40, 0x38, 0x49, 0xff, 0x49, 0x42, 0x25, 0xff, 0x4b, 0x43, 0x34, 0xff, 0x4d, 0x44, 0x35, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4d, 0x45, 0x35, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4f, 0x47, 0x37, 0xff, 0x4f, 0x47, 0x38, 0xff, 0x4c, 0x44, 0x35, 0xff, 0x49, 0x42, 0x25, 0xff, 0x40, 0x38, 0x47, 0xff, 0x38, 0x2c, 0xae, 0xff, 0x39, 0x2b, 0xbc, 0xff, 0x39, 0x2c, 0xb6, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x38, 0x2a, 0xb7, 0xff, 0x3f, 0x33, 0xb9, 0xff, 0x35, 0x28, 0xb6, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x37, 0x29, 0xb7, 0xff, 0x3a, 0x2d, 0xb9, 0xff, 0x38, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x39, 0x2c, 0xba, 0xff, 0x38, 0x2c, 0xb1, 0xff, 0x41, 0x39, 0x45, 0xff, 0x49, 0x42, 0x28, 0xff, 0x4c, 0x44, 0x36, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4e, 0x45, 0x35, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4f, 0x47, 0x37, 0xff, 0x51, 0x49, 0x38, 0xff, 0x4f, 0x47, 0x37, 0xff, 0x4a, 0x42, 0x31, 0xff, 0x43, 0x3a, 0x28, 0xff, 0x43, 0x3b, 0x28, 0xff, 0x4d, 0x45, 0x33, 0xff, 0x4c, 0x44, 0x36, 0xff, 0x4a, 0x42, 0x28, 0xff, 0x41, 0x39, 0x44, 0xff, 0x38, 0x2c, 0xaf, 0xff, 0x39, 0x2c, 0xba, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x39, 0x2d, 0xb8, 0xff, 0x38, 0x2b, 0xb7, 0xff, 0x42, 0x36, 0xba, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x3c, 0x2f, 0xb9, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x37, 0x2a, 0xbd, 0xff, 0x3f, 0x37, 0x54, 0xff, 0x4a, 0x42, 0x25, 0xff, 0x4c, 0x44, 0x36, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4f, 0x47, 0x36, 0xff, 0x50, 0x48, 0x37, 0xff, 0x50, 0x48, 0x37, 0xff, 0x4b, 0x43, 0x32, 0xff, 0x44, 0x3c, 0x2a, 0xff, 0x40, 0x38, 0x25, 0xff, 0x46, 0x3e, 0x2c, 0xff, 0x5d, 0x56, 0x46, 0xff, 0x84, 0x7e, 0x72, 0xff, 0xb9, 0xb6, 0xaf, 0xff, 0x63, 0x5d, 0x51, 0xff, 0x47, 0x3f, 0x2d, 0xff, 0x4d, 0x45, 0x38, 0xff, 0x4a, 0x42, 0x25, 0xff, 0x3f, 0x37, 0x51, 0xff, 0x37, 0x2b, 0xbc, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x3c, 0x2f, 0xb9, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x40, 0x34, 0xba, 0xff, 0x37, 0x2a, 0xb7, 0xff, 0x3a, 0x2d, 0xb9, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x3a, 0x2d, 0xb6, 0xff, 0x38, 0x2b, 0xc1, 0xff, 0x3b, 0x31, 0x7c, 0xff, 0x48, 0x41, 0x25, 0xff, 0x4c, 0x43, 0x35, 0xff, 0x4d, 0x45, 0x33, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4f, 0x47, 0x36, 0xff, 0x4e, 0x46, 0x36, 0xff, 0x48, 0x40, 0x2e, 0xff, 0x41, 0x39, 0x27, 0xff, 0x41, 0x39, 0x27, 0xff, 0x50, 0x48, 0x37, 0xff, 0x71, 0x6b, 0x5d, 0xff, 0xa1, 0x9c, 0x93, 0xff, 0xd0, 0xce, 0xc8, 0xff, 0xf3, 0xf2, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5e, 0x5a, 0x52, 0xff, 0x3c, 0x34, 0x24, 0xff, 0x50, 0x48, 0x36, 0xff, 0x4b, 0x43, 0x35, 0xff, 0x48, 0x41, 0x25, 0xff, 0x3c, 0x32, 0x79, 0xff, 0x38, 0x2a, 0xc2, 0xff, 0x3a, 0x2d, 0xb5, 0xff, 0x38, 0x2b, 0xb7, 0xff, 0x3a, 0x2d, 0xb9, 0xff, 0x38, 0x2b, 0xb7, 0xff, 0x3f, 0x33, 0xb9, 0xff, 0x39, 0x2b, 0xb7, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x3b, 0x2e, 0xb8, 0xff, 0x38, 0x2b, 0xb7, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xba, 0xff, 0x38, 0x2c, 0xac, 0xff, 0x43, 0x3c, 0x34, 0xff, 0x4b, 0x43, 0x30, 0xff, 0x4c, 0x44, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4c, 0x44, 0x33, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x46, 0x3d, 0x2c, 0xff, 0x46, 0x3e, 0x2c, 0xff, 0x60, 0x59, 0x4a, 0xff, 0x8b, 0x85, 0x79, 0xff, 0xbc, 0xb9, 0xb2, 0xff, 0xe6, 0xe5, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xff, 0xf9, 0xf9, 0xf8, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0x5e, 0x5a, 0x51, 0xff, 0x30, 0x29, 0x1c, 0xff, 0x46, 0x3f, 0x2f, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4b, 0x43, 0x30, 0xff, 0x43, 0x3c, 0x32, 0xff, 0x38, 0x2c, 0xaa, 0xff, 0x39, 0x2c, 0xbb, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x38, 0x2b, 0xb7, 0xff, 0x3b, 0x2f, 0xb8, 0xff, 0x3d, 0x31, 0xb9, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x38, 0x2c, 0xb8, 0xff, 0x3a, 0x2d, 0xb6, 0xff, 0x38, 0x2a, 0xc1, 0xff, 0x3d, 0x33, 0x6e, 0xff, 0x49, 0x42, 0x26, 0xff, 0x4c, 0x44, 0x36, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4c, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x33, 0xff, 0x4f, 0x47, 0x36, 0xff, 0x45, 0x3d, 0x2b, 0xff, 0x80, 0x7a, 0x6d, 0xff, 0xd7, 0xd5, 0xd1, 0xff, 0xf7, 0xf7, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xfa, 0xfa, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0x5f, 0x5a, 0x52, 0xff, 0x31, 0x2a, 0x1d, 0xff, 0x39, 0x33, 0x27, 0xff, 0x44, 0x3d, 0x2d, 0xff, 0x4e, 0x45, 0x37, 0xff, 0x49, 0x42, 0x25, 0xff, 0x3d, 0x33, 0x6b, 0xff, 0x38, 0x2b, 0xc1, 0xff, 0x3a, 0x2d, 0xb6, 0xff, 0x38, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x3f, 0x33, 0xb9, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x3e, 0x32, 0xb8, 0xff, 0x38, 0x2b, 0xb7, 0xff, 0x3a, 0x2d, 0xb9, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb9, 0xff, 0x38, 0x2b, 0xb2, 0xff, 0x42, 0x3b, 0x3d, 0xff, 0x4b, 0x43, 0x2e, 0xff, 0x4d, 0x45, 0x35, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4c, 0x44, 0x33, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4e, 0x45, 0x34, 0xff, 0x50, 0x48, 0x38, 0xff, 0x40, 0x37, 0x24, 0xff, 0xab, 0xa8, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf9, 0xf9, 0xff, 0xf7, 0xf7, 0xf6, 0xff, 0xfa, 0xfa, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf7, 0xf6, 0xff, 0xc9, 0xc7, 0xc4, 0xff, 0xcb, 0xca, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5d, 0x58, 0x50, 0xff, 0x31, 0x2b, 0x1d, 0xff, 0x3b, 0x35, 0x28, 0xff, 0x37, 0x32, 0x25, 0xff, 0x44, 0x3c, 0x2e, 0xff, 0x4d, 0x45, 0x30, 0xff, 0x42, 0x3b, 0x3a, 0xff, 0x38, 0x2c, 0xb0, 0xff, 0x39, 0x2c, 0xba, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x3a, 0x2d, 0xb9, 0xff, 0x38, 0x2a, 0xb7, 0xff, 0x3f, 0x32, 0xb9, 0xff, 0x3d, 0x30, 0xb8, 0xff,
0x00, 0xff, 0x00, 0xff, 0x3b, 0x2f, 0xb8, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x3a, 0x2d, 0xb6, 0xff, 0x38, 0x2b, 0xc0, 0xff, 0x3a, 0x2f, 0x91, 0xff, 0x47, 0x40, 0x28, 0xff, 0x4c, 0x44, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x46, 0x34, 0xff, 0x4f, 0x47, 0x37, 0xff, 0x41, 0x38, 0x25, 0xff, 0xa4, 0xa0, 0x97, 0xff, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xe2, 0xe0, 0xff, 0xb3, 0xb1, 0xac, 0xff, 0x7d, 0x79, 0x70, 0xff, 0x51, 0x4c, 0x41, 0xff, 0x23, 0x1d, 0x0e, 0xff, 0x83, 0x80, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5a, 0x55, 0x4d, 0xff, 0x30, 0x2a, 0x1c, 0xff, 0x3b, 0x35, 0x28, 0xff, 0x39, 0x33, 0x26, 0xff, 0x37, 0x32, 0x25, 0xff, 0x43, 0x3c, 0x2e, 0xff, 0x49, 0x41, 0x28, 0xff, 0x3a, 0x2f, 0x8e, 0xff, 0x38, 0x2b, 0xc0, 0xff, 0x3a, 0x2d, 0xb6, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x3c, 0x2f, 0xb8, 0xff, 0x40, 0x34, 0xb9, 0xff,
0x00, 0xff, 0x00, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb6, 0xff, 0x38, 0x2a, 0xc2, 0xff, 0x3d, 0x34, 0x6e, 0xff, 0x4a, 0x42, 0x26, 0xff, 0x4c, 0x45, 0x36, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4c, 0x44, 0x33, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4e, 0x45, 0x34, 0xff, 0x50, 0x48, 0x38, 0xff, 0x40, 0x38, 0x25, 0xff, 0xa6, 0xa2, 0x98, 0xff, 0xff, 0xff, 0xff, 0xff, 0xca, 0xc8, 0xc5, 0xff, 0x92, 0x8e, 0x88, 0xff, 0x5f, 0x5b, 0x50, 0xff, 0x3b, 0x35, 0x28, 0xff, 0x2b, 0x24, 0x16, 0xff, 0x2b, 0x25, 0x17, 0xff, 0x36, 0x30, 0x23, 0xff, 0x2c, 0x25, 0x18, 0xff, 0x8d, 0x8a, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5b, 0x56, 0x4e, 0xff, 0x31, 0x2b, 0x1d, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x37, 0x31, 0x27, 0xff, 0x41, 0x3a, 0x20, 0xff, 0x3e, 0x35, 0x6c, 0xff, 0x38, 0x2a, 0xc2, 0xff, 0x3a, 0x2d, 0xb6, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2b, 0xb8, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x45, 0x3a, 0xba, 0xff,
0x00, 0xff, 0x00, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x38, 0x2b, 0xbe, 0xff, 0x40, 0x37, 0x54, 0xff, 0x4b, 0x44, 0x29, 0xff, 0x4d, 0x45, 0x36, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4e, 0x46, 0x34, 0xff, 0x50, 0x48, 0x38, 0xff, 0x40, 0x38, 0x25, 0xff, 0xa7, 0xa3, 0x9a, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x3e, 0x33, 0xff, 0x24, 0x1e, 0x0f, 0xff, 0x32, 0x2c, 0x1e, 0xff, 0x38, 0x32, 0x25, 0xff, 0x3c, 0x36, 0x2a, 0xff, 0x3d, 0x37, 0x2a, 0xff, 0x41, 0x3b, 0x2e, 0xff, 0x2f, 0x28, 0x1a, 0xff, 0x8c, 0x89, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5b, 0x56, 0x4e, 0xff, 0x31, 0x2b, 0x1d, 0xff, 0x3b, 0x35, 0x28, 0xff, 0x38, 0x32, 0x25, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x28, 0xff, 0x36, 0x31, 0x1b, 0xff, 0x38, 0x30, 0x4e, 0xff, 0x38, 0x2b, 0xbe, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x38, 0x2c, 0xb7, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x47, 0x3c, 0xb9, 0xff,
0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x38, 0x2c, 0xb7, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x38, 0x2b, 0xb9, 0xff, 0x41, 0x39, 0x46, 0xff, 0x4b, 0x44, 0x2c, 0xff, 0x4d, 0x45, 0x35, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4e, 0x46, 0x34, 0xff, 0x50, 0x48, 0x38, 0xff, 0x41, 0x38, 0x25, 0xff, 0xa8, 0xa4, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4e, 0x48, 0x3d, 0xff, 0x37, 0x31, 0x23, 0xff, 0x3c, 0x36, 0x2a, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x3b, 0x35, 0x28, 0xff, 0x31, 0x2b, 0x1d, 0xff, 0x2e, 0x28, 0x1a, 0xff, 0x1e, 0x17, 0x08, 0xff, 0x88, 0x85, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5a, 0x55, 0x4d, 0xff, 0x31, 0x2b, 0x1d, 0xff, 0x3b, 0x35, 0x28, 0xff, 0x38, 0x32, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x37, 0x31, 0x1f, 0xff, 0x32, 0x2c, 0x39, 0xff, 0x38, 0x2b, 0xb7, 0xff, 0x39, 0x2c, 0xb9, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x3a, 0x2d, 0xb9, 0xff, 0x38, 0x2b, 0xb7, 0xff, 0x4d, 0x42, 0xba, 0xff,
0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2d, 0xb8, 0xff, 0x3a, 0x2d, 0xb9, 0xff, 0x38, 0x2c, 0xba, 0xff, 0x42, 0x3a, 0x46, 0xff, 0x4c, 0x44, 0x2d, 0xff, 0x4d, 0x45, 0x35, 0xff, 0x4c, 0x44, 0x33, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4e, 0x45, 0x35, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x50, 0x48, 0x37, 0xff, 0x40, 0x37, 0x25, 0xff, 0xa7, 0xa3, 0x9a, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4d, 0x47, 0x3c, 0xff, 0x33, 0x2d, 0x1f, 0xff, 0x3b, 0x35, 0x28, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x2e, 0x27, 0x1a, 0xff, 0x59, 0x53, 0x49, 0xff, 0x8a, 0x87, 0x7f, 0xff, 0x6f, 0x6b, 0x61, 0xff, 0x98, 0x96, 0x90, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5b, 0x56, 0x4e, 0xff, 0x31, 0x2b, 0x1d, 0xff, 0x3b, 0x35, 0x28, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x38, 0x32, 0x20, 0xff, 0x34, 0x2d, 0x36, 0xff, 0x38, 0x2b, 0xb5, 0xff, 0x3a, 0x2d, 0xba, 0xff, 0x39, 0x2b, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2b, 0xb7, 0xff, 0x44, 0x39, 0xb6, 0xff,
0x39, 0x2c, 0xb8, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x3a, 0x2d, 0xb9, 0xff, 0x38, 0x2b, 0xb9, 0xff, 0x42, 0x3a, 0x46, 0xff, 0x4c, 0x44, 0x2d, 0xff, 0x4d, 0x45, 0x35, 0xff, 0x4c, 0x44, 0x33, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x50, 0x48, 0x36, 0xff, 0x52, 0x4a, 0x3b, 0xff, 0x43, 0x3b, 0x28, 0xff, 0xa9, 0xa5, 0x9c, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0x4d, 0x47, 0x3c, 0xff, 0x33, 0x2d, 0x1f, 0xff, 0x3c, 0x36, 0x2a, 0xff, 0x2f, 0x28, 0x1b, 0xff, 0x93, 0x90, 0x89, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf9, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5e, 0x5a, 0x51, 0xff, 0x31, 0x2b, 0x1d, 0xff, 0x3b, 0x35, 0x28, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x38, 0x32, 0x20, 0xff, 0x33, 0x2d, 0x36, 0xff, 0x38, 0x2c, 0xb5, 0xff, 0x3a, 0x2d, 0xb9, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2b, 0xb8, 0xff, 0x46, 0x3a, 0xb7, 0xff,
0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x3a, 0x2d, 0xb9, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x38, 0x2c, 0xba, 0xff, 0x41, 0x39, 0x46, 0xff, 0x4b, 0x44, 0x2c, 0xff, 0x4d, 0x45, 0x35, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4c, 0x44, 0x33, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x42, 0x39, 0x26, 0xff, 0x44, 0x3b, 0x29, 0xff, 0x33, 0x2a, 0x15, 0xff, 0xa2, 0x9e, 0x94, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4c, 0x46, 0x3b, 0xff, 0x35, 0x2f, 0x22, 0xff, 0x31, 0x2b, 0x1d, 0xff, 0x62, 0x5e, 0x53, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xfa, 0xf9, 0xf9, 0xff, 0xfb, 0xfb, 0xfa, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0x5e, 0x59, 0x51, 0xff, 0x31, 0x2b, 0x1d, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x38, 0x32, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x27, 0xff, 0x37, 0x31, 0x1f, 0xff, 0x33, 0x2c, 0x3b, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x39, 0x2d, 0xb9, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x4e, 0x43, 0xb6, 0xff,
0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb9, 0xff, 0x38, 0x2c, 0xb8, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x37, 0x2b, 0xbf, 0xff, 0x3f, 0x37, 0x57, 0xff, 0x4b, 0x43, 0x29, 0xff, 0x4d, 0x44, 0x35, 0xff, 0x4d, 0x45, 0x34, 0xff, 0x4e, 0x46, 0x35, 0xff, 0x4a, 0x42, 0x31, 0xff, 0x4a, 0x42, 0x30, 0xff, 0x8d, 0x88, 0x7c, 0xff, 0xb9, 0xb6, 0xaf, 0xff, 0x9e, 0x9a, 0x8f, 0xff, 0xbe, 0xbb, 0xb4, 0xff, 0xfd, 0xfd, 0xfd, 0xff, 0x4e, 0x48, 0x3d, 0xff, 0x37, 0x31, 0x24, 0xff, 0x2b, 0x25, 0x17, 0xff, 0x99, 0x95, 0x8f, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xf9, 0xf9, 0xf9, 0xff, 0xfd, 0xfd, 0xfd, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x5b, 0x53, 0xff, 0x30, 0x2a, 0x1c, 0xff, 0x3b, 0x35, 0x28, 0xff, 0x39, 0x33, 0x25, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x28, 0xff, 0x36, 0x31, 0x1b, 0xff, 0x33, 0x2c, 0x4d, 0xff, 0x38, 0x2c, 0xbf, 0xff, 0x3a, 0x2c, 0xb7, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x50, 0x47, 0xb4, 0xff,
0x00, 0xff, 0x00, 0xff, 0x3a, 0x2e, 0xb7, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb6, 0xff, 0x38, 0x2a, 0xc2, 0xff, 0x3c, 0x33, 0x72, 0xff, 0x49, 0x42, 0x25, 0xff, 0x4d, 0x45, 0x36, 0xff, 0x4e, 0x45, 0x35, 0xff, 0x4c, 0x45, 0x34, 0xff, 0x4a, 0x42, 0x31, 0xff, 0xc6, 0xc4, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf7, 0xf7, 0xff, 0x50, 0x4b, 0x40, 0xff, 0x36, 0x30, 0x23, 0xff, 0x2c, 0x25, 0x17, 0xff, 0x8c, 0x89, 0x81, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf7, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xfb, 0xfb, 0xfb, 0xff, 0xfb, 0xfb, 0xfb, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0x50, 0x4b, 0x40, 0xff, 0x33, 0x2d, 0x20, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x39, 0x32, 0x26, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x39, 0x32, 0x28, 0xff, 0x35, 0x30, 0x18, 0xff, 0x34, 0x2b, 0x68, 0xff, 0x39, 0x2b, 0xc3, 0xff, 0x39, 0x2d, 0xb5, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x3a, 0x2e, 0xb7, 0xff, 0x52, 0x49, 0xb3, 0xff,
0x00, 0xff, 0x00, 0xff, 0x3d, 0x30, 0xb6, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x38, 0x2b, 0xbf, 0xff, 0x3a, 0x2e, 0x95, 0xff, 0x46, 0x3f, 0x29, 0xff, 0x4c, 0x44, 0x34, 0xff, 0x4f, 0x47, 0x37, 0xff, 0x41, 0x38, 0x26, 0xff, 0x8d, 0x88, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf9, 0xf9, 0xff, 0xfa, 0xfa, 0xf9, 0xff, 0xfa, 0xfa, 0xf9, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xf7, 0xf7, 0xf7, 0xff, 0x4f, 0x4a, 0x3f, 0xff, 0x34, 0x2e, 0x21, 0xff, 0x37, 0x30, 0x23, 0xff, 0x46, 0x40, 0x35, 0xff, 0xed, 0xed, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0xb2, 0xad, 0xff, 0x2f, 0x29, 0x1b, 0xff, 0x3b, 0x35, 0x28, 0xff, 0x39, 0x33, 0x26, 0xff, 0x38, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x32, 0x27, 0xff, 0x34, 0x2e, 0x1b, 0xff, 0x35, 0x2a, 0x8f, 0xff, 0x3a, 0x2c, 0xc0, 0xff, 0x38, 0x2c, 0xb6, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x37, 0x2a, 0xb9, 0xff, 0x3f, 0x33, 0xb6, 0xff, 0x48, 0x3e, 0xb4, 0xff,
0x00, 0xff, 0x00, 0xff, 0x40, 0x35, 0xb5, 0xff, 0x37, 0x2a, 0xb8, 0xff, 0x3a, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x38, 0x2b, 0xb5, 0xff, 0x42, 0x3a, 0x41, 0xff, 0x4b, 0x43, 0x2d, 0xff, 0x50, 0x48, 0x38, 0xff, 0x40, 0x37, 0x25, 0xff, 0xb8, 0xb5, 0xad, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xfa, 0xfa, 0xfa, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xfd, 0xfd, 0xfd, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0x50, 0x4b, 0x40, 0xff, 0x33, 0x2d, 0x1f, 0xff, 0x3d, 0x37, 0x2a, 0xff, 0x30, 0x2a, 0x1d, 0xff, 0x59, 0x54, 0x4a, 0xff, 0xca, 0xc8, 0xc5, 0xff, 0xf0, 0xf0, 0xef, 0xff, 0xea, 0xea, 0xe9, 0xff, 0xa9, 0xa6, 0xa0, 0xff, 0x3c, 0x36, 0x29, 0xff, 0x37, 0x31, 0x24, 0xff, 0x39, 0x34, 0x27, 0xff, 0x39, 0x32, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x27, 0xff, 0x37, 0x31, 0x20, 0xff, 0x33, 0x2c, 0x34, 0xff, 0x37, 0x2b, 0xb3, 0xff, 0x39, 0x2c, 0xb9, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x37, 0x29, 0xb8, 0xff, 0x45, 0x3b, 0xb4, 0xff, 0x55, 0x4c, 0xae, 0xff,
0x00, 0xff, 0x00, 0xff, 0x43, 0x38, 0xb3, 0xff, 0x39, 0x2d, 0xb7, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x3a, 0x2d, 0xb6, 0xff, 0x38, 0x2b, 0xc1, 0xff, 0x3c, 0x32, 0x76, 0xff, 0x49, 0x41, 0x25, 0xff, 0x4f, 0x47, 0x39, 0xff, 0x40, 0x37, 0x24, 0xff, 0x9d, 0x98, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf7, 0xff, 0xfa, 0xfa, 0xfa, 0xff, 0xf9, 0xf9, 0xf9, 0xff, 0xfd, 0xfd, 0xfd, 0xff, 0xec, 0xeb, 0xeb, 0xff, 0x40, 0x3a, 0x2d, 0xff, 0x37, 0x31, 0x24, 0xff, 0x39, 0x33, 0x26, 0xff, 0x3b, 0x35, 0x28, 0xff, 0x31, 0x2b, 0x1e, 0xff, 0x32, 0x2c, 0x1f, 0xff, 0x4a, 0x44, 0x38, 0xff, 0x43, 0x3d, 0x31, 0xff, 0x2d, 0x26, 0x18, 0xff, 0x37, 0x31, 0x24, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x39, 0x33, 0x26, 0xff, 0x38, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x28, 0xff, 0x35, 0x2f, 0x18, 0xff, 0x34, 0x2b, 0x6d, 0xff, 0x39, 0x2c, 0xc2, 0xff, 0x39, 0x2d, 0xb6, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x38, 0x2a, 0xb8, 0xff, 0x50, 0x47, 0xae, 0xff, 0x7f, 0x7d, 0xa2, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x3e, 0x32, 0xb4, 0xff, 0x38, 0x2a, 0xb9, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb9, 0xff, 0x38, 0x2c, 0xb1, 0xff, 0x43, 0x3b, 0x3a, 0xff, 0x4c, 0x44, 0x2e, 0xff, 0x4a, 0x42, 0x31, 0xff, 0x55, 0x4d, 0x3c, 0xff, 0xe3, 0xe2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, 0x86, 0x7e, 0xff, 0x2e, 0x27, 0x1a, 0xff, 0x3c, 0x36, 0x29, 0xff, 0x38, 0x32, 0x25, 0xff, 0x39, 0x33, 0x26, 0xff, 0x3b, 0x35, 0x29, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x34, 0x2e, 0x21, 0xff, 0x36, 0x30, 0x22, 0xff, 0x3c, 0x36, 0x29, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x27, 0xff, 0x37, 0x31, 0x21, 0xff, 0x33, 0x2c, 0x2d, 0xff, 0x37, 0x2b, 0xaf, 0xff, 0x39, 0x2d, 0xba, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x38, 0x2b, 0xb9, 0xff, 0x3c, 0x2f, 0xb6, 0xff, 0x67, 0x62, 0xa3, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x44, 0x39, 0xb0, 0xff, 0x38, 0x2a, 0xb8, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x3a, 0x2d, 0xb6, 0xff, 0x38, 0x2b, 0xc1, 0xff, 0x3a, 0x30, 0x87, 0xff, 0x47, 0x40, 0x26, 0xff, 0x4d, 0x45, 0x36, 0xff, 0x47, 0x3f, 0x2d, 0xff, 0x5a, 0x52, 0x43, 0xff, 0xae, 0xab, 0xa5, 0xff, 0xcc, 0xcb, 0xc8, 0xff, 0xc6, 0xc4, 0xc0, 0xff, 0x7d, 0x78, 0x70, 0xff, 0x30, 0x29, 0x1c, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x39, 0x33, 0x26, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x39, 0x33, 0x26, 0xff, 0x3a, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x38, 0x32, 0x28, 0xff, 0x34, 0x2e, 0x18, 0xff, 0x35, 0x2b, 0x7f, 0xff, 0x39, 0x2c, 0xc2, 0xff, 0x39, 0x2c, 0xb5, 0xff, 0x39, 0x2b, 0xb8, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x36, 0x28, 0xba, 0xff, 0x4d, 0x44, 0xab, 0xff, 0x82, 0x80, 0x94, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x3c, 0x2f, 0xae, 0xff, 0x40, 0x35, 0xb2, 0xff, 0x37, 0x2a, 0xb9, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x3a, 0x2c, 0xb7, 0xff, 0x38, 0x2a, 0xbf, 0xff, 0x3e, 0x35, 0x5f, 0xff, 0x49, 0x41, 0x23, 0xff, 0x4d, 0x45, 0x38, 0xff, 0x49, 0x41, 0x2f, 0xff, 0x3d, 0x35, 0x24, 0xff, 0x33, 0x2c, 0x1f, 0xff, 0x2f, 0x28, 0x1b, 0xff, 0x2e, 0x27, 0x19, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x3a, 0x34, 0x26, 0xff, 0x3a, 0x33, 0x26, 0xff, 0x3a, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x38, 0x32, 0x29, 0xff, 0x35, 0x2f, 0x16, 0xff, 0x33, 0x2b, 0x54, 0xff, 0x39, 0x2b, 0xc0, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x38, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x39, 0x2c, 0xb9, 0xff, 0x3a, 0x2d, 0xb6, 0xff, 0x71, 0x6e, 0x93, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x4a, 0x40, 0xab, 0xff, 0x37, 0x2a, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x39, 0x2c, 0xb9, 0xff, 0x38, 0x2b, 0xb7, 0xff, 0x40, 0x37, 0x51, 0xff, 0x49, 0x42, 0x25, 0xff, 0x4d, 0x45, 0x37, 0xff, 0x51, 0x49, 0x38, 0xff, 0x4b, 0x44, 0x33, 0xff, 0x3d, 0x37, 0x29, 0xff, 0x3b, 0x35, 0x29, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x3a, 0x33, 0x26, 0xff, 0x39, 0x34, 0x27, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x27, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x38, 0x32, 0x28, 0xff, 0x35, 0x30, 0x18, 0xff, 0x33, 0x2b, 0x46, 0xff, 0x38, 0x2b, 0xb5, 0xff, 0x39, 0x2b, 0xb9, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x38, 0x2c, 0xb8, 0xff, 0x3a, 0x2e, 0xb7, 0xff, 0x33, 0x25, 0xbb, 0xff, 0x5c, 0x56, 0xa0, 0xff, 0x85, 0x85, 0x84, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x47, 0x3d, 0xaa, 0xff, 0x36, 0x28, 0xbb, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x38, 0x2b, 0xb8, 0xff, 0x39, 0x2d, 0xb7, 0xff, 0x39, 0x2c, 0xba, 0xff, 0x38, 0x2b, 0xb7, 0xff, 0x3f, 0x36, 0x56, 0xff, 0x48, 0x41, 0x24, 0xff, 0x4b, 0x43, 0x32, 0xff, 0x4d, 0x45, 0x36, 0xff, 0x49, 0x42, 0x32, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x38, 0x32, 0x25, 0xff, 0x39, 0x34, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x3a, 0x33, 0x26, 0xff, 0x3a, 0x34, 0x27, 0xff, 0x39, 0x34, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x28, 0xff, 0x38, 0x32, 0x25, 0xff, 0x34, 0x2f, 0x17, 0xff, 0x33, 0x2b, 0x4b, 0xff, 0x37, 0x2b, 0xb6, 0xff, 0x39, 0x2c, 0xbb, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x35, 0x28, 0xbb, 0xff, 0x46, 0x3b, 0xab, 0xff, 0x88, 0x88, 0x88, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x49, 0x40, 0xa8, 0xff, 0x40, 0x35, 0xad, 0xff, 0x37, 0x29, 0xbb, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x39, 0x2c, 0xba, 0xff, 0x38, 0x2b, 0xbc, 0xff, 0x3c, 0x32, 0x72, 0xff, 0x45, 0x3e, 0x2c, 0xff, 0x4a, 0x42, 0x28, 0xff, 0x4d, 0x45, 0x33, 0xff, 0x4a, 0x42, 0x34, 0xff, 0x3a, 0x34, 0x28, 0xff, 0x38, 0x32, 0x26, 0xff, 0x39, 0x34, 0x27, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x27, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x27, 0xff, 0x39, 0x33, 0x28, 0xff, 0x38, 0x32, 0x25, 0xff, 0x36, 0x30, 0x1b, 0xff, 0x33, 0x2d, 0x1f, 0xff, 0x34, 0x2b, 0x6a, 0xff, 0x38, 0x2b, 0xbc, 0xff, 0x39, 0x2c, 0xba, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x39, 0x2b, 0xb8, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x38, 0x2a, 0xba, 0xff, 0x39, 0x2c, 0xb2, 0xff, 0x81, 0x80, 0x92, 0xff, 0x89, 0x8a, 0x85, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x4e, 0x46, 0xa3, 0xff, 0x3c, 0x30, 0xb0, 0xff, 0x37, 0x29, 0xbb, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x38, 0x2b, 0xc1, 0xff, 0x39, 0x2e, 0x9c, 0xff, 0x3f, 0x37, 0x56, 0xff, 0x45, 0x3e, 0x2c, 0xff, 0x4a, 0x43, 0x27, 0xff, 0x49, 0x41, 0x2a, 0xff, 0x3a, 0x34, 0x24, 0xff, 0x38, 0x32, 0x25, 0xff, 0x39, 0x33, 0x26, 0xff, 0x39, 0x33, 0x25, 0xff, 0x39, 0x32, 0x25, 0xff, 0x38, 0x32, 0x23, 0xff, 0x37, 0x31, 0x1e, 0xff, 0x35, 0x30, 0x19, 0xff, 0x33, 0x2e, 0x20, 0xff, 0x33, 0x2b, 0x4c, 0xff, 0x36, 0x2b, 0x99, 0xff, 0x39, 0x2c, 0xc1, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x39, 0x2b, 0xba, 0xff, 0x34, 0x27, 0xb4, 0xff, 0x73, 0x70, 0x92, 0xff, 0x8d, 0x8e, 0x87, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x50, 0x48, 0x9d, 0xff, 0x3c, 0x31, 0xae, 0xff, 0x36, 0x29, 0xbd, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2d, 0xb6, 0xff, 0x39, 0x2b, 0xbd, 0xff, 0x38, 0x2b, 0xbf, 0xff, 0x39, 0x2e, 0x9e, 0xff, 0x3c, 0x33, 0x6e, 0xff, 0x42, 0x3a, 0x4b, 0xff, 0x41, 0x3a, 0x34, 0xff, 0x35, 0x2f, 0x24, 0xff, 0x34, 0x2e, 0x23, 0xff, 0x34, 0x2e, 0x23, 0xff, 0x34, 0x2e, 0x23, 0xff, 0x33, 0x2d, 0x2a, 0xff, 0x33, 0x2c, 0x40, 0xff, 0x34, 0x2b, 0x67, 0xff, 0x36, 0x2b, 0x9b, 0xff, 0x38, 0x2b, 0xbf, 0xff, 0x39, 0x2c, 0xbe, 0xff, 0x39, 0x2c, 0xb6, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x37, 0x2a, 0xbb, 0xff, 0x34, 0x27, 0xb4, 0xff, 0x70, 0x6c, 0x93, 0xff, 0x8b, 0x8c, 0x83, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x50, 0x48, 0x9c, 0xff, 0x40, 0x36, 0xa7, 0xff, 0x36, 0x27, 0xbd, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x38, 0x2b, 0xbe, 0xff, 0x38, 0x2b, 0xc3, 0xff, 0x37, 0x2a, 0xbb, 0xff, 0x39, 0x2d, 0xac, 0xff, 0x38, 0x2c, 0xa2, 0xff, 0x36, 0x2b, 0xa0, 0xff, 0x37, 0x2b, 0xa1, 0xff, 0x36, 0x2b, 0xa1, 0xff, 0x37, 0x2b, 0xaa, 0xff, 0x38, 0x2c, 0xbb, 0xff, 0x39, 0x2c, 0xc4, 0xff, 0x39, 0x2c, 0xbf, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb7, 0xff, 0x3a, 0x2e, 0xb8, 0xff, 0x35, 0x27, 0xbc, 0xff, 0x39, 0x2d, 0xad, 0xff, 0x73, 0x71, 0x8e, 0xff, 0x8c, 0x8d, 0x85, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x4a, 0x41, 0xa0, 0xff, 0x48, 0x40, 0x9b, 0xff, 0x38, 0x2b, 0xb7, 0xff, 0x37, 0x29, 0xbc, 0xff, 0x3a, 0x2c, 0xb7, 0xff, 0x39, 0x2d, 0xb7, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x3a, 0x2d, 0xb6, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x39, 0x2c, 0xbb, 0xff, 0x3a, 0x2c, 0xbd, 0xff, 0x3a, 0x2c, 0xbd, 0xff, 0x3a, 0x2d, 0xbd, 0xff, 0x3a, 0x2d, 0xbd, 0xff, 0x3a, 0x2d, 0xbb, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x39, 0x2d, 0xb6, 0xff, 0x39, 0x2d, 0xb8, 0xff, 0x39, 0x2c, 0xb8, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x38, 0x2b, 0xbb, 0xff, 0x33, 0x25, 0xb9, 0xff, 0x47, 0x3e, 0xa0, 0xff, 0x80, 0x7f, 0x89, 0xff, 0x8b, 0x8b, 0x84, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x3c, 0x31, 0xa6, 0xff, 0x4f, 0x48, 0x97, 0xff, 0x42, 0x39, 0xa4, 0xff, 0x37, 0x2a, 0xb8, 0xff, 0x37, 0x29, 0xbd, 0xff, 0x39, 0x2b, 0xba, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x39, 0x2d, 0xb7, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x3a, 0x2d, 0xb8, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x3a, 0x2d, 0xb7, 0xff, 0x39, 0x2c, 0xb9, 0xff, 0x38, 0x2a, 0xbc, 0xff, 0x35, 0x27, 0xbb, 0xff, 0x3c, 0x32, 0xa8, 0xff, 0x61, 0x5d, 0x8d, 0xff, 0x88, 0x89, 0x83, 0xff, 0x88, 0x88, 0x85, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x43, 0x3a, 0x9d, 0xff, 0x4c, 0x44, 0x94, 0xff, 0x43, 0x3a, 0xa0, 0xff, 0x3a, 0x2e, 0xb1, 0xff, 0x36, 0x29, 0xba, 0xff, 0x37, 0x29, 0xbd, 0xff, 0x38, 0x2a, 0xbb, 0xff, 0x39, 0x2c, 0xba, 0xff, 0x3a, 0x2c, 0xb9, 0xff, 0x39, 0x2c, 0xb9, 0xff, 0x3a, 0x2c, 0xb9, 0xff, 0x3a, 0x2c, 0xb9, 0xff, 0x39, 0x2c, 0xba, 0xff, 0x38, 0x2a, 0xbb, 0xff, 0x37, 0x29, 0xbd, 0xff, 0x35, 0x28, 0xbb, 0xff, 0x38, 0x2b, 0xb5, 0xff, 0x3e, 0x34, 0xa4, 0xff, 0x53, 0x4e, 0x89, 0xff, 0x75, 0x75, 0x7a, 0xff, 0x88, 0x88, 0x80, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x3f, 0x33, 0xa5, 0xff, 0x47, 0x3e, 0x9f, 0xff, 0x4c, 0x45, 0x92, 0xff, 0x4a, 0x43, 0x93, 0xff, 0x42, 0x39, 0x9f, 0xff, 0x3d, 0x32, 0xaa, 0xff, 0x39, 0x2e, 0xb1, 0xff, 0x38, 0x2c, 0xb5, 0xff, 0x38, 0x2b, 0xb6, 0xff, 0x38, 0x2b, 0xb6, 0xff, 0x39, 0x2c, 0xb5, 0xff, 0x39, 0x2d, 0xb1, 0xff, 0x3d, 0x32, 0xaa, 0xff, 0x43, 0x3a, 0xa0, 0xff, 0x4c, 0x45, 0x94, 0xff, 0x57, 0x53, 0x83, 0xff, 0x6c, 0x6b, 0x7a, 0xff, 0x86, 0x86, 0x81, 0xff, 0x97, 0x97, 0x97, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x41, 0x36, 0xaf, 0xff, 0x4a, 0x42, 0x99, 0xff, 0x55, 0x50, 0x86, 0xff, 0x5a, 0x57, 0x7c, 0xff, 0x5d, 0x5b, 0x7b, 0xff, 0x54, 0x50, 0x7e, 0xff, 0x54, 0x4f, 0x7d, 0xff, 0x5e, 0x5b, 0x7b, 0xff, 0x5e, 0x5c, 0x7c, 0xff, 0x5b, 0x57, 0x8a, 0xff, 0x51, 0x4c, 0x8b, 0xff, 0x60, 0x5e, 0x78, 0xff, 0x7e, 0x7e, 0x81, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
#endif
};
const lv_img_dsc_t watch_menu_music_player_icon = {
.header.cf = LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED,
.header.always_zero = 0,
.header.reserved = 0,
.header.w = 42,
.header.h = 42,
.data_size = 1764 * LV_COLOR_SIZE / 8,
.data = music_player_icon_map,
};
const LV_ATTRIBUTE_LARGE_CONST uint8_t lost_phone_icon_map[] = {
#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8
/*Pixel format: Red: 3 bit, Green: 3 bit, Blue: 2 bit*/

View File

@ -39,21 +39,51 @@ typedef struct CompassScreen
CompassLabel_t compassTemperature;
} CompassScreen_t;
/* Initializes the compass screen context object */
/**
* @brief Initializes the compass screen object structure.
* @note This function has to be called first before any others.
*
* @param compassScreen a pointer to the compass screen object structure.
*/
void compass_screen_init(CompassScreen_t * const compassScreen);
/* Set the compassAzimuth in degrees to show */
/**
* @brief Sets the azimuth in degrees (relative to the north) to show on the compass UI.
*
* @param compassScreen a pointer to the compass screen object structure.
* @param azimuth the azimuth in degrees (0 to 359) relative to north to show.
*/
void compass_screen_set_azimuth(CompassScreen_t * const compassScreen, uint16_t azimuth);
/* Set the compassTemperature in degrees celsius to show */
/**
* @brief Sets the temperature in degrees celsius to show on the compass UI.
*
* @param compassScreen a pointer to the compass screen object structure.
* @param temperature the temperature to display on the compass screen in degrees celsius.
*/
void compass_screen_set_temperature(CompassScreen_t * const compassScreen, float temperature);
/**
* @brief Returns true if the compass screen is currently being used and displayed.
*
* @param compassScreen a pointer to the compass screen object structure.
* @return true if the compass screen is being used .
* @return false if the compass screen is not being used/currently displayed.
*/
bool compass_screen_is_in_use(CompassScreen_t * const compassScreen);
/* Builds the compass screen graphically */
/**
* @brief Builds the compass screen graphically.
*
* @param compassScreen a pointer to the compass screen object structure.
*/
void compass_screen_create(CompassScreen_t * const compassScreen);
/* Frees all resources used by the CompassScreen object */
/**
* @brief Frees all resources used by the CompassScreen object, to be called when discarding the compass screen.
*
* @param compassScreen a pointer to the compass screen object structure.
*/
void compass_screen_destroy(CompassScreen_t * const compassScreen);
#endif // COMPASS_SCREEN_H

View File

@ -3,6 +3,12 @@
#include "lvgl.h"
/**
* @brief The type of the callback to register, which will be called every time the
* find my phone button is clicked on the UI.
* The findMyPhone boolean parameter will be set to true if we want to make the phone ring or false otherwise.
*
*/
typedef void (*SendFindMyPhoneBLECommandCb_t)(bool findMyPhone);
typedef struct FindMyPhoneButton
@ -23,14 +29,43 @@ typedef struct FindMyPhoneScreen
bool ble_connection_state;
} FindMyPhoneScreen_t;
/**
* @brief Initializes the find my phone screen object structure.
*
* @param findMyPhoneScreen a pointer to the find my phone screen object structure.
*/
void find_my_phone_screen_init(FindMyPhoneScreen_t * const findMyPhoneScreen);
/**
* @brief Registers a callback called every time the find my phone button is clicked.
* Depending on the action to perform, the boolean parameter will be set accordingly.
*
* @param findMyPhoneScreen a pointer to the find my phone screen object structure.
* @param sendFindMyPhoneBLECommandCb the callback of type SendFindMyPhoneBLECommandCb_t to register.
*/
void find_my_phone_screen_register_BLE_command_send_cb(FindMyPhoneScreen_t * const findMyPhoneScreen, SendFindMyPhoneBLECommandCb_t sendFindMyPhoneBLECommandCb);
/**
* @brief Tells the find my phone screen app if a BLE connection is currently established between the watch a phone.
* This will disable the feature if no connection currently exists.
*
* @param findMyPhoneScreen a pointer to the find my phone screen object structure.
* @param connected a boolean value which should be set to true if a connection is established and to false otherwise.
*/
void find_my_phone_screen_notify_BLE_connection_state(FindMyPhoneScreen_t * const findMyPhoneScreen, bool connected);
/**
* @brief Builds the find my phone screen graphically.
*
* @param findMyPhoneScreen a pointer to the find my phone screen object structure.
*/
void find_my_phone_screen_create(FindMyPhoneScreen_t * const findMyPhoneScreen);
/**
* @brief Frees all resources used by the findMyPhoneScreen object, to be called when discarding the find my phone screen.
*
* @param findMyPhoneScreen a pointer to the find my phone screen object structure.
*/
void find_my_phone_screen_destroy(FindMyPhoneScreen_t * const findMyPhoneScreen);
#endif //FIND_MY_PHONE_SCREEN_H

View File

@ -11,6 +11,7 @@
#include "menu_screen.h"
#include "compass_screen.h"
#include "find_my_phone_screen.h"
#include "music_player_screen.h"
#include "settings_screen.h"
#include "watch_peripherals.h"
#include "watch_settings.h"
@ -36,6 +37,8 @@ WatchFace_t watchFace;
MenuScreen_t menuScreen;
CompassScreen_t compassScreen;
FindMyPhoneScreen_t findMyPhoneScreen;
MusicPlayerScreen_t musicPlayerScreen;
SettingsScreen_t settingsScreen;
static struct
@ -240,8 +243,8 @@ static void setBLEEnabledCb(bool *enabled, SettingMode_e mode)
{
watch_face_set_bluetooth_indicator(&watchFace, BLUETOOTH_STATE_OFF);
find_my_phone_screen_notify_BLE_connection_state(&findMyPhoneScreen, false);
}
music_player_screen_notify_BLE_connection_state(&musicPlayerScreen, false);
}
}
}
}
@ -374,6 +377,23 @@ static void parser_event_cb(const gadget_bridge_event_data_t *gadget_bridge_even
watch_face_force_sync(&watchFace);
}
break;
case GADGET_BRIDGE_EVENT_TYPE_MUSIC_INFO:
music_player_screen_set_playing_music_title_and_artist(&musicPlayerScreen, gadget_bridge_event_data->music_info.track, gadget_bridge_event_data->music_info.artist);
music_player_screen_set_music_duration(&musicPlayerScreen, gadget_bridge_event_data->music_info.duration_in_seconds);
break;
case GADGET_BRIDGE_EVENT_TYPE_MUSIC_STATE:
switch(gadget_bridge_event_data->music_state.music_state)
{
case GADGET_BRIDGE_MUSIC_STATE_PLAY:
music_player_screen_set_music_playing_state(&musicPlayerScreen, MUSIC_CONTROL_PLAY);
break;
case GADGET_BRIDGE_MUSIC_STATE_PAUSE:
case GADGET_BRIDGE_MUSIC_STATE_STOP:
music_player_screen_set_music_playing_state(&musicPlayerScreen, MUSIC_CONTROL_PAUSE);
break;
}
music_player_screen_set_music_position(&musicPlayerScreen, gadget_bridge_event_data->music_state.position_in_seconds);
break;
default:
APP_LOG_INFO("Not yet handled\n");
}
@ -400,10 +420,12 @@ static void ble_service_state_change_cb(ble_service_state_e ble_service_state)
case BLE_SERVICE_MODE_CONNECTED:
watch_face_set_bluetooth_indicator(&watchFace, BLUETOOTH_STATE_CONNECTED);
find_my_phone_screen_notify_BLE_connection_state(&findMyPhoneScreen, true);
music_player_screen_notify_BLE_connection_state(&musicPlayerScreen, true);
break;
case BLE_SERVICE_MODE_ADVERTISING:
watch_face_set_bluetooth_indicator(&watchFace, BLUETOOTH_STATE_ON);
find_my_phone_screen_notify_BLE_connection_state(&findMyPhoneScreen, false);
music_player_screen_notify_BLE_connection_state(&musicPlayerScreen, false);
break;
case BLE_SERVICE_MODE_SUBSCRIBED:
_is_ble_device_subscribed = true;
@ -462,6 +484,11 @@ static void sendFindMyPhoneBLECommandCb(bool findMyPhone)
gadget_bridge_send_find_phone(findMyPhone);
}
static void sendMusicPlaybackBLECommandCb(MusicPlaybackCtrlAction_e musicPlaybackCtrlAction)
{
gadget_bridge_send_music_control(musicPlaybackCtrlAction);
}
extern LCDConfig_t LCDConfig;
void gfx_task(void *param)
@ -527,6 +554,9 @@ void gfx_task(void *param)
find_my_phone_screen_init(&findMyPhoneScreen);
find_my_phone_screen_register_BLE_command_send_cb(&findMyPhoneScreen, &(sendFindMyPhoneBLECommandCb));
music_player_screen_init(&musicPlayerScreen);
music_player_screen_register_music_playback_control_cb(&musicPlayerScreen, &(sendMusicPlaybackBLECommandCb));
settings_screen_init(&settingsScreen);
settings_screen_register_API_interface(&settingsScreen, &settingsScreenAPIInterface);

View File

@ -5,6 +5,7 @@
#include "watch_face.h"
#include "compass_screen.h"
#include "find_my_phone_screen.h"
#include "music_player_screen.h"
#include "translation.h"
#define array_size(array) (sizeof(array)/sizeof(array[0]))
@ -24,20 +25,27 @@ static void menu_item_cb(lv_event_t *e)
}
break;
case 2:
{
extern MusicPlayerScreen_t musicPlayerScreen;
music_player_screen_create(&musicPlayerScreen);
lv_scr_load_anim(musicPlayerScreen.display, LV_SCR_LOAD_ANIM_MOVE_LEFT, 400, 0, true);
}
break;
case 3:
{
extern CompassScreen_t compassScreen;
compass_screen_create(&compassScreen);
lv_scr_load_anim(compassScreen.display, LV_SCR_LOAD_ANIM_MOVE_LEFT, 400, 0, true);
}
break;
case 3:
case 4:
{
extern FindMyPhoneScreen_t findMyPhoneScreen;
find_my_phone_screen_create(&findMyPhoneScreen);
lv_scr_load_anim(findMyPhoneScreen.display, LV_SCR_LOAD_ANIM_MOVE_LEFT, 400, 0, true);
}
break;
case 4:
case 5:
{
extern SettingsScreen_t settingsScreen;
settings_screen_create(&settingsScreen);
@ -102,6 +110,7 @@ void menu_screen_create(MenuScreen_t * const menuScreen)
LV_IMG_DECLARE(watch_menu_mail_icon)
LV_IMG_DECLARE(watch_menu_contacts_icon)
LV_IMG_DECLARE(watch_menu_alarm_icon)
LV_IMG_DECLARE(watch_menu_music_player_icon)
LV_IMG_DECLARE(watch_menu_settings_icon)
LV_IMG_DECLARE(watch_menu_messages_icon)
LV_IMG_DECLARE(watch_menu_compass_icon)
@ -118,28 +127,38 @@ void menu_screen_create(MenuScreen_t * const menuScreen)
//We add the screen header
common_screen_header_component(menuScreen->display, "Menu", 50);
lv_obj_t *scroll_item_container = lv_obj_create(menuScreen->display);
lv_obj_set_style_bg_color(scroll_item_container, lv_color_white(), LV_PART_MAIN);
lv_obj_set_size(scroll_item_container, lv_pct(100), 240-50);
lv_obj_set_pos(scroll_item_container, 0, 50);
lv_obj_set_style_pad_all(scroll_item_container, 0, LV_PART_MAIN);
lv_obj_set_style_pad_top(scroll_item_container, 10, LV_PART_MAIN);
lv_obj_set_style_pad_bottom(scroll_item_container, 20, LV_PART_MAIN);
lv_obj_set_style_radius(scroll_item_container, 0, LV_PART_MAIN);
lv_obj_set_style_border_width(scroll_item_container, 0, LV_PART_MAIN);
lv_obj_set_style_pad_right(scroll_item_container, 15, LV_PART_SCROLLBAR);
if(menuScreen->scrollItemContainer)
{
LV_LOG_ERROR("scrollItemContainer should be NULL here !");
lv_obj_del(menuScreen->scrollItemContainer);
menuScreen->scrollItemContainer = NULL;
}
menuScreen->scrollItemContainer = lv_obj_create(menuScreen->display);
lv_obj_set_style_bg_color(menuScreen->scrollItemContainer, lv_color_white(), LV_PART_MAIN);
lv_obj_set_size(menuScreen->scrollItemContainer, lv_pct(100), 240-50);
lv_obj_set_pos(menuScreen->scrollItemContainer, 0, 50);
lv_obj_set_style_pad_all(menuScreen->scrollItemContainer, 0, LV_PART_MAIN);
lv_obj_set_style_pad_top(menuScreen->scrollItemContainer, 10, LV_PART_MAIN);
lv_obj_set_style_pad_bottom(menuScreen->scrollItemContainer, 20, LV_PART_MAIN);
lv_obj_set_style_radius(menuScreen->scrollItemContainer, 0, LV_PART_MAIN);
lv_obj_set_style_border_width(menuScreen->scrollItemContainer, 0, LV_PART_MAIN);
lv_obj_set_style_pad_right(menuScreen->scrollItemContainer, 15, LV_PART_SCROLLBAR);
menu_screen_add_item(scroll_item_container, 0, &watch_menu_clock_icon, translation_get_word(TRANSLATION_WATCH), &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 1, &watch_menu_alarm_icon, translation_get_word(TRANSLATION_ALARM), &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 2, &watch_menu_compass_icon, translation_get_word(TRANSLATION_COMPASS), &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 3, &watch_menu_lost_phone_icon, translation_get_word(TRANSLATION_FIND_MY_PHONE), &(menu_item_cb));
menu_screen_add_item(menuScreen->scrollItemContainer, 0, &watch_menu_clock_icon, translation_get_word(TRANSLATION_WATCH), &(menu_item_cb));
menu_screen_add_item(menuScreen->scrollItemContainer, 1, &watch_menu_alarm_icon, translation_get_word(TRANSLATION_ALARM), &(menu_item_cb));
menu_screen_add_item(menuScreen->scrollItemContainer, 2, &watch_menu_music_player_icon, translation_get_word(TRANSLATION_MUSIC), &(menu_item_cb));
menu_screen_add_item(menuScreen->scrollItemContainer, 3, &watch_menu_compass_icon, translation_get_word(TRANSLATION_COMPASS), &(menu_item_cb));
menu_screen_add_item(menuScreen->scrollItemContainer, 4, &watch_menu_lost_phone_icon, translation_get_word(TRANSLATION_FIND_MY_PHONE), &(menu_item_cb));
/*
menu_screen_add_item(scroll_item_container, 3, &watch_menu_messages_icon, "Text messages", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 4, &watch_menu_mail_icon, "Mails", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 5, &watch_menu_dialer_icon, "Phone", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 6, &watch_menu_contacts_icon, "Contacts", &(menu_item_cb));*/
menu_screen_add_item(scroll_item_container, 4, &watch_menu_settings_icon, translation_get_word(TRANSLATION_SETTINGS), &(menu_item_cb));
menu_screen_add_item(menuScreen->scrollItemContainer, 3, &watch_menu_messages_icon, "Text messages", &(menu_item_cb));
menu_screen_add_item(menuScreen->scrollItemContainer, 4, &watch_menu_mail_icon, "Mails", &(menu_item_cb));
menu_screen_add_item(menuScreen->scrollItemContainer, 5, &watch_menu_dialer_icon, "Phone", &(menu_item_cb));
menu_screen_add_item(menuScreen->scrollItemContainer, 6, &watch_menu_contacts_icon, "Contacts", &(menu_item_cb));*/
menu_screen_add_item(menuScreen->scrollItemContainer, 5, &watch_menu_settings_icon, translation_get_word(TRANSLATION_SETTINGS), &(menu_item_cb));
//Lets restore the previous scrolling position
lv_obj_scroll_to_y(menuScreen->scrollItemContainer, menuScreen->lastScrollPosition, LV_ANIM_OFF);
//We register the event callback to handle the cleanup
lv_obj_add_event_cb(menuScreen->display, &(cleanup_event_cb), LV_EVENT_DELETE, menuScreen);
}
@ -152,5 +171,7 @@ void menu_screen_destroy(MenuScreen_t * const menuScreen)
return;
}
menuScreen->display = NULL;
//Lets save the current scroll position
menuScreen->lastScrollPosition = lv_obj_get_scroll_y(menuScreen->scrollItemContainer);
memset(menuScreen, 0, offsetof(MenuScreen_t, lastScrollPosition));
}

View File

@ -6,7 +6,11 @@
// Menu screen context object
typedef struct MenuScreen
{
//Can be erased attributes
lv_obj_t *display;
lv_obj_t *scrollItemContainer;
//Should not be erased attributes
lv_coord_t lastScrollPosition;
} MenuScreen_t;
/* Initializes the menu screen context object */

View File

@ -0,0 +1,436 @@
#include <stdio.h>
#include <string.h>
#include "music_player_screen.h"
#include "menu_screen.h"
#include "translation.h"
void _set_UI_no_ble_connection(MusicPlayerScreen_t * const musicPlayerScreen, bool connected);
static void gesture_event_cb(lv_event_t *e)
{
MusicPlayerScreen_t *musicPlayerScreen = e->user_data;
lv_dir_t gesture;
switch(gesture = lv_indev_get_gesture_dir(lv_indev_get_act()))
{
case LV_DIR_LEFT:
LV_LOG_USER("GESTURE : LEFT");
break;
case LV_DIR_RIGHT:
LV_LOG_USER("GESTURE : RIGHT");
// We create the menu screen and switch to it
extern MenuScreen_t menuScreen;
menu_screen_create(&menuScreen);
lv_scr_load_anim(menuScreen.display, LV_SCR_LOAD_ANIM_MOVE_RIGHT, 400, 0, true);
break;
case LV_DIR_TOP:
LV_LOG_USER("GESTURE : TOP");
break;
case LV_DIR_BOTTOM:
LV_LOG_USER("GESTURE : BOTTOM");
break;
default:
LV_LOG_USER("GESTURE : %u", gesture);
}
}
static void cleanup_event_cb(lv_event_t *e)
{
MusicPlayerScreen_t *musicPlayerScreen = e->user_data;
music_player_screen_destroy(musicPlayerScreen);
LV_LOG_USER("cleanup");
}
static void music_player_button_click_event_cb(lv_event_t *e)
{
MusicPlayerScreen_t *musicPlayerScreen = e->user_data;
MusicPlaybackCtrlAction_e action = (MusicPlaybackCtrlAction_e)lv_obj_get_user_data(e->target);
LV_LOG_USER("Action is : %u, code is : %u", action, e->code);
if(musicPlayerScreen->musicPlaybackCtrlCb)
{
if(action == MUSIC_CONTROL_PLAY)
{
MusicPlaybackCtrlAction_e stateToApply = musicPlayerScreen->currentPlayState == MUSIC_CONTROL_PLAY ? MUSIC_CONTROL_PAUSE : MUSIC_CONTROL_PLAY;
musicPlayerScreen->musicPlaybackCtrlCb(stateToApply);
music_player_screen_set_music_playing_state(musicPlayerScreen, stateToApply);
}
else if(action == MUSIC_CONTROL_NEXT)
{
musicPlayerScreen->musicPlaybackCtrlCb(e->code == LV_EVENT_SHORT_CLICKED ? MUSIC_CONTROL_FORWARD : MUSIC_CONTROL_NEXT);
}
else if(action == MUSIC_CONTROL_PREVIOUS)
{
musicPlayerScreen->musicPlaybackCtrlCb(e->code == LV_EVENT_SHORT_CLICKED ? MUSIC_CONTROL_REWIND : MUSIC_CONTROL_PREVIOUS);
}
else
{
musicPlayerScreen->musicPlaybackCtrlCb(action);
}
}
}
void music_player_screen_init(MusicPlayerScreen_t * const musicPlayerScreen)
{
if(!musicPlayerScreen)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
memset(musicPlayerScreen, 0, sizeof(MusicPlayerScreen_t));
musicPlayerScreen->currentPlayState = MUSIC_CONTROL_PAUSE;
}
void music_player_screen_register_music_playback_control_cb(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlaybackCtrlCb_t musicPlaybackCtrlCb)
{
if(!musicPlayerScreen)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
musicPlayerScreen->musicPlaybackCtrlCb = musicPlaybackCtrlCb;
}
void music_player_screen_notify_BLE_connection_state(MusicPlayerScreen_t * const musicPlayerScreen, bool connected)
{
if(!musicPlayerScreen)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
if(musicPlayerScreen->ble_connection_state != connected)
{
musicPlayerScreen->ble_connection_state = connected;
if(musicPlayerScreen->display != NULL)
_set_UI_no_ble_connection(musicPlayerScreen, musicPlayerScreen->ble_connection_state);
}
}
void music_player_screen_set_playing_music_title_and_artist(MusicPlayerScreen_t * const musicPlayerScreen, const char *title, const char *artist)
{
if(!musicPlayerScreen)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
if(title)
{
strncpy(musicPlayerScreen->titleText, title, sizeof musicPlayerScreen->titleText);
musicPlayerScreen->titleText[sizeof(musicPlayerScreen->titleText) - 1] = '\0';
if(musicPlayerScreen->titleLabel)
{
lv_label_set_text_static(musicPlayerScreen->titleLabel, musicPlayerScreen->titleText);
}
}
if(artist)
{
strncpy(musicPlayerScreen->artistText, artist, sizeof musicPlayerScreen->artistText);
musicPlayerScreen->artistText[sizeof(musicPlayerScreen->artistText) - 1] = '\0';
if(musicPlayerScreen->artistLabel)
{
lv_label_set_text_static(musicPlayerScreen->artistLabel, musicPlayerScreen->artistText);
}
}
}
void music_player_screen_set_music_duration(MusicPlayerScreen_t * const musicPlayerScreen, uint16_t durationInSeconds)
{
if(!musicPlayerScreen)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
musicPlayerScreen->currentMusicDuration = durationInSeconds;
//If the widget is currently displayed, we update it as well !
if(!musicPlayerScreen->playbackArc) return;
lv_arc_set_range(musicPlayerScreen->playbackArc, 0, musicPlayerScreen->currentMusicDuration);
if(durationInSeconds < 3600)sprintf(musicPlayerScreen->durationTimeLabel.text, "%s%u:%s%u", durationInSeconds / 60 < 10 ? "0":"", durationInSeconds / 60, durationInSeconds % 60 < 10 ? "0":"", durationInSeconds % 60);
else sprintf(musicPlayerScreen->durationTimeLabel.text, "%s%u:%s%u:%s%u", durationInSeconds / 3600 < 10 ? "0":"", durationInSeconds / 3600,
(durationInSeconds % 3600) / 60 < 10 ? "0":"", (durationInSeconds % 3600) / 60,
(durationInSeconds % 3600) % 60 < 10 ? "0":"", (durationInSeconds % 3600) % 60);
lv_label_set_text_static(musicPlayerScreen->durationTimeLabel.label, musicPlayerScreen->durationTimeLabel.text);
}
void music_player_screen_set_music_position(MusicPlayerScreen_t * const musicPlayerScreen, uint16_t positionInSeconds)
{
if(!musicPlayerScreen)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
if(positionInSeconds > musicPlayerScreen->currentMusicDuration) positionInSeconds = musicPlayerScreen->currentMusicDuration;
musicPlayerScreen->currentMusicPosition = positionInSeconds;
//If the widget is currently displayed, we update it as well !
if(!musicPlayerScreen->playbackArc) return;
lv_arc_set_value(musicPlayerScreen->playbackArc, musicPlayerScreen->currentMusicPosition);
if(positionInSeconds < 3600)sprintf(musicPlayerScreen->positionTimeLabel.text, "%s%u:%s%u", positionInSeconds / 60 < 10 ? "0":"", positionInSeconds / 60, positionInSeconds % 60 < 10 ? "0":"", positionInSeconds % 60);
else sprintf(musicPlayerScreen->positionTimeLabel.text, "%s%u:%s%u:%s%u", positionInSeconds / 3600 < 10 ? "0":"", positionInSeconds / 3600,
(positionInSeconds % 3600) / 60 < 10 ? "0":"", (positionInSeconds % 3600) / 60,
(positionInSeconds % 3600) % 60 < 10 ? "0":"", (positionInSeconds % 3600) % 60);
lv_label_set_text_static(musicPlayerScreen->positionTimeLabel.label, musicPlayerScreen->positionTimeLabel.text);
}
void music_player_screen_set_music_playing_state(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlaybackCtrlAction_e playingState)
{
if(!musicPlayerScreen)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
if(musicPlayerScreen->currentPlayState == playingState) return;
if(playingState != MUSIC_CONTROL_PAUSE && playingState != MUSIC_CONTROL_PLAY) return;
musicPlayerScreen->currentPlayState = playingState;
if(!musicPlayerScreen->playPauseBtn.label) return;
strcpy(musicPlayerScreen->playPauseBtn.icon, musicPlayerScreen->currentPlayState == MUSIC_CONTROL_PLAY ? LV_SYMBOL_PAUSE : LV_SYMBOL_PLAY);
lv_label_set_text_static(musicPlayerScreen->playPauseBtn.label, musicPlayerScreen->playPauseBtn.icon);
}
bool music_player_screen_is_in_use(MusicPlayerScreen_t * const musicPlayerScreen)
{
if(!musicPlayerScreen)
{
LV_LOG_ERROR("NULL pointer given !");
return false;
}
return musicPlayerScreen->display != NULL;
}
void music_player_screen_create(MusicPlayerScreen_t * const musicPlayerScreen)
{
if(!musicPlayerScreen)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
if(musicPlayerScreen->display)
{
LV_LOG_ERROR("display should be NULL here !");
lv_obj_del(musicPlayerScreen->display);
musicPlayerScreen->display = NULL;
}
musicPlayerScreen->display = lv_obj_create(NULL);
lv_obj_set_style_bg_color(musicPlayerScreen->display, lv_color_white(), LV_PART_MAIN);
lv_obj_clear_flag(musicPlayerScreen->display, LV_OBJ_FLAG_SCROLLABLE);
//Black circled background
lv_obj_t *blackCircle = lv_obj_create(musicPlayerScreen->display);
lv_obj_set_style_bg_color(blackCircle, lv_color_black(), LV_PART_MAIN);
lv_obj_set_style_border_width(blackCircle, 0, LV_PART_MAIN);
lv_obj_set_style_pad_all(blackCircle, 0, LV_PART_MAIN);
lv_obj_set_style_radius(blackCircle, LV_RADIUS_CIRCLE, LV_PART_MAIN);
//The +1 to the hor and ver res is used to get rid of graphical issue... (1px white background bleeding on the black one)
lv_obj_set_size(blackCircle, lv_disp_get_ver_res(NULL)+1, lv_disp_get_hor_res(NULL)+1);
lv_obj_center(blackCircle);
//Let's create the UI for this amazing music player ...
//Play/Pause button
if(musicPlayerScreen->playPauseBtn.button)
{
LV_LOG_ERROR("playPauseBtn should be NULL here !");
lv_obj_del(musicPlayerScreen->playPauseBtn.button);
musicPlayerScreen->playPauseBtn.button = NULL;
}
musicPlayerScreen->playPauseBtn.button = lv_btn_create(musicPlayerScreen->display);
lv_obj_set_size(musicPlayerScreen->playPauseBtn.button, 60, 60);
lv_obj_set_style_radius(musicPlayerScreen->playPauseBtn.button, LV_RADIUS_CIRCLE, LV_PART_MAIN);
lv_obj_align(musicPlayerScreen->playPauseBtn.button, LV_ALIGN_BOTTOM_MID, 0, -80);
musicPlayerScreen->playPauseBtn.label = lv_label_create(musicPlayerScreen->playPauseBtn.button);
strcpy(musicPlayerScreen->playPauseBtn.icon, musicPlayerScreen->currentPlayState == MUSIC_CONTROL_PLAY ? LV_SYMBOL_PAUSE : LV_SYMBOL_PLAY);
lv_label_set_text_static(musicPlayerScreen->playPauseBtn.label, musicPlayerScreen->playPauseBtn.icon);
lv_obj_set_style_text_font(musicPlayerScreen->playPauseBtn.label, &lv_font_montserrat_30, LV_PART_MAIN);
lv_obj_center(musicPlayerScreen->playPauseBtn.label);
lv_obj_set_user_data(musicPlayerScreen->playPauseBtn.button, MUSIC_CONTROL_PLAY);
lv_obj_add_event_cb(musicPlayerScreen->playPauseBtn.button, &(music_player_button_click_event_cb), LV_EVENT_CLICKED, musicPlayerScreen);
//Previous track button
musicPlayerScreen->previousBtn = lv_btn_create(musicPlayerScreen->display);
lv_obj_set_size(musicPlayerScreen->previousBtn, 47, 47);
lv_obj_set_style_radius(musicPlayerScreen->previousBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN);
lv_obj_align_to(musicPlayerScreen->previousBtn, musicPlayerScreen->playPauseBtn.label, LV_ALIGN_OUT_LEFT_MID, -25, 0);
lv_obj_t *previousBtnLabel = lv_label_create(musicPlayerScreen->previousBtn);
lv_label_set_text_static(previousBtnLabel, LV_SYMBOL_LEFT LV_SYMBOL_LEFT);
lv_obj_set_style_text_font(previousBtnLabel, &lv_font_montserrat_24, LV_PART_MAIN);
lv_obj_center(previousBtnLabel);
lv_obj_set_user_data(musicPlayerScreen->previousBtn, (void *)MUSIC_CONTROL_PREVIOUS);
lv_obj_add_event_cb(musicPlayerScreen->previousBtn, &(music_player_button_click_event_cb), LV_EVENT_SHORT_CLICKED, musicPlayerScreen);
lv_obj_add_event_cb(musicPlayerScreen->previousBtn, &(music_player_button_click_event_cb), LV_EVENT_LONG_PRESSED, musicPlayerScreen);
//Next track button
musicPlayerScreen->nextBtn = lv_btn_create(musicPlayerScreen->display);
lv_obj_set_size(musicPlayerScreen->nextBtn, 47, 47);
lv_obj_set_style_radius(musicPlayerScreen->nextBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN);
lv_obj_align_to(musicPlayerScreen->nextBtn, musicPlayerScreen->playPauseBtn.label, LV_ALIGN_OUT_RIGHT_MID, 25, 0);
lv_obj_t *nextBtnLabel = lv_label_create(musicPlayerScreen->nextBtn);
lv_label_set_text_static(nextBtnLabel, LV_SYMBOL_RIGHT LV_SYMBOL_RIGHT);
lv_obj_set_style_text_font(nextBtnLabel, &lv_font_montserrat_24, LV_PART_MAIN);
lv_obj_center(nextBtnLabel);
lv_obj_set_user_data(musicPlayerScreen->nextBtn, (void *)MUSIC_CONTROL_NEXT);
lv_obj_add_event_cb(musicPlayerScreen->nextBtn, &(music_player_button_click_event_cb), LV_EVENT_SHORT_CLICKED, musicPlayerScreen);
lv_obj_add_event_cb(musicPlayerScreen->nextBtn, &(music_player_button_click_event_cb), LV_EVENT_LONG_PRESSED, musicPlayerScreen);
//Volume down button
musicPlayerScreen->volumeDownBtn = lv_btn_create(musicPlayerScreen->display);
lv_obj_set_size(musicPlayerScreen->volumeDownBtn, 47, 47);
lv_obj_set_style_radius(musicPlayerScreen->volumeDownBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN);
lv_obj_align_to(musicPlayerScreen->volumeDownBtn, musicPlayerScreen->previousBtn, LV_ALIGN_BOTTOM_MID, 25, 50);
lv_obj_t *volumeDownBtnLabel = lv_label_create(musicPlayerScreen->volumeDownBtn);
lv_label_set_text_static(volumeDownBtnLabel, LV_SYMBOL_VOLUME_MID);
lv_obj_set_style_text_font(volumeDownBtnLabel, &lv_font_montserrat_24, LV_PART_MAIN);
lv_obj_center(volumeDownBtnLabel);
lv_obj_set_user_data(musicPlayerScreen->volumeDownBtn, (void *)MUSIC_CONTROL_VOLUMEDOWN);
lv_obj_add_event_cb(musicPlayerScreen->volumeDownBtn, &(music_player_button_click_event_cb), LV_EVENT_CLICKED, musicPlayerScreen);
//Volume up button
musicPlayerScreen->volumeUpBtn = lv_btn_create(musicPlayerScreen->display);
lv_obj_set_size(musicPlayerScreen->volumeUpBtn, 47, 47);
lv_obj_set_style_radius(musicPlayerScreen->volumeUpBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN);
lv_obj_align_to(musicPlayerScreen->volumeUpBtn, musicPlayerScreen->nextBtn, LV_ALIGN_BOTTOM_MID, -25, 50);
lv_obj_t *volumeUpBtnLabel = lv_label_create(musicPlayerScreen->volumeUpBtn);
lv_label_set_text_static(volumeUpBtnLabel, LV_SYMBOL_VOLUME_MAX);
lv_obj_set_style_text_font(volumeUpBtnLabel, &lv_font_montserrat_24, LV_PART_MAIN);
lv_obj_center(volumeUpBtnLabel);
lv_obj_set_user_data(musicPlayerScreen->volumeUpBtn, (void *)MUSIC_CONTROL_VOLUMEUP);
lv_obj_add_event_cb(musicPlayerScreen->volumeUpBtn, &(music_player_button_click_event_cb), LV_EVENT_CLICKED, musicPlayerScreen);
//Track title
if(musicPlayerScreen->titleLabel)
{
LV_LOG_ERROR("titleLabel should be NULL here !");
lv_obj_del(musicPlayerScreen->titleLabel);
musicPlayerScreen->titleLabel = NULL;
}
musicPlayerScreen->titleLabel = lv_label_create(musicPlayerScreen->display);
lv_label_set_text_static(musicPlayerScreen->titleLabel, musicPlayerScreen->titleText);
lv_obj_set_style_text_color(musicPlayerScreen->titleLabel, lv_color_white(), LV_PART_MAIN);
lv_obj_set_style_text_font(musicPlayerScreen->titleLabel, &lv_font_montserrat_28, LV_PART_MAIN);
lv_obj_set_width(musicPlayerScreen->titleLabel, 200);
lv_obj_align(musicPlayerScreen->titleLabel, LV_ALIGN_TOP_MID, 0, 40);
lv_obj_set_style_text_align(musicPlayerScreen->titleLabel, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN);
lv_label_set_long_mode(musicPlayerScreen->titleLabel, LV_LABEL_LONG_SCROLL_CIRCULAR);
//Track artist
if(musicPlayerScreen->artistLabel)
{
LV_LOG_ERROR("artistLabel should be NULL here !");
lv_obj_del(musicPlayerScreen->artistLabel);
musicPlayerScreen->artistLabel = NULL;
}
musicPlayerScreen->artistLabel = lv_label_create(musicPlayerScreen->display);
lv_label_set_text_static(musicPlayerScreen->artistLabel, musicPlayerScreen->artistText);
lv_obj_set_style_text_color(musicPlayerScreen->artistLabel, lv_color_white(), LV_PART_MAIN);
lv_obj_set_style_text_font(musicPlayerScreen->artistLabel, &lv_font_montserrat_16, LV_PART_MAIN);
lv_obj_set_size(musicPlayerScreen->artistLabel, 150, 20);
lv_obj_align_to(musicPlayerScreen->artistLabel, musicPlayerScreen->titleLabel, LV_ALIGN_BOTTOM_MID, 0, 25);
lv_obj_set_style_text_align(musicPlayerScreen->artistLabel, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN);
lv_label_set_long_mode(musicPlayerScreen->artistLabel, LV_LABEL_LONG_SCROLL_CIRCULAR);
//Track playback labels
if(musicPlayerScreen->durationTimeLabel.label)
{
LV_LOG_ERROR("durationTimeLabel should be NULL here !");
lv_obj_del(musicPlayerScreen->durationTimeLabel.label);
musicPlayerScreen->durationTimeLabel.label = NULL;
}
musicPlayerScreen->durationTimeLabel.label = lv_label_create(musicPlayerScreen->display);
lv_obj_set_style_text_color(musicPlayerScreen->durationTimeLabel.label, lv_color_white(), LV_PART_MAIN);
lv_obj_align(musicPlayerScreen->durationTimeLabel.label, LV_ALIGN_BOTTOM_RIGHT, -60, -20);
if(musicPlayerScreen->positionTimeLabel.label)
{
LV_LOG_ERROR("positionTimeLabel should be NULL here !");
lv_obj_del(musicPlayerScreen->positionTimeLabel.label);
musicPlayerScreen->positionTimeLabel.label = NULL;
}
musicPlayerScreen->positionTimeLabel.label = lv_label_create(musicPlayerScreen->display);
lv_obj_set_style_text_color(musicPlayerScreen->positionTimeLabel.label, lv_color_white(), LV_PART_MAIN);
lv_obj_align(musicPlayerScreen->positionTimeLabel.label, LV_ALIGN_BOTTOM_LEFT, 60, -20);
//Track playback cursor
if(musicPlayerScreen->playbackArc)
{
LV_LOG_ERROR("playbackArc should be NULL here !");
lv_obj_del(musicPlayerScreen->playbackArc);
musicPlayerScreen->playbackArc = NULL;
}
musicPlayerScreen->playbackArc = lv_arc_create(musicPlayerScreen->display);
lv_obj_remove_style(musicPlayerScreen->playbackArc, NULL, LV_PART_KNOB);
lv_obj_clear_flag(musicPlayerScreen->playbackArc, LV_OBJ_FLAG_CLICKABLE);
lv_obj_align(musicPlayerScreen->playbackArc, LV_ALIGN_CENTER, 0,0);
lv_obj_set_size(musicPlayerScreen->playbackArc, 240, 240);
lv_obj_set_style_arc_color(musicPlayerScreen->playbackArc, lv_palette_main(LV_PALETTE_LIME), LV_PART_INDICATOR);
music_player_screen_set_music_duration(musicPlayerScreen, musicPlayerScreen->currentMusicDuration);
music_player_screen_set_music_position(musicPlayerScreen, musicPlayerScreen->currentMusicPosition);
_set_UI_no_ble_connection(musicPlayerScreen, musicPlayerScreen->ble_connection_state);
//We register the event callback to handle gestures
lv_obj_add_event_cb(musicPlayerScreen->display, &(gesture_event_cb), LV_EVENT_GESTURE, musicPlayerScreen);
//We register the event callback to handle the cleanup
lv_obj_add_event_cb(musicPlayerScreen->display, &(cleanup_event_cb), LV_EVENT_DELETE, musicPlayerScreen);
}
void music_player_screen_destroy(MusicPlayerScreen_t * const musicPlayerScreen)
{
if(!musicPlayerScreen)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
memset(musicPlayerScreen, 0, offsetof(MusicPlayerScreen_t, musicPlaybackCtrlCb));
}
void _set_UI_no_ble_connection(MusicPlayerScreen_t * const musicPlayerScreen, bool connected)
{
if(connected)
{
lv_obj_clear_state(musicPlayerScreen->playPauseBtn.button, LV_STATE_DISABLED);
lv_obj_clear_state(musicPlayerScreen->previousBtn, LV_STATE_DISABLED);
lv_obj_clear_state(musicPlayerScreen->nextBtn, LV_STATE_DISABLED);
lv_obj_clear_state(musicPlayerScreen->volumeDownBtn, LV_STATE_DISABLED);
lv_obj_clear_state(musicPlayerScreen->volumeUpBtn, LV_STATE_DISABLED);
lv_label_set_text_static(musicPlayerScreen->titleLabel, musicPlayerScreen->titleText);
lv_obj_clear_flag(musicPlayerScreen->artistLabel, LV_OBJ_FLAG_HIDDEN);
}
else
{
lv_obj_add_state(musicPlayerScreen->playPauseBtn.button, LV_STATE_DISABLED);
lv_obj_add_state(musicPlayerScreen->previousBtn, LV_STATE_DISABLED);
lv_obj_add_state(musicPlayerScreen->nextBtn, LV_STATE_DISABLED);
lv_obj_add_state(musicPlayerScreen->volumeDownBtn, LV_STATE_DISABLED);
lv_obj_add_state(musicPlayerScreen->volumeUpBtn, LV_STATE_DISABLED);
lv_label_set_text_static(musicPlayerScreen->titleLabel, translation_get_word(TRANSLATION_PHONE_NOT_CONNECTED_2));
lv_obj_set_style_bg_color(musicPlayerScreen->titleLabel, lv_color_black(), LV_PART_MAIN);
lv_obj_add_flag(musicPlayerScreen->artistLabel, LV_OBJ_FLAG_HIDDEN);
}
}

View File

@ -0,0 +1,78 @@
#ifndef MUSIC_PLAYER_SCREEN_H
#define MUSIC_PLAYER_SCREEN_H
#include "lvgl.h"
typedef enum MusicPlaybackCtrlAction
{
MUSIC_CONTROL_PLAY = 0,
MUSIC_CONTROL_PAUSE,
MUSIC_CONTROL_PLAYPAUSE,
MUSIC_CONTROL_NEXT,
MUSIC_CONTROL_PREVIOUS,
MUSIC_CONTROL_VOLUMEUP,
MUSIC_CONTROL_VOLUMEDOWN,
MUSIC_CONTROL_FORWARD,
MUSIC_CONTROL_REWIND,
} MusicPlaybackCtrlAction_e;
typedef void (*MusicPlaybackCtrlCb_t)(MusicPlaybackCtrlAction_e musicPlaybackCtrlAction);
typedef struct PlayerButton
{
lv_obj_t *button;
lv_obj_t *label;
char icon[4];
} PlayerButton_t;
typedef struct TimeLabel
{
lv_obj_t *label;
char text[9];
} TimeLabel_t;
typedef struct MusicPlayerScreen
{
//Can be erased attributes
lv_obj_t *display;
PlayerButton_t playPauseBtn;
lv_obj_t *previousBtn;
lv_obj_t *nextBtn;
lv_obj_t *volumeDownBtn;
lv_obj_t *volumeUpBtn;
lv_obj_t *playbackArc;
lv_obj_t *titleLabel;
lv_obj_t *artistLabel;
TimeLabel_t positionTimeLabel, durationTimeLabel;
//Should not be erased attributes
MusicPlaybackCtrlCb_t musicPlaybackCtrlCb;
MusicPlaybackCtrlAction_e currentPlayState;
char titleText[60];
char artistText[30];
uint16_t currentMusicDuration; //The currently playing music's total duration in seconds.
uint16_t currentMusicPosition; //The currently playing music's cursor position in seconds.
bool ble_connection_state;
} MusicPlayerScreen_t;
void music_player_screen_init(MusicPlayerScreen_t * const musicPlayerScreen);
void music_player_screen_register_music_playback_control_cb(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlaybackCtrlCb_t musicPlaybackCtrlCb);
void music_player_screen_notify_BLE_connection_state(MusicPlayerScreen_t * const musicPlayerScreen, bool connected);
void music_player_screen_set_playing_music_title_and_artist(MusicPlayerScreen_t * const musicPlayerScreen, const char *title, const char *artist);
void music_player_screen_set_music_duration(MusicPlayerScreen_t * const musicPlayerScreen, uint16_t durationInSeconds);
void music_player_screen_set_music_position(MusicPlayerScreen_t * const musicPlayerScreen, uint16_t positionInSeconds);
void music_player_screen_set_music_playing_state(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlaybackCtrlAction_e playingState);
bool music_player_screen_is_in_use(MusicPlayerScreen_t * const musicPlayerScreen);
void music_player_screen_create(MusicPlayerScreen_t * const musicPlayerScreen);
void music_player_screen_destroy(MusicPlayerScreen_t * const musicPlayerScreen);
#endif // MUSIC_PLAYER_SCREEN_H

View File

@ -78,7 +78,12 @@ typedef struct WatchFace
struct tm dateTime;
} WatchFace_t;
/* Initializes the watch face context object */
/**
* @brief Initializes the watch face context object
* @note This function has to be called first before any others
*
* @param watchFace a pointer to the watch face context structure.
*/
void watch_face_init(WatchFace_t * const watchFace);
/**
@ -158,7 +163,7 @@ void watch_face_force_sync(WatchFace_t * const watchFace);
*
* @param watchFace a pointer to the watch face context structure.
* @return true if the watch face screen is being used
* @return false if the watch face screen is not being used/displayed currently
* @return false if the watch face screen is not being used/currently displayed
*/
bool watch_face_is_in_use(WatchFace_t * const watchFace);

View File

@ -19,6 +19,11 @@ static const char * const translation_dictionary[][TRANSLATED_LANGUAGES_COUNT] =
[TRANSLATION_GERMAN] = "Wecker",
[TRANSLATION_ENGLISH]= "Alarm"
},
[TRANSLATION_MUSIC] = {
[TRANSLATION_FRENCH] = "Musique",
[TRANSLATION_GERMAN] = "Musik",
[TRANSLATION_ENGLISH]= "Music player"
},
[TRANSLATION_COMPASS] = {
[TRANSLATION_FRENCH] = "Boussole",
[TRANSLATION_GERMAN] = "Kompass",
@ -188,6 +193,21 @@ static const char * const translation_dictionary[][TRANSLATED_LANGUAGES_COUNT] =
[TRANSLATION_FRENCH] = "Je l'ai\nTrouver !",
[TRANSLATION_GERMAN] = "Ich\nHabe Es\nGefu-\nnden !",
[TRANSLATION_ENGLISH]= "Found\nIt !",
},
[TRANSLATION_PHONE_NOT_CONNECTED_2] = {
[TRANSLATION_FRENCH] = "\t\t\t\t\t\tMobile non connecte !",
[TRANSLATION_GERMAN] = "\t\t\t\t\t\tKeine Verbindung zum Handy !",
[TRANSLATION_ENGLISH] = "\t\t\t\t\t\tPhone not connected !",
},
[TRANSLATION_NO_TRACK_TITLE] = {
[TRANSLATION_FRENCH] = "[Titre inconnu]",
[TRANSLATION_GERMAN] = "[Unbekannten Titel]",
[TRANSLATION_ENGLISH] = "[Unknown title]",
},
[TRANSLATION_NO_TRACK_ARTIST] = {
[TRANSLATION_FRENCH] = "[Artiste inconnu]",
[TRANSLATION_GERMAN] = "[Unbekannten Sanger]",
[TRANSLATION_ENGLISH] = "[Unknown artist]",
}
};

View File

@ -16,6 +16,7 @@ typedef enum TranslationWord
TRANSLATION_MENU = 0,
TRANSLATION_WATCH,
TRANSLATION_ALARM,
TRANSLATION_MUSIC,
TRANSLATION_COMPASS,
TRANSLATION_FIND_MY_PHONE,
TRANSLATION_ALTIMETER,
@ -51,7 +52,12 @@ typedef enum TranslationWord
/* Find my phone app translation */
TRANSLATION_PHONE_NOT_CONNECTED,
TRANSLATION_FIND_MY_PHONE_BTN,
TRANSLATION_FOUND_MY_PHONE_BTN
TRANSLATION_FOUND_MY_PHONE_BTN,
/* Music player app translation */
TRANSLATION_PHONE_NOT_CONNECTED_2,
TRANSLATION_NO_TRACK_TITLE,
TRANSLATION_NO_TRACK_ARTIST,
} TranslationWord_e;
const char * translation_get_word(TranslationWord_e word);

View File

@ -33,6 +33,7 @@ int string_to_uint(char *buf, u32 *d);
int string_to_ipaddr(const char *buf, u8 *addr);
char * strdup(const char *s);
char * strndup(const char *s, size_t len);
int strcasecmp(const char *s1, const char *s2);
int sendchar(int ch);
void dumpBuffer(char *name, char* buffer, int len);

View File

@ -1107,11 +1107,15 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void)
else to_return = GADGET_BRIDGE_PARSER_CODE_OK;
break;
case GADGET_BRIDGE_PARSER_FSM_FOUND_MUSICINFO:
if((start = strstr(_gadget_bridge_internals.buffer, "artist:"))
&& (end = strstr(_gadget_bridge_internals.buffer, ",track")))
if((start = strstr(_gadget_bridge_internals.buffer, "artist:")) &&
(end = strstr(_gadget_bridge_internals.buffer, ",track")))
{
end2 = strstr(_gadget_bridge_internals.buffer, ",album");
printf("###Found TRACK\n");
_parser_extract_char_str(start + 8, end - 1, &_gadget_bridge_internals.event_data.music_info.artist);
if(end2 != NULL && end2 < end)
_parser_extract_char_str(start + 8, end2 - 1, &_gadget_bridge_internals.event_data.music_info.artist);
else
_parser_extract_char_str(start + 8, end - 1, &_gadget_bridge_internals.event_data.music_info.artist);
// We remove the parsed part from the buffer
end += 1;
@ -1235,6 +1239,7 @@ const char *gadget_bridge_notification_type_2_str(gadget_bridge_notification_typ
{
CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_SMS)
CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_EMAIL)
CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_WHATSAPP)
CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_GADGET_BRIDGE)
CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_UNKNOWN)
default:
@ -1248,6 +1253,7 @@ const char *gadget_bridge_music_state_2_str(gadget_bridge_music_state_e music_st
{
CASE_RETURN_STR(GADGET_BRIDGE_MUSIC_STATE_PAUSE)
CASE_RETURN_STR(GADGET_BRIDGE_MUSIC_STATE_PLAY)
CASE_RETURN_STR(GADGET_BRIDGE_MUSIC_STATE_STOP)
CASE_RETURN_STR(GADGET_BRIDGE_MUSIC_STATE_UNKNOWN)
default:
return "Unknown music state";
@ -1407,11 +1413,13 @@ static void _parser_extract_tel(char *start, char *end)
static void _parser_extract_src(char *start, char *end)
{
*end = '\0';
if(strcmp(start, "Messages") == 0)
if(strcasecmp(start, "Messages") == 0)
_gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_SMS;
else if(strcmp(start, "E-mail") == 0)
else if(strcasecmp(start, "E-mail") == 0)
_gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_EMAIL;
else if(strcmp(start, "Gadgetbridge") == 0)
else if(strcasecmp(start, "WhatsApp") == 0)
_gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_WHATSAPP;
else if(strcasecmp(start, "Gadgetbridge") == 0)
_gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_GADGET_BRIDGE;
else
_gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_UNKNOWN;
@ -1449,6 +1457,8 @@ static void _parser_extract_state(char *start, char *end)
_gadget_bridge_internals.event_data.music_state.music_state = GADGET_BRIDGE_MUSIC_STATE_PLAY;
else if(strcmp(start, "pause") == 0)
_gadget_bridge_internals.event_data.music_state.music_state = GADGET_BRIDGE_MUSIC_STATE_PAUSE;
else if(strcmp(start, "stop") == 0)
_gadget_bridge_internals.event_data.music_state.music_state = GADGET_BRIDGE_MUSIC_STATE_STOP;
else
_gadget_bridge_internals.event_data.music_state.music_state = GADGET_BRIDGE_MUSIC_STATE_UNKNOWN;

View File

@ -130,6 +130,7 @@ typedef enum gadget_bridge_notification_type
{
GADGET_BRIDGE_NOTIFICATION_TYPE_SMS = 0,
GADGET_BRIDGE_NOTIFICATION_TYPE_EMAIL,
GADGET_BRIDGE_NOTIFICATION_TYPE_WHATSAPP,
GADGET_BRIDGE_NOTIFICATION_TYPE_GADGET_BRIDGE,
GADGET_BRIDGE_NOTIFICATION_TYPE_UNKNOWN,
} gadget_bridge_notification_type_e;
@ -138,6 +139,7 @@ typedef enum
{
GADGET_BRIDGE_MUSIC_STATE_PAUSE = 0,
GADGET_BRIDGE_MUSIC_STATE_PLAY,
GADGET_BRIDGE_MUSIC_STATE_STOP,
GADGET_BRIDGE_MUSIC_STATE_UNKNOWN,
} gadget_bridge_music_state_e;

View File

@ -16,18 +16,18 @@
<stdbool.h>
<time.h>
1681114227 source:d:\users\think\programmation\arduino\git_projects\w800_smart_watch\src\gadget_bridge_parser\gadget_bridge.c
1684074204 source:d:\users\think\programmation\arduino\git_projects\w800_smart_watch\src\gadget_bridge_parser\gadget_bridge.c
"gadget_bridge.h"
<stdio.h>
<stdlib.h>
<string.h>
1681150637 d:\users\think\programmation\arduino\git_projects\w800_smart_watch\src\gadget_bridge_parser\gadget_bridge.h
1684074112 d:\users\think\programmation\arduino\git_projects\w800_smart_watch\src\gadget_bridge_parser\gadget_bridge.h
<stdint.h>
<stdbool.h>
<time.h>
1681114227 source:d:\users\think\programmation\arduino\git_projects\w800_smart_watch\src\gadget_bridge_parser\main.c
1684074076 source:d:\users\think\programmation\arduino\git_projects\w800_smart_watch\src\gadget_bridge_parser\main.c
<stdio.h>
<stdlib.h>
<string.h>

View File

@ -2,19 +2,19 @@
<CodeBlocks_layout_file>
<FileVersion major="1" minor="0" />
<ActiveTarget name="Debug" />
<File name="gadget_bridge.h" open="1" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="main.c" open="0" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1906" topLine="64" />
<Cursor1 position="11119" topLine="337" />
</Cursor>
</File>
<File name="main.c" open="1" top="1" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="gadget_bridge.c" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="9858" topLine="284" />
<Cursor1 position="61086" topLine="1211" />
</Cursor>
</File>
<File name="gadget_bridge.c" open="1" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="gadget_bridge.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="252" topLine="0" />
<Cursor1 position="4063" topLine="120" />
</Cursor>
</File>
</CodeBlocks_layout_file>

View File

@ -278,6 +278,20 @@ const char *sample[] =
"deo with subtitles)\"",
",dur:219,c:-1,n:-1})",
"[16]GB({t:\"musicinfo\",a",
"rtist:\"Inna\",album:\"",
",track:\"Sun Is Up\",",
"dur:185,c:-1,n:0})",
"[16]GB({t:\"musicinfo\",a",
"rtist:\"The Fat ",
"Rat\",track:\"The cal",
"ling by laur",
"a brem) [Gabry Ponte Ice P",
"op Mix] (Original Vi",
"deo with subtitles)\"",
",dur:219,c:-1,n:-1})",
"[16]GB({t:\"notify\",i",
"d:1680859061,body:\"tes",
"t hehe test\",sender:\"",
@ -316,6 +330,23 @@ const char *sample[] =
"sender :\"This is a test",
"payload \",tel:\"This is",
" a test payload \"})[10]",
"[16]GB({t:\"notify\",id:1",
"684049367,src:\"Whats",
"App\",title:\"Backyard",
" ⸮: ~?PIERRE EMMANUE",
"L DUCHET\",body:\"F⸮li",
"citations ⸮ Adrien q",
"ui vient de finir no",
"n pas son Ultra comm",
"e annonc⸮ (annul⸮) m",
"ais un 92 km 2000d+ ",
"en terminant premier",
" ex aequo en 7h59!!\\",
"nUn concurrent s⸮rie",
"ux pour la backyard ",
"!\nEncore bravo :cla",
"p::+1:\"})[10]",
};
int main()

View File

@ -1653,10 +1653,10 @@
<Option compilerVar="CC" />
</Unit>
<Unit filename="menu_screen.h" />
<Unit filename="music_control_screen.c">
<Unit filename="music_player_screen.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="music_control_screen.h" />
<Unit filename="music_player_screen.h" />
<Unit filename="rsrc/hour_hand.png" />
<Unit filename="settings_screen.c">
<Option compilerVar="CC" />

View File

@ -2,15 +2,253 @@
<CodeBlocks_layout_file>
<FileVersion major="1" minor="0" />
<ActiveTarget name="Debug" />
<File name="lvgl\src\hal\lv_hal_indev.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5065" topLine="123" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_color.c" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="10782" topLine="316" />
</Cursor>
</File>
<File name="lvgl\lvgl.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="138" />
</Cursor>
</File>
<File name="altimeter_screen.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1028" topLine="30" />
</Cursor>
</File>
<File name="lvgl\src\widgets\list\lv_list.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="721" topLine="16" />
</Cursor>
</File>
<File name="main.c" open="1" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3609" topLine="56" />
</Cursor>
</File>
<File name="lvgl\src\lv_api_map.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="722" topLine="32" />
</Cursor>
</File>
<File name="lvgl\src\widgets\label\lv_label.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1299" topLine="36" />
</Cursor>
</File>
<File name="settings_screen.h" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="315" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\widgets\img\lv_img.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="4439" topLine="123" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_style.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="7273" topLine="217" />
</Cursor>
</File>
<File name="lvgl\src\layouts\grid\lv_grid.h" open="0" top="0" tabpos="13" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="579" topLine="17" />
</Cursor>
</File>
<File name="compass_screen.c" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="6172" topLine="194" />
</Cursor>
</File>
<File name="lvgl\examples\widgets\bar\lv_example_bar_6.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="181" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_log.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1509" topLine="59" />
</Cursor>
</File>
<File name="lv_drivers\win_drv.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="585" topLine="0" />
</Cursor>
</File>
<File name="lvgl\lv_conf_template.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="56" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_style.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="11206" topLine="296" />
</Cursor>
</File>
<File name="lvgl\demos\widgets\assets\img_demo_widgets_avatar.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1282774" topLine="472" />
</Cursor>
</File>
<File name="find_my_phone_screen.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="978" topLine="0" />
</Cursor>
</File>
<File name="watch_face.c" open="1" top="0" tabpos="3" split="0" active="1" splitpos="702" zoom_1="0" zoom_2="-1">
<Cursor>
<Cursor1 position="5273" topLine="135" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="7842" topLine="283" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_timer.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2694" topLine="70" />
</Cursor>
</File>
<File name="lvgl\src\widgets\chart\lv_chart.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="11658" topLine="336" />
</Cursor>
</File>
<File name="lv_drivers\display\monitor.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="289" topLine="31" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_disp.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="7126" topLine="230" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font_montserrat_30.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="869" topLine="0" />
</Cursor>
</File>
<File name="lvgl\demos\widgets\lv_demo_widgets.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2825" topLine="122" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_scroll.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="11856" topLine="347" />
</Cursor>
</File>
<File name="common_screen_components.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="517" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\draw\lv_draw_img.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5230" topLine="191" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font_montserrat_12.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="22" />
</Cursor>
</File>
<File name="lvgl\src\hal\lv_hal_disp.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="11123" topLine="327" />
</Cursor>
</File>
<File name="compass_assets.c" open="0" top="0" tabpos="13" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="143" />
</Cursor>
</File>
<File name="find_my_phone_screen.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2751" topLine="55" />
</Cursor>
</File>
<File name="lvgl\src\widgets\menu\lv_menu.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3321" topLine="109" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_tree.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2082" topLine="62" />
</Cursor>
</File>
<File name="lv_drivers\win32drv\win32drv.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="15" />
</Cursor>
</File>
<File name="lvgl\demos\widgets\lv_demo_widgets.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="456" topLine="6" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2638" topLine="87" />
</Cursor>
</File>
<File name="lvgl\src\hal\lv_hal_disp.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="823" topLine="24" />
</Cursor>
</File>
<File name="lvgl\src\widgets\roller\lv_roller.h" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="715" topLine="26" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_types.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1759" topLine="61" />
</Cursor>
</File>
<File name="lvgl\src\libs\ffmpeg\lv_ffmpeg.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5784" topLine="170" />
</Cursor>
</File>
<File name="lvgl\src\widgets\img\lv_img.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1863" topLine="59" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_disp.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="615" topLine="25" />
</Cursor>
</File>
<File name="compass_screen.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1253" topLine="20" />
</Cursor>
</File>
<File name="music_player_screen.h" open="1" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2313" topLine="41" />
</Cursor>
</File>
<File name="watch_menu_icons.c" open="0" top="0" tabpos="18" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="869291" topLine="156" />
<Cursor1 position="193199" topLine="176" />
</Cursor>
<Folding>
<Collapse line="2" />
<Collapse line="185" />
<Collapse line="195" />
<Collapse line="378" />
<Collapse line="388" />
<Collapse line="571" />
<Collapse line="581" />
@ -25,21 +263,32 @@
<Collapse line="1536" />
<Collapse line="1546" />
<Collapse line="1729" />
<Collapse line="1739" />
<Collapse line="1922" />
<Collapse line="1932" />
<Collapse line="2115" />
<Collapse line="2125" />
<Collapse line="2284" />
</Folding>
</File>
<File name="lvgl\src\core\lv_obj.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\core\lv_indev.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2638" topLine="87" />
<Cursor1 position="3034" topLine="107" />
</Cursor>
</File>
<File name="lvgl\demos\widgets\assets\img_demo_widgets_avatar.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\core\lv_obj_style_gen.c" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1282774" topLine="472" />
<Cursor1 position="13491" topLine="412" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="music_player_screen.c" open="1" top="1" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5535" topLine="120" />
<Cursor1 position="2702" topLine="56" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_anim.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="732" topLine="34" />
</Cursor>
</File>
<File name="lvgl\src\widgets\spinbox\lv_spinbox.h" open="0" top="0" tabpos="18" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -47,19 +296,29 @@
<Cursor1 position="4262" topLine="120" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_refr.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="menu_screen.c" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2447" topLine="75" />
<Cursor1 position="4556" topLine="79" />
</Cursor>
</File>
<File name="altimeter_screen.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\core\lv_event.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1028" topLine="30" />
<Cursor1 position="846" topLine="28" />
</Cursor>
</File>
<File name="lvgl\lv_conf_template.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_conf.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="56" />
<Cursor1 position="2737" topLine="65" />
</Cursor>
</File>
<File name="lvgl\src\widgets\label\lv_label.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5648" topLine="194" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_log.h" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2557" topLine="68" />
</Cursor>
</File>
<File name="altimeter_screen_assets.c" open="0" top="0" tabpos="19" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -67,89 +326,14 @@
<Cursor1 position="96342" topLine="161" />
</Cursor>
</File>
<File name="lvgl\src\widgets\chart\lv_chart.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\layouts\flex\lv_flex.c" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="11658" topLine="336" />
<Cursor1 position="3097" topLine="74" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_disp.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\widgets\list\lv_list.c" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="2" zoom_2="0">
<Cursor>
<Cursor1 position="7126" topLine="230" />
</Cursor>
</File>
<File name="settings_screen.c" open="1" top="1" tabpos="5" split="0" active="1" splitpos="513" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="23555" topLine="429" />
</Cursor>
</File>
<File name="lv_drivers\win32drv\win32drv.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="524" topLine="954" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_color.c" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="10782" topLine="316" />
</Cursor>
</File>
<File name="lvgl\src\hal\lv_hal_indev.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5065" topLine="123" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_timer.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="635" topLine="36" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="7842" topLine="283" />
</Cursor>
</File>
<File name="lvgl\src\layouts\flex\lv_flex.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="950" topLine="43" />
</Cursor>
</File>
<File name="menu_screen.c" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3627" topLine="67" />
</Cursor>
</File>
<File name="compass_assets.c" open="0" top="0" tabpos="13" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="143" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_class.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1857" topLine="35" />
</Cursor>
</File>
<File name="compass_screen.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1253" topLine="18" />
</Cursor>
</File>
<File name="lvgl\examples\widgets\menu\lv_example_menu_5.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="7631" topLine="141" />
</Cursor>
</File>
<File name="lv_drivers\win_drv.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="585" topLine="0" />
</Cursor>
</File>
<File name="altimeter_screen.c" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="13638" topLine="409" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_log.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1509" topLine="59" />
<Cursor1 position="2391" topLine="53" />
</Cursor>
</File>
<File name="lv_drivers\indev\keyboard.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -157,66 +341,11 @@
<Cursor1 position="440" topLine="14" />
</Cursor>
</File>
<File name="lvgl\src\widgets\menu\lv_menu.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3321" topLine="109" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font_montserrat_30.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="869" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\hal\lv_hal_disp.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="823" topLine="24" />
</Cursor>
</File>
<File name="lvgl\src\widgets\label\lv_label.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1299" topLine="36" />
</Cursor>
</File>
<File name="lvgl\src\hal\lv_hal_indev.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3566" topLine="102" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_style_gen.h" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="13017" topLine="346" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_types.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1759" topLine="61" />
</Cursor>
</File>
<File name="watch_face.h" open="1" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3303" topLine="82" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_pos.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="7730" topLine="167" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_event.h" open="1" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5693" topLine="115" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_anim.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3835" topLine="68" />
</Cursor>
</File>
<File name="lvgl\src\widgets\list\lv_list.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="721" topLine="16" />
</Cursor>
</File>
<File name="lvgl\src\widgets\tileview\lv_tileview.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1055" topLine="40" />
@ -231,114 +360,19 @@
<Cursor1 position="3011" topLine="100" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font_montserrat_12.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\core\lv_obj_class.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="22" />
<Cursor1 position="1857" topLine="35" />
</Cursor>
</File>
<File name="lvgl\src\lv_api_map.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="common_screen_components.c" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="722" topLine="32" />
</Cursor>
</File>
<File name="lvgl\src\widgets\imgbtn\lv_imgbtn.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2184" topLine="61" />
</Cursor>
</File>
<File name="lvgl\src\widgets\roller\lv_roller.h" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="715" topLine="26" />
</Cursor>
</File>
<File name="lvgl\lvgl.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="138" />
</Cursor>
</File>
<File name="lvgl\src\draw\lv_draw_img.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5230" topLine="191" />
</Cursor>
</File>
<File name="common_screen_components.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="517" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\widgets\label\lv_label.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5648" topLine="194" />
</Cursor>
</File>
<File name="settings_screen.h" open="1" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="315" topLine="0" />
</Cursor>
</File>
<File name="lvgl\examples\widgets\bar\lv_example_bar_6.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="181" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_indev_scroll.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="14405" topLine="323" />
</Cursor>
</File>
<File name="lvgl\src\libs\ffmpeg\lv_ffmpeg.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5784" topLine="170" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_timer.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5053" topLine="144" />
</Cursor>
</File>
<File name="watch_face.c" open="1" top="0" tabpos="1" split="0" active="1" splitpos="702" zoom_1="1" zoom_2="-1">
<Cursor>
<Cursor1 position="2615" topLine="83" />
</Cursor>
</File>
<File name="lv_drivers\win32drv\win32drv.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="15" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_color.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="6581" topLine="189" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_style.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="7273" topLine="217" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_disp.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="615" topLine="25" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_scroll.h" open="0" top="0" tabpos="16" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1988" topLine="67" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_area.h" open="0" top="0" tabpos="15" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1789" topLine="74" />
</Cursor>
</File>
<File name="lvgl\src\widgets\list\lv_list.c" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="2" zoom_2="0">
<Cursor>
<Cursor1 position="2391" topLine="53" />
<Cursor1 position="1343" topLine="21" />
</Cursor>
</File>
<File name="menu_screen.h" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="48" topLine="0" />
<Cursor1 position="294" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_tree.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -346,49 +380,9 @@
<Cursor1 position="1234" topLine="139" />
</Cursor>
</File>
<File name="lv_drivers\display\SSD1963.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\core\lv_obj_scroll.h" open="0" top="0" tabpos="16" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1563" topLine="27" />
</Cursor>
</File>
<File name="watch_casio_assets.c" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2981397" topLine="949" />
</Cursor>
</File>
<File name="lvgl\demos\widgets\lv_demo_widgets.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="456" topLine="6" />
</Cursor>
</File>
<File name="lvgl\src\hal\lv_hal_disp.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="11123" topLine="327" />
</Cursor>
</File>
<File name="common_screen_components.c" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="498" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\layouts\flex\lv_flex.c" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3097" topLine="74" />
</Cursor>
</File>
<File name="lv_drv_conf.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="6602" topLine="208" />
</Cursor>
</File>
<File name="main.c" open="1" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2852" topLine="77" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_indev.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3034" topLine="107" />
<Cursor1 position="8724" topLine="215" />
</Cursor>
</File>
<File name="lvgl\src\widgets\imgbtn\lv_imgbtn.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -396,19 +390,24 @@
<Cursor1 position="2129" topLine="53" />
</Cursor>
</File>
<File name="lv_drivers\win32drv\win32drv.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="524" topLine="954" />
</Cursor>
</File>
<File name="watch_casio_assets.c" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2981397" topLine="949" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font_fmt_txt.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="24" />
</Cursor>
</File>
<File name="lvgl\src\draw\lv_img_buf.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\misc\lv_color.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="6210" topLine="113" />
</Cursor>
</File>
<File name="compass_screen.c" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="6172" topLine="154" />
<Cursor1 position="761" topLine="32" />
</Cursor>
</File>
<File name="lvgl\src\widgets\menu\lv_menu.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -416,74 +415,24 @@
<Cursor1 position="3706" topLine="117" />
</Cursor>
</File>
<File name="lvgl\src\draw\lv_draw_rect.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\core\lv_refr.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="539" topLine="9" />
<Cursor1 position="2447" topLine="75" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_scroll.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lv_drv_conf.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="12525" topLine="363" />
<Cursor1 position="6602" topLine="208" />
</Cursor>
</File>
<File name="firmware_version.h" open="0" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\core\lv_indev_scroll.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="160" topLine="0" />
<Cursor1 position="14405" topLine="323" />
</Cursor>
</File>
<File name="lvgl\demos\widgets\lv_demo_widgets.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="lvgl\src\draw\lv_img_buf.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2825" topLine="122" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_log.h" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2557" topLine="68" />
</Cursor>
</File>
<File name="lvgl\src\widgets\img\lv_img.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1863" topLine="59" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_style_gen.c" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="13491" topLine="412" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_tree.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2082" topLine="62" />
</Cursor>
</File>
<File name="lv_drivers\display\monitor.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="289" topLine="31" />
</Cursor>
</File>
<File name="lvgl\src\widgets\img\lv_img.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="4439" topLine="123" />
</Cursor>
</File>
<File name="lvgl\src\layouts\grid\lv_grid.h" open="0" top="0" tabpos="13" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="579" topLine="17" />
</Cursor>
</File>
<File name="lv_conf.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="555" topLine="10" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_symbol_def.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1135" topLine="14" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_style.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="9059" topLine="238" />
<Cursor1 position="6210" topLine="113" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_pos.c" open="0" top="0" tabpos="12" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -491,9 +440,84 @@
<Cursor1 position="10562" topLine="336" />
</Cursor>
</File>
<File name="lvgl\src\layouts\flex\lv_flex.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="950" topLine="43" />
</Cursor>
</File>
<File name="firmware_version.h" open="0" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="160" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\widgets\imgbtn\lv_imgbtn.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2184" topLine="61" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5535" topLine="120" />
</Cursor>
</File>
<File name="lvgl\src\draw\lv_draw_rect.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="465" topLine="9" />
</Cursor>
</File>
<File name="watch_face.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3303" topLine="56" />
</Cursor>
</File>
<File name="lv_drivers\lv_drv_conf_template.h" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="10670" topLine="390" />
</Cursor>
</File>
<File name="settings_screen.c" open="0" top="0" tabpos="5" split="0" active="1" splitpos="513" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="36580" topLine="689" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_symbol_def.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="338" topLine="14" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_timer.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="716" topLine="31" />
</Cursor>
</File>
<File name="altimeter_screen.c" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="13638" topLine="409" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_style_gen.h" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="28878" topLine="602" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_area.h" open="0" top="0" tabpos="15" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1789" topLine="74" />
</Cursor>
</File>
<File name="lvgl\examples\widgets\menu\lv_example_menu_5.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="7631" topLine="141" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_pos.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="7730" topLine="167" />
</Cursor>
</File>
<File name="lv_drivers\display\SSD1963.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1563" topLine="27" />
</Cursor>
</File>
</CodeBlocks_layout_file>

View File

@ -118,9 +118,10 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLi
music_player_screen_init(&musicPlayerScreen);
music_player_screen_register_music_playback_control_cb(&musicPlayerScreen, &(musicPlaybackCtrlCb));
music_player_screen_set_playing_music_title_and_artist(&musicPlayerScreen, "Sun Is Up Hoho Haha", "Inna");
music_player_screen_set_music_duration(&musicPlayerScreen, 5896);
music_player_screen_set_music_position(&musicPlayerScreen, 122);
music_player_screen_set_music_playing_state(&musicPlayerScreen, MUSIC_CONTROL_PLAY);
music_player_screen_notify_BLE_connection_state(&musicPlayerScreen, true);
music_player_screen_set_music_duration(&musicPlayerScreen, 3*60+42);
music_player_screen_set_music_position(&musicPlayerScreen, 24);
//music_player_screen_set_music_playing_state(&musicPlayerScreen, MUSIC_CONTROL_PLAY);
altimeter_screen_register_measurement_cb(&altimeterScreen, &(alti_meas_cb));

View File

@ -148,28 +148,37 @@ void menu_screen_create(MenuScreen_t * const menuScreen)
//We add the screen header
common_screen_header_component(menuScreen->display, "Menu", 50);
lv_obj_t *scroll_item_container = lv_obj_create(menuScreen->display);
lv_obj_set_style_bg_color(scroll_item_container, lv_color_white(), LV_PART_MAIN);
lv_obj_set_size(scroll_item_container, lv_pct(100), 240-50);
lv_obj_set_pos(scroll_item_container, 0, 50);
lv_obj_set_style_pad_all(scroll_item_container, 0, LV_PART_MAIN);
lv_obj_set_style_pad_top(scroll_item_container, 10, LV_PART_MAIN);
lv_obj_set_style_pad_bottom(scroll_item_container, 20, LV_PART_MAIN);
lv_obj_set_style_radius(scroll_item_container, 0, LV_PART_MAIN);
lv_obj_set_style_border_width(scroll_item_container, 0, LV_PART_MAIN);
lv_obj_set_style_pad_right(scroll_item_container, 15, LV_PART_SCROLLBAR);
if(menuScreen->scrollItemContainer)
{
LV_LOG_ERROR("scrollItemContainer should be NULL here !");
lv_obj_del(menuScreen->scrollItemContainer);
menuScreen->scrollItemContainer = NULL;
}
menuScreen->scrollItemContainer = lv_obj_create(menuScreen->display);
lv_obj_set_style_bg_color(menuScreen->scrollItemContainer, lv_color_white(), LV_PART_MAIN);
lv_obj_set_size(menuScreen->scrollItemContainer, lv_pct(100), 240-50);
lv_obj_set_pos(menuScreen->scrollItemContainer, 0, 50);
lv_obj_set_style_pad_all(menuScreen->scrollItemContainer, 0, LV_PART_MAIN);
lv_obj_set_style_pad_top(menuScreen->scrollItemContainer, 10, LV_PART_MAIN);
lv_obj_set_style_pad_bottom(menuScreen->scrollItemContainer, 20, LV_PART_MAIN);
lv_obj_set_style_radius(menuScreen->scrollItemContainer, 0, LV_PART_MAIN);
lv_obj_set_style_border_width(menuScreen->scrollItemContainer, 0, LV_PART_MAIN);
lv_obj_set_style_pad_right(menuScreen->scrollItemContainer, 15, LV_PART_SCROLLBAR);
menu_screen_add_item(scroll_item_container, 0, &watch_menu_clock_icon, "Watch", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 1, &watch_menu_alarm_icon, "Alarm", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 2, &watch_menu_music_player_icon, "Music player", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 3, &watch_menu_compass_icon, "Compass", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 4, &watch_menu_altimeter_icon, "Altimeter", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 5, &watch_menu_lost_phone_icon, "Find my phone", &(menu_item_cb));
menu_screen_add_item(menuScreen->scrollItemContainer, 0, &watch_menu_clock_icon, "Watch", &(menu_item_cb));
menu_screen_add_item(menuScreen->scrollItemContainer, 1, &watch_menu_alarm_icon, "Alarm", &(menu_item_cb));
menu_screen_add_item(menuScreen->scrollItemContainer, 2, &watch_menu_music_player_icon, "Music player", &(menu_item_cb));
menu_screen_add_item(menuScreen->scrollItemContainer, 3, &watch_menu_compass_icon, "Compass", &(menu_item_cb));
menu_screen_add_item(menuScreen->scrollItemContainer, 4, &watch_menu_altimeter_icon, "Altimeter", &(menu_item_cb));
menu_screen_add_item(menuScreen->scrollItemContainer, 5, &watch_menu_lost_phone_icon, "Find my phone", &(menu_item_cb));
//menu_screen_add_item(scroll_item_container, 3, &watch_menu_messages_icon, "Text messages", &(menu_item_cb));
//menu_screen_add_item(scroll_item_container, 4, &watch_menu_mail_icon, "Mails", &(menu_item_cb));
//menu_screen_add_item(scroll_item_container, 5, &watch_menu_dialer_icon, "Phone", &(menu_item_cb));
//menu_screen_add_item(scroll_item_container, 6, &watch_menu_contacts_icon, "Contacts", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 6, &watch_menu_settings_icon, "Settings", &(menu_item_cb));
menu_screen_add_item(menuScreen->scrollItemContainer, 6, &watch_menu_settings_icon, "Settings", &(menu_item_cb));
//Lets restore the previous scrolling position
lv_obj_scroll_to_y(menuScreen->scrollItemContainer, menuScreen->lastScrollPosition, LV_ANIM_OFF);
//We register the event callback to handle the cleanup
lv_obj_add_event_cb(menuScreen->display, &(cleanup_event_cb), LV_EVENT_DELETE, menuScreen);
@ -183,5 +192,7 @@ void menu_screen_destroy(MenuScreen_t * const menuScreen)
return;
}
menuScreen->display = NULL;
//Lets save the current scroll position
menuScreen->lastScrollPosition = lv_obj_get_scroll_y(menuScreen->scrollItemContainer);
memset(menuScreen, 0, offsetof(MenuScreen_t, lastScrollPosition));
}

View File

@ -6,7 +6,11 @@
// Menu screen context object
typedef struct MenuScreen
{
//Can be erased attributes
lv_obj_t *display;
lv_obj_t *scrollItemContainer;
//Should not be erased attributes
lv_coord_t lastScrollPosition;
} MenuScreen_t;
/* Initializes the menu screen context object */

View File

@ -1,7 +1,9 @@
#include "music_player_screen.h"
#include "menu_screen.h"
#include <stdio.h>
#include <string.h>
#include "music_player_screen.h"
#include "menu_screen.h"
void _set_UI_no_ble_connection(MusicPlayerScreen_t * const musicPlayerScreen, bool connected);
static void gesture_event_cb(lv_event_t *e)
{
@ -67,6 +69,13 @@ static void music_player_button_click_event_cb(lv_event_t *e)
}
}
static void track_position_update_cb(lv_timer_t *timer)
{
MusicPlayerScreen_t *musicPlayerScreen = timer->user_data;
music_player_screen_set_music_position(musicPlayerScreen, ++musicPlayerScreen->currentMusicPosition);
}
void music_player_screen_init(MusicPlayerScreen_t * const musicPlayerScreen)
{
if(!musicPlayerScreen)
@ -90,6 +99,22 @@ void music_player_screen_register_music_playback_control_cb(MusicPlayerScreen_t
musicPlayerScreen->musicPlaybackCtrlCb = musicPlaybackCtrlCb;
}
void music_player_screen_notify_BLE_connection_state(MusicPlayerScreen_t * const musicPlayerScreen, bool connected)
{
if(!musicPlayerScreen)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
if(musicPlayerScreen->ble_connection_state != connected)
{
musicPlayerScreen->ble_connection_state = connected;
if(musicPlayerScreen->display != NULL)
_set_UI_no_ble_connection(musicPlayerScreen, musicPlayerScreen->ble_connection_state);
}
}
void music_player_screen_set_playing_music_title_and_artist(MusicPlayerScreen_t * const musicPlayerScreen, const char *title, const char *artist)
{
if(!musicPlayerScreen)
@ -176,6 +201,10 @@ void music_player_screen_set_music_playing_state(MusicPlayerScreen_t * const mus
if(playingState != MUSIC_CONTROL_PAUSE && playingState != MUSIC_CONTROL_PLAY) return;
musicPlayerScreen->currentPlayState = playingState;
if(musicPlayerScreen->currentPlayState == MUSIC_CONTROL_PLAY)
lv_timer_resume(musicPlayerScreen->timePositionTimer);
else
lv_timer_pause(musicPlayerScreen->timePositionTimer);
if(!musicPlayerScreen->playPauseBtn.label) return;
@ -209,7 +238,18 @@ void music_player_screen_create(MusicPlayerScreen_t * const musicPlayerScreen)
musicPlayerScreen->display = NULL;
}
musicPlayerScreen->display = lv_obj_create(NULL);
lv_obj_set_style_bg_color(musicPlayerScreen->display, lv_color_black(), LV_PART_MAIN);
lv_obj_set_style_bg_color(musicPlayerScreen->display, lv_color_white(), LV_PART_MAIN);
lv_obj_clear_flag(musicPlayerScreen->display, LV_OBJ_FLAG_SCROLLABLE);
//Black circled background
lv_obj_t *blackCircle = lv_obj_create(musicPlayerScreen->display);
lv_obj_set_style_bg_color(blackCircle, lv_color_black(), LV_PART_MAIN);
lv_obj_set_style_border_width(blackCircle, 0, LV_PART_MAIN);
lv_obj_set_style_pad_all(blackCircle, 0, LV_PART_MAIN);
lv_obj_set_style_radius(blackCircle, LV_RADIUS_CIRCLE, LV_PART_MAIN);
//The +1 to the hor and ver res is used to get rid of graphical issue... (1px white background bleeding on the black one)
lv_obj_set_size(blackCircle, lv_disp_get_ver_res(NULL)+1, lv_disp_get_hor_res(NULL)+1);
lv_obj_center(blackCircle);
//Let's create the UI for this amazing music player ...
//Play/Pause button
@ -234,62 +274,62 @@ void music_player_screen_create(MusicPlayerScreen_t * const musicPlayerScreen)
lv_obj_add_event_cb(musicPlayerScreen->playPauseBtn.button, &(music_player_button_click_event_cb), LV_EVENT_CLICKED, musicPlayerScreen);
//Previous track button
lv_obj_t *previousBtn = lv_btn_create(musicPlayerScreen->display);
lv_obj_set_size(previousBtn, 47, 47);
lv_obj_set_style_radius(previousBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN);
lv_obj_align_to(previousBtn, musicPlayerScreen->playPauseBtn.label, LV_ALIGN_OUT_LEFT_MID, -25, 0);
musicPlayerScreen->previousBtn = lv_btn_create(musicPlayerScreen->display);
lv_obj_set_size(musicPlayerScreen->previousBtn, 47, 47);
lv_obj_set_style_radius(musicPlayerScreen->previousBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN);
lv_obj_align_to(musicPlayerScreen->previousBtn, musicPlayerScreen->playPauseBtn.label, LV_ALIGN_OUT_LEFT_MID, -25, 0);
lv_obj_t *previousBtnLabel = lv_label_create(previousBtn);
lv_obj_t *previousBtnLabel = lv_label_create(musicPlayerScreen->previousBtn);
lv_label_set_text_static(previousBtnLabel, LV_SYMBOL_LEFT LV_SYMBOL_LEFT);
lv_obj_set_style_text_font(previousBtnLabel, &lv_font_montserrat_24, LV_PART_MAIN);
lv_obj_center(previousBtnLabel);
lv_obj_set_user_data(previousBtn, (void *)MUSIC_CONTROL_PREVIOUS);
lv_obj_add_event_cb(previousBtn, &(music_player_button_click_event_cb), LV_EVENT_SHORT_CLICKED, musicPlayerScreen);
lv_obj_add_event_cb(previousBtn, &(music_player_button_click_event_cb), LV_EVENT_LONG_PRESSED, musicPlayerScreen);
lv_obj_set_user_data(musicPlayerScreen->previousBtn, (void *)MUSIC_CONTROL_PREVIOUS);
lv_obj_add_event_cb(musicPlayerScreen->previousBtn, &(music_player_button_click_event_cb), LV_EVENT_SHORT_CLICKED, musicPlayerScreen);
lv_obj_add_event_cb(musicPlayerScreen->previousBtn, &(music_player_button_click_event_cb), LV_EVENT_LONG_PRESSED, musicPlayerScreen);
//Next track button
lv_obj_t *nextBtn = lv_btn_create(musicPlayerScreen->display);
lv_obj_set_size(nextBtn, 47, 47);
lv_obj_set_style_radius(nextBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN);
lv_obj_align_to(nextBtn, musicPlayerScreen->playPauseBtn.label, LV_ALIGN_OUT_RIGHT_MID, 25, 0);
musicPlayerScreen->nextBtn = lv_btn_create(musicPlayerScreen->display);
lv_obj_set_size(musicPlayerScreen->nextBtn, 47, 47);
lv_obj_set_style_radius(musicPlayerScreen->nextBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN);
lv_obj_align_to(musicPlayerScreen->nextBtn, musicPlayerScreen->playPauseBtn.label, LV_ALIGN_OUT_RIGHT_MID, 25, 0);
lv_obj_t *nextBtnLabel = lv_label_create(nextBtn);
lv_obj_t *nextBtnLabel = lv_label_create(musicPlayerScreen->nextBtn);
lv_label_set_text_static(nextBtnLabel, LV_SYMBOL_RIGHT LV_SYMBOL_RIGHT);
lv_obj_set_style_text_font(nextBtnLabel, &lv_font_montserrat_24, LV_PART_MAIN);
lv_obj_center(nextBtnLabel);
lv_obj_set_user_data(nextBtn, (void *)MUSIC_CONTROL_NEXT);
lv_obj_add_event_cb(nextBtn, &(music_player_button_click_event_cb), LV_EVENT_SHORT_CLICKED, musicPlayerScreen);
lv_obj_add_event_cb(nextBtn, &(music_player_button_click_event_cb), LV_EVENT_LONG_PRESSED, musicPlayerScreen);
lv_obj_set_user_data(musicPlayerScreen->nextBtn, (void *)MUSIC_CONTROL_NEXT);
lv_obj_add_event_cb(musicPlayerScreen->nextBtn, &(music_player_button_click_event_cb), LV_EVENT_SHORT_CLICKED, musicPlayerScreen);
lv_obj_add_event_cb(musicPlayerScreen->nextBtn, &(music_player_button_click_event_cb), LV_EVENT_LONG_PRESSED, musicPlayerScreen);
//Volume down button
lv_obj_t *volumeDownBtn = lv_btn_create(musicPlayerScreen->display);
lv_obj_set_size(volumeDownBtn, 47, 47);
lv_obj_set_style_radius(volumeDownBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN);
lv_obj_align_to(volumeDownBtn, previousBtn, LV_ALIGN_BOTTOM_MID, 25, 50);
musicPlayerScreen->volumeDownBtn = lv_btn_create(musicPlayerScreen->display);
lv_obj_set_size(musicPlayerScreen->volumeDownBtn, 47, 47);
lv_obj_set_style_radius(musicPlayerScreen->volumeDownBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN);
lv_obj_align_to(musicPlayerScreen->volumeDownBtn, musicPlayerScreen->previousBtn, LV_ALIGN_BOTTOM_MID, 25, 50);
lv_obj_t *volumeDownBtnLabel = lv_label_create(volumeDownBtn);
lv_obj_t *volumeDownBtnLabel = lv_label_create(musicPlayerScreen->volumeDownBtn);
lv_label_set_text_static(volumeDownBtnLabel, LV_SYMBOL_VOLUME_MID);
lv_obj_set_style_text_font(volumeDownBtnLabel, &lv_font_montserrat_24, LV_PART_MAIN);
lv_obj_center(volumeDownBtnLabel);
lv_obj_set_user_data(volumeDownBtn, (void *)MUSIC_CONTROL_VOLUMEDOWN);
lv_obj_add_event_cb(volumeDownBtn, &(music_player_button_click_event_cb), LV_EVENT_CLICKED, musicPlayerScreen);
lv_obj_set_user_data(musicPlayerScreen->volumeDownBtn, (void *)MUSIC_CONTROL_VOLUMEDOWN);
lv_obj_add_event_cb(musicPlayerScreen->volumeDownBtn, &(music_player_button_click_event_cb), LV_EVENT_CLICKED, musicPlayerScreen);
//Volume up button
lv_obj_t *volumeUpBtn = lv_btn_create(musicPlayerScreen->display);
lv_obj_set_size(volumeUpBtn, 47, 47);
lv_obj_set_style_radius(volumeUpBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN);
lv_obj_align_to(volumeUpBtn, nextBtn, LV_ALIGN_BOTTOM_MID, -25, 50);
musicPlayerScreen->volumeUpBtn = lv_btn_create(musicPlayerScreen->display);
lv_obj_set_size(musicPlayerScreen->volumeUpBtn, 47, 47);
lv_obj_set_style_radius(musicPlayerScreen->volumeUpBtn, LV_RADIUS_CIRCLE, LV_PART_MAIN);
lv_obj_align_to(musicPlayerScreen->volumeUpBtn, musicPlayerScreen->nextBtn, LV_ALIGN_BOTTOM_MID, -25, 50);
lv_obj_t *volumeUpBtnLabel = lv_label_create(volumeUpBtn);
lv_obj_t *volumeUpBtnLabel = lv_label_create(musicPlayerScreen->volumeUpBtn);
lv_label_set_text_static(volumeUpBtnLabel, LV_SYMBOL_VOLUME_MAX);
lv_obj_set_style_text_font(volumeUpBtnLabel, &lv_font_montserrat_24, LV_PART_MAIN);
lv_obj_center(volumeUpBtnLabel);
lv_obj_set_user_data(volumeUpBtn, (void *)MUSIC_CONTROL_VOLUMEUP);
lv_obj_add_event_cb(volumeUpBtn, &(music_player_button_click_event_cb), LV_EVENT_CLICKED, musicPlayerScreen);
lv_obj_set_user_data(musicPlayerScreen->volumeUpBtn, (void *)MUSIC_CONTROL_VOLUMEUP);
lv_obj_add_event_cb(musicPlayerScreen->volumeUpBtn, &(music_player_button_click_event_cb), LV_EVENT_CLICKED, musicPlayerScreen);
//Track title
if(musicPlayerScreen->titleLabel)
@ -360,6 +400,16 @@ void music_player_screen_create(MusicPlayerScreen_t * const musicPlayerScreen)
music_player_screen_set_music_duration(musicPlayerScreen, musicPlayerScreen->currentMusicDuration);
music_player_screen_set_music_position(musicPlayerScreen, musicPlayerScreen->currentMusicPosition);
_set_UI_no_ble_connection(musicPlayerScreen, musicPlayerScreen->ble_connection_state);
if(musicPlayerScreen->timePositionTimer)
{
LV_LOG_ERROR("timePositionTimer should be NULL here !");
lv_timer_del(musicPlayerScreen->timePositionTimer);
musicPlayerScreen->timePositionTimer = NULL;
}
musicPlayerScreen->timePositionTimer = lv_timer_create(&(track_position_update_cb), 1000, musicPlayerScreen);
lv_timer_pause(musicPlayerScreen->timePositionTimer);
//We register the event callback to handle gestures
lv_obj_add_event_cb(musicPlayerScreen->display, &(gesture_event_cb), LV_EVENT_GESTURE, musicPlayerScreen);
@ -374,6 +424,31 @@ void music_player_screen_destroy(MusicPlayerScreen_t * const musicPlayerScreen)
LV_LOG_ERROR("NULL pointer given !");
return;
}
lv_timer_del(musicPlayerScreen->timePositionTimer);
memset(musicPlayerScreen, 0, offsetof(MusicPlayerScreen_t, musicPlaybackCtrlCb));
}
void _set_UI_no_ble_connection(MusicPlayerScreen_t * const musicPlayerScreen, bool connected)
{
if(connected)
{
lv_obj_clear_state(musicPlayerScreen->playPauseBtn.button, LV_STATE_DISABLED);
lv_obj_clear_state(musicPlayerScreen->previousBtn, LV_STATE_DISABLED);
lv_obj_clear_state(musicPlayerScreen->nextBtn, LV_STATE_DISABLED);
lv_obj_clear_state(musicPlayerScreen->volumeDownBtn, LV_STATE_DISABLED);
lv_obj_clear_state(musicPlayerScreen->volumeUpBtn, LV_STATE_DISABLED);
lv_label_set_text_static(musicPlayerScreen->titleLabel, musicPlayerScreen->titleText);
lv_obj_clear_flag(musicPlayerScreen->artistLabel, LV_OBJ_FLAG_HIDDEN);
}
else
{
lv_obj_add_state(musicPlayerScreen->playPauseBtn.button, LV_STATE_DISABLED);
lv_obj_add_state(musicPlayerScreen->previousBtn, LV_STATE_DISABLED);
lv_obj_add_state(musicPlayerScreen->nextBtn, LV_STATE_DISABLED);
lv_obj_add_state(musicPlayerScreen->volumeDownBtn, LV_STATE_DISABLED);
lv_obj_add_state(musicPlayerScreen->volumeUpBtn, LV_STATE_DISABLED);
lv_label_set_text_static(musicPlayerScreen->titleLabel,"\t\t\t\t\t\tPhone not connected !");
lv_obj_set_style_bg_color(musicPlayerScreen->titleLabel, lv_color_black(), LV_PART_MAIN);
lv_obj_add_flag(musicPlayerScreen->artistLabel, LV_OBJ_FLAG_HIDDEN);
}
}

View File

@ -36,10 +36,15 @@ typedef struct MusicPlayerScreen
//Can be erased attributes
lv_obj_t *display;
PlayerButton_t playPauseBtn;
lv_obj_t *previousBtn;
lv_obj_t *nextBtn;
lv_obj_t *volumeDownBtn;
lv_obj_t *volumeUpBtn;
lv_obj_t *playbackArc;
lv_obj_t *titleLabel;
lv_obj_t *artistLabel;
TimeLabel_t positionTimeLabel, durationTimeLabel;
lv_timer_t *timePositionTimer;
//Should not be erased attributes
MusicPlaybackCtrlCb_t musicPlaybackCtrlCb;
MusicPlaybackCtrlAction_e currentPlayState;
@ -47,12 +52,15 @@ typedef struct MusicPlayerScreen
char artistText[30];
uint16_t currentMusicDuration; //The currently playing music's total duration in seconds.
uint16_t currentMusicPosition; //The currently playing music's cursor position in seconds.
bool ble_connection_state;
} MusicPlayerScreen_t;
void music_player_screen_init(MusicPlayerScreen_t * const musicPlayerScreen);
void music_player_screen_register_music_playback_control_cb(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlaybackCtrlCb_t musicPlaybackCtrlCb);
void music_player_screen_notify_BLE_connection_state(MusicPlayerScreen_t * const musicPlayerScreen, bool connected);
void music_player_screen_set_playing_music_title_and_artist(MusicPlayerScreen_t * const musicPlayerScreen, const char *title, const char *artist);
void music_player_screen_set_music_duration(MusicPlayerScreen_t * const musicPlayerScreen, uint16_t durationInSeconds);

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB