Compare commits

..

456 Commits

Author SHA1 Message Date
Gabor Kiss-Vamosi
e6d7be00bf docs: update changelog 2023-07-05 13:42:21 +02:00
Gabriel Wang
15433d69b9 chore(cmsis-pack): update cmsis-pack for v8.3.8 (#4340) 2023-07-05 13:39:10 +02:00
Gabor Kiss-Vamosi
9491c3ff6d example(tabview): fix tabview disable scrollig example
there is no animatin after selecting a tab by clicking anymore
2023-06-30 22:50:52 +02:00
Gabor Kiss-Vamosi
3de61c76af fix(tabview): remove the animation if the tab is selected by clicking the button on the header 2023-06-26 10:33:21 +02:00
kolliemo
09cc0de573 docs: mention incompatibility between software rotation and direct_mode or full_refresh (#4308) 2023-06-23 22:39:10 +02:00
Gabor Kiss-Vamosi
227ac02341 docs(faq): don't say 24 bit is support as LVGL can't render in RGB888 directly 2023-06-23 09:52:25 +02:00
Gabor Kiss-Vamosi
8b83fe7ea5 feat(rt-thread): make the rt-thread env recursively glob the UI files 2023-06-20 07:53:34 +02:00
Gabor Kiss-Vamosi
edd5ad28ad fix(btnmatrix): fix array out of bounds addressing with groups and no buttons 2023-06-19 10:28:23 +02:00
pete-pjb
07bce7466d fix:(BtnMatrix) Backport https://github.com/lvgl/lvgl/pull/4185
Stop disabled/hidden button matrix keys from getting stuck in a loop
2023-06-16 17:51:49 +01:00
pete-pjb
1713cd3fd8 Revert "fix:(BtnMatrix) Backport https://github.com/lvgl/lvgl/pull/4185"
This reverts commit cb602ea778.
2023-06-16 17:42:08 +01:00
pete-pjb
cb602ea778 fix:(BtnMatrix) Backport https://github.com/lvgl/lvgl/pull/4185
Stop Button Matrix getting stuck in loop if buttons disable/hidden
2023-06-16 17:31:34 +01:00
Rbb666
caf29ef0c5 add(docs): add renesas-ra6m3 get-started document (#4278) 2023-06-12 12:21:46 +02:00
jacquesdmernok
a3199514ab fix(stm32): static function prototypes moved from .h to .c (#4276) 2023-06-12 12:12:12 +02:00
Rbb666
78cbdfc151 add(gpu): add renesas-ra6m3 gpu adaptation (#4270) 2023-06-08 10:42:34 +02:00
Gabor Kiss-Vamosi
75e6ef4e1d fix(btnmatrix): fix using > 7 as button width 2023-05-31 22:49:41 +02:00
Lorenzo Arena
2376c57860 fix(png): fix decode image size and some warnings (#4248) 2023-05-29 10:43:49 +02:00
Gabor Kiss-Vamosi
e3659c46b1 fix(arduino): fix messed up variable types 2023-05-24 11:09:51 +02:00
Lorenzo Arena
df96b57f4e fix(bidi): add more Hebrew checks to RTL characters set (#4171) (#4239) 2023-05-24 10:00:07 +02:00
Gabor Kiss-Vamosi
67b3011f83 fix(chart): fix division by zero if there are no ticks 2023-05-19 10:25:17 +02:00
nicusorcitu
d87737612a perf(pxp, vglite): improve performance and add more features (#4222)
Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>
Signed-off-by: Stefan Babatie <stefan.babatie@nxp.com>
Signed-off-by: Jason Yu <zejiang.yu@nxp.com>
Co-authored-by: Stefan Babatie <stefan.babatie@nxp.com>
Co-authored-by: Jason Yu <zejiang.yu@nxp.com>
2023-05-18 22:43:19 +02:00
Gabor Kiss-Vamosi
6a89bd2d74 fix(msgbox): fix typo 2023-05-18 13:01:17 +02:00
Gabor Kiss-Vamosi
6843c191b7 fix(msgbox): add missing lv_obj_class_init_obj
fixes #4226
2023-05-18 11:53:58 +02:00
Gabor Kiss-Vamosi
1caafc55dd fix(disp): fix memory leak lv_scr_load_anim with auto_del and time=0
fixes: #4212
2023-05-18 11:14:16 +02:00
Gabor Kiss-Vamosi
5ba90a5c41 fix(flex): register LV_STYLE_FLEX_GROW
fixes #4214
2023-05-10 08:25:04 +02:00
jadergn
630da9c6ca fix(img): fix getting the image type on big endian systems (#4215) 2023-05-09 20:27:54 +02:00
Mariotaku
ee95e7dc25 fix(sdl): destroy texture after use if not stored in cache (#4173) 2023-05-08 17:02:49 +02:00
Gabor Kiss-Vamosi
45b13c378f fix(draw): typo with LV_COLOR_DEPTH 8 2023-05-03 10:34:18 +02:00
Gabriel Wang
2b56e04205 chore(cmsis-pack): update cmsis-pack for v8.3.7 (#4203) 2023-05-03 10:11:24 +02:00
Gabor Kiss-Vamosi
177900b033 docs(changelog): update changelog for v8.3.7 2023-05-03 10:07:40 +02:00
Oleg Belousov
203e7fc97d fix (spinbox): doubling characters entered from the keyboard (#4190) 2023-05-01 11:11:56 +02:00
Gabriel Wang
7345e62355 fix(arm-2d): fix transform-chrome-keying issue (#4178) 2023-04-28 11:26:53 +02:00
Gabor Kiss-Vamosi
48d7878bac fix(style): fix trasition on bg_grad color
fixes: #4174
2023-04-28 10:37:32 +02:00
Gabor Kiss-Vamosi
a0795b49e8 fix(indev): fix integer overflow in recursive zoom calculation 2023-04-24 20:10:33 +02:00
Gabor Kiss-Vamosi
a150b15e45 feat(btnmatrix): review ctrl map and allow width values to be max 15 2023-04-24 10:54:47 +02:00
Posejdos
a95714ba7c fix(menu): prevent setting the current page again (#4136) 2023-04-18 10:50:22 +02:00
Tomas Rezucha
8536152d81 fix(esp): fix ESP-IDF pedantic builds (backport v8.3) (#4135) 2023-04-17 13:03:58 +02:00
moinmoin-sh
6314441839 fix: color mixing with LV_COLOR_SWAP == 1 (#4101) 2023-04-03 15:10:03 +02:00
Gabor Kiss-Vamosi
88c51b22ad docs: udpate changelog 2023-04-03 10:29:45 +02:00
Gabriel Wang
6b0092c0d9 chore(cmsis-pack): update cmsis-pack for v8.3.6 (#4108) 2023-04-03 10:27:16 +02:00
Gabor Kiss-Vamosi
aa313806d0 fix(bar): delete running animations when a new value is set without animation
fixes #4094
2023-04-03 10:25:04 +02:00
Gabor Kiss-Vamosi
5e0e1c8c4e chore: code formatting 2023-03-28 13:56:17 +02:00
Gabor Kiss-Vamosi
d0e19eb2d3 fix(arc): fix knob area invalidation 2023-03-28 13:53:59 +02:00
Neo Xu
fd20fabfda fix(group): fix default_group becomes wild pointer when deleted (#4076) 2023-03-20 15:27:22 +01:00
Gabor Kiss-Vamosi
399069b4a2 Update build_html_examples.sh 2023-03-17 17:08:33 +01:00
Gabor Kiss-Vamosi
501230e0fc docs: use a fixed commit of lv_web_emscripten
fixes #4071
2023-03-17 17:00:52 +01:00
Neo Xu
adcf166382 fix(fs_posix): allow creating new file and set permission. (#3976)
Signed-off-by: Neo Xu <neo.xu1990@gmail.com>
2023-03-17 09:40:23 +01:00
Gabor Kiss-Vamosi
2f294aa76c docs(arduino): add note to not use lv_examles library 2023-03-14 07:40:48 +01:00
Gabor Kiss-Vamosi
9a870b34a9 format code 2023-03-08 11:12:11 +01:00
Gabor Kiss-Vamosi
0b7777f27a fix(slider): consider animations on pressing 2023-03-08 11:09:38 +01:00
Neo Xu
e8d8f399e0 fix(img): support negative angles (#3846)
Signed-off-by: Xu Xingliang <xuxingliang@xiaomi.com>
2023-02-27 17:16:08 +01:00
yuqingli05
0df09db23e fix(gif): synchronize with master (#4003) 2023-02-20 21:05:48 +01:00
Morgan Diepart
e2386fd46d fix(gpu): fix STM GPU drivers for some variants (#4004) 2023-02-20 14:26:11 +01:00
fvanroie
2944277f07 fix(img): possible divide by 0 exception (lvgl#3988) (#3990)
Co-authored-by: fvanroie <cpt_jack@msn.com>
2023-02-15 20:57:19 +01:00
Gabor Kiss-Vamosi
6af01798d8 feat(msg): add lv_msg_unsubcribe_obj 2023-02-14 13:36:12 +01:00
Gabor Kiss-Vamosi
77670fb1a5 chore: update the version numbers to v8.3.5-dev 2023-02-07 08:16:26 +01:00
Gabor Kiss-Vamosi
f29514aa5c docs: update changelog 2023-02-07 08:12:45 +01:00
Gabriel Wang
e7e8cf846d feat(cmsis-pack): update cmsis-pack for v8.3.5 (#3972) 2023-02-07 08:10:13 +01:00
Junbo Zheng
8b1270347f fix(monkey): remove executable permissions from source files (#3971)
Signed-off-by: Junbo Zheng <zhengjunbo1@xiaomi.com>
2023-02-07 07:34:38 +01:00
Amir Gonnen
e6cd7063b6 fix(ci): set Ubuntu version for MicroPython test (#3865) 2023-02-01 13:39:40 +01:00
Gabor Kiss-Vamosi
34c545ef19 docs(indev): fix the name of long_press_repeat_time (was long_press_rep_time)
fixes #3954
2023-02-01 10:42:03 +01:00
nicusorcitu
361ee79611 feat(gpu): improve NXP's PXP and VGLite accelerators (#3952)
Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>
Signed-off-by: Stefan Babatie <stefan.babatie@nxp.com>
Signed-off-by: Wenbin Yuan <wenbin.yuan@nxp.com>
Co-authored-by: Stefan Babatie <stefan.babatie@nxp.com>
Co-authored-by: Wenbin Yuan <wenbin.yuan@nxp.com>
2023-02-01 10:35:24 +01:00
Gabor Kiss-Vamosi
39f424767f fix(roller): consider the recolor setting of the label
fixes #3950
2023-01-28 23:57:08 +01:00
Tomasz Jastrzębski
1853cc5143 perf(dam2d): rework stm32 dma2d (#3904) 2023-01-23 08:37:34 +01:00
Gabor Kiss-Vamosi
9faca8a8d4 Update layer.md 2023-01-13 09:27:22 +01:00
Mr.9You
8ea6f03fc3 fix(Kconfig): Fix wrong type of LV_FS_STDIO_CACHE_SIZE (v8.3) (#3906) 2023-01-05 21:19:33 +01:00
Forairaaaaa
c6c1b0b3d3 chore: add an option to "LV_TICK_CUSTOM" (#3879) 2023-01-03 08:12:19 +01:00
Mr.9You
e529230f4b ci(esp): fix push to the component registry on tag 2023-01-02 20:16:37 +01:00
Gabriel Wang
dbb15bb3ea feat(cmsis-pack): update for v8.3.4 (#3896) 2023-01-01 13:30:29 +01:00
Gabor Kiss-Vamosi
47c8f8f982 bump version numbers to v8.3.5-dev 2022-12-15 13:39:56 +01:00
Gabor Kiss-Vamosi
2c0162b457 release v8.3.4 2022-12-15 13:38:36 +01:00
Man, Jianting (Meco)
dec580b9f1 fix(rt-thread): sync rt-thread v5.0.0 rt_align (#3864) 2022-12-13 11:47:17 +01:00
Gabor Kiss-Vamosi
ad56dfaf70 fix(gridnav): fix stucking in pressed state with encoder
fixes #3854
2022-12-13 09:59:20 +01:00
Gabor Kiss-Vamosi
c8e584f879 fix(style): add the missing support for pct pivot in tranasform style properties 2022-12-11 00:16:57 +01:00
Mariotaku
d2d886aae5 fix(draw): SDL2 gradient support #3848 (#3856) 2022-12-08 10:36:03 +01:00
Gabor Kiss-Vamosi
1e3ca25fed fix(example): fix warnings
related to #3759
2022-12-06 08:08:20 +01:00
Gabor Kiss-Vamosi
84cf05d8b2 fix(indev): fix scrolling on transformed obejcts
related to #3819
2022-12-05 09:46:21 +01:00
Gabor Kiss-Vamosi
2c17b28ac4 fix(darw): add back the disappeared antialising=0 support
fixes #3838
2022-12-03 17:49:48 +01:00
Gabor Kiss-Vamosi
1ed026ca73 fix(benchmark): fix warnings
related to #3759
2022-12-02 14:34:30 +01:00
Gabor Kiss-Vamosi
ae3825871e demo(benchmark): fix lv_label_set_text_fmt format strings 2022-11-28 21:34:30 +01:00
Man, Jianting (Meco)
ae300acb2f [v8.3.x][rt-thread][squareline] fix compiler cannot find the lvgl/lvg… (#3834) 2022-11-28 19:38:29 +01:00
Gabor Kiss-Vamosi
41fa416134 fix(msg): fix typos in API by adding wrappers
fixes #3822
2022-11-24 11:08:53 +01:00
Gabor Kiss-Vamosi
68f6190f8e chore: format code 2022-11-23 12:49:05 +01:00
Gabor Kiss-Vamosi
1173dcba96 demo(benchmark): fix warning 2022-11-23 12:45:25 +01:00
Gabor Kiss-Vamosi
716e5e2c8b fix(meter): fix setting part_draw_dsc.id in needle img drawing 2022-11-20 12:37:13 +01:00
Gabor Kiss-Vamosi
bb2c2ac34a fix(chart): fix very dense bar charts 2022-11-20 12:37:13 +01:00
Gabor Kiss-Vamosi
c4c400716e fix(flex): be sure obj->w_layout and h_layout can't be set at the same time
realted to https://forum.lvgl.io/t/flex-grow-in-rotate/10220/4
2022-11-17 21:28:30 +01:00
_VIFEXTech
6825d4bd1d chore(table): remove extra spaces (#3805)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-11-16 14:21:42 +01:00
Gabor Kiss-Vamosi
39d03a80f4 feat(table): scroll to the selected cell with key navigation
Fixes https://forum.lvgl.io/t/grid-navigation-with-automatic-scrolling-for-table/10285
2022-11-16 11:32:11 +01:00
Ramesh
340a1cb60b fix(esp.cmake): add demos and examples (#3784) 2022-11-05 18:55:30 +01:00
Gabor Kiss-Vamosi
e06f03db72 fix(draw): fix transformation accuracy
fixes #3777
2022-11-02 17:26:12 +01:00
Gabor Kiss-Vamosi
bd11ad8542 fix(draw): handle LV_COLOR_DEPTH == 1 too in lv_draw_sw_transform
fixes: #3772
2022-11-01 18:25:09 +01:00
Gabor Kiss-Vamosi
e050f5ca15 fix(draw): fix text color with sub pixel rendering and BGR order
fixes: #3764
2022-10-26 10:14:02 +02:00
Gabor Kiss-Vamosi
903e94b716 fix(style): remove the reduntant define of LV_GRADIENT_MAX_STOPS
fixes #3752
2022-10-24 16:03:34 +02:00
Gabor Kiss-Vamosi
0732400e7b Revert "feat(keyboard): ported arabic keyboard from release 7.10.0 (#3728)"
This reverts commit 483b2a4322.
2022-10-09 19:27:34 +02:00
gianlucacornacchia
483b2a4322 feat(keyboard): ported arabic keyboard from release 7.10.0 (#3728) 2022-10-09 18:42:10 +02:00
Gabor Kiss-Vamosi
5545ffc925 release v8.3.3 2022-10-06 10:00:12 +02:00
Gabor Kiss-Vamosi
c8bee40410 fix: version number in lvgl.h 2022-09-30 11:26:19 +02:00
Gabor Kiss-Vamosi
755d363ecc release v8.3.2 2022-09-27 08:04:09 +02:00
Gabor Kiss-Vamosi
dfd14fa778 fix(slider): find the nearest value on click instead of floor
fixes: #3690
2022-09-19 09:55:49 +02:00
Mariotaku
1ab9aa5312 fix(fragment): fixed child fragment event dispatch (#3683) 2022-09-12 16:19:54 +02:00
Mariotaku
4d69cd865c fix(sdl): clear streaming/target texture with FillRect (#3682) 2022-09-12 16:18:47 +02:00
Tyler
832bef4346 fix(sdl): transformation with alpha (#3576) (#3678)
Co-authored-by: Mariotaku <mariotaku.lee@gmail.com>
2022-09-10 13:51:42 +02:00
Gabor Kiss-Vamosi
d5b2a9b256 fix(draw): fix border drawing with thick borders
fixes #3648
2022-09-02 13:32:18 +02:00
Gabor Kiss-Vamosi
7640950216 chore: fix warnings 2022-08-31 22:32:56 +02:00
Gabor Kiss-Vamosi
8b605cc482 fix(refr): fix true double double buffering logic with transparent screens
fixes #3623
2022-08-31 21:15:53 +02:00
Gabor Kiss-Vamosi
ece3495004 fix(draw): allow drawing outline with LV_DRAW_COMPLEX == 0 too 2022-08-31 21:15:53 +02:00
_VIFEXTech
f6655c2aaf fix(draw_sw): fix image cache to access the freed stack space (#3584)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-08-23 15:30:05 +02:00
Pieter De Gendt
cba2aa95c8 fix(style): use compile time prop_cnt for const styles (#3609)
No need to end with an empty/invalid property in the const list.
This change allows to save space, and doesn't break existing lists.
2022-08-23 12:19:48 +02:00
Man, Jianting (Meco)
660464c973 chore(rt-thread) backport fixes from v9 (#3604)
https://github.com/lvgl/lvgl/pull/3566
https://github.com/lvgl/lvgl/pull/3467
2022-08-21 20:42:32 -04:00
Gabor Kiss-Vamosi
5156ee058d fix(group): be sure obj is removed from its current group in lv_group_add_obj
fixes #3593
2022-08-19 12:03:06 +02:00
Gabor Kiss-Vamosi
a0515ba30d fix(style): add missing invalidation in lv_obj_remove_local_style_prop
fixes #3581
2022-08-17 12:51:45 +02:00
Chris Morgan
1a46030918 docs(draw) remove reference to old lv_fs_add_drv function (#3564) 2022-08-11 09:24:49 -04:00
Chris Morgan
f58dcd94fc docs(disp): LV_COLOR_SCREEN_TRANSP remove dependency on LV_COLOR_DEPTH_32 as transparency is supported across all color depths (#3556)
* Kconfig - LV_COLOR_SCREEN_TRANSP remove dependency on LV_COLOR_DEPTH_32 as transparency is supported across all color depths

* display.md - LV_COLOR_SCREEN_TRANSP remove mention of 32bpp requirement that is no longer necessary
2022-08-10 14:00:14 +02:00
Gabor Kiss-Vamosi
d59bba12db fix(colorwheel): fix updating color when using lv_colorwheel_set_hsv
fixes https://forum.lvgl.io/t/about-colorwheel-updates-bug/9522
2022-08-07 23:08:19 +02:00
Gabor Kiss-Vamosi
5022476edc remove accidentally added code 2022-08-07 23:07:10 +02:00
Gabor Kiss-Vamosi
b884abae26 fix(canvas): fix clipéping on transformation
fixes: #3545
2022-08-07 21:34:17 +02:00
卢华东
aa45d59852 fix(demo): can not found lvgl.h file (#3477) 2022-07-28 00:08:02 +02:00
Amir Gonnen
55e95ed351 fix(ci) checkout lv_micropython release/v8 branch (#3524) 2022-07-26 17:53:17 -04:00
Gabor Kiss-Vamosi
be485d7605 ci: protect test.c with #if LV_BUILD_TEST 2022-07-25 21:33:31 +02:00
Gabor Kiss-Vamosi
9024b72b48 update the changelog 2022-07-25 12:46:26 +02:00
Gabor Kiss-Vamosi
9b998aa47d Bump version numbers to v8.3.1 2022-07-25 12:44:28 +02:00
Gabor Kiss-Vamosi
71913d300d example(freetype): Update the Micropython example to use the Lato font 2022-07-25 12:43:17 +02:00
Adam Martini
284834e799 fix(led): add bg_color draw descriptors back to led draw event to support LV_DRAW_COMPLEX 0 (#3515)
Co-authored-by: Hopper Automation <automation_hopper@hopper.com>
2022-07-23 20:40:56 +02:00
Gabor Kiss-Vamosi
8544cc3806 example(freetype): replace the arial font with lato to avoid licensing issues
fixes https://github.com/zephyrproject-rtos/zephyr/issues/48111
2022-07-23 20:32:56 +02:00
s-hadinger
62662f68e9 docs(tasmota): support LVGL 8.3.0 (#3511) 2022-07-20 14:04:42 +02:00
Gabor Kiss-Vamosi
a283273bd2 fix(arc): fix arc knob invalidation in SYMMETRICAL mode
fixes #3465
2022-07-14 17:23:13 +02:00
Gabor Kiss-Vamosi
9750c97aff fix(refr): fix lv_refr_get_top_obj
related to https://forum.lvgl.io/t/how-to-speed-up-the-v8-version/9091/21
2022-07-14 17:22:54 +02:00
Gabor Kiss-Vamosi
2967172bee fix(slider): fix knob drawing in symmetrical mode 2022-07-14 17:22:46 +02:00
Badokas
9e1b6166b0 docs(readme): fix LVGL version typo (8.3.0) (#3462) 2022-07-07 21:07:17 +02:00
Gabriel Wang
49c59f4615 feat(cmsis-pack): update cmsis-pack for v8.3.0 release (#3453)
* feat(cmsis-pack): cmsis-pack for v8.3.0 release

* minor update

* Update env_support/cmsis-pack/LVGL.lvgl.pdsc

Co-authored-by: embeddedt <42941056+embeddedt@users.noreply.github.com>

* update cmsis-pack for v8.3.0 release

* Update LVGL.lvgl.1.0.6.pack

Co-authored-by: embeddedt <42941056+embeddedt@users.noreply.github.com>
2022-07-06 10:36:45 +02:00
Gabor Kiss-Vamosi
eb992e2355 set version numbers to v8.3.0 2022-07-06 10:28:20 +02:00
Gabriel Wang
702659132d feat(cmsis-pack): cmsis-pack for v8.3.0 release (#3450)
* feat(cmsis-pack): cmsis-pack for v8.3.0 release

* minor update

* Update env_support/cmsis-pack/LVGL.lvgl.pdsc

Co-authored-by: embeddedt <42941056+embeddedt@users.noreply.github.com>

Co-authored-by: embeddedt <42941056+embeddedt@users.noreply.github.com>
2022-07-06 10:25:38 +02:00
Man, Jianting (Meco)
c2628fd7ef chore(demo): fix the path of picture files in readme (#3451) 2022-07-06 09:06:31 +02:00
100ask
10e0b7a1ad feat(ime_pinyin): add API to support 9-key input mode (#3447)
* feat(ime_pinyin): add API to support 9-key input mode

* some optimizations for lv_ime_pinyin

* Update lv_example_ime_pinyin_2.c

* Update src/extra/others/ime/lv_ime_pinyin.h

Co-authored-by: YobeZhou <smilezyb@163.com>
Co-authored-by: Yobe Zhou <33565334+YobeZhou@users.noreply.github.com>
Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
2022-07-06 09:04:53 +02:00
_VIFEXTech
73114028d3 feat(font): add font placeholder drawing configuration (#3446)
* feat(font): add font placeholder drawing configuration

* Turn on placeholder by default in Kconfig

Signed-off-by: pengyiqiang <pengyiqiang@xiaomi.com>

* When disabled LV_USE_FONT_PLACEHOLDER set box_w=0

* Remove placeholder_font to get glyphs

Signed-off-by: pengyiqiang <pengyiqiang@xiaomi.com>

Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-07-05 16:42:46 +02:00
Gabor Kiss-Vamosi
5a06fce472 perf(draw): speed up non normal blend modes 2022-07-05 14:54:08 +02:00
Gabor Kiss-Vamosi
cbbace4ca5 chore: fix warning 2022-07-05 09:30:49 +02:00
Man, Jianting (Meco)
fb624e594f fix(draw): conflict with external ALIGN define (#3336)
ALIGN is a common name, so that easily conflict with other components
2022-07-05 09:01:38 +02:00
Gabor Kiss-Vamosi
13c99fc4b6 fix(refr): fix memory write out of bounds issue 2022-07-05 08:58:03 +02:00
_VIFEXTech
23c8a91a11 feat(fsdrv): add posix lseek() error checking (#3444)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-07-04 15:03:49 +02:00
Gabor Kiss-Vamosi
f3a07a3e8a fix(Kconfig): allow unchecking LV_CONF_SKIP
fixes: #3441
2022-07-04 14:30:10 +02:00
jadonmmiller
a06e11478e fix(arc): fix bug with LV_ARC_MODE_REVERSE (#3417) (#3418) 2022-07-04 13:06:26 +02:00
Mariotaku
a1326dc31a fix(fragment): memory leak of fragments #3438 (#3442) 2022-07-04 12:48:27 +02:00
_VIFEXTech
d43f10a180 feat(misc): add asynchronous call function cancellation function (#3439)
* feat(misc): add asynchronous call function cancellation function

* Update documentation

* Remove useless comments

* remove continue

Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-07-03 12:31:17 +02:00
Gabor Kiss-Vamosi
7ada1301c2 fix(btnmatrix): fix extra draw size calculation to not clip shadow 2022-07-03 11:32:39 +02:00
Gabor Kiss-Vamosi
77d726efb2 fix(draw): clip the bg img to the rectangle's area in lv_draw_sw_rect 2022-07-03 11:32:39 +02:00
Gabriel Wang
922108dbbe chore: cmsis pack monthly update (#3435)
* update lv_gpu_arm2d to support  LV_IMG_CF_RGB565A8

* feat(porting) minor update

* feat(cmsis-pack): monthly update for June

* Update LVGL.pidx

* fix(draw): solve memory leaking issue

* Update lv_draw_sw_layer.c

* Update LVGL.lvgl.1.0.5.pack

* Update LVGL.lvgl.1.0.5.pack
2022-07-01 20:20:48 +02:00
Gabriel Wang
a2bd96023f fix(draw): solve memory leaking issue (#3437)
* fix(draw): solve memory leaking issue

* Update lv_draw_sw_layer.c

* Revert "Update lv_draw_sw_layer.c"

This reverts commit 4ca1ab303c1e0297529f7eb662ea4ee7f24b10fa.

* Revert "fix(draw): solve memory leaking issue"

This reverts commit 6f36e1a8c324abf79423b83bea9611f8cd59664d.

* fix(draw): free layer ctx when layer_init returns NULL

* Update lv_draw_layer.c
2022-07-01 14:27:05 +02:00
Gabor Kiss-Vamosi
25ce6e3ae9 fix(scroll): do not fire scroll begin/end event on every scroll step
fixes: #3436
2022-07-01 13:55:44 +02:00
Gabor Kiss-Vamosi
e5c11f1f68 fix(indev): scroll_ throw_vect cannot converge to 0 when vect is negative
fixes: #3431
2022-07-01 10:24:29 +02:00
Gabor Kiss-Vamosi
4572a0c6c9 fix(chart): fix misaligned horizontal tick lines on bar charts
fixes: https://forum.lvgl.io/t/how-to-make-the-major-ticks-center-the-bars-of-the-chart/9244/2
2022-07-01 10:12:14 +02:00
Gabor Kiss-Vamosi
746917dcca docs(chart): describe how to set the space between columns 2022-07-01 09:11:31 +02:00
Gabor Kiss-Vamosi
c2c44c68ee docs(README): fix broken link 2022-06-29 14:24:49 +02:00
100ask
6ff164f87d example(ime_pinyin): improved lv_example_ime_pinyin_1 (#3428) 2022-06-29 09:58:34 +02:00
Gabor Kiss-Vamosi
6acbdaa53d fix(style): fix using width for both width and height in radius transition
fixes: #3427
2022-06-28 17:32:12 +02:00
Gabor Kiss-Vamosi
88bbef14bf docs(sim): add link to qt-creator 2022-06-28 17:28:49 +02:00
Man, Jianting (Meco)
cb9a297bc5 docs(indev): add comment in input device part (#3422) 2022-06-26 10:32:14 +02:00
Gabor Kiss-Vamosi
549e70099e chore(readme): fix link 2022-06-25 11:20:33 +02:00
Yobe Zhou
92f1f9c0cc feat(ime_pinyin): add API to use Pinyin IME(Chinese input) (#3408)
* feat(pinyin_ime): add API to use Pinyin IME(Chinese input)

1.Low resource usage
2.Support custom thesaurus
3.Support custom styles (Candidate panel, keyboard)
4.Support simple spelling

* fix(ime_pinyin): fix several problems of ime_pinyin

1. Change lv_pinyin_ime to lv_ime_pinyin
2. Add lv_pinyin_ime_set_keyboard interface
3. Add lv_ime_pinyin configuration in Kconfig, src/lv_conf_internal.h

* refactor(ime_pinyin): improve coding specification

* feat(ime_pinyin): add simple Pinyin IME example

* docs(ime_pinyin): Add ime_pinyin documentation

* Delete settings.json

* Update dictionary based on simsun

* Delete lv_font_source_han_sans_normal_16.c

* Update lv_example_ime_pinyin_1.c

* Update ime_pinyin.md

add Chinese translation document

* Update lv_ime_pinyin.c

* Update lv_ime_pinyin.c

* Update lv_ime_pinyin.h

* Update lv_ime_pinyin.c

* Update lv_example_ime_pinyin_1.c

* Update lv_conf_internal.h

* Update lv_ime_pinyin.c

* Update lv_ime_pinyin.c

Co-authored-by: 100askTeam <team100ask@outlook.com>
2022-06-24 14:38:24 +02:00
Eugene Yaremenko
4056a15ecc fix(gridnav) correct logic in find_last_focusable (#3423) 2022-06-23 10:14:33 -04:00
Gabor Kiss-Vamosi
6b2eac1dd7 example(btnmatrix): update lv_example_btnmatrix_2 to expicitly check which part is drawn
related to https://forum.lvgl.io/t/style-messagebox-buttons-causes-outline-around-all-buttons-in-the-button-matrix/9170
2022-06-23 13:26:31 +02:00
Gabor Kiss-Vamosi
3b95fa8397 chore: fix Kconfig 2022-06-23 13:02:26 +02:00
Gabor Kiss-Vamosi
d4b7283de8 chore: fix code formatting 2022-06-23 11:54:11 +02:00
Gabor Kiss-Vamosi
afaa8c9300 demo(benchmark): add LV_DEMO_BENCHMARK_RGB565A8 option
fixes #3379
2022-06-23 11:51:20 +02:00
KyleParker-Gongyuan
8d8aaed0e3 fix(examples) correct comment in slider example (#3419)
The label is above the slider in this example, not below it.
2022-06-21 08:50:55 -04:00
Gabor Kiss-Vamosi
e651383688 fix(dropdown): fix scrolling when options are CENTER aligned
fixes: https://forum.lvgl.io/t/add-users-style-to-dropdown-list/9144
2022-06-20 08:14:45 +02:00
Gabor Kiss-Vamosi
91ebf810aa docs(get-started): add quick-overview to the index 2022-06-19 15:05:37 +02:00
Gabor Kiss-Vamosi
0255c6dd39 fix(meter): improve the precision of tick line drawing
fixes #3361
2022-06-19 11:21:27 +02:00
Gabor Kiss-Vamosi
cbff8e83e5 fix(draw): fix transformations on subdivided areas 2022-06-15 23:33:20 +02:00
Mariotaku
f575935180 fix(sdl): add transformation support for the SDL backend (#3403)
* sdl transform wip

* sdl transform wip

* working transform (scale, rotate)

* fixed transform with masks

* fixing includes

* removed lv_obj_t references in draw backend

* update the API to work with SW layers too

* update lv_conf_internal.h

* makefile fixes

* updated sdl transform implementation

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
2022-06-15 10:36:47 +02:00
Gabriel Wang
ca9aff6119 cmsis pack monthy update for June (#3413)
* fix(benchmark): remove duplicated output in report log

* doc(benchmark): update the method for performance analysis

* feat(cmsis-pack): v1.0.5-alpha1

* fix(template): use consistent resolution information

* Update LVGL.lvgl.1.0.5-alpha1.pack
2022-06-14 13:03:50 +02:00
张杨
22627c47ce fix(bmp): fix with LV_COLOR_16_SWAP (#3412)
* Update lv_bmp.c

fix bug. When the bmp is 16 bit depth, the picture is not displayed properly due to no swap bytes

* Update lv_bmp.c

* Update lv_bmp.c

* format

* using unsigned int
2022-06-14 12:23:04 +02:00
Man, Jianting (Meco)
1e40fa88a4 doc(rt-thread): add section:import a bsp project into rt-thread studio (#3411) 2022-06-14 10:31:30 +02:00
pete-pjb
60ebd25d3d chore(tabview) fix format - (run python script this time!) 2022-06-13 13:07:49 +01:00
pete-pjb
3e56e96922 chore(tabview) fix format. 2022-06-13 13:04:44 +01:00
pete-pjb
11b708ed95 chore(tabview) correct format. 2022-06-13 13:00:23 +01:00
pete-pjb
2c9695afb4 feat(tabview) add API to rename tab.
https://github.com/lvgl/lvgl/issues/3407#issue-1265916615
2022-06-13 12:56:37 +01:00
embeddedt
9a48de0f8b feat(style) add 'inherit' and 'initial' CSS properties (#3390)
Fixes #3086
2022-06-09 20:20:34 -04:00
Lazar Chervenkov
03c43d95ad example(imgfont): fix lvgl.h include path (#3405)
When LV_LVGL_H_INCLUDE_SIMPLE is not defined, the path to the lvgl.h gives a compilation error. I fixed the path
2022-06-08 11:08:54 +02:00
Mariotaku
018a8cfdac fix(sdl): fix LRU, reported in #3402 (#3404)
* fix for #3402

* fixed unsupported type
2022-06-08 11:01:19 +02:00
ivooesch
533e325f21 fix(draw) avoid use-after-free when drawing arcs (#3399)
* Update lv_draw_sw_arc.c

Fixed probelöm with freeing uninitialized, probably not in the most efficient way, as I do not really know the internalk workings of this lib

* Update lv_draw_sw_arc.c
2022-06-07 12:52:10 +02:00
pete-pjb
ff6316c749 revert (msgbox) revert incorrect button padding fix. 2022-06-06 11:10:19 +01:00
Gabriel Wang
c9fa4ef0fc feat(porting): add flushing control to the template (#3384)
* feat(porting): add flushing control to the template

* Update examples/porting/lv_port_disp_template.c

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>

* Update examples/porting/lv_port_disp_template.c

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>

* Update examples/porting/lv_port_disp_template.c

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>

* Update lv_port_disp_template.h

* use consistent comment

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
2022-06-03 15:08:08 +02:00
qinshijing
e59c83b453 feat(anim): add deleted callback (#3279) (#3295)
Co-authored-by: qinshijing <qinshijing@xiaomi.com>
2022-06-03 11:01:07 +02:00
Gabriel Wang
ce0605182c feat(cmsis-pack): monthly update for May (#3394) 2022-06-03 10:40:33 +02:00
martaaay
d5ccf379da docs(slider) mention that VALUE_CHANGED is not sent on release (#3397) 2022-06-02 19:50:17 -04:00
Gabor Kiss-Vamosi
9ac8ce69f6 fix(draw): handle non BLEND_MODE_NORMAL for ARGB drawing 2022-06-02 10:16:42 +02:00
Johannes Marbach
eef838f51f feat(textarea): make it possible to customize the bullet character (#3388)
* feat(textarea): Make it possible to customise the bullet character

This adds functions to allow overriding the default bullet character
with a custom one (or even no character at all).

* Update docs/widgets/core/textarea.md

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
2022-05-30 12:05:22 +02:00
kctan0805
6ad52a7119 fix(subpx): fix subpixel rendering font is not displaying bug (#3387) 2022-05-28 21:39:28 +02:00
Amir Gonnen
6a8dd1a3b6 fix(style): reset style lookup table after gc sweep/lv_deinit (#3385) 2022-05-28 21:21:01 +02:00
Gabor Kiss-Vamosi
6be43b83b3 fix(gpu): fix warning with NXP GPU
fixes https://github.com/lvgl/lvgl/pull/3322#issuecomment-1139282874
2022-05-27 21:07:16 +02:00
PeterB
d4c9ab5037 chore(msg_box) correct formatting. 2022-05-27 11:17:17 +01:00
PeterB
cb4da38e3c Fix(msgbox) correct msg_box button padding if LV_DPI_DEF is set to less
than 130
2022-05-27 11:05:37 +01:00
_VIFEXTech
d151a6789f feat(disp): add a temporary invalidation disable interface (#3378)
* feat(disp): add a temporary disable invalidation interface

* minor adjustments

* remove forgotten comment

Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
2022-05-26 22:46:55 +02:00
ExplorerLog
2cf4d4b17e chore correct file encodings (#3381)
Change "UTF-8 with BOM" to "UTF-8"
2022-05-26 13:06:58 -04:00
Dennis Field
2e93b88ead feat(group): add edge callbacks when trying to move focus past beginning or end (#3374) 2022-05-24 15:31:46 +02:00
_VIFEXTech
6e3d01190f feat(benchmark): make lvgl render at the highest frame rate (#3352)
* feat(benchmark): make lvgl render at the highest frame rate

* add lv_demo_benchmark_set_max_speed

* Update comments and README

Signed-off-by: pengyiqiang <pengyiqiang@xiaomi.com>

Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-05-24 12:36:22 +02:00
nicusorcitu
029eef79c4 feat(gpu): reattach nxp pxp vglite accelerators(#3322)
* feat(pxp/vglite) Attach NXP GPUs to the new draw context.

Create a single NXP draw layer on top of PXP and VGLITE.
Extra changes:
1. Add VGLITE image blits acceleration.
2. Reenable blit split workaround for quality issue in RT500.
3. Increase threshold from 32 to 5000 px to fill/blit with both PXP and VGLITE.
4. Allow to enable both PXP and VGLITE. Add a fallback mechanism:
- by default the PXP will try to accelerate. if that is not supported (or fails
due to threshold limit condition from 3.) then it will fallback to VGLITE.
- if VGLITE does not support that feature (or fails due to threshold limit
condition from 3.) the it will fallback to CPU.

Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* feat(vglite) Add VGLITE support to draw the backgroud of rectangles.

optim: draw only a circle when radius has value LV_RADIUS_CIRCLE.
optim: to draw rounded corners, use cubic bezier curves

Signed-off-by: Seb Fagard <sebastien.fagard@nxp.com>
Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* feat(vglite) Add VGLITE support to draw arcs.

Use up to 4 bezier curves to optimize the drawing of an arc.
The arc curve has to be constant when growing the angle:
for this we compute sub-arc based on a best approximation of quarter-arc.
use dichotomy to find the sub-arc 't' param, instead of tangent approximation.

Signed-off-by: Seb Fagard <sebastien.fagard@nxp.com>
Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* feat(pxp) Add ARGB88888 format support for PXP backend.

Supports per pixel and global alpha blending, and combination of alpha blending with recolor feature.

Signed-off-by: Jerome Evillard <jerome.evillard@nxp.com>
Signed-off-by: Seb Fagard <sebastien.fagard@nxp.com>
Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* feat(vglite) Add the support of ARGB 32bits color format.

Signed-off-by: Seb Fagard <sebastien.fagard@nxp.com>
Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* feat(vglite) Add VGLITE acceleration support for rotation and zoom.

Signed-off-by: Seb Fagard <sebastien.fagard@nxp.com>
Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* feat(pxp) Add PXP acceleratin to rotate in blit.

Applies the rotation on the pxp output.

Signed-off-by: Seb Fagard <sebastien.fagard@nxp.com>
Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* fix(pxp/vglite) Avoid calling the blend callback from image decoded callback.

Add lv_gpu_nxp_pxp_blit_transform() and lv_gpu_nxp_vglite_blit_transform().
This will simplify a lot the fallback mechanism and the way of adding new
image decoded features.
(MGG-884)

Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* feat(pxp) Add image rotate 90x.

Simplify the two steps process by adding the blit_cover and blit_opa functions.

In order to rotate or recolor with opacity, two steps must be fallowed:
1. Run the operation without opa.
2. Blend the result by applying the opa.
(MGG-469)

Obs:
Recolor and rotate is currently not supported with opa or alpha channel.(MGG-883)

Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* fix(vglite) Fix incorrect slider widget indicator when vglite acceleration is enabled

(MGG-863)

Signed-off-by: Stefan Babatie <stefan.babatie@nxp.com>
Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* fix(pxp) Fix pxp fill (simple rect draw)  on 32 bit color depth.

(MGG-890)

Signed-off-by: Stefan Babatie <stefan.babatie@nxp.com>

* fix(pxp) Separate blit simple by the blit with transformation.

While we run into blit with transformation we have to
decide if the operation needs to be done in one or two steps.
Blit with color format (opa or alpha or chroma key) - require one step: blit_cf().
Blit with rotate or recolor but no color format - require one step: blit_cover().
Blit with rotate or recolor + opa or alpha - require two steps:
blit_opa() = blit_cover() + blit_cf().
Blit with rotate or recolor + chroma key - not supported yet.

Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* feat(pxp) Add support for recolor with chroma-keying.

(MGG-434)

Signed-off-by: Stefan Babatie <stefan.babatie@nxp.com>

* fix(pxp) Fix temporary buffer allocation limit.

Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* fix(pxp) Add PXP limitation while rotating images not aligned to 16x16 blocks.

Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* fix(nxp) Add makefiles.

Tested with:
      working-directory: tests/makefile
      run: make test_file

Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* feat(nxp) Update NXP github documentation.

(MGG-864)

Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* fix(nxp) Move the API comments of global functions only in the H files to make maintenance simpler.

Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* fix(nxp/vglite) Fixed some warnings. Remove unused variables.

Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* fix(nxp) lv_draw_nxp_ctx_deinit() shall simply fallback to sofware call.

Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* fix(nxp) Fallback to software callbacks if need for argb8565 support.

During rendering, LVGL might initializes new draw_ctxs and start drawing into
a separate buffer (called layer). If the content to be rendered has "holes",
e.g. rounded corner, LVGL temporarily sets the disp_drv.screen_transp flag.
It means the renderers should draw into an ARGB buffer.
With 32 bit color depth it's not a big problem but with 16 bit color depth
the target pixel format is ARGB8565 which is not supported by the GPU.
In this case, the NXP callbacks should fallback to SW rendering.

Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* fix(pxp) Fix wrong demo widget transparency.

1. Fix alpha inverted calculation for fill with opacity.
2. Fix also the ratio of recoloring for chroma key.

Signed-off-by: Stefan Babatie <stefan.babatie@nxp.com>

* fix(vglite) Remove software pre-multiplication when hardware pre-multiplication is available.

(MGG-886)

Signed-off-by: Stefan Babatie <stefan.babatie@nxp.com>

* doc(vglite) Add vglite initialization info.

Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* fix(pxp/vglite) Fix unused variable warnings when PXP/VGLite are not enabled simultaneously.

Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

* fix(pxp) Fixed the color key recoloring on 16 bits color depth.

1. Fixed the arguments of lv_color_mix(), previously was using an inversed logic. But it works anyway.
2. Use LV_COLOR_SET_X for adjusting the channels on both 16 and 32 bits. Fixed the max values.

Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>

Co-authored-by: Stefan Babatie <stefan.babatie@nxp.com>
2022-05-24 11:43:57 +02:00
Gabor Kiss-Vamosi
52287fd64a fix(disp): make lv_scr_load work better with lv_scr_load_anim and auto_del = true
related to: https://forum.lvgl.io/t/crash-when-delete-a-screen-by-using-lv-obj-del/8930
2022-05-23 16:42:26 +02:00
Man, Jianting (Meco)
c63d12f6da feat(rt-thread): allow users to control refresh period in the lvgl thread (#3375) 2022-05-22 14:45:49 +02:00
Gabriel Wang
4e06025e1d fix(benchmark): fix the issue that wrong scene number is used (#3372)
* fix(benchmark): fix the issue that wrong scene number is used when display the result

* remove white-spaces
2022-05-20 13:46:42 +02:00
Gabriel Wang
332d0abcfc fix(draw): fix colour supports for indexed and alpha-only (#3371) 2022-05-20 09:32:59 +02:00
Gabor Kiss-Vamosi
7bb09e3580 example(span): avoid ambiguous meaing
fixes: https://github.com/lvgl/lvgl/pull/2227#issuecomment-1131193923
2022-05-19 13:01:28 +02:00
Gabor Kiss-Vamosi
42d9c07eeb fix(color): compensate rounding error during blending
fixes #3362
2022-05-18 23:08:12 +02:00
embeddedt
71d535defd fix(examples) use type-safe function for retrieving event param
Fixes #3364
2022-05-18 13:58:35 -04:00
embeddedt
276f28a8a2 fix(draw) ensure variable is initialized to avoid warning
Fixes #3365
2022-05-18 08:53:35 -04:00
Gabor Kiss-Vamosi
22854ff3fb fix(tabview, tileview): fix scrolling
The issue was introduced by 777fe1ea. It sends SCOLL_END event even when there is no scroll aniamtion
2022-05-18 12:03:37 +02:00
Gabor Kiss-Vamosi
523062b9ee fix(color): color mix rounding error
fixes: #3362
2022-05-18 07:57:48 +02:00
Gabriel Wang
a7cfc0b901 feat(cmsis-pack): Monthly update for May (alpha) (#3359)
* feat(cmsis-pack): Monthly update for May

* fix(benchmark): fix a typo

* fix(draw): fix warning

* Update LVGL.lvgl.1.0.4-alpha5.pack

* feat(arm-2d): add a quick patch to support RGB565A8
2022-05-16 20:41:59 +02:00
Gabriel Wang
c5d1557738 feat(demos): add a callback for benchmark (#3353)
* feat(demos): add a callback for benchmark to indicate testing is finished

* update doc and fix code-format

* fix code-format issue

* Update demos/benchmark/lv_demo_benchmark.c

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>

* change function name accordingly.

* Update demos/benchmark/README.md

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
2022-05-16 17:58:44 +02:00
Gabor Kiss-Vamosi
834a118847 fix warnings 2022-05-16 17:39:31 +02:00
Gabor Kiss-Vamosi
ccbb41dedc chore(img): update API comments
fix: #3350
2022-05-16 17:23:20 +02:00
Gabor Kiss-Vamosi
76de7c6b7b fix(draw): fix the calculation of the transformed coordinates
fixes https://forum.lvgl.io/t/inaccurate-bitmap-zoom/8858
2022-05-16 17:15:36 +02:00
Gabor Kiss-Vamosi
67446a4922 support chrome keysed image rotatation 2022-05-16 17:15:36 +02:00
Gabor Kiss-Vamosi
930115edbb revert example 2022-05-16 17:15:36 +02:00
Gabor Kiss-Vamosi
2716475932 formatting 2022-05-16 17:15:36 +02:00
Gabor Kiss-Vamosi
b773330234 fix conflicts 2022-05-16 17:15:36 +02:00
Rafael M
c72b899d33 docs(readme): add version portuguese brazilian (#3349) 2022-05-16 16:16:41 +02:00
Gabriel Wang
6ae0784251 feat(gpu): Update lv_gpu_arm2d with new features (#3340)
* feat(gpu): Update lv_gpu_arm2d with new features

- Provide acceleration for
    * Transform
    * Recolour
    * Chrome-Key

* remove typos

* fix code-format issue

* update according to #3337

* remove the last /* *INDENT-ON* */
2022-05-16 11:15:49 +08:00
embeddedt
2148ed99b0 fix(mem): fix TLSF returning the wrong pointer when the requested size is too large (#3325)
* test(mem) add test for #3324

* fix(tlsf) don't return the same pointer if the requested size is too large
2022-05-14 22:04:13 +02:00
_VIFEXTech
0d6c08105a fix(demo): fix warning. (#3344)
* fix(demo): fix warning.

lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.c:169:5: warning: "LV_EX_MOUSEWHEEL" is not defined, evaluates to 0 [-Wundef]
  169 | #if LV_EX_MOUSEWHEEL
      |     ^~~~~~~~~~~~~~~~

Signed-off-by: pengyiqiang <pengyiqiang@xiaomi.com>

* fix benchmark warning.

~/lvgl/demos/benchmark/lv_demo_benchmark.c:1069:33: warning: cast between incompatible function types from ‘void (*)(lv_obj_t , uint16_t)’ {aka ‘void ()(struct _lv_obj_t , short unsigned int)’} to ‘void ()(void , int32_t)’ {aka ‘void ()(void , int)’} [-Wcast-function-type]
1069 | lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t) lv_arc_set_end_angle);
| ^
~/lvgl/demos/benchmark/lv_demo_benchmark.c: In function ‘fall_anim’:
~/lvgl/demos/benchmark/lv_demo_benchmark.c:1090:29: warning: cast between incompatible function types from ‘void ()(struct _lv_obj_t , lv_coord_t)’ {aka ‘void ()(struct _lv_obj_t , short int)’} to ‘void ()(void , int32_t)’ {aka ‘void ()(void *, int)’} [-Wcast-function-type]
1090 | lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t) lv_obj_set_y);
|

Signed-off-by: pengyiqiang <pengyiqiang@xiaomi.com>

Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-05-14 07:35:12 +02:00
Xiang Xiao
58b75f1175 fix(config): add LV_GPU_SDL_LRU_SIZE (#3348)
Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
2022-05-12 12:41:41 +02:00
Man, Jianting (Meco)
40e9c6b9e0 chore(rt.thread): improve rt-thread marcos (#3355) 2022-05-12 09:35:28 +02:00
Gabor Kiss-Vamosi
941d95b049 chore(imfont): fix heading in the docs 2022-05-11 22:10:25 +02:00
Gabor Kiss-Vamosi
656a0e5167 docs(others): add imgfont to the index 2022-05-11 21:04:20 +02:00
Man, Jianting (Meco)
a6cbf3146a improve rt-thread initialization process (#3345) 2022-05-10 19:55:22 +02:00
Gabor Kiss-Vamosi
cc18518e96 feat(indev): send LV_EVENT_PRESS_LOST on release with wait_until_release
related to #3211
2022-05-10 19:29:13 +02:00
Gabriel Wang
8d3c41d517 feat(draw): improve acceleration for LV_IMG_CF_ALPHA_8BIT (#3337)
* feat(draw): improve acceleration for LV_IMG_CF_ALPHA_8BIT

* fix format issue

* fix: use normal method when conditions are not fulfilled.

* fix a typo

* feat(demo): add Weighted FPS and Opa speed log output (#3326)

Signed-off-by: pengyiqiang <pengyiqiang@xiaomi.com>

Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>

* perf(layer): cache the layer_type

fixes #3334

* fix partial redraw and setting color

Co-authored-by: _VIFEXTech <1290176185@qq.com>
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
2022-05-10 18:52:50 +02:00
Arnaud Mouiche
6c68095fb5 fix(txt): fix returned value of lv_txt_iso8859_1_next(..., NULL) (#3338)
Should return the first character of txt instead of the following one.

For example, used in lv_txt_get_width() to get 'letter_next' leading to
incorrect lv_font_get_glyph_width results.

Co-authored-by: Arnaud Mouiche <arnaud.mouiche@invoxia.com>
2022-05-10 18:25:46 +02:00
Gabor Kiss-Vamosi
c6c2864048 perf(draw): minor optimiziation in point transformation 2022-05-10 11:13:10 +02:00
embeddedt
ebd20af6e9 docs collapse APIs by default 2022-05-09 14:21:31 -04:00
embeddedt
85e3e23878 ci bump test timeout to 30 seconds [skip ci]
The ARM runners are a lot slower.
2022-05-09 13:40:48 -04:00
embeddedt
d6911053aa chore(docs) remove unneeded eval_rst statements 2022-05-09 13:35:03 -04:00
embeddedt
1816fa576c ci(docs) replace use of sed with proper configuration variables 2022-05-09 13:28:06 -04:00
embeddedt
bae6bc08e0 Revert "test(mem) add test for #3324"
This reverts commit 97006647d8.
2022-05-09 13:27:05 -04:00
embeddedt
a3d66c9b67 ci update docs builder to work with Python 3.10 2022-05-09 12:49:03 -04:00
embeddedt
f04fddd481 Merge branch 'master' of github.com:lvgl/lvgl 2022-05-09 12:42:37 -04:00
embeddedt
d367bb7cf1 docs(examples) avoid redirects when loading examples 2022-05-07 17:37:51 -04:00
_VIFEXTech
93dfd87a7a feat(anim): add the function of getting global animation refresher timer (#3331)
* feat(anim): add dynamic setting animation refresh period support

* add lv_anim_get_refr_period

* add lv_anim_get_timer

Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-05-07 22:58:38 +02:00
Gabriel Wang
45a39a11fe fix(benchmark): remove redundant string for the small screens (#3335)
* fix(benchmark): remove redundant string for the small screens (i.e. <320 in width)

* remove tail white-spaces
2022-05-07 22:14:35 +02:00
Gabor Kiss-Vamosi
ac2e2f132e perf(layer): cache the layer_type
fixes #3334
2022-05-07 22:01:28 +02:00
_VIFEXTech
e577b7a616 feat(demo): add Weighted FPS and Opa speed log output (#3326)
Signed-off-by: pengyiqiang <pengyiqiang@xiaomi.com>

Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-05-06 14:39:26 +02:00
_VIFEXTech
012a7cfddb fix(chart): fix accessing uninitialized point_area (#3327)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-05-05 11:02:39 +02:00
Gabriel Wang
7c9eea1e63 feat(gpu): Update gpu arm 2d (#3320)
* feat(lv_gpu_arm2d): accelerate chrome-keying

* feat: accelerate Image ARGB for rgba8888

* Update lv_gpu_arm2d.c

* chore disable formatting for __ACCELERATE_PREPARE__

astyle seems to have issues understanding multiline preprocessor blocks.

Co-authored-by: embeddedt <42941056+embeddedt@users.noreply.github.com>
2022-05-04 21:34:42 +02:00
Gabor Kiss-Vamosi
ed3538a1ad chore(demo): fix lv_demo_widget if THEME_DEFAULT is not enabled 2022-05-04 21:14:28 +02:00
Gabor Kiss-Vamosi
a99eb6bb6a fix(spinbox): rename lv_spinbox_set_pos to lv_spinbox_set_cursor_pos
fixes #3301
2022-05-04 21:14:28 +02:00
Xiang Xiao
c7ca38f1d5 fix(config): add LV_LAYER_SIMPLE_BUF_SIZE to Kconfig (#3312)
* fix(config): add LV_LAYER_SIMPLE_BUF_SIZE to Kconfig

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>

* fix(config): remove LV_USE_EXTERNAL_RENDERER which is unused anymore

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
2022-05-04 21:02:34 +02:00
Xiang Xiao
e827207080 fix(config): Keep the sequence of widget in order (#3314)
Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
2022-05-04 21:00:49 +02:00
Xiang Xiao
da9e53c2f4 fix(config): fix typo in LV_USE_PERF_MONITOR and LV_USE_MEM_MONITOR (#3313)
and order macro in lv_conf_kconfig.h as Kconfig and lv_conf_template.h

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
2022-05-04 20:59:55 +02:00
Xiang Xiao
4e7a0b2824 chore: correct the code format in lv_conf_template.h (#3310)
* chore: correct the code format in lv_conf_template.h

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>

* feat(config): support #undef in lv_conf_template.h

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
2022-05-04 20:58:09 +02:00
_VIFEXTech
181bf88ef0 fix(refr): initializing row_cnt is to silence the warning (#3309)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-05-04 20:19:52 +02:00
embeddedt
97006647d8 test(mem) add test for #3324 2022-05-04 09:19:00 -04:00
embeddedt
b83c5aa9bc ci make sure LVGL assertions cause tests to fail 2022-05-04 09:15:30 -04:00
embeddedt
003f18f86c ci limit tests to 15 seconds 2022-05-04 09:08:04 -04:00
Gabriel Wang
6560c792ca docs(pc-simulator): add MDK with FastModel (#3318) 2022-05-03 23:31:02 +08:00
Gabriel Wang
d5497b0a13 docs(intro): update for v8.2.0 (#3316) 2022-05-02 12:00:16 +08:00
Gabor Kiss-Vamosi
72ae62d06f chore(chart): fix typo in the comment
Fixes https://forum.lvgl.io/t/crowded-mode-in-chart/8730
2022-05-01 20:09:41 +02:00
embeddedt
a101e70ebd ci(makefile) fix typo in GitHub action 2022-04-29 19:38:48 -04:00
embeddedt
ea79cee01a ci add Makefile test 2022-04-29 19:38:04 -04:00
_VIFEXTech
bf0a0d543b fix(meter): fix typo (#3308)
* fix(meter): remove unused code

* add part_draw_dsc.p2 = &p_outer

Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-04-29 21:29:31 +02:00
_VIFEXTech
787f1a7729 fix(draw): update Makefiles (#3303)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-04-29 09:15:52 -04:00
Gabor Kiss-Vamosi
46bf27d50b fix(grid): fix dead branch
fixes: #3306
2022-04-29 13:39:43 +02:00
_VIFEXTech
e8cf036955 fix(lodepng): fix NULL pointer access (#3307)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-04-29 13:29:06 +02:00
Gabor Kiss-Vamosi
d8622f544f chore: fix warning 2022-04-27 20:44:30 +02:00
Gabor Kiss-Vamosi
23eecce008 fix(draw): fix img recolor 2022-04-27 15:23:39 +02:00
Gabor Kiss-Vamosi
51a7a61df3 fix(draw): revert handling of style_opa on not MAIN parts 2022-04-27 15:11:00 +02:00
Gabriel Wang
b81437e964 feat(cmsis-pack): Monthly update for April (#3300)
* feat(cmsis-pack): Monthly update for April

* fix typo
2022-04-27 14:29:01 +02:00
Gabor Kiss-Vamosi
e624b90db3 fix(draw): be sure angle values are in the correct range 2022-04-27 14:25:12 +02:00
Gabor Kiss-Vamosi
a76bb70a79 feat(arc): add lv_arc_align_obj_to_angle and lv_arc_rotate_obj_to_angle 2022-04-27 14:24:45 +02:00
Gabor Kiss-Vamosi
ff7204ecad fix(hal): disable driver->screen_transp by default regardless to LV_COLOR_SCREEN_TRANSP
With the new layer handling LV_COLOR_SCREEN_TRANSP will be enabled in a lot of cases
but screen_transp still shouldn't be enabled.
2022-04-26 17:29:13 +02:00
Kenji Mouri
3c0a3d05cc feat(fsdrv) fix issues for win32 backends (#3284) 2022-04-26 16:55:40 +02:00
Ivan Kravets
4094a37a5f docs(readme) update link to the PlatformIO Registry (#3296) 2022-04-26 08:06:10 -04:00
Gabor Kiss-Vamosi
8b15007568 fix(draw): create intermediate layer for blend modes too 2022-04-26 11:23:55 +02:00
Gabor Kiss-Vamosi
318146a2c2 feat(draw): support transforming widgets and improfe sw transform
For details see: https://docs.lvgl.io/master/overview/style.html
2022-04-26 10:45:12 +02:00
_VIFEXTech
69aa421acd docs(gesture): fix typo lv_indev_act() -> lv_indev_get_act() (#3291)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-04-26 10:32:18 +02:00
woody
07b7eea56c feat(gpu): add SWM341 gpu support (synwit)
* Update lv_gpu_stm32_dma2d.c

fix stm32 DMA2D blend。

* add SWM341 DMA2D support for lvgl

* add SWM341 DMA2D support for lvgl

* add SWM341 DMA2D support for lvgl

* add SWM341 DMA2D support for lvgl

* add SWM341 DMA2D support for lvgl
2022-04-25 15:13:19 +02:00
ZiyangYE
95620285bd fix(Kconfig): change the type of LV_FS_STDIO_LETTER from string to int (#3282) 2022-04-25 13:07:58 +02:00
_VIFEXTech
c9ab5e4e55 fix(demo): fix Wformat warning (#3290)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-04-25 12:57:01 +02:00
_VIFEXTech
9868cb92bc fix(snapshot): add missing ASSERT checks (#3292)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-04-25 12:56:10 +02:00
Gabor Kiss-Vamosi
8481e3a33b ci(switch): fix mem leak test 2022-04-21 21:18:40 +02:00
Gabor Kiss-Vamosi
98660a861d fix(fs): fix cached read and add unit test for lv_fs
fixes: #3262
2022-04-21 20:45:33 +02:00
simplejack-src
1cf2e5d886 feat(cmake-build): Option to allow building shared libraries. (#3278)
Add option in CMake build to specify that shared libraries should be created (as
opposed to static). This is an exclusive option (not enabled by default).

Co-authored-by: simeplejack-src <example@example.com>
2022-04-20 12:04:56 +02:00
Gabor Kiss-Vamosi
17f5e0accb fix(slider): fix left knob in ranged mode
fixes: #3285
2022-04-20 11:19:26 +02:00
Gabor Kiss-Vamosi
9997fb00aa feat(dropdown): add lv_dropdown_get_option_index 2022-04-19 11:25:29 +02:00
Mariotaku
2c90cba9de Revert "Update lv_draw_sdl.c (#3167)" (#3280)
This reverts commit ededba94b4.
2022-04-19 10:22:44 +02:00
Gabor Kiss-Vamosi
65db5c99e0 docs(gesture): describe how prevent sending events after a gesture
Related to #3211
2022-04-19 10:11:16 +02:00
_VIFEXTech
0fdd5d6449 feat(hal): add render_start_cb to disp_drv (#3274)
* feat(hal): add render_start_cb to disp_drv

* update doc for render_start_cb

* Update docs/porting/display.md

* remove disp_refr parameter

Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
2022-04-19 10:05:59 +02:00
Gabor Kiss-Vamosi
ef08f1c0fe chore(ci): add friendlier message to stale bot 2022-04-19 08:37:46 +02:00
Gabor Kiss-Vamosi
c596a36d9e fix(layout): use uint16_t LV_LAYOUT_FLEX/GRID
fixes #3273
2022-04-14 13:41:32 +02:00
Gabor Kiss-Vamosi
777fe1ea70 fix(scroll): send LV_EVENT_SCROLL_BEGIN/END with no animation too 2022-04-14 13:38:03 +02:00
Gabriel Wang
b6e76e28cf feat(cmsis-pack): monthly update for April (v1.0.3-alpha) (#3271) 2022-04-14 13:28:34 +02:00
Arno Moonen
016099e09c fix(Kconfig): Add LV_USE_GRIDNAV and LV_USE_FRAGMENT to Kconfig (#3270)
Co-authored-by: Arno Moonen <arno.moonen@airios.eu>
2022-04-13 15:38:20 +02:00
_VIFEXTech
56383c46cf fix(msgbox): do not execute init obj when obj == NULL (#3264)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-04-12 09:07:24 +02:00
embeddedt
06fff4b9ba fix(event) avoid using a boolean as a pointer
Fixes #3265
2022-04-11 17:53:57 -04:00
_VIFEXTech
96c4a45576 fix(menu): use LV_ASSERT_MALLOC check for new_node (#3263)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-04-11 20:31:30 +02:00
guoweilkd
9137840582 fix(canvas):image cache may expire after set canvas's buff (#3267) 2022-04-11 13:35:28 +02:00
_VIFEXTech
3db7adffb1 fix(obj_style): prevent access to class null pointer (#3252)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-04-11 12:43:52 +02:00
_VIFEXTech
563603589d pref(png): use lv_memcpy/memset to improve performance (#3251)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-04-11 12:41:59 +02:00
Gabor Kiss-Vamosi
dea75d9b4a fix(draw): fix disp_bg_img drawing
See https://forum.lvgl.io/t/issue-with-background-image-rendering-in-lvgl-8-2-0-with-lv-color-depth-32/8607
2022-04-11 12:40:56 +02:00
Gabor Kiss-Vamosi
1b219654db chore: code formatting and fix warnings 2022-04-06 22:18:30 +02:00
Gabor Kiss-Vamosi
b0a46c4837 fix(indev): do not send keys to objects in disabled state 2022-04-06 22:12:24 +02:00
Gabor Kiss-Vamosi
00f67597d3 fix(theme) add disabled style to textarea in the default theme 2022-04-06 22:12:24 +02:00
Gabor Kiss-Vamosi
79a29d749d feat(msg): add publisher-subscriber messaging 2022-04-06 22:12:24 +02:00
embeddedt
5977eeff3c ci(stale) bump action version
This should fix a couple problems I've noted with issues not having their stale status removed.
2022-04-05 08:14:03 -04:00
Gabriel Wang
c6d4b6e554 feat(benchmark): add trace output for running a specific scenario (#3245)
* feat(benchmark): add trace output for running a specific scenario

* Update lv_demo_benchmark.c
2022-04-05 10:52:07 +02:00
_VIFEXTech
bf85b50031 fix(png): fix possible memory leak when decoding fails (#3249)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-04-05 10:21:09 +02:00
_VIFEXTech
311df87f0d fix(libs): fix possible buffer underflow caused by extension matching (#3250)
Signed-off-by: pengyiqiang <pengyiqiang@xiaomi.com>

Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-04-05 10:19:17 +02:00
Gabor Kiss-Vamosi
a7f9dfa8c3 fix(refr): consider masks with LV_OBJ_FLAG_OVERFLOW_VISIBLE
fixes: #3151
2022-04-04 18:37:30 +02:00
Ryzee119
57e3697dca fix(fs): track multiple directory handles with win32 backends (#3243)
* fix(fs_win32): Track multiple directory handles

* fix(fs_stdio): Track multiple directory handles (win32)
2022-04-04 14:49:07 +02:00
Gabor Kiss-Vamosi
b7b22c190c revert(group): 72cb683c79
fixes: #3248
2022-04-04 13:28:23 +02:00
Gabor Kiss-Vamosi
b171f7dde2 fix(list): use for icon 2022-03-30 14:19:21 +02:00
_VIFEXTech
f9b554503e fix(png): use LV_IMG_CF_TRUE_COLOR_ALPHA instead of LV_IMG_CF_RAW_ALPHA (#3212)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-30 13:18:28 +02:00
Man, Jianting (Meco)
6185da3d76 fix(Keil-AC5): slience warnings in Keil-AC5 (#3221)
* fix(Keil-AC5): slience warnings in Keil-AC5

* Update SConscript

* Update src/misc/lv_types.h

Co-authored-by: embeddedt <42941056+embeddedt@users.noreply.github.com>

Co-authored-by: embeddedt <42941056+embeddedt@users.noreply.github.com>
2022-03-30 13:12:39 +02:00
Xiang Xiao
7c6f98146d chore(kconfig): minor fix for Kconfig (#3215)
* chore(Kconfig): remove "!= 0" from "depends on LV_USE_FS_XXX != 0"

since all LV_USE_FS_XXX is bool variable, "depends on LV_USE_FS_XXX" is enough

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>

* chore(Kconfig): select LV_USE_IMG for LV_USE_CANVAS

since canvas depends on image

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
2022-03-30 13:09:48 +02:00
_VIFEXTech
8a2d283b2e fix(meter): fix infinite loop caused by loop variable type mismatch (#3232)
* fix(meter): fix infinite loop caused by loop variable type mismatch

* Update src/extra/widgets/meter/lv_meter.c

Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
2022-03-30 13:06:30 +02:00
_VIFEXTech
82740fea59 fix(chart): remove invalid decision branches (#3231)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-30 13:05:33 +02:00
_VIFEXTech
06e616d0cb fix(gradient): assert before dividing by 0 (#3228)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-30 13:04:52 +02:00
_VIFEXTech
b35a37f52d fix(calendar): fix infinite loop caused by loop variable type mismatch (#3230)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-30 13:01:49 +02:00
_VIFEXTech
435cc3fedc fix(flex): assert before dividing by 0 (#3237)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-30 13:00:48 +02:00
_VIFEXTech
74f66d96d5 fix(hal): fix LV_ASSERT_MALLOC wrong placement (#3236)
Signed-off-by: pengyiqiang <pengyiqiang@xiaomi.com>

Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-30 12:59:58 +02:00
_VIFEXTech
e4fb579558 fix(disp): fix missing null pointer judgment (#3238)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-30 12:59:26 +02:00
_VIFEXTech
80a6d2bf57 fix(obj_class): fix possible memory leak when the default disp is NULL (#3235)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-30 12:58:28 +02:00
_VIFEXTech
adf7dc2121 fix(draw_sw_letter): fix incorrect use of sizeof for a pointer (#3234)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-30 12:57:53 +02:00
_VIFEXTech
7dd229a7cd fix(indev): fix null pointer access caused by typo (#3229)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-30 12:57:30 +02:00
_VIFEXTech
5d8845e0a2 fix(event): remove invalid decision branches (#3233)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-30 12:56:54 +02:00
_VIFEXTech
b0c1e297f4 fix(draw_mask): remove invalid decision branches (#3225)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-30 12:55:05 +02:00
_VIFEXTech
5a7e7e25e9 fix(spinbox): remove invalid judgment (#3227)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-30 12:54:26 +02:00
_VIFEXTech
2c70665674 fix(gradient): remove invalid decision branches (#3226)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-30 12:53:46 +02:00
_VIFEXTech
931207683d fix(txt): return 0 if letter_uni is out of range (#3224)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-30 12:52:37 +02:00
_VIFEXTech
9768c78c20 fix(calendar): fix possible array access out of bounds (#3223)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-30 12:51:58 +02:00
_VIFEXTech
423a3eb5d7 fix(style): remove useless null pointer judgment (#3222)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-30 12:51:36 +02:00
Pete Bone
8f8bd5f47c Update chart to set LV_CHART_POINT_NONE correctly for LV_USE_LARGE_COORD (#3217)
* Update chart to set LV_CHART_POINT_NONE correctly for LV_USE_LARGE_COORD

* Fix warning.
2022-03-29 17:33:47 +01:00
guoweilkd
6b628e524b fix(obj): scrolling exception when use lv_obj_set_parent() (#3210) 2022-03-29 16:39:26 +02:00
Gabriel Wang
a5b9a1c210 feat(env_support): cmsis pack monthly update (#3209)
* feat(gpu): update lv_gpu_arm2d

* feat(cmsis-pack): Monthly update for March
2022-03-29 13:58:07 +02:00
Tim Stableford
f426d546fa feat(tabview): support vertical scrolling (#3184)
This makes it so when the tabview has the tabs on the left or right
it will be scrolled up and down rather than left and right in all cases.
2022-03-29 13:57:48 +02:00
guoweilkd
47791926f9 feat(span): add an interface for setting the number of lines (#3200)
* fix draw: remove the high overflow judgment code
2022-03-29 13:06:58 +02:00
_VIFEXTech
9a0a74813d fix(libs): fix memcmp memory access overflow (#3205)
Signed-off-by: pengyiqiang <pengyiqiang@xiaomi.com>

Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-25 14:22:16 +01:00
Xiang Xiao
7d968bda8b chore(config): change LV_FFMPEG_AV_DUMP_FORMAT to LV_FFMPEG_DUMP_FORMAT (#3199)
ensure all ffmpeg special config start with the prefix(LV_FFMPEG_)

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
2022-03-24 22:13:06 +01:00
_VIFEXTech
8ddbae1f35 fix(png): fix possible file leaks (#3204)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-24 22:12:29 +01:00
Xiang Xiao
a6368fec53 fix(docs): rename task-handler.md to timer-handler.md (#3203)
since all task facility is already switched to timer facility

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
2022-03-24 22:11:45 +01:00
Gabor Kiss-Vamosi
378aaa637b docs: add section for renderers and gpus 2022-03-24 21:52:42 +01:00
Ryzee119
4f30bb9fa5 fix(lru): Fix use of undefined variables (#3181) 2022-03-24 21:42:31 +01:00
Gabor Kiss-Vamosi
127d8e82e3 fix(textarea): fix max length handling 2022-03-24 18:48:25 +01:00
Man, Jianting (Meco)
15247f9305 fix(rt-thread): Sconscript use LOCAL_CFLAGS to replace LOCAL_CCFLAGS (#3196) 2022-03-23 13:13:59 +01:00
Carlos Diaz
2b6cc3bc9c ci(slider): add unit test (#3198)
* slider: Refactor LV_SLIDER_KNOB_COORD and draw_knob

The `hor` parameter of this macro was always true, ending up always using the
left side of the ternary operator, with this refactor we eliminate the `hor`
parameter and remove the ternary operator it was used for.

This macro is only used in the `draw_knob` event handler, so it helps with its
initial cleanup.

* test(slider): Test documented default properties

* test(slider): Tests for LV_EVENT_KEY with valid and invalid keys

* feat(slider): Add helper to know if slider is horizontal

* chore(slider): Cleanup LV_EVENT_PRESSING handler

Reduce scope of variables where possible and use LV_CLAMP

* chore(slider): Cleanup draw_knob

* test(slider): Add tests for LV_EVENT_RELEASED

* test(slider): Add note about left_knob_focus

* test(slider): Initial test for hit test

* test(slider): Add tests for different slider modes

* chore(slider): cleanup draw_knob

* chore(slider): Cleanup position_knob

* test(slider): Move group configuration to setUp

* test(slider): Refactor tests with feedback

* add test_ranged_mode_adjust_with_encoder

* code formatting

* tests(slider): Remove direct usages of left_knob_focus

* test(slider): Remove unused variable

* Revert "test(slider): Refactor tests with feedback"

This reverts commit b274f829ecd83c894569b6f0535c7edebce5cbc9.

* test(slider): Add missing variable

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
2022-03-23 13:05:30 +01:00
Xiang Xiao
a694fc3f87 fix(make) make files under draw/gpu (#3202)
* chore(gpu): remove the empty src/gpu/lv_gpu.mk

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>

* fix(draw): add the missing gnu driver .mk

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
2022-03-23 12:58:37 +01:00
Gabor Kiss-Vamosi
1d60da6d8e chore: code formatting 2022-03-23 12:49:33 +01:00
Gabor Kiss-Vamosi
e53f60259c fix(style): _lv_style_prop_lookup_flags tell all flags for LV_STYLE_PROP_ANY 2022-03-23 11:25:29 +01:00
Man, Jianting (Meco)
a8e99798b3 fix(docs-CN):fix broken links to docs in dir get-started (#3195) 2022-03-23 10:38:17 +08:00
gliggy
3f778638bf fix broken links to docs in dir get-started (#3190)
add sub-directories as appropriate
2022-03-23 10:37:56 +08:00
_VIFEXTech
f28cd60279 fix(indev): fix warning about formatting uint32_t with %d (#3193)
Signed-off-by: pengyiqiang <pengyiqiang@xiaomi.com>

Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-03-22 13:56:07 +01:00
Viatorus
962d374791 feat(indev): add possibility to enable/disable all input devices at once (#3179)
* add possibility to globally enable/disable all input devices

* fix copy/paste error

* merge lv_indev_globally_enable into lv_indev_enable

* add missing simicolon

* remove unused variable
2022-03-21 14:53:40 +01:00
Xiang Xiao
fcf833f9af Minor document update (#3185)
* chore(docs): change "-DLV_USE_BTN 1" to "-DLV_USE_BTN=1"

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>

* chore(docs): update demo related link and description

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
2022-03-21 13:34:12 +01:00
Xiang Xiao
bc17353057 chore(docs): remove [lv_sim_...] and [lv_...] from "Repository layout" (#3183)
* chore(docs): remove [lv_sim_...] and [lv_...] from "Repository layout"

since [lv_sim_...] is part of [lv_port...] and [lv_...] just equals no filter at all

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>

* Update docs/intro/index.md

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
2022-03-21 13:26:19 +01:00
Xiang Xiao
2e80590b3f chore(make): add lv_ prefix to examples/examples.mk and src/extra/extra.mk (#3187)
follow other make file convention

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
2022-03-21 11:27:08 +01:00
Xiang Xiao
4c4f954059 chore(style): remove the trailing space from all source files (#3188)
Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
2022-03-21 11:25:51 +01:00
Gabor Kiss-Vamosi
46bd054ad4 chore: code formatting 2022-03-20 22:37:12 +01:00
Gabor Kiss-Vamosi
d9ae58b697 fix(style): fix heap use after free with transition styles 2022-03-20 22:37:01 +01:00
Gabor Kiss-Vamosi
48728a7839 fix(layout): fix the handling of FLOATING children 2022-03-20 21:45:09 +01:00
Gabor Kiss-Vamosi
5546b9d740 fix(style): make color filter inherited 2022-03-20 21:45:09 +01:00
Gabor Kiss-Vamosi
0e3bd11751 chore: fix comment typo 2022-03-20 21:45:09 +01:00
Xiang Xiao
6ba51f7f3f chore(docs): update the link of demos to the new location (#3182)
Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
2022-03-20 08:20:57 -04:00
Gabor Kiss-Vamosi
559986d5b7 chore: run code format 2022-03-18 16:03:48 +01:00
Gabor Kiss-Vamosi
242112b2df fix(theme): properly disable transitions if LV_THEME_DEFAULT_TRANSITION_TIME==0
fixes #3157
2022-03-18 15:46:07 +01:00
Gabor Kiss-Vamosi
306fa19682 fix(table): invalidate only the changed cell
fixes: https://forum.lvgl.io/t/refresh-cells-that-changed/8454
2022-03-18 15:16:06 +01:00
Gabor Kiss-Vamosi
7c74f6556a fix(scroll): fix scroll to view to the left
fixes #3158
2022-03-18 15:15:51 +01:00
Man, Jianting (Meco)
ca17c204d0 doc(rt-thread): add more BSP supports (#3178)
* doc(rt-thread): add more BSP supports

* improve sconscript
2022-03-18 14:09:01 +01:00
Mariotaku
c76a3d206e added missing implementation for lv_fragment_get_manager (#3169) 2022-03-17 16:26:16 +01:00
guoweilkd
061b6b5441 fix(Kconfig): move LV_USE_IMGFONT to others menu (#3176) 2022-03-17 16:00:47 +01:00
embeddedt
3016266686 chore(docs) fix logical inconsistency in wording 2022-03-17 10:54:26 -04:00
rqbh
ededba94b4 Update lv_draw_sdl.c (#3167)
Fix sdl gpu draw back
2022-03-17 15:22:10 +01:00
Gabor Kiss-Vamosi
f584a30af3 chore(docs): fix links 2022-03-17 13:47:54 +01:00
Gabor Kiss-Vamosi
8a81532191 docs: rearrange the get-started section
Add folder for Platforms, RTOS, and Bindings
2022-03-17 13:19:53 +01:00
Gabor Kiss-Vamosi
4341660b93 chore(docs): mark v7 as eol 2022-03-17 11:17:35 +01:00
guoweilkd
7713327d61 feat(font): add imgfont - can be used to add emojis to label/span (#3160)
* feature(font): draw img in label/span

* add to tests

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
2022-03-17 10:18:14 +01:00
Gabor Kiss-Vamosi
7153e3f8b7 fix(arc): fix arc image drawing issue 2022-03-17 10:11:39 +01:00
Gabriel Wang
16a1af3873 fix(draw): src_buf_tmp will be NULL when LV_DRAW_COMPLEX is '0' (#3163) 2022-03-16 16:15:20 +01:00
Gabor Kiss-Vamosi
28bd55c5d3 fix(span): align the baselines (#3164) 2022-03-16 10:43:39 +01:00
Gabriel Wang
a0153182b8 feat(gpu): add gpu arm2d (#3162)
* feat(gpu): add support for arm-2d

* fix(hal): fix typos

* feat(cmsis-pack): v1.0.2-alpha2 for monthly update

* update format for lv_gpu_arm2d.c

* Update LVGL.lvgl.1.0.2-alpha1.pack
2022-03-16 10:26:12 +01:00
ckielstra
f79e2838cb chore(doc): spelling (#3172)
* Spelling: 'an unicode' -> 'a unicode'

* fix(changelog) spelling

* Remove double spaces

* Spelling
2022-03-16 10:19:19 +01:00
patricklaf
d56ce08782 feat(dma2d): add lv_draw_stm32_dma2d_buffer_copy function (#3147)
* Add lv_draw_stm32_dma2d_buffer_copy function

* Code format

* More code format
2022-03-12 19:28:38 +01:00
Gabor Kiss-Vamosi
bae823cf54 chore: code formatting 2022-03-12 19:19:43 +01:00
Gabor Kiss-Vamosi
54f99870b3 fix(fs): mark the read cache as invalid by default
fixes #3148
2022-03-12 19:07:04 +01:00
Gabor Kiss-Vamosi
62d6f3c533 fix(theme): make the basic theme even more simpler 2022-03-12 18:50:19 +01:00
HX2003
44f6f75238 chore(gridnav): fix broken links for gridnav (#3159) 2022-03-11 10:57:06 +01:00
Viatorus
45b0f86ae5 feat(disp): add screen out animations (#3081)
* add screen out animations

* make FADE_ON an alias of FADE_IN for backward compatiblitiy

* revert any changes to lv_indev.c

* format code

* update docs

* disable input if screen animation is active
2022-03-10 16:54:42 +01:00
Gabor Kiss-Vamosi
5ec6694f78 fix(theme): fix mono theme init 2022-03-10 15:12:17 +01:00
HX2003
bc94b4de52 feat(menu): make menu widget more compatible with encoder (#3061) 2022-03-10 14:03:38 +01:00
Carlos Diaz
688421bc10 chore(tests_indev): Add comments to encoder helper (#3155) 2022-03-10 10:53:56 +01:00
Gabor Kiss-Vamosi
a6c4c13490 fix(menu): fix crash on delete (#3154)
* fix(menu): fix crash on delete

fixes #3123

* handle NULL

* code formatting
2022-03-09 00:05:53 +01:00
Gabriel Wang
08a3cc0eb6 chore(doc): fix typos in task-handler.md (#3153) 2022-03-08 20:29:40 +01:00
embeddedt
fcc1152f9c ci don't run workflows twice on PRs 2022-03-07 10:04:59 -05:00
embeddedt
8ac93ad883 refactor(style) move flag information into a dedicated table (#3102) 2022-03-07 10:01:25 -05:00
embeddedt
d345f76d02 ci remove formatting comment
This only works when the author is an @lvgl member.
2022-03-05 17:11:39 -05:00
embeddedt
cbc38afb3a fix(bmp) fix typo in BPP condition
Thanks @egonbeermat
2022-03-05 13:28:45 -05:00
Xiang Xiao
ff0bf6386d chore(lvgl.[h|mk]): don't include the grandchildren file (#3145)
Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
2022-03-04 21:00:13 +01:00
Jackson Ming Hu
04aca9dae3 fix(Kconfig): add missing LV_USE_THEME_MONO (#3146) 2022-03-04 20:55:05 +01:00
Xiang Xiao
4078a571dc fix(demo/stress): remove the unused assets (#3139)
Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
2022-03-01 19:38:32 +01:00
LY3T
5a3ca098f7 fix(jpg): swap high and low bytes when macro LV_COLOR_16_SWAP is 1 (#3138) 2022-03-01 18:57:48 +01:00
Gabriel Wang
c0575c57af chore(env-support): cmsis-pack monthly update (#3137)
* Update README.md

* feat(env_support): cmsis-pack monthly update
2022-03-01 18:49:05 +01:00
Gabor Kiss-Vamosi
18f2d78728 fix(roller): fix unexpected jump in infinite mode
fixes #3132
2022-03-01 18:40:39 +01:00
Carlos Diaz
0a5c5465d2 chore(docs): fix trailing whitespaces in files (#3133) 2022-03-01 13:52:45 +01:00
Carlos Diaz
406386dc3f test(line): add unit tests for line widget (#3104)
* test(line): Test y invert field

* test(line): Validate documented default values

* test(line): Assert line is not clickable after construction

* test(line): Test line size calculation

* chore(line): Refactor LV_EVENT_GET_SELF_SIZE handling

Return early when no point_array is set or point_num is 0

* chore(line): Cleanup LV_EVENT_DRAW_MAIN handling

Reduce scope of point variables

* test(line): Clean screen on tearDown

* test(line): Add initial test for extra draw size calculation

* test(line): Fix extra draw size test
2022-02-25 19:58:43 +01:00
Andres O. Vela
340d45cfa9 feat(label): added animation style property to apply it to circular scrolling animation of label widget (#3128)
* feat(label): added animation style property to apply it to circular scrolling animation of label widget

Added an animation style property to be used as animation template for different use cases in different widgets.
This commit implements using this property to set the start and repeat delay of the circular scrolling animation of the label widget.

Closes #3097

* fix(label): changed animation style property's var_type to `const lv_anim_t *`

* example(label): added example showing how to customize circular scrolling animation

* chore(label): ran code-format.py and added missing function prototype to lv_example_widgets.h
2022-02-25 11:54:27 +01:00
Carlos Diaz
e25fa427d1 test(table): replicate issue when reducing table cells (#3121)
* test(table): Replicate issue when reducing table cells

See #3120 for report

* test(table): Cell reduction test without use after free

Set the row count to 1 to be able to have a passing test, now we can track
down the real bug, which is triggered when having more than 1 row in the table.

* test(table): Add failing test for cell reduction

This test currently triggers the use after free bug

* chore(table): No-op when new and current row and columns counts are equal

* chore(table): Clean up lv_table_set_col_cnt

* chore(table): Add comments to get_row_height

* chore(table): Minor format cleanup and comment of cell_data layout

* fix ASAN arror

* minor fixes

* chore(table): Restore comments to get_row_height

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
2022-02-24 19:14:33 +01:00
Carlos Diaz
a83cae012d feat(script): add pre-commit configuration for code formatting (#3092)
* Add initial pre-commit configuration for code formatting

* chore: Move --recursive switch from cfg file to script

* pre-commit: Update format-source hook to use code-format.cfg

Also remove the code-format-per-file.cfg file as it's now unused

* docs: Add section about pre-commit
2022-02-24 18:44:39 +01:00
GoT
4ed0f011f6 chore(docs): fix type about file system cache_size setting (#3115) 2022-02-24 17:19:04 +01:00
Gabor Kiss-Vamosi
ac202e7b96 fix(keyboard): don't show popovers on map change 2022-02-23 18:41:49 +01:00
Gabor Kiss-Vamosi
72cb683c79 fix(group): in lv_group_remove() fix if the object to focus is deleted
If in the defocus event of the currently focused object the the next object to focus is deleted there was a  crash
2022-02-23 18:40:27 +01:00
Gabor Kiss-Vamosi
3d92972695 fix(spinbox): set its default width in its class 2022-02-22 20:55:37 +01:00
Gabor Kiss-Vamosi
bb03fb197c fix(theme): in the basic theme show the textarea cursor only in focuses state 2022-02-22 20:55:37 +01:00
Gabor Kiss-Vamosi
83343f11a1 chore(draw): show error for small gradient cache size 2022-02-22 20:55:37 +01:00
Alexandre Abadie
774403b3cf fix(script): in lv_conf_internal fix some widget dependencies when using Kconfig (#3119)
* widgets: make dependencies internal handling consistent when using Kconfig

* scripts/lv_conf_internal_gen.py: fix issue with widget with dependencies

* scripts/lv_conf_internal_gen.py: allow to call it from other directory
2022-02-22 19:45:33 +01:00
Xiang Xiao
550a15c317 fix(demo): minor fix for benchmark (#3114)
1.add const to rnd_map
2.replace "i < sizeof(scenes) / sizeof(scene_dsc_t) - 1" with "scenes[i].create_cb"
3.replace "sizeof(scenes) / sizeof(scene_dsc_t)" with "dimof(scenes)"

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
2022-02-22 12:47:04 +01:00
_VIFEXTech
30648ab4f1 feat(refr): prevents dirty areas from being modified during rendering (#3107)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-02-22 11:59:02 +01:00
GoT
efb9c5cc52 chore(fs): wrong parameters doc for fs_write in lv_port_fs_template.c (#3109)
* Wrong parameters doc for fs_write

Wrong parameters doc for fs_write in lv_port_fs_template.c

* Fix wrong code block for fsdrv files and lv_fs.h
2022-02-21 16:14:06 +01:00
Xiang Xiao
0b799830ea chore(demos): redirect urls to the new location in README.md (#3112)
Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
2022-02-21 16:13:12 +01:00
xaowang96
15f9a54ba4 fix(misc): in lv_map() handle if maximum value less than minimum value (#3113) 2022-02-21 15:40:27 +01:00
Gabor Kiss-Vamosi
d034511bba feat(draw): add draw_ctx->buffer_copy
realted to: #3087
2022-02-18 13:57:11 +01:00
_VIFEXTech
48cb4e9164 fix(extra): adjust image decoder initialization order (#3085)
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-02-18 12:56:14 +01:00
Ali Rostami
f23ae6e67c fix(chart): optimize chart invalidation (#3028)
* replace lv_chart_refresh by invalidate_point so the chart will be updated faster.

* Update lv_chart.c

It seems the second `invalidate_point` is extra and can be removed.

* Update src/extra/widgets/chart/lv_chart.c

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
2022-02-18 12:30:47 +01:00
_VIFEXTech
2be4e82991 fix(refr): fix performance monitor NULL pointer access (#3105)
* fix(refr) performance monitor NULL pointer access

* doc(refr): describe the setting of LV_DISP_DEF_REFR_PERIOD

Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-02-18 11:32:16 +01:00
Jason Pritchard
c49430bfd4 fix(misc): Remove duplicate declaration of _lv_log_add. (#3103)
Commit ba38a4b appears to have accidentally added a duplicate declaration of
_lv_log_add. With -Wredundant-decls, this causes warnings to spam the terminal.

    warning: redundant redeclaration of ‘_lv_log_add’ [-Wredundant-decls]
2022-02-18 09:00:27 +01:00
Ken Carpenter
349a51cb03 fix(gridnav): get key code from the actual event (#3101)
This enables queuing up a key while animation is occurring and then sending it to the gridnav once the animation is complete.
Without this, if you call `lv_event_send()` to send a key to the gridnav later, then `lv_indev_get_act()` returns `NULL` since it's no longer actively processing the key handler, and nothing happens from the key.
2022-02-17 22:23:14 +01:00
Gabor Kiss-Vamosi
6c00552629 fix: fix warning 2022-02-17 18:34:26 +01:00
Gabor Kiss-Vamosi
b1e2c06658 fix(gif): fix rare issue when drawing the gif's background 2022-02-17 18:16:48 +01:00
Carlos Diaz
ab727d3181 test(textarea): add unit test (#3074)
* test(textarea): Password mode

* test(textarea): label style with one line enabled

* test(textarea): Cursor click pos

* chore(textarea): Move auto hide to helper

* test(textarea): Placeholder text

* test(textarea): Default properties values

* test(textarea): Remove assert from one line test

* tests(textarea): Remove unused variables

* feat/textarea: Add and use is_valid_but_non_printable_char

* chore/textarea: General cleanup

* test(textarea): Accepted chars

* Update src/widgets/lv_textarea.c

* test(textarea): Assert text is empty after widget creation

* test(textarea): Update test for label style with one line enabled

* test(textarea): Add default text helper and use it

* test(textarea): Ignore line break chars in one line mode

* textarea: Check for line break chars sooner when adding char

* textarea: Start refactor of insert_handler

* textarea: Add comments to insert_handler

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
2022-02-17 18:12:59 +01:00
Gabor Kiss-Vamosi
b6d2daa493 feat(gridnav): add lv_gridnav_set_focused
fixes #3069
2022-02-17 18:11:30 +01:00
Carlos Diaz
cfd6d43672 test(table): add unit tests (#3040)
* test(table): Happy path test for set_cell_value

* table: Abstract char configuration on set_cell_value

Abstract bytes to allocate calculation and txt copying

* table: Add missing &

* table: Update helper names

* test(table): Add test for column increasing when setting a formatted cell value

* table: Increase table columns when needed

* test(table): Fix test_table_should_grow_columns_automatically_when_setting_formatted_cell_value

* table: Fix code formatting

* test(table): Add test for cell ctrl

* table: Refactor draw_main low hanging fruits

* lv_table: Initial refactor of get_row_height

Mostly early breaks on loops and reducing variable scope where possible

* lv_table: Initial refactor of refr_size

Adding const wherever is possible

* lv_table: Further cleanup get_row_height

* lv_table: Cleanup loop in draw_main

* lv_table: Fix -Werror=shadow compilation error

* test(table): Tests for cell ctrl clearance

* lv_table: Rename index to idx

* lv_table: Use helper to know if cell is empty

* test(table): Comment assumptions to column grow test

* test(table): Row height with multi line cell value

* test(table): Wrap on long texts and increase row height

* add rendering test

* fix warnings

* fix out of bounds indexig

* fix rendering test

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
2022-02-17 13:52:46 +01:00
guoweilkd
060b37e8fb fix(draw_rect): delete __STDC_VERSION__ to ensure C++ compatibility (#3099) 2022-02-17 12:31:16 +01:00
Gabor Kiss-Vamosi
fe4caaff0e chore: remove debug settings 2022-02-16 20:31:17 +01:00
Gabor Kiss-Vamosi
c742f2c888 fix(obj): fix LV_OBJ_FLAG_OVERFLOW_VISIBLE
fixes: #3098
2022-02-16 19:58:59 +01:00
Gabriel Wang
a82dc49c26 pre-release for LVGL cmsis-pack v1.0.1 (#3091)
* pre-release for LVGL cmsis-pack v1.0.1

* update lv_conf_cmsis.h
2022-02-16 19:39:16 +01:00
Gabor Kiss-Vamosi
4a766c516d example(slider): make lv_example_slider_3 work with dark theme too
fixes: #3094
2022-02-16 14:04:05 +01:00
GoT
0cbb0087f7 docs(scroll) add information about scroll coordinates (#3088) 2022-02-16 07:49:12 -05:00
Gabor Kiss-Vamosi
4246615f48 chore(tests): fix image compare tests 2022-02-16 09:45:39 +01:00
Gabor Kiss-Vamosi
e4824f5f6b doc(disp): describe "Decoupling the display refresh timer"
Introduced in 85cc84ad94
2022-02-16 09:27:45 +01:00
Gabor Kiss-Vamosi
7cf5709b06 fix(font): use 0 width for non printable characters 2022-02-16 09:10:48 +01:00
GoT
cbcf194bc4 docs(msgbox) fix typo (#3095) 2022-02-15 16:45:02 -05:00
Gabriel Wang
305ad00893 feat(benchmark): add an API to run specific scene (#3089) 2022-02-13 14:02:45 -05:00
embeddedt
9771050b99 chore(format) add formatting for examples & demos, merge test config 2022-02-13 13:59:17 -05:00
Gabriel Wang
ba38a4bb76 feat(log): improve lv_log and add log the result from lv_demo_benchmark (#3084)
* feat(log): improve log

* Update log.md

* Update log.md

* fix: fix formatting issue

* fix: fix formatting again...

* fix: remove blanks
2022-02-12 20:12:32 +01:00
Gabor Kiss-Vamosi
48d87e1ed2 test(img): fix image error diff handler 2022-02-11 16:59:24 +01:00
guoweilkd
751b1b67b8 fix(font):draw placeholder if get_glyph_dsc() returns false (#3000) 2022-02-11 15:26:57 +01:00
embeddedt
c6b34bc85b fix(conf): work around GCC bug (#3082)
Fixes #3078
2022-02-11 15:25:44 +01:00
Mariotaku
e7736f2c32 feat(fragment): add fragment manager (a UI Controller concept) (#2940)
* adding lv_obj_controller

* adding examples for lv_obj_controller

* added some docs

* formatted code

* updated controller docs

* updated controller docs

* updated sample controller field

* changed lv_controller_manager_parent to lv_controller_manager_get_parent

* updated unmanaged controller creation/deletion

* renamed lv_controller_manager_t

* rename: controller -> fragment

* formatted code

* Update examples/others/fragment/lv_example_fragment.h

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>

* Update src/extra/others/fragment/lv_fragment.c

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>

* Update src/extra/others/fragment/lv_fragment.c

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>

* Update src/extra/others/fragment/lv_fragment.c

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>

* code cleanup

* fragment creation rework

* (wip) fragment manager

* (wip) fragment manager

* refactoring fragment

* lifecycle fixes

* updated fragment event callback

* exposed states of fragment

* added some docs

* updated lv_fragment_managed_states_t name

* updated docs

* updated docs

* updated lv_fragment_manager_dispatch_event docs

* removed msgbox fragment

* updated fragment docs

* updated fragment docs

* updated docs

* updating examples

* fixed example

* reformatted code

* fixed obj_created set timing

* simplified fragment

* improved fragment view del assertion

* fixed a typo

* fixed event_cb check in lv_obj_remove_event_cb_with_user_data

* fixing fragment obj assertion

* regenerated config

* fixed fragment examples

* fixed fragment examples

* added missing examples

* updated docs

* fragment api cleanup

* rename fragment struct names

* added missing param doc

* enabled test for 32bit build

* feat(porting): add a macro lv_run_timer_handler_in_period to simplify porting (#3063)

* feat(porting): add a macro lv_run_timer_handler_in_period to simplify porting

* feat: update helper function and doc

* doc(porting): update function names

* revise to the original os.md

* fix: fix typo

* fix: mitigate warnings

* chore: fix code formatting

* fix(fsdrv): replacing sprintf with lv_snprintf for safety (#3079)

* fix(Kconfig) remove duplicate LV_BUILD_EXAMPLES configuration

* feat(refr) add reset of FPS statistics

* fix(conf) mismatched macro judgment

* feat(fsdrv) replacing sprintf with lv_snprintf for safety

* feat(fsdrv) update stdio and win32

Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>

* fix warnings

Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
Co-authored-by: Gabriel Wang <embedded_zhuoran@Hotmail.com>
Co-authored-by: _VIFEXTech <1290176185@qq.com>
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-02-11 12:43:08 +01:00
_VIFEXTech
9f90d82e91 fix(fsdrv): replacing sprintf with lv_snprintf for safety (#3079)
* fix(Kconfig) remove duplicate LV_BUILD_EXAMPLES configuration

* feat(refr) add reset of FPS statistics

* fix(conf) mismatched macro judgment

* feat(fsdrv) replacing sprintf with lv_snprintf for safety

* feat(fsdrv) update stdio and win32

Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
2022-02-08 15:22:28 +01:00
Gabor Kiss-Vamosi
2dc804f2b2 chore: fix code formatting 2022-02-07 21:18:00 +01:00
Gabriel Wang
796f0c0b4e feat(porting): add a macro lv_run_timer_handler_in_period to simplify porting (#3063)
* feat(porting): add a macro lv_run_timer_handler_in_period to simplify porting

* feat: update helper function and doc

* doc(porting): update function names

* revise to the original os.md

* fix: fix typo

* fix: mitigate warnings
2022-02-07 21:10:12 +01:00
Gabor Kiss-Vamosi
9e1b789fb3 chore(demo): describe why the memory leak is no zero 2022-02-07 20:38:05 +01:00
Gabor Kiss-Vamosi
9a1e385b2b docs(images): fix notes about breaking change inf v8.2
Indexed images are not chroma keyed. Use the alpha chaneel instead.
Realted to: https://forum.lvgl.io/t/8-2-0-image-drawing-renders-actual-color-defined-for-transparency-in-lv-img-cf-indexed-8bit-images-8-1-0-and-prior-did-not/8133
2022-02-07 19:15:01 +01:00
GoT
78966f5cc4 docs(scroll): use LV_DIR_VER instead of LV_DIR_TOP (#3066)
Bad usage of LV_DIR_TOP
2022-02-07 17:33:54 +01:00
Carlos Diaz
2c7760c687 chore(test): format test cases (#3071) 2022-02-03 09:59:55 +01:00
Gabriel Wang
e400a87df9 fix(cmsis-pack): add PIDX for cmsis-pack (#3064) 2022-02-01 09:01:50 +01:00
embeddedt
9fcefe5a49 ci use GCC problem matcher on ARM tests as well 2022-01-31 09:28:02 -05:00
Gabor Kiss-Vamosi
23c7b2dbf2 change version numbers to v8.3.0-dev 2022-01-31 13:35:13 +01:00
655 changed files with 28277 additions and 11470 deletions

View File

@@ -6,6 +6,7 @@ on:
branches: [ master, release/v8.* ]
jobs:
lint:
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2

View File

@@ -6,8 +6,9 @@ on:
jobs:
build:
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
name: Build ${{ matrix.port }} port
runs-on: ubuntu-latest
runs-on: ubuntu-20.04
continue-on-error: true
strategy:
matrix:
@@ -22,7 +23,7 @@ jobs:
- name: Clone lv_micropython
run: |
git clone https://github.com/lvgl/lv_micropython.git .
git checkout master
git checkout release/v8
- name: Initialize lv_bindings submodule
run: git submodule update --init --recursive lib/lv_bindings
- name: Update ${{ matrix.port }} port submodules

View File

@@ -8,6 +8,7 @@ on:
jobs:
build:
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
runs-on: ubuntu-latest
strategy:
matrix:
@@ -55,6 +56,7 @@ jobs:
steps:
- uses: actions/checkout@v2.1.0
- uses: ammaraskar/gcc-problem-matcher@master
- name: Setup cache
uses: actions/cache@v2
with:

View File

@@ -5,6 +5,7 @@ on:
jobs:
verify-conf-internal:
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
runs-on: ubuntu-latest
steps:
- name: Checkout

View File

@@ -5,6 +5,7 @@ on:
jobs:
verify-formatting:
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
runs-on: ubuntu-latest
steps:
- name: Checkout
@@ -28,12 +29,3 @@ jobs:
echo "Please apply the preceding diff to your code or run scripts/code-format.py"
exit 1
fi
- name: Comment PR
uses: thollander/actions-comment-pull-request@v1
if: github.event_name == 'pull_request' && failure()
with:
message: |
Your PR needs its formatting corrected before it can be merged upstream.
Please run `scripts/code-format.py` and commit the resulting change.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -9,12 +9,20 @@ jobs:
if: github.repository == 'lvgl/lvgl'
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v3
- uses: actions/stale@v5
with:
repo-token: ${{ secrets.LVGL_BOT_TOKEN }}
stale-issue-message: 'This issue is stale because it has been open 14 days with no activity. Remove stale label or comment or this will be closed in 7 days.'
stale-pr-message: 'This PR is stale because it has been open 14 days with no activity. Remove stale label or comment or this will be closed in 7 days.'
close-issue-message: 'This issue was closed because it has been stalled for 7 days with no activity.'
stale-pr-message: |
We need some feedback on this issue.
Now we mark this as "stale" because there was no activity here for 14 days.
Remove the "stale" label or comment else this will be closed in 7 days.
close-issue-message: |
As there was no activity here for a while we close this issue. But don't worry, the conversation is still here and you can get back to it at any time.
So feel free to comment if you have remarks or ideas on this topic.
days-before-stale: 14
days-before-close: 7
exempt-issue-labels: 'pinned'

View File

@@ -1,23 +1,23 @@
name: Push LVGL release to Espressif Component Service
# If the commit is tagged, it will be uploaded. Other scenario silently fail.
on:
push:
branches:
- master
jobs:
upload_components:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
with:
submodules: "recursive"
- name: Upload component to component registry
uses: espressif/github-actions/upload_components@master
with:
name: "lvgl"
version: "git"
namespace: "lvgl"
api_token: ${{ secrets.ESP_IDF_COMPONENT_API_TOKEN }}
name: Push LVGL release to Espressif Component Service
# If the commit is tagged, it will be uploaded. Other scenario silently fail.
on:
push:
tags:
- v*
jobs:
upload_components:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
submodules: "recursive"
- name: Upload component to component registry
uses: espressif/upload-components-ci-action@v1
with:
name: "lvgl"
version: ${{ github.ref_name }}
namespace: "lvgl"
api_token: ${{ secrets.ESP_IDF_COMPONENT_API_TOKEN }}

21
.github/workflows/makefile.yml vendored Normal file
View File

@@ -0,0 +1,21 @@
name: Check Makefile
on:
push:
branches: [ master, release/v8.* ]
pull_request:
branches: [ master, release/v8.* ]
jobs:
build:
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
runs-on: ubuntu-latest
name: Build using Makefile
steps:
- uses: actions/checkout@v2
- uses: ammaraskar/gcc-problem-matcher@master
- name: Install prerequisites
run: scripts/install-prerequisites.sh
- name: Build
working-directory: tests/makefile
run: make test_file

3
.gitignore vendored
View File

@@ -22,3 +22,6 @@ test_screenshot_error.h
build/
tests/build_*/
tests/report/
.DS_Store
.vscode
*.bak

30
.pre-commit-config.yaml Normal file
View File

@@ -0,0 +1,30 @@
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.2.0
hooks:
- id: trailing-whitespace
- repo: local
hooks:
# Run astyle over the staged files with c and h extension found in the directories
# listed in the files regex pattern. Ignoring the files in the exclude pattern.
- id: format-source
name: Formatting source files
entry: astyle --options=scripts/code-format.cfg --ignore-exclude-errors
stages: [ commit ]
language: system
pass_filenames: true
verbose: true
files: |
(?x)^(
src/ |
tests/src/test_cases/
)
exclude: |
(?x)^(
src/extra/libs/ |
src/lv_conf_internal.h
)
types_or: ["c", "header"]

156
Kconfig
View File

@@ -6,7 +6,7 @@ menu "LVGL configuration"
# without lv_conf.h file, the lv_conf_internal.h and
# lv_conf_kconfig.h files are used instead.
config LV_CONF_SKIP
bool
bool "Uncheck this to use custom lv_conf.h"
default y
config LV_CONF_MINIMAL
@@ -42,11 +42,9 @@ menu "LVGL configuration"
config LV_COLOR_SCREEN_TRANSP
bool "Enable more complex drawing routines to manage screens transparency."
depends on LV_COLOR_DEPTH_32
help
Can be used if the UI is above another layer, e.g. an OSD menu or video player.
Requires `LV_COLOR_DEPTH = 32` colors and the screen's `bg_opa` should be set to
non LV_OPA_COVER value
The screen's `bg_opa` should be set to non LV_OPA_COVER value
config LV_COLOR_MIX_ROUND_OFS
int "Adjust color mix functions rounding"
@@ -156,6 +154,15 @@ menu "LVGL configuration"
radiuses are saved).
Set to 0 to disable caching.
config LV_LAYER_SIMPLE_BUF_SIZE
int "Optimal size to buffer the widget with opacity"
default 24576
help
"Simple layers" are used when a widget has `style_opa < 255`
to buffer the widget into a layer and blend it as an image
with the given opacity. Note that `bg_opa`, `text_opa` etc
don't require buffering into layer.
config LV_IMG_CACHE_DEF_SIZE
int "Default image cache size. 0 to disable caching."
default 0
@@ -205,8 +212,11 @@ menu "LVGL configuration"
endmenu
menu "GPU"
config LV_USE_EXTERNAL_RENDERER
bool
config LV_USE_GPU_ARM2D
bool "Enable Arm's 2D image processing library (Arm-2D) for all Cortex-M processors."
default n
help
Must deploy arm-2d library to your project and add include PATH for "arm_2d.h".
config LV_USE_GPU_STM32_DMA2D
bool "Enable STM32 DMA2D (aka Chrom Art) GPU."
@@ -218,6 +228,26 @@ menu "LVGL configuration"
Must be defined to include path of CMSIS header of target processor
e.g. "stm32f769xx.h" or "stm32f429xx.h"
config LV_USE_GPU_RA6M3_G2D
bool "Enable RA6M3 G2D GPU."
config LV_GPU_RA6M3_G2D_INCLUDE
string "include path of target processor"
depends on LV_USE_GPU_RA6M3_G2D
default "hal_data.h"
help
Must be defined to include path of target processor
e.g. "hal_data.h"
config LV_USE_GPU_SWM341_DMA2D
bool "Enable SWM341 DMA2D GPU."
config LV_GPU_SWM341_DMA2D_INCLUDE
string "include path of CMSIS header of target processor"
depends on LV_USE_GPU_SWM341_DMA2D
default "SWM341.h"
help
Must be defined to include path of CMSIS header of target processor
e.g. "SWM341.h"
config LV_USE_GPU_NXP_PXP
bool "Use NXP's PXP GPU iMX RTxxx platforms."
config LV_USE_GPU_NXP_PXP_AUTO_INIT
@@ -238,12 +268,17 @@ menu "LVGL configuration"
config LV_USE_GPU_SDL
bool "Use SDL renderer API"
select LV_USE_EXTERNAL_RENDERER
default n
config LV_GPU_SDL_INCLUDE_PATH
string "include path of SDL header"
depends on LV_USE_GPU_SDL
default "SDL2/SDL.h"
config LV_GPU_SDL_LRU_SIZE
int "Maximum buffer size to allocate for rotation"
depends on LV_USE_GPU_SDL
default 8388608
help
Texture cache size, 8MB by default.
endmenu
menu "Logging"
@@ -374,7 +409,7 @@ menu "LVGL configuration"
bool "Left middle"
config LV_PERF_MONITOR_ALIGN_RIGHT_MID
bool "Right middle"
config LV_PERF_MONITOR_ALIGN_BOTTOM_CENTER
config LV_PERF_MONITOR_ALIGN_CENTER
bool "Center"
endchoice
@@ -403,7 +438,7 @@ menu "LVGL configuration"
bool "Left middle"
config LV_MEM_MONITOR_ALIGN_RIGHT_MID
bool "Right middle"
config LV_MEM_MONITOR_ALIGN_BOTTOM_CENTER
config LV_MEM_MONITOR_ALIGN_CENTER
bool "Center"
endchoice
@@ -628,6 +663,10 @@ menu "LVGL configuration"
Set the pixel order of the display.
Important only if "subpx fonts" are used.
With "normal" font it doesn't matter.
config LV_USE_FONT_PLACEHOLDER
bool "Enable drawing placeholders when glyph dsc is not found."
default y
endmenu
menu "Text Settings"
@@ -715,6 +754,7 @@ menu "LVGL configuration"
default y if !LV_CONF_MINIMAL
config LV_USE_CANVAS
bool "Canvas. Dependencies: lv_img."
select LV_USE_IMG
default y if !LV_CONF_MINIMAL
config LV_USE_CHECKBOX
bool "Check Box"
@@ -814,6 +854,13 @@ menu "LVGL configuration"
config LV_USE_MSGBOX
bool "Msgbox."
default y if !LV_CONF_MINIMAL
config LV_USE_SPAN
bool "span"
default y if !LV_CONF_MINIMAL
config LV_SPAN_SNIPPET_STACK_SIZE
int "Maximum number of span descriptor"
default 64
depends on LV_USE_SPAN
config LV_USE_SPINBOX
bool "Spinbox."
default y if !LV_CONF_MINIMAL
@@ -829,19 +876,12 @@ menu "LVGL configuration"
config LV_USE_WIN
bool "Win"
default y if !LV_CONF_MINIMAL
config LV_USE_SPAN
bool "span"
default y if !LV_CONF_MINIMAL
config LV_SPAN_SNIPPET_STACK_SIZE
int "Maximum number of span descriptor"
default 64
depends on LV_USE_SPAN
endmenu
menu "Themes"
config LV_USE_THEME_DEFAULT
bool "A simple, impressive and very complete theme"
default y if !LV_CONF_MINIMAL
default y if !LV_COLOR_DEPTH_1 && !LV_CONF_MINIMAL
config LV_THEME_DEFAULT_DARK
bool "Yes to set dark mode, No to set light mode"
depends on LV_USE_THEME_DEFAULT
@@ -855,7 +895,10 @@ menu "LVGL configuration"
depends on LV_USE_THEME_DEFAULT
config LV_USE_THEME_BASIC
bool "A very simple theme that is a good starting point for a custom theme"
default y if !LV_CONF_MINIMAL
default y if !LV_COLOR_DEPTH_1 && !LV_CONF_MINIMAL
config LV_USE_THEME_MONO
bool "Monochrome theme, suitable for some E-paper & dot matrix displays"
default y if LV_COLOR_DEPTH_1 && !LV_CONF_MINIMAL
endmenu
menu "Layouts"
@@ -871,53 +914,55 @@ menu "LVGL configuration"
config LV_USE_FS_STDIO
bool "File system on top of stdio API"
config LV_FS_STDIO_LETTER
string "Set an upper cased letter on which the drive will accessible (e.g. 'A' i.e. 65 )"
depends on LV_USE_FS_STDIO != 0
int "Set an upper cased letter on which the drive will accessible (e.g. 'A' i.e. 65 )"
default 0
depends on LV_USE_FS_STDIO
config LV_FS_STDIO_PATH
string "Set the working directory"
depends on LV_USE_FS_STDIO != 0
depends on LV_USE_FS_STDIO
config LV_FS_STDIO_CACHE_SIZE
string ">0 to cache this number of bytes in lv_fs_read()"
depends on LV_USE_FS_STDIO != 0
int ">0 to cache this number of bytes in lv_fs_read()"
default 0
depends on LV_USE_FS_STDIO
config LV_USE_FS_POSIX
bool "File system on top of posix API"
config LV_FS_POSIX_LETTER
int "Set an upper cased letter on which the drive will accessible (e.g. 'A' i.e. 65)"
default 0
depends on LV_USE_FS_POSIX != 0
depends on LV_USE_FS_POSIX
config LV_FS_POSIX_PATH
string "Set the working directory"
depends on LV_USE_FS_POSIX != 0
depends on LV_USE_FS_POSIX
config LV_FS_POSIX_CACHE_SIZE
int ">0 to cache this number of bytes in lv_fs_read()"
default 0
depends on LV_USE_FS_POSIX != 0
depends on LV_USE_FS_POSIX
config LV_USE_FS_WIN32
bool "File system on top of Win32 API"
config LV_FS_WIN32_LETTER
int "Set an upper cased letter on which the drive will accessible (e.g. 'A' i.e. 65)"
default 0
depends on LV_USE_FS_WIN32 != 0
depends on LV_USE_FS_WIN32
config LV_FS_WIN32_PATH
string "Set the working directory"
depends on LV_USE_FS_WIN32 != 0
depends on LV_USE_FS_WIN32
config LV_FS_WIN32_CACHE_SIZE
int ">0 to cache this number of bytes in lv_fs_read()"
default 0
depends on LV_USE_FS_WIN32 != 0
depends on LV_USE_FS_WIN32
config LV_USE_FS_FATFS
bool "File system on top of FatFS"
config LV_FS_FATFS_LETTER
int "Set an upper cased letter on which the drive will accessible (e.g. 'A' i.e. 65)"
default 0
depends on LV_USE_FS_FATFS != 0
depends on LV_USE_FS_FATFS
config LV_FS_FATFS_CACHE_SIZE
int ">0 to cache this number of bytes in lv_fs_read()"
default 0
depends on LV_USE_FS_FATFS != 0
depends on LV_USE_FS_FATFS
config LV_USE_PNG
bool "PNG decoder library"
@@ -960,8 +1005,8 @@ menu "LVGL configuration"
config LV_USE_FFMPEG
bool "FFmpeg library"
config LV_FFMPEG_AV_DUMP_FORMAT
bool "Dump av format"
config LV_FFMPEG_DUMP_FORMAT
bool "Dump format"
depends on LV_USE_FFMPEG
default n
endmenu
@@ -974,6 +1019,47 @@ menu "LVGL configuration"
config LV_USE_MONKEY
bool "Enable Monkey test"
default n
config LV_USE_GRIDNAV
bool "Enable grid navigation"
default n
config LV_USE_FRAGMENT
bool "Enable lv_obj fragment"
default n
config LV_USE_IMGFONT
bool "draw img in label or span obj"
default n
config LV_USE_MSG
bool "Enable a published subscriber based messaging system"
default n
config LV_USE_IME_PINYIN
bool "Enable Pinyin input method"
default n
config LV_IME_PINYIN_USE_K9_MODE
bool "Enable Pinyin input method 9 key input mode"
depends on LV_USE_IME_PINYIN
default n
config LV_IME_PINYIN_K9_CAND_TEXT_NUM
int "Maximum number of candidate panels for 9-key input mode"
depends on LV_IME_PINYIN_USE_K9_MODE
default 3
config LV_IME_PINYIN_USE_DEFAULT_DICT
bool "Use built-in Thesaurus"
depends on LV_USE_IME_PINYIN
default y
help
If you do not use the default thesaurus, be sure to use lv_ime_pinyin after setting the thesauruss
config LV_IME_PINYIN_CAND_TEXT_NUM
int "Maximum number of candidate panels"
depends on LV_USE_IME_PINYIN
default 6
help
Set the maximum number of candidate panels that can be displayed.
This needs to be adjusted according to the size of the screen.
endmenu
menu "Examples"
@@ -998,6 +1084,10 @@ menu "LVGL configuration"
config LV_USE_DEMO_BENCHMARK
bool "Benchmark your system"
default n
config LV_DEMO_BENCHMARK_RGB565A8
bool "Use RGB565A8 images with 16 bit color depth instead of ARGB8565"
depends on LV_USE_DEMO_BENCHMARK
default n
config LV_USE_DEMO_STRESS
bool "Stress test for LVGL"

View File

@@ -17,7 +17,7 @@ LVGL provides everything you need to create an embedded GUI with easy-to-use gra
</h4>
**English** | [中文](./README_zh.md) |
**English** | [中文](./README_zh.md) | [Português do Brasil](./README_pt_BR.md)
---
@@ -40,11 +40,11 @@ LVGL provides everything you need to create an embedded GUI with easy-to-use gra
* Multi-language support with UTF-8 handling, CJK, Bidirectional and Arabic script support
* Fully customizable graphical elements via [CSS-like styles](https://docs.lvgl.io/master/overview/style.html)
* Powerful layouts inspired by CSS: [Flexbox](https://docs.lvgl.io/master/layouts/flex.html) and [Grid](https://docs.lvgl.io/master/layouts/grid.html)
* OS, External memory and GPU are supported but not required. (built in support for STM32 DMA2D, and NXP PXP and VGLite)
* OS, External memory and GPU are supported but not required. (built in support for STM32 DMA2D, SWM341 DMA2D, and NXP PXP and VGLite)
* Smooth rendering even with a [single frame buffer](https://docs.lvgl.io/master/porting/display.html)
* Written in C and compatible with C++
* Micropython Binding exposes [LVGL API in Micropython](https://blog.lvgl.io/2019-02-20/micropython-bindings)
* [Simulator](https://docs.lvgl.io/master/get-started/pc-simulator.html) to develop on PC without embedded hardware
* [Simulator](https://docs.lvgl.io/master/get-started/platforms/pc-simulator.html) to develop on PC without embedded hardware
* 100+ simple [Examples](https://github.com/lvgl/lvgl/tree/master/examples)
* [Documentation](http://docs.lvgl.io/) and API references online and in PDF
@@ -93,26 +93,27 @@ Basically, every modern controller (which is able to drive a display) is suitabl
*Note that the memory usage might vary depending on the architecture, compiler and build options.*
### Supported platforms
LVGL is completely platform independent and can be used with any MCU that fulfills the requirements.
LVGL is completely platform independent and can be used with any MCU that fulfills the requirements.
Just to mention some platforms:
- NXP: Kinetis, LPC, iMX, iMX RT
- STM32F1, STM32F3, STM32F4, STM32F7, STM32L4, STM32L5, STM32H7
- Microchip dsPIC33, PIC24, PIC32MX, PIC32MZ
- [Linux frame buffer](https://blog.lvgl.io/2018-01-03/linux_fb) (/dev/fb)
- [Raspberry Pi](http://www.vk3erw.com/index.php/16-software/63-raspberry-pi-official-7-touchscreen-and-littlevgl)
- [Raspberry Pi](https://github.com/lvgl/lv_port_linux_frame_buffer)
- [Espressif ESP32](https://github.com/lvgl/lv_port_esp32)
- [Infineon Aurix](https://github.com/lvgl/lv_port_aurix)
- Nordic NRF52 Bluetooth modules
- Quectel modems
- [SYNWIT SWM341](http://www.synwit.cn/)
LVGL is also available as:
- [Arduino library](https://docs.lvgl.io/master/get-started/arduino.html)
- [PlatformIO package](https://platformio.org/lib/show/12440/lvgl)
- [Arduino library](https://docs.lvgl.io/master/get-started/platforms/arduino.html)
- [PlatformIO package](https://registry.platformio.org/libraries/lvgl/lvgl)
- [Zephyr library](https://docs.zephyrproject.org/latest/reference/kconfig/CONFIG_LVGL.html)
- [ESP32 component](https://docs.lvgl.io/master/get-started/espressif.html)
- [ESP32 component](https://docs.lvgl.io/master/get-started/platforms/espressif.html)
- [NXP MCUXpresso component](https://www.nxp.com/design/software/embedded-software/lvgl-open-source-graphics-library:LITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY)
- [NuttX library](https://docs.lvgl.io/master/get-started/nuttx.html)
- [RT-Thread RTOS](https://docs.lvgl.io/master/get-started/rt-thread.html)
- [NuttX library](https://docs.lvgl.io/master/get-started/os/nuttx.html)
- [RT-Thread RTOS](https://docs.lvgl.io/master/get-started/os/rt-thread.html)
## Get started
@@ -120,7 +121,7 @@ This list shows the recommended way of learning the library:
1. Check the [Online demos](https://lvgl.io/demos) to see LVGL in action (3 minutes)
2. Read the [Introduction](https://docs.lvgl.io/master/intro/index.html) page of the documentation (5 minutes)
3. Get familiar with the basics on the [Quick overview](https://docs.lvgl.io/master/get-started/quick-overview.html) page (15 minutes)
4. Set up a [Simulator](https://docs.lvgl.io/master/get-started/pc-simulator.html) (10 minutes)
4. Set up a [Simulator](https://docs.lvgl.io/master/get-started/platforms/pc-simulator.html) (10 minutes)
5. Try out some [Examples](https://github.com/lvgl/lvgl/tree/master/examples)
6. Port LVGL to a board. See the [Porting](https://docs.lvgl.io/master/porting/index.html) guide or check the ready to use [Projects](https://github.com/lvgl?q=lv_port_)
7. Read the [Overview](https://docs.lvgl.io/master/overview/index.html) page to get a better understanding of the library (2-3 hours)
@@ -152,7 +153,7 @@ void btn_event_cb(lv_event_t * e)
}
```
### Micropython
Learn more about [Micropython](https://docs.lvgl.io/master/get-started/micropython.html).
Learn more about [Micropython](https://docs.lvgl.io/master/get-started/bindings/micropython.html).
```python
def btn_event_cb(e):
print("Clicked")

206
README_pt_BR.md Normal file
View File

@@ -0,0 +1,206 @@
<h1 align="center"> LVGL - Biblioteca gráfica leve e versátil</h1>
<p align="center">
<img src="https://lvgl.io/assets/images/lvgl_widgets_demo.gif">
</p>
<p align="center">
O LVGL fornece tudo o que você precisa para criar uma GUI incorporada com elementos gráficos fáceis de usar, belos efeitos visuais e um baixo consumo de memória.
</p>
<h4 align="center">
<a href="https://lvgl.io">Site</a> &middot;
<a href="https://docs.lvgl.io/">Documentação</a> &middot;
<a href="https://forum.lvgl.io">Fórum</a> &middot;
<a href="https://lvgl.io/services">Serviços</a> &middot;
<a href="https://docs.lvgl.io/master/examples.html">Exemplos interativos</a>
</h4>
[English](./README.md) | [中文](./README_zh.md) | **Português do Brasil**
---
### Tabela de conteúdo
- [Visão Geral](#visão-geral)
- [Iniciando](#iniciando)
- [Exemplos](#exemplos)
- [Serviços](#serviços)
- [Contribuindo](#contribuindo)
## Visão Geral
### Recursos
* Poderosos [widgets](https://docs.lvgl.io/master/widgets/index.html): botões, gráficos, listas, controles deslizantes (sliders), imagens, etc.
* Mecanismo gráfico avançado: animações, anti-aliasing, opacidade, rolagem suave, modos de mesclagem (blending modes), etc.
* Suporte à [vários dispositivos de entrada](https://docs.lvgl.io/master/overview/indev.html): tela sensível ao toque, mouse, teclado, codificador, botões, etc.
* Suporte à [vários monitores](https://docs.lvgl.io/master/overview/display.html)
* Pode ser usado com qualquer microcontrolador e display, independente do hardware
* Escalável para operar com pouca memória (64 kB Flash, 16 kB RAM)
* Suporte multilíngue com manipulação UTF-8, suporte ao alfabeto bidirecional, árabe e CJK (Chinês, Japonês e Coreano)
* Elementos gráficos totalmente personalizáveis por meio de [CSS](https://docs.lvgl.io/master/overview/style.html)
* Layouts poderosos inspirados em CSS: [Flexbox](https://docs.lvgl.io/master/layouts/flex.html) e [Grid](https://docs.lvgl.io/master/layouts/grid.html)
* SO, memória externa e GPU são suportados, mas não obrigatórios. (suporte integrado para STM32 DMA2D, SWM341 DMA2D e NXP PXP e VGLite)
* Renderização suave mesmo com um [buffer de quadro único](https://docs.lvgl.io/master/porting/display.html) (single frame buffer)
* Escrito em C e compatível com C++
* Uso do LittlevGL com Micropython simplificado com [LVGL API in Micropython](https://blog.lvgl.io/2019-02-20/micropython-bindings)
* [Simulador](https://docs.lvgl.io/master/get-started/platforms/pc-simulator.html) para desenvolver no PC sem hardware embutido
* Mais de 100 [exemplos simples](https://github.com/lvgl/lvgl/tree/master/examples)
* [Documentação](http://docs.lvgl.io/) e referências de API online e em PDF
### Requerimentos
Basicamente, todo controlador moderno (que é capaz de acionar um display) é adequado para executar LVGL. Os requisitos mínimos são:
<table>
<tr>
<td>
<strong>Nome</strong>
</td>
<td>
<strong>Minímo</strong>
</td>
<td>
<strong>Recomendado</strong>
</td>
</tr>
<tr>
<td>
<strong>Arquitetura</strong>
</td>
<td colspan="2">Microcontrolador ou processador de 16, 32 ou 64 bits</td>
</tr>
<tr>
<td>
<strong>Clock</strong>
</td>
<td>&gt; 16 MHz</td>
<td>&gt; 48 MHz</td>
</tr>
<tr>
<td>
<strong>Flash/ROM</strong>
</td>
<td>&gt; 64 kB</td>
<td>&gt; 180 kB</td>
</tr>
<tr>
<td>
<strong>RAM estática</strong>
</td>
<td>&gt; 16 kB</td>
<td>&gt; 48 kB</td>
</tr>
<tr>
<td>
<strong>Draw buffer</strong>
</td>
<td>&gt; 1 &times; <em>hor. res.</em> pixels</td>
<td>&gt; tamanho da tela de 1/10</td>
</tr>
<tr>
<td>
<strong>Compilador</strong>
</td>
<td colspan="2">Padrão C99 ou mais recente</td>
</tr>
</table>
*Observe que o uso de memória pode variar dependendo da arquitetura, do compilador e das opções de compilação.*
### Plataformas suportadas
O LVGL é completamente independente de plataforma e pode ser usado com qualquer MCU que atenda aos requisitos.
Apenas para citar algumas plataformas:
- NXP: Kinetis, LPC, iMX, iMX RT
- STM32F1, STM32F3, STM32F4, STM32F7, STM32L4, STM32L5, STM32H7
- Microchip dsPIC33, PIC24, PIC32MX, PIC32MZ
- [Linux frame buffer](https://blog.lvgl.io/2018-01-03/linux_fb) (/dev/fb)
- [Raspberry Pi](http://www.vk3erw.com/index.php/16-software/63-raspberry-pi-official-7-touchscreen-and-littlevgl)
- [Espressif ESP32](https://github.com/lvgl/lv_port_esp32)
- [Infineon Aurix](https://github.com/lvgl/lv_port_aurix)
- Nordic NRF52 Bluetooth modules
- Quectel modems
- [SYNWIT SWM341](https://www.synwit.cn/)
LVGL também está disponível para:
- [Arduino library](https://docs.lvgl.io/master/get-started/platforms/arduino.html)
- [PlatformIO package](https://registry.platformio.org/libraries/lvgl/lvgl)
- [Zephyr library](https://docs.zephyrproject.org/latest/reference/kconfig/CONFIG_LVGL.html)
- [ESP32 component](https://docs.lvgl.io/master/get-started/platforms/espressif.html)
- [NXP MCUXpresso component](https://www.nxp.com/design/software/embedded-software/lvgl-open-source-graphics-library:LITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY)
- [NuttX library](https://docs.lvgl.io/master/get-started/os/nuttx.html)
- [RT-Thread RTOS](https://docs.lvgl.io/master/get-started/os/rt-thread.html)
## Iniciando
Esta lista mostra a maneira recomendada de aprender sobre a biblioteca:
1. Confira as [demos on-line](https://lvgl.io/demos) para ver o LVGL em ação (3 minutos)
2. Leia a [introdução](https://docs.lvgl.io/master/intro/index.html) da documentação (5 minutos)
3. Familiarize-se com o básico da [Visão geral rápida](https://docs.lvgl.io/master/get-started/quick-overview.html) (15 minutos)
4. Configure um [simulador](https://docs.lvgl.io/master/get-started/platforms/pc-simulator.html) (10 minutos)
5. Experimente alguns [Exemplos](https://github.com/lvgl/lvgl/tree/master/examples)
6. Placa para porta LVGL. Veja o guia [porting](https://docs.lvgl.io/master/porting/index.html) ou verifique o pronto para usar [Projects](https://github.com/lvgl?q=lv_port_)
7. Leia a [visão geral](https://docs.lvgl.io/master/overview/index.html) para entender melhor a biblioteca (2-3 horas)
8. Verifique a documentação dos [widgets](https://docs.lvgl.io/master/widgets/index.html) para ver seus recursos e como utilizá-los
9. Se você tiver dúvidas, acesse o [fórum](http://forum.lvgl.io/)
10. Leia o guia de [contribuição](https://docs.lvgl.io/master/CONTRIBUTING.html) para ver como você pode ajudar a melhorar o LVGL (15 minutos)
## Exemplos
Para mais exemplos, veja a pasta [examples](https://github.com/lvgl/lvgl/tree/master/examples).
![Exemplo de botão LVGL com rótulo (label)](https://github.com/lvgl/lvgl/raw/master/docs/misc/btn_example.png)
### C
```c
lv_obj_t * button = lv_btn_create(lv_scr_act()); /* Adiciona um botão à tela atual */
lv_obj_set_pos(button, 10, 10); /* Define uma posição ao botão na tela */
lv_obj_set_size(button, 100, 50); /* Define o tamanho */
lv_obj_add_event_cb(button, button_event_callback, LV_EVENT_CLICKED, NULL); /* Atribui um retorno de chamada (callback) */
lv_obj_t * label = lv_label_create(button); /* Adiciona um rótulo (label) */
lv_label_set_text(label, "Clique aqui"); /* Define o texto do rótulo (label) */
lv_obj_center(label); /* Alinha o texto ao centro */
...
void button_event_callback(lv_event_t * e)
{
printf("Clicado\n");
}
```
### Micropython
Saiba mais em [Micropython](https://docs.lvgl.io/master/get-started/bindings/micropython.html)
```python
def button_event_callback(event):
print("Clicado")
# Cria um botão e um rótulo (label)
button = lv.btn(lv.scr_act())
button.set_pos(10, 10)
button.set_size(100, 50)
button.add_event_cb(button_event_callback, lv.EVENT.CLICKED, None)
label = lv.label(button)
label.set_text("Cliquq aqui")
label.center()
```
## Serviços
O LVGL Kft foi estabelecido para fornecer uma base sólida para a biblioteca LVGL. Oferecemos vários tipos de serviços
para ajudá-lo no desenvolvimento da interface do usuário:
- Design gráfico
- Implementação de IU
- Consultoria/Suporte
Para mais informações, consulte [LVGL Serviços](https://lvgl.io/services). Sinta-se à vontade para entrar em contato
conosco se tiver alguma dúvida.
## Contribuindo
O LVGL é um projeto aberto e sua contribuição é muito bem-vinda. Há muitas maneiras de contribuir, desde simplesmente
falando sobre seu projeto, escrevendo exemplos, melhorando a documentação, corrigindo bugs até hospedar seu próprio
projeto sob a organização LVGL.
Para obter uma descrição detalhada das oportunidades de contribuição, visite a seção de [contribuição](https://docs.lvgl.io/master/CONTRIBUTING.html) da documentação.

View File

@@ -20,7 +20,7 @@ LVGL是一个高度可裁剪、低资源占用、界面美观且易用的嵌入
</h4>
[English](./README.md) | **中文** |
[English](./README.md) | **中文** | [Português do Brasil](./README_pt_BR.md)
---
@@ -42,11 +42,11 @@ LVGL是一个高度可裁剪、低资源占用、界面美观且易用的嵌入
* 配置可裁剪最低资源占用64 kB Flash16 kB RAM
* 基于UTF-8的多语种支持例如中文、日文、韩文、阿拉伯文等
* 可以通过[类CSS](https://docs.lvgl.io/master/overview/style.html)的方式来设计、布局图形界面(例如:[Flexbox](https://docs.lvgl.io/master/layouts/flex.html)、[Grid](https://docs.lvgl.io/master/layouts/grid.html)
* 支持操作系统、外置内存、以及硬件加速LVGL已内建支持STM32 DMA2D、NXP PXP和VGLite
* 支持操作系统、外置内存、以及硬件加速LVGL已内建支持STM32 DMA2D、SWM341 DMA2D、NXP PXP和VGLite
* 即便仅有[单缓冲区(frame buffer)](https://docs.lvgl.io/master/porting/display.html)的情况下,也可保证渲染如丝般顺滑
* 全部由C编写完成并支持C++调用
* 支持Micropython编程参见[LVGL API in Micropython](https://blog.lvgl.io/2019-02-20/micropython-bindings)
* 支持[模拟器](https://docs.lvgl.io/master/get-started/pc-simulator.html)仿真,可以无硬件依托进行开发
* 支持[模拟器](https://docs.lvgl.io/master/get-started/platforms/pc-simulator.html)仿真,可以无硬件依托进行开发
* 丰富详实的[例程](https://github.com/lvgl/lvgl/tree/master/examples)
* 详尽的[文档](http://docs.lvgl.io/)以及API参考手册可线上查阅或可下载为PDF格式
@@ -95,7 +95,7 @@ LVGL是一个高度可裁剪、低资源占用、界面美观且易用的嵌入
*注意:资源占用情况与具体硬件平台、编译器等因素有关,上表中仅给出参考值*
### 已经支持的平台
LVGL本身并不依赖特定的硬件平台任何满足LVGL硬件配置要求的微控制器均可运行LVGL。
LVGL本身并不依赖特定的硬件平台任何满足LVGL硬件配置要求的微控制器均可运行LVGL。
如下仅列举其中一部分:
- NXP: Kinetis, LPC, iMX, iMX RT
@@ -107,14 +107,15 @@ LVGL本身并不依赖特定的硬件平台任何满足LVGL硬件配置要求
- [Infineon Aurix](https://github.com/lvgl/lv_port_aurix)
- Nordic NRF52 Bluetooth modules
- Quectel modems
- [SYNWIT SWM341](https://www.synwit.cn/)
LVGL也支持
- [Arduino library](https://docs.lvgl.io/master/get-started/arduino.html)
- [Arduino library](https://docs.lvgl.io/master/get-started/platforms/arduino.html)
- [PlatformIO package](https://platformio.org/lib/show/12440/lvgl)
- [Zephyr library](https://docs.zephyrproject.org/latest/reference/kconfig/CONFIG_LVGL.html)
- [ESP32 component](https://docs.lvgl.io/master/get-started/espressif.html)
- [ESP32 component](https://docs.lvgl.io/master/get-started/platforms/espressif.html)
- [NXP MCUXpresso component](https://www.nxp.com/design/software/embedded-software/lvgl-open-source-graphics-library:LITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY)
- [NuttX library](https://docs.lvgl.io/master/get-started/nuttx.html)
- [NuttX library](https://docs.lvgl.io/master/get-started/os/nuttx.html)
- [RT-Thread RTOS](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/packages-manual/lvgl-docs/introduction)
@@ -123,7 +124,7 @@ LVGL也支持
1. 使用[网页在线例程](https://lvgl.io/demos)来体验LVGL3分钟
2. 阅读文档[简介](https://docs.lvgl.io/master/intro/index.html)章节来初步了解LVGL5分钟
3. 再来阅读一下文档快速[快速概览](https://docs.lvgl.io/master/get-started/quick-overview.html)章节来了解LVGL的基本知识15分钟
4. 学习如何使用[模拟器](https://docs.lvgl.io/master/get-started/pc-simulator.html)来在电脑上仿真LVGL10分钟
4. 学习如何使用[模拟器](https://docs.lvgl.io/master/get-started/platforms/pc-simulator.html)来在电脑上仿真LVGL10分钟
5. 试着动手实践一些[例程](https://github.com/lvgl/lvgl/tree/master/examples)
6. 参考[移植指南](https://docs.lvgl.io/master/porting/index.html)尝试将LVGL移植到一块开发板上LVGL也已经提供了一些移植好的[工程](https://github.com/lvgl?q=lv_port_)
7. 仔细阅读文档[总览](https://docs.lvgl.io/master/overview/index.html)章节来更加深入的了解和熟悉LVGL2-3小时
@@ -155,7 +156,7 @@ void btn_event_cb(lv_event_t * e)
}
```
### Micropython
更多信息请到 [Micropython官网](https://docs.lvgl.io/master/get-started/micropython.html) 查询.
更多信息请到 [Micropython官网](https://docs.lvgl.io/master/get-started/bindings/micropython.html) 查询.
```python
def btn_event_cb(e):
print("Clicked")
@@ -190,4 +191,3 @@ LVGL是一个开源项目非常欢迎您参与到社区贡献当中。您有
- 修复bug
请参见文档[如何向社区贡献](https://docs.lvgl.io/master/CONTRIBUTING.html)章节来获取更多信息。

View File

@@ -1,7 +1,7 @@
# Demos for LVGL
## Add the examples to your projects
1. demos can be found in the 'demos' folder once you clone the lvgl.
1. demos can be found in the 'demos' folder once you clone the lvgl.
2. In the ***lv_conf.h*** or equivalent places, you can find demo related macros, change its value to enable or disable specified demos:
@@ -38,7 +38,7 @@
...
```
3. If your development environment or toolchain does not add source files inside '***lvgl***' folder automatically, ensure the `demos` folder is included for compilation.
3. If your development environment or toolchain does not add source files inside '***lvgl***' folder automatically, ensure the `demos` folder is included for compilation.
4. Include "***demos/lv_demos.h***" in your application source file, for example:
```c
@@ -53,11 +53,11 @@
## Demos
### Widgets
Shows how the widgets look like out of the box using the built-in material theme.
Shows how the widgets look like out of the box using the built-in material theme.
See in [lv_demo_widgets](https://github.com/lvgl/lv_examples/tree/master/src/lv_demo_widgets) folder.
See in [widgets](https://github.com/lvgl/lvgl/tree/master/demos/widgets) folder.
<img src="https://github.com/lvgl/lv_examples/blob/master/src/lv_demo_widgets/screenshot1.png?raw=true" width=600px alt="Basic demo to show the widgets of LVGL">
<img src="https://github.com/lvgl/lvgl/tree/master/demos/widgets/screenshot1.png?raw=true" width=600px alt="Basic demo to show the widgets of LVGL">
For running this demo properly, please make sure **LV_MEM_SIZE** is at least **38KB** (and **48KB** is recommended):
@@ -68,29 +68,29 @@ For running this demo properly, please make sure **LV_MEM_SIZE** is at least **3
### Music player
The music player demo shows what kind of modern, smartphone-like user interfaces can be created on LVGL. It works the best with display with 480x272 or 272x480 resolution.
The music player demo shows what kind of modern, smartphone-like user interfaces can be created on LVGL. It works the best with display with 480x272 or 272x480 resolution.
See in [lv_demo_music](https://github.com/lvgl/lv_examples/tree/master/src/lv_demo_music) folder.
See in [music](https://github.com/lvgl/lvgl/tree/master/demos/music) folder.
<img src="https://github.com/lvgl/lv_examples/blob/master/src/lv_demo_music/screenshot1.gif?raw=true" width=600px alt="Music player demo with LVGL">
<img src="https://github.com/lvgl/lvgl/tree/master/demos/music/screenshot1.gif?raw=true" width=600px alt="Music player demo with LVGL">
### Keypad and encoder
LVGL allows you to control the widgets with a keypad and/or encoder without a touchpad. This demo shows how to handle buttons, drop-down lists, rollers, sliders, switches, and text inputs without touchpad.
Learn more about the touchpad-less usage of LVGL [here](https://docs.lvgl.io/v7/en/html/overview/indev.html#keypad-and-encoder).
LVGL allows you to control the widgets with a keypad and/or encoder without a touchpad. This demo shows how to handle buttons, drop-down lists, rollers, sliders, switches, and text inputs without touchpad.
Learn more about the touchpad-less usage of LVGL [here](https://docs.lvgl.io/master/overview/indev.html#keypad-and-encoder).
See in [lv_demo_keypad_encoder](https://github.com/lvgl/lv_examples/tree/master/src/lv_demo_keypad_encoder) folder.
See in [keypad_encoder](https://github.com/lvgl/lvgl/tree/master/demos/keypad_encoder) folder.
<img src="https://github.com/lvgl/lv_examples/blob/master/src/lv_demo_keypad_encoder/screenshot1.png?raw=true" width=600px alt="Keypad and encoder navigation in LVGL embedded GUI library">
<img src="https://github.com/lvgl/lvgl/tree/master/demos/keypad_encoder/screenshot1.png?raw=true" width=600px alt="Keypad and encoder navigation in LVGL embedded GUI library">
### Benchmark
A demo to measure the performance of LVGL or to compare different settings.
See in [lv_demo_benchmark](https://github.com/lvgl/lv_examples/tree/master/src/lv_demo_benchmark) folder.
<img src="https://github.com/lvgl/lv_examples/blob/master/src/lv_demo_benchmark/screenshot1.png?raw=true" width=600px alt="Benchmark demo with LVGL embedded GUI library">
A demo to measure the performance of LVGL or to compare different settings.
See in [benchmark](https://github.com/lvgl/lvgl/tree/master/demos/benchmark) folder.
<img src="https://github.com/lvgl/lvgl/tree/master/demos/benchmark/screenshot1.png?raw=true" width=600px alt="Benchmark demo with LVGL embedded GUI library">
### Stress
A stress test for LVGL. It contains a lot of object creation, deletion, animations, style usage, and so on. It can be used if there is any memory corruption during heavy usage or any memory leaks.
See in [lv_demo_stress](https://github.com/lvgl/lv_examples/tree/master/src/lv_demo_stress) folder.
<img src="https://github.com/lvgl/lv_examples/blob/master/src/lv_demo_stress/screenshot1.png?raw=true" width=600px alt="Stress test for LVGL">
A stress test for LVGL. It contains a lot of object creation, deletion, animations, style usage, and so on. It can be used if there is any memory corruption during heavy usage or any memory leaks.
See in [stress](https://github.com/lvgl/lvgl/tree/master/demos/stress) folder.
<img src="https://github.com/lvgl/lvgl/tree/master/demos/stress/screenshot1.png?raw=true" width=600px alt="Stress test for LVGL">
## Contributing
For contribution and coding style guidelines, please refer to the file docs/CONTRIBUTING.md in the main LVGL repo:

View File

@@ -2,48 +2,133 @@
## Overview
The benchmark demo tests the performance in various cases.
For example rectangle, border, shadow, text, image blending, image transformation, blending modes, etc.
The benchmark demo tests the performance in various cases.
For example rectangle, border, shadow, text, image blending, image transformation, blending modes, etc.
All tests are repeated with 50% opacity.
The size and position of the objects during testing are set with a pseudo random number to make the benchmark repeatable.
The size and position of the objects during testing are set with a pseudo random number to make the benchmark repeatable.
On to top of the screen the title of the current test step, and the result of the previous step is displayed.
## Run the benchmark
- In `lv_conf.h` or equivalent places set `LV_USE_DEMO_BENCHMARK 1`
- After `lv_init()` and initializing the drivers call `lv_demo_benchmark()`
- If you only want to run a specific scene for any purpose (e.g. debug, performance optimization etc.), you can call `lv_demo_benchmark_run_scene()` instead of `lv_demo_benchmark()`and pass the scene number.
- If you enabled trace output by setting macro `LV_USE_LOG` to `1` and trace level `LV_LOG_LEVEL` to `LV_LOG_LEVEL_USER` or higher, benchmark results are printed out in `csv` format.
- If you want to know when the testing is finished, you can register a callback function via `lv_demo_benchmark_register_finished_handler()` before calling `lv_demo_benchmark()` or `lv_demo_benchmark_run_scene()`.
- If you want to know the maximum rendering performance of the system, call `lv_demo_benchmark_set_max_speed(true)` before `lv_demo_benchmark()`.
## Interpret the result
The FPS is measured like this:
- load the next step
- in the display driver's `monitor_cb` accumulate the time-to-render and the number of cycles
- in the display driver's `monitor_cb` accumulate the time-to-render and the number of cycles
- measure for 1 second
- calculate `FPS = time_sum / render_cnt`
Note that it can result in very high FPS results for simple cases.
E.g. if some simple rectangles are drawn in 5 ms, the benchmark will tell it's 200 FPS.
So it ignores `LV_DISP_REFR_PERIOD` which tells LVGL how often it should refresh the screen.
Note that it can result in very high FPS results for simple cases.
E.g. if some simple rectangles are drawn in 5 ms, the benchmark will tell it's 200 FPS.
So it ignores `LV_DISP_REFR_PERIOD` which tells LVGL how often it should refresh the screen.
In other words, the benchmark shows the FPS from the pure rendering time.
By default, only the changed areas are refreshed. It means if only a few pixels are changed in 1 ms the benchmark will show 1000 FPS. To measure the performance with full screen refresh uncomment `lv_obj_invalidate(lv_scr_act())` in `monitor_cb()` in `lv_demo_benchmark.c`.
![LVGL benchmark running](https://github.com/lvgl/lv_examples/blob/master/src/lv_demo_benchmark/screenshot1.png?raw=true)
![LVGL benchmark running](screenshot1.png)
If you are doing performance analysis for 2D image processing optimization, LCD latency (flushing data to LCD) introduced by `disp_flush()` might dilute the performance results of the LVGL drawing process, hence make it harder to see your optimization results (gain or loss). To avoid such problem, please:
1. Use a flag to control the LCD flushing inside `disp_flush()`. For example:
```c
volatile bool disp_flush_enabled = true;
/* Enable updating the screen (the flushing process) when disp_flush() is called by LVGL
*/
void disp_enable_update(void)
{
disp_flush_enabled = true;
}
/* Disable updating the screen (the flushing process) when disp_flush() is called by LVGL
*/
void disp_disable_update(void)
{
disp_flush_enabled = false;
}
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
if(disp_flush_enabled) {
GLCD_DrawBitmap(area->x1, //!< x
area->y1, //!< y
area->x2 - area->x1 + 1, //!< width
area->y2 - area->y1 + 1, //!< height
(const uint8_t *)color_p);
}
/*IMPORTANT!!!
*Inform the graphics library that you are ready with the flushing*/
lv_disp_flush_ready(disp_drv);
}
```
2. Disable flushing before calling `lv_demo_benchmark()` or `lv_demo_benchmark_run_scene()`, for example:
```c
extern void disp_enable_update(void);
extern void disp_disable_update(void);
static void on_benchmark_finished(void)
{
disp_enable_update();
}
int main(void)
{
lv_init();
lv_port_disp_init();
lv_port_indev_init();
LV_LOG("Running LVGL Benchmark...");
LV_LOG("Please stand by...");
LV_LOG("NOTE: You will NOT see anything until the end.");
disp_disable_update();
lv_demo_benchmark_set_finished_cb(&on_benchmark_finished);
lv_demo_benchmark_set_max_speed(true);
lv_demo_benchmark();
//lv_demo_benchmark_run_scene(43); // run scene no 31
...
while(1){
lv_timer_handler(); //! run lv task at the max speed
}
}
```
## Result summary
3. Alternatively, you can use trace output to get the benchmark results in csv format by:
- Setting macro `LV_USE_LOG` to `1`
- Setting trace level `LV_LOG_LEVEL` to `LV_LOG_LEVEL_USER` or higher.
## Result summary
In the end, a table is created to display measured FPS values.
On top of the summary screen, the "Weighted FPS" value is shown.
In this, the result of the more common cases are taken into account with a higher weight.
On top of the summary screen, the "Weighted FPS" value is shown.
In this, the result of the more common cases are taken into account with a higher weight.
"Opa. speed" shows the speed of the measurements with opacity compared to full opacity.
E.g. "Opa. speed = 90%" means that rendering with opacity is 10% slower.
"Opa. speed" shows the speed of the measurements with opacity compared to full opacity.
E.g. "Opa. speed = 90%" means that rendering with opacity is 10% slower.
In the first section of the table, "Slow but common cases", those cases are displayed which are considered common but were slower than 20 FPS.
Below this in the "All cases section" all the results are shown. The < 10 FPS results are shown with red, the >= 10 but < 20 FPS values are displayed with orange.
![LVGL benchmark result summary](https://github.com/lvgl/lv_examples/blob/master/src/lv_demo_benchmark/screenshot2.png?raw=true)
![LVGL benchmark result summary](https://github.com/lvgl/lvgl/tree/master/demos/benchmark/screenshot2.png?raw=true)

View File

@@ -0,0 +1,224 @@
#include "../../../lvgl.h"
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMG_IMG_BENCHMARK_COGWHEEL_RGB565A8
#define LV_ATTRIBUTE_IMG_IMG_BENCHMARK_COGWHEEL_RGB565A8
#endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_IMG_BENCHMARK_COGWHEEL_RGB565A8 uint8_t img_benchmark_cogwheel_rgb565a8_map[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x94, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xb2, 0x63, 0x33, 0x74, 0x5a, 0xc6, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0xf7, 0x74, 0x7c, 0xd2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xb2, 0x63, 0xd2, 0x6b, 0x74, 0x84, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9e, 0xf7, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1d, 0xdf, 0x33, 0x7c, 0xd2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xd2, 0x63, 0x13, 0x74, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x39, 0xbe, 0x36, 0x9d, 0xdc, 0xde, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x1d, 0xdf, 0xf6, 0x8c, 0x34, 0x74, 0x57, 0x9d, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0xd6, 0x54, 0x7c, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x12, 0x74, 0xd2, 0x6b, 0x13, 0x74, 0xdc, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf9, 0xb5, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x12, 0x74, 0xf5, 0x94, 0x1c, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1a, 0xbe, 0xd6, 0x8c, 0x95, 0x84, 0x74, 0x7c, 0x34, 0x74, 0x54, 0x7c, 0xb8, 0xad, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd9, 0xb5, 0x54, 0x7c, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x12, 0x74, 0xd2, 0x6b, 0x12, 0x74, 0xb4, 0x8c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xef, 0x74, 0x84, 0x90, 0x5b, 0x90, 0x5b, 0x90, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0x12, 0x74, 0x94, 0x84, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb9, 0xad, 0x75, 0x7c, 0x34, 0x74, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x33, 0x74, 0x95, 0x84, 0x7d, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x94, 0x33, 0x74, 0xf3, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x12, 0x74, 0xf2, 0x6b, 0xf2, 0x73, 0x32, 0x7c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x36, 0x9d, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x5b, 0x50, 0x5b, 0x90, 0x63, 0x5d, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xf7, 0xd6, 0x8c, 0x34, 0x74, 0x55, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x34, 0x74, 0x54, 0x7c, 0xb8, 0xad, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x95, 0x84, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0x12, 0x7c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0xf7, 0x33, 0x74, 0x91, 0x5b, 0xd1, 0x6b, 0xd1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x39, 0xc6, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x17, 0x95, 0x54, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x74, 0x54, 0x7c, 0xfc, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x74, 0x84, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xd2, 0x6b, 0xf2, 0x73, 0x5a, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb8, 0xad, 0xf2, 0x6b, 0xb1, 0x63, 0xd1, 0x6b, 0xd1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0xd1, 0x6b, 0x15, 0x9d, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x9d, 0x75, 0x7c, 0x55, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x13, 0x74, 0x37, 0x9d, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0xde, 0x98, 0xa5, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0x53, 0x84, 0x3a, 0xc6, 0xff, 0xff, 0x00, 0x00, 0xbb, 0xd6, 0x12, 0x74, 0xb1, 0x63, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0xd1, 0x6b, 0xf5, 0x9c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x57, 0x9d, 0x74, 0x7c, 0x54, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x74, 0x7c, 0x57, 0x9d, 0x7b, 0xc6, 0x5a, 0xce, 0x1a, 0xbe, 0x78, 0xa5, 0xb5, 0x84, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0x54, 0x7c, 0x36, 0x9d, 0xf8, 0xb5, 0x94, 0x84, 0xb1, 0x63, 0xb1, 0x63, 0xd2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0xd1, 0x73, 0x36, 0xa5, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3a, 0xbe, 0x95, 0x84, 0x54, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x34, 0x7c, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x12, 0x74, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd1, 0x63, 0xf2, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0xd1, 0x73, 0xbb, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x17, 0x95, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x34, 0x7c, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x12, 0x74, 0x12, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb0, 0x63, 0xd0, 0x73, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xef, 0xf5, 0x94, 0x1c, 0xdf, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3d, 0xe7, 0xdf, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xbe, 0x95, 0x84, 0x54, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x74, 0x54, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x12, 0x74, 0x12, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xd0, 0x73, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0xf7, 0x57, 0xa5, 0x12, 0x74, 0xb1, 0x63, 0xf1, 0x6b, 0x56, 0x9d, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb9, 0xad, 0x17, 0x95, 0x38, 0x9d, 0x3d, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x37, 0x9d, 0x75, 0x7c, 0x54, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x74, 0x34, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x12, 0x74, 0x12, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0xd1, 0x6b, 0x56, 0xa5, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x94, 0xd1, 0x6b, 0x4f, 0x5b, 0x70, 0x5b, 0x0f, 0x53, 0xb0, 0x63, 0xf5, 0x94, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x58, 0x9d, 0xd6, 0x8c, 0x75, 0x7c, 0x96, 0x84, 0xd6, 0x8c, 0xbc, 0xce, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x98, 0xa5, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x33, 0x74, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x73, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x12, 0x74, 0x36, 0x9d, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xef, 0x73, 0x7c, 0x90, 0x63, 0x4f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x2f, 0x53, 0x90, 0x63, 0xb4, 0x8c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0xa5, 0xd6, 0x8c, 0x96, 0x84, 0xb6, 0x84, 0x96, 0x84, 0x76, 0x84, 0xb6, 0x84, 0xb9, 0xad, 0xbf, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xb5, 0xd6, 0x8c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x84, 0x75, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x74, 0x34, 0x74, 0x33, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x73, 0xd2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0xb1, 0x63, 0xf2, 0x73, 0x39, 0xbe, 0xfc, 0xde, 0x12, 0x74, 0x90, 0x63, 0x4f, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x2e, 0x53, 0x90, 0x63, 0x36, 0x9d, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb9, 0xad, 0xd7, 0x8c, 0x96, 0x84, 0xb6, 0x84, 0xb6, 0x84, 0xb6, 0x84, 0x96, 0x84, 0x96, 0x84, 0xb6, 0x84, 0x78, 0xa5, 0x5e, 0xef, 0xff, 0xff, 0xf9, 0xb5, 0xd6, 0x8c, 0x75, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x13, 0x74, 0xf2, 0x6b, 0xb1, 0x63, 0x70, 0x5b, 0x6f, 0x5b, 0x4f, 0x53, 0x6f, 0x5b, 0xf2, 0x6b, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xb1, 0x63, 0x4f, 0x5b, 0x2f, 0x53, 0x4f, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb0, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x32, 0x74, 0x12, 0x74, 0x70, 0x5b, 0x4f, 0x5b, 0x70, 0x5b, 0x90, 0x5b, 0x90, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x53, 0x7c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x37, 0x9d, 0x96, 0x84, 0xb6, 0x84, 0xb6, 0x84, 0xb6, 0x84, 0xb6, 0x84, 0x96, 0x84, 0x96, 0x84, 0x75, 0x84, 0x95, 0x84, 0xb6, 0x84, 0x95, 0x84, 0x95, 0x84, 0x75, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x75, 0x84, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x54, 0x7c, 0x33, 0x74, 0xf2, 0x6b, 0xd1, 0x6b, 0x90, 0x63, 0x6f, 0x5b, 0x2e, 0x53, 0x0d, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0x2e, 0x53, 0xd2, 0x6b, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0x90, 0x63, 0x0e, 0x53, 0xed, 0x4a, 0x0d, 0x4b, 0x0e, 0x4b, 0x2e, 0x53, 0x4f, 0x5b, 0x6f, 0x5b, 0x90, 0x63, 0x91, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x5b, 0x90, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x53, 0x6f, 0x5b, 0x94, 0x8c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x37, 0x9d, 0x96, 0x84, 0x96, 0x84, 0xb6, 0x84, 0x96, 0x84, 0x96, 0x84, 0x96, 0x84, 0x96, 0x84, 0x96, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x7c, 0x95, 0x84, 0x95, 0x84, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x54, 0x7c, 0x34, 0x7c, 0xf2, 0x6b, 0xb1, 0x63, 0x4f, 0x53, 0x0d, 0x53, 0x0d, 0x4b, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0d, 0x4b, 0x2f, 0x53, 0xd2, 0x6b, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0x90, 0x63, 0x2e, 0x53, 0x0d, 0x4b, 0x0d, 0x4b, 0x0d, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x4f, 0x53, 0x90, 0x5b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x5b, 0x90, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x70, 0x63, 0x70, 0x5b, 0x90, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x2f, 0x53, 0xb0, 0x6b, 0x35, 0xa5, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0xc6, 0xb6, 0x84, 0x75, 0x84, 0x96, 0x84, 0x96, 0x84, 0x96, 0x84, 0x96, 0x84, 0x96, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x75, 0x84, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x54, 0x7c, 0xf2, 0x6b, 0x90, 0x5b, 0x2f, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x0d, 0x4b, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x2f, 0x53, 0xd2, 0x6b, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0x91, 0x63, 0x2e, 0x53, 0xed, 0x4a, 0x0d, 0x4b, 0x0d, 0x4b, 0x0d, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x4f, 0x53, 0x4f, 0x5b, 0x70, 0x5b, 0x91, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0xd1, 0x7b, 0x1c, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1a, 0xbe, 0x75, 0x84, 0x96, 0x84, 0xb6, 0x84, 0x96, 0x84, 0x96, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x75, 0x7c, 0x13, 0x74, 0xb1, 0x63, 0x4f, 0x5b, 0x0e, 0x53, 0x0d, 0x4b, 0x0d, 0x4b, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0xee, 0x4a, 0xed, 0x4a, 0x0e, 0x53, 0x4f, 0x63, 0x90, 0x6b, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xd2, 0x6b, 0x4f, 0x5b, 0xcc, 0x52, 0x0d, 0x53, 0x6f, 0x5b, 0x4e, 0x5b, 0xed, 0x4a, 0xcd, 0x42, 0xed, 0x4a, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x4f, 0x5b, 0x6f, 0x5b, 0x90, 0x63, 0x90, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x53, 0x8f, 0x6b, 0xd4, 0x9c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xb5, 0x96, 0x84, 0x75, 0x7c, 0xb6, 0x84, 0x96, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x54, 0x7c, 0xf2, 0x6b, 0x70, 0x5b, 0x0e, 0x53, 0xed, 0x4a, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x0e, 0x53, 0x2e, 0x5b, 0x90, 0x6b, 0x52, 0x84, 0x15, 0x9d, 0xbb, 0xde, 0x39, 0xc6, 0x54, 0x84, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xb1, 0x6b, 0x2e, 0x5b, 0x4e, 0x6b, 0x56, 0xad, 0xdb, 0xde, 0xdb, 0xd6, 0xf8, 0xbd, 0x73, 0x84, 0xd1, 0x6b, 0x2e, 0x53, 0xee, 0x4a, 0x0e, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0x2e, 0x5b, 0xd0, 0x7b, 0x3d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xf7, 0xf7, 0x94, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x54, 0x7c, 0xb1, 0x63, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x53, 0x2e, 0x53, 0x4f, 0x63, 0xd0, 0x73, 0x52, 0x8c, 0x7a, 0xd6, 0x9e, 0xf7, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x94, 0x13, 0x74, 0xf3, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xb1, 0x63, 0x90, 0x6b, 0x35, 0xa5, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7a, 0xce, 0x73, 0x84, 0xb0, 0x6b, 0x6f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x6f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x0e, 0x53, 0x6f, 0x6b, 0x55, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xe7, 0xf7, 0x94, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x96, 0x84, 0x95, 0x84, 0x34, 0x74, 0x90, 0x63, 0x2e, 0x53, 0x0d, 0x4b, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x53, 0x2e, 0x63, 0xf1, 0x7b, 0xf8, 0xbd, 0x9e, 0xf7, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x9d, 0x33, 0x74, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xb1, 0x6b, 0xd1, 0x73, 0x3e, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xef, 0x5d, 0xef, 0xb7, 0xad, 0xd1, 0x6b, 0x4f, 0x5b, 0x4f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x2f, 0x5b, 0xf1, 0x7b, 0x7e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x17, 0x95, 0x75, 0x7c, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x96, 0x84, 0x95, 0x84, 0x33, 0x74, 0x90, 0x63, 0x0e, 0x53, 0x0d, 0x4b, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0xed, 0x52, 0x2e, 0x5b, 0xd0, 0x73, 0xb7, 0xb5, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x95, 0x33, 0x74, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xd1, 0x6b, 0xf1, 0x73, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xe7, 0x97, 0xad, 0xf1, 0x73, 0x2f, 0x53, 0x4f, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x53, 0x12, 0x74, 0x9e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd9, 0xb5, 0xb6, 0x84, 0x75, 0x7c, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x33, 0x74, 0x90, 0x5b, 0x0e, 0x53, 0x0e, 0x4b, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0x0e, 0x53, 0x6f, 0x63, 0x31, 0x8c, 0x18, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x95, 0x33, 0x74, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xd1, 0x6b, 0xf1, 0x7b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0xb5, 0x32, 0x74, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x53, 0xb0, 0x63, 0x15, 0x9d, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xd6, 0x8c, 0x75, 0x7c, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x33, 0x74, 0x90, 0x5b, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x8f, 0x73, 0x35, 0xad, 0x9e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x95, 0x33, 0x74, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xd1, 0x6b, 0xf1, 0x7b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xef, 0x94, 0x84, 0x90, 0x63, 0x90, 0x63, 0xb0, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x53, 0x90, 0x63, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbb, 0xce, 0xf5, 0x94, 0x73, 0x84, 0x32, 0x7c, 0xdc, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x57, 0x9d, 0x75, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x54, 0x74, 0x90, 0x63, 0x0e, 0x53, 0x0e, 0x4b, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0d, 0x53, 0xf0, 0x7b, 0xf8, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x95, 0x13, 0x74, 0xf3, 0x6b, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xd1, 0x6b, 0xf1, 0x7b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x56, 0x9d, 0xf2, 0x73, 0x90, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x53, 0x4f, 0x5b, 0x94, 0x84, 0x77, 0xad, 0x97, 0xad, 0x56, 0x9d, 0xd4, 0x8c, 0x12, 0x74, 0x90, 0x63, 0x2e, 0x53, 0x0e, 0x53, 0x12, 0x74, 0x9e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xef, 0xf6, 0x94, 0x17, 0x95, 0x9b, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xd9, 0xad, 0x75, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x54, 0x7c, 0xb1, 0x63, 0x0e, 0x53, 0x0d, 0x4b, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0x0e, 0x5b, 0xf1, 0x83, 0xf8, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x95, 0x13, 0x74, 0xf2, 0x6b, 0x13, 0x74, 0x12, 0x74, 0xf2, 0x6b, 0xd1, 0x6b, 0xf2, 0x7b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0xa5, 0x12, 0x74, 0xb1, 0x63, 0xd1, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0x90, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0xb0, 0x63, 0xb0, 0x6b, 0x6f, 0x5b, 0x2e, 0x53, 0x0e, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x4f, 0x5b, 0x93, 0x84, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xf7, 0xd6, 0x8c, 0x54, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x95, 0x84, 0xb5, 0x84, 0x17, 0x95, 0xd9, 0xb5, 0x98, 0xa5, 0xd6, 0x8c, 0x75, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x75, 0x84, 0x75, 0x7c, 0x95, 0x84, 0x75, 0x7c, 0xd1, 0x63, 0x0e, 0x53, 0x0d, 0x4b, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0d, 0x53, 0x11, 0x84, 0x19, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x95, 0x13, 0x74, 0xf2, 0x6b, 0x12, 0x6c, 0x12, 0x6c, 0xf2, 0x6b, 0xd1, 0x6b, 0x12, 0x7c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0xa5, 0x12, 0x74, 0xd1, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xb1, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x4f, 0x53, 0xee, 0x4a, 0xd1, 0x6b, 0x7d, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0xd6, 0x95, 0x84, 0x34, 0x74, 0x75, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0xb6, 0x84, 0xb5, 0x84, 0x75, 0x7c, 0x75, 0x84, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x75, 0x7c, 0xf2, 0x6b, 0x4f, 0x53, 0x0d, 0x4b, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0xf0, 0x7b, 0x39, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x95, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xd1, 0x6b, 0xf1, 0x7b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0xa5, 0xf2, 0x73, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x0e, 0x4b, 0x4f, 0x5b, 0x97, 0xad, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0xf7, 0xb5, 0x8c, 0x54, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x55, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x34, 0x74, 0x70, 0x5b, 0x0d, 0x4b, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x8f, 0x73, 0xf8, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x95, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xb1, 0x6b, 0xf1, 0x7b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd5, 0x8c, 0xd2, 0x6b, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0xd1, 0x6b, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xf1, 0x73, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0xef, 0x54, 0x7c, 0x54, 0x7c, 0x74, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x54, 0x7c, 0xb1, 0x63, 0x2e, 0x53, 0x0d, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xed, 0x52, 0x6f, 0x6b, 0x55, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x95, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xb1, 0x6b, 0xf1, 0x7b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xdf, 0x94, 0x84, 0xf2, 0x6b, 0xf3, 0x6b, 0x33, 0x74, 0xf2, 0x73, 0xb1, 0x63, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x4f, 0x5b, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5a, 0xc6, 0x34, 0x74, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x13, 0x74, 0x4f, 0x53, 0x0d, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x2e, 0x63, 0x72, 0x94, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x95, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xb1, 0x6b, 0xf1, 0x7b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0xce, 0x33, 0x74, 0xf3, 0x6b, 0x33, 0x74, 0x33, 0x74, 0xf2, 0x6b, 0x90, 0x63, 0x4f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0x2e, 0x53, 0x52, 0x84, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5a, 0xc6, 0x54, 0x7c, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x75, 0x7c, 0x54, 0x7c, 0xb1, 0x63, 0x0e, 0x53, 0x0e, 0x4b, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x11, 0x84, 0xfc, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x95, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xb1, 0x6b, 0xf1, 0x7b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x95, 0x33, 0x74, 0x13, 0x74, 0x34, 0x74, 0x33, 0x74, 0xb1, 0x63, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x2f, 0x53, 0x0e, 0x53, 0x2e, 0x5b, 0x11, 0x84, 0x7a, 0xce, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x98, 0xad, 0x54, 0x7c, 0x13, 0x74, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x74, 0x7c, 0x75, 0x7c, 0xf2, 0x6b, 0x4f, 0x5b, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x4f, 0x6b, 0x18, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xe7, 0x95, 0x84, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xb1, 0x6b, 0xf2, 0x73, 0x5a, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xe6, 0x74, 0x84, 0xf3, 0x6b, 0x54, 0x7c, 0x54, 0x7c, 0xf2, 0x6b, 0x90, 0x63, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x0e, 0x53, 0x4f, 0x63, 0x93, 0x94, 0xfc, 0xde, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbc, 0xd6, 0x37, 0x9d, 0x75, 0x84, 0x33, 0x74, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0xb1, 0x63, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x2e, 0x5b, 0x11, 0x84, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0xf7, 0x7a, 0xce, 0xf6, 0x94, 0x13, 0x74, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd2, 0x6b, 0x74, 0x84, 0x3a, 0xc6, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x98, 0xa5, 0x33, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x34, 0x74, 0xb1, 0x63, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2e, 0x53, 0xed, 0x52, 0x8f, 0x73, 0xf4, 0xa4, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd9, 0xb5, 0x95, 0x84, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x13, 0x74, 0x90, 0x63, 0x0e, 0x53, 0x2e, 0x53, 0x2f, 0x53, 0x0e, 0x53, 0x8f, 0x6b, 0x59, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, 0xce, 0x94, 0x84, 0x53, 0x7c, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0x33, 0x74, 0xb4, 0x8c, 0xfc, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xe7, 0xb5, 0x8c, 0x34, 0x74, 0x54, 0x7c, 0x75, 0x7c, 0xf2, 0x6b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0xed, 0x52, 0x2e, 0x6b, 0x15, 0xad, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbf, 0xff, 0xb9, 0xb5, 0x95, 0x84, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0xd1, 0x6b, 0x4f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x5b, 0x11, 0x84, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xe7, 0x77, 0xa5, 0x33, 0x74, 0xd2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0x91, 0x63, 0xb1, 0x63, 0x12, 0x74, 0x98, 0xad, 0x5e, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf9, 0xb5, 0x34, 0x74, 0x54, 0x7c, 0x95, 0x84, 0x33, 0x74, 0x90, 0x63, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x0e, 0x5b, 0x52, 0x8c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0xce, 0x95, 0x84, 0x34, 0x74, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x34, 0x74, 0x90, 0x63, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x4e, 0x63, 0x35, 0xad, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xef, 0xd5, 0x8c, 0xd2, 0x6b, 0x91, 0x63, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd1, 0x63, 0x70, 0x5b, 0xb1, 0x63, 0xb4, 0x8c, 0x7d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xdf, 0x74, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x54, 0x7c, 0xd2, 0x6b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x5b, 0x4f, 0x53, 0x4f, 0x5b, 0xd8, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0xbe, 0x54, 0x7c, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x74, 0x54, 0x7c, 0x13, 0x74, 0x6f, 0x5b, 0x0e, 0x4b, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0xd0, 0x7b, 0x1c, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x8c, 0xb1, 0x63, 0x70, 0x5b, 0xd1, 0x6b, 0x12, 0x74, 0x12, 0x74, 0xd2, 0x6b, 0xd2, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb0, 0x63, 0x6f, 0x5b, 0x4f, 0x5b, 0x90, 0x63, 0xf5, 0x94, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xef, 0xd6, 0x8c, 0x75, 0x7c, 0x95, 0x84, 0x95, 0x84, 0x13, 0x74, 0x4f, 0x5b, 0x2f, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x4f, 0x53, 0x2e, 0x53, 0xf4, 0x94, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xbe, 0x13, 0x74, 0x54, 0x7c, 0x34, 0x74, 0x34, 0x74, 0x54, 0x74, 0x33, 0x74, 0xf2, 0x6b, 0x4f, 0x5b, 0x0e, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x0e, 0x5b, 0xd4, 0x9c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x98, 0xad, 0xf2, 0x6b, 0x4f, 0x53, 0x6f, 0x5b, 0xb4, 0x8c, 0x36, 0x9d, 0x74, 0x84, 0xd2, 0x6b, 0x91, 0x63, 0x90, 0x63, 0x90, 0x63, 0xb0, 0x63, 0xb1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xf1, 0x73, 0xf1, 0x73, 0xf1, 0x73, 0x6f, 0x5b, 0x4f, 0x5b, 0xd1, 0x6b, 0x3a, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0xc6, 0xb6, 0x84, 0x95, 0x84, 0xb6, 0x84, 0x54, 0x7c, 0x6f, 0x5b, 0x2e, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0xee, 0x4a, 0x32, 0x7c, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x98, 0xad, 0xf3, 0x6b, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x34, 0x74, 0x33, 0x74, 0xd1, 0x63, 0x4f, 0x5b, 0x2e, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x4e, 0x63, 0x9b, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xce, 0x54, 0x7c, 0xb2, 0x63, 0x70, 0x5b, 0x31, 0x74, 0xff, 0xff, 0x00, 0x00, 0x9e, 0xf7, 0x74, 0x84, 0x32, 0x7c, 0x93, 0x84, 0xf4, 0x94, 0xd4, 0x94, 0x15, 0x9d, 0x56, 0x9d, 0xd5, 0x8c, 0x13, 0x74, 0x33, 0x7c, 0x15, 0x9d, 0xff, 0xff, 0xff, 0xff, 0x74, 0x84, 0x90, 0x63, 0x70, 0x5b, 0x32, 0x74, 0x1c, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xe7, 0xd6, 0x8c, 0x75, 0x7c, 0xd6, 0x8c, 0x75, 0x7c, 0x90, 0x63, 0x2f, 0x5b, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x5b, 0x0e, 0x4b, 0xb0, 0x6b, 0x5a, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x94, 0xf2, 0x6b, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x34, 0x74, 0x13, 0x74, 0x90, 0x63, 0x4f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xb0, 0x73, 0x1c, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xdf, 0x94, 0x84, 0xf2, 0x6b, 0xf2, 0x6b, 0x91, 0x63, 0x93, 0x84, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xf7, 0x39, 0xc6, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x19, 0xbe, 0xdc, 0xde, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xd5, 0x94, 0x91, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x15, 0x95, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xe7, 0xf7, 0x94, 0x76, 0x7c, 0xd7, 0x8c, 0x95, 0x84, 0xf2, 0x6b, 0x4f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x5b, 0x2e, 0x53, 0x4f, 0x5b, 0x73, 0x84, 0xdb, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xd6, 0xb5, 0x8c, 0xf3, 0x6b, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x34, 0x74, 0x13, 0x74, 0x70, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x5b, 0x11, 0x7c, 0x7e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0xc6, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x73, 0xd2, 0x6b, 0x53, 0x7c, 0x5a, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0xb5, 0x33, 0x7c, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0xf1, 0x6b, 0x7b, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xef, 0x17, 0x95, 0x75, 0x7c, 0xd7, 0x8c, 0x96, 0x84, 0x13, 0x74, 0x70, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x6f, 0x5b, 0x6f, 0x63, 0x32, 0x7c, 0x7d, 0xef, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xbf, 0xef, 0xfc, 0xde, 0xb8, 0xad, 0xb5, 0x84, 0x33, 0x74, 0x13, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x34, 0x74, 0x13, 0x74, 0x90, 0x63, 0x6f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x63, 0x32, 0x84, 0x9b, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xf7, 0x98, 0xa5, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x73, 0xf2, 0x6b, 0xd1, 0x6b, 0x32, 0x74, 0x5f, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x53, 0x7c, 0x91, 0x63, 0x90, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x70, 0x5b, 0xf5, 0x94, 0x9e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xd6, 0x95, 0x84, 0x34, 0x74, 0x75, 0x7c, 0x54, 0x7c, 0xf2, 0x6b, 0x70, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x0e, 0x4b, 0x0d, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0x4e, 0x5b, 0xf1, 0x6b, 0xff, 0xff,
0x00, 0x00, 0x5e, 0xef, 0x57, 0x9d, 0x16, 0x95, 0xd5, 0x8c, 0x74, 0x84, 0x54, 0x7c, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0x12, 0x7c, 0xb5, 0x8c, 0xf9, 0xb5, 0x9b, 0xce, 0x3a, 0xc6, 0x3a, 0xbe, 0x3a, 0xbe, 0x19, 0xbe, 0x39, 0xbe, 0x19, 0xbe, 0x19, 0xbe, 0x19, 0xbe, 0x5a, 0xc6, 0xb8, 0xad, 0xd5, 0x8c, 0x33, 0x7c, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf3, 0x73, 0x70, 0x5b, 0x90, 0x63, 0x39, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xf7, 0x12, 0x74, 0x70, 0x5b, 0x90, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x70, 0x5b, 0xd1, 0x6b, 0x73, 0x84, 0xf5, 0x94, 0xf5, 0x94, 0xd5, 0x94, 0xd5, 0x8c, 0xd5, 0x8c, 0xd4, 0x8c, 0xd4, 0x8c, 0xd4, 0x8c, 0xd4, 0x8c, 0xd4, 0x8c, 0xd4, 0x8c, 0xd4, 0x8c, 0xd5, 0x94, 0x73, 0x84, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0xed, 0x4a, 0xcd, 0x4a, 0x0e, 0x53, 0xff, 0xff,
0xff, 0xff, 0x13, 0x74, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf3, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0x70, 0x5b, 0x90, 0x63, 0x3c, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x95, 0x84, 0xd1, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0xcd, 0x42, 0x4e, 0x53, 0xfc, 0xe6,
0x1c, 0xdf, 0x13, 0x74, 0xd2, 0x63, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x6c, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0x70, 0x5b, 0xb0, 0x6b, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x17, 0x95, 0xf2, 0x6b, 0x90, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0xcd, 0x42, 0x2e, 0x53, 0x97, 0xad,
0xfc, 0xde, 0x33, 0x74, 0xd2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x73, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0x70, 0x5b, 0xd1, 0x73, 0x7e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0xa5, 0x13, 0x74, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0xed, 0x4a, 0x0e, 0x53, 0x52, 0x84,
0x5e, 0xef, 0x33, 0x74, 0xd2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x12, 0x74, 0x12, 0x74, 0xf2, 0x73, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0x90, 0x63, 0xd1, 0x73, 0x9e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x38, 0x9d, 0xf2, 0x73, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0xcd, 0x42, 0x0d, 0x4b, 0x32, 0x84,
0x5d, 0xef, 0x13, 0x74, 0xd2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x63, 0xd2, 0x63, 0xd2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0x90, 0x63, 0xf1, 0x73, 0x9e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd6, 0x8c, 0xd2, 0x6b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x2f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0xed, 0x4a, 0xcd, 0x4a, 0x4e, 0x5b, 0xb7, 0xb5,
0x9e, 0xef, 0xf2, 0x73, 0xb1, 0x63, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf3, 0x73, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x6c, 0xf2, 0x6b, 0xf2, 0x6b, 0x12, 0x74, 0x12, 0x74, 0x12, 0x74, 0x12, 0x74, 0xf2, 0x73, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0x91, 0x63, 0x12, 0x74, 0x3d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x74, 0x7c, 0x91, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x70, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x5b, 0x8f, 0x6b, 0x52, 0x84, 0xff, 0xff,
0xff, 0xff, 0x74, 0x7c, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x73, 0xf2, 0x73, 0xf2, 0x73, 0x12, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xb0, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x4f, 0x63, 0xb1, 0x73, 0x73, 0x8c, 0xf8, 0xb5, 0xbb, 0xd6, 0xbb, 0xd6, 0xbb, 0xd6, 0x9b, 0xce, 0x9b, 0xce, 0xbb, 0xd6, 0x9b, 0xce, 0x9b, 0xce, 0xdc, 0xd6, 0xf9, 0xbd, 0xb5, 0x8c, 0x12, 0x74, 0xd1, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0x91, 0x63, 0x12, 0x74, 0x7a, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0xd6, 0x12, 0x74, 0x50, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x5b, 0x4f, 0x5b, 0x4f, 0x63, 0xb0, 0x73, 0x32, 0x84, 0xb4, 0x94, 0x97, 0xad, 0xf8, 0xb5, 0xd8, 0xb5, 0xd8, 0xb5, 0xd8, 0xb5, 0xd8, 0xb5, 0xd8, 0xb5, 0xd8, 0xb5, 0xb7, 0xb5, 0x15, 0x9d, 0x32, 0x7c, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x70, 0x5b, 0x6f, 0x5b, 0x4f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0xcd, 0x4a, 0xed, 0x5a, 0xaf, 0x73, 0x73, 0x8c, 0x18, 0xbe, 0x5d, 0xef, 0x7d, 0xef, 0xff, 0xff, 0x00, 0x00,
0x00, 0x00, 0xbe, 0xf7, 0xd8, 0xb5, 0xd5, 0x8c, 0x94, 0x8c, 0x94, 0x84, 0x74, 0x84, 0x53, 0x7c, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x73, 0x13, 0x74, 0xd1, 0x6b, 0x4f, 0x5b, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0xed, 0x52, 0x6f, 0x6b, 0x76, 0xb5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0xad, 0xb1, 0x63, 0xd1, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xb1, 0x63, 0x32, 0x7c, 0xfc, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x33, 0x7c, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x5b, 0x6f, 0x63, 0xf0, 0x83, 0x9a, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, 0xce, 0x12, 0x74, 0x91, 0x63, 0xd1, 0x6b, 0xb1, 0x63, 0x90, 0x63, 0x4f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0xac, 0x52, 0xd0, 0x83, 0x7a, 0xd6, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xf9, 0xbd, 0x74, 0x84, 0x12, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0x12, 0x74, 0xd2, 0x6b, 0x4f, 0x5b, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0x73, 0x8c, 0x9e, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, 0xce, 0x12, 0x74, 0xb1, 0x63, 0xd2, 0x6b, 0xb1, 0x63, 0xd1, 0x73, 0xf4, 0x9c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xde, 0x12, 0x74, 0x4f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x11, 0x7c, 0x9a, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xef, 0x53, 0x7c, 0xb1, 0x63, 0xf2, 0x6b, 0xd1, 0x6b, 0x90, 0x63, 0x4f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xed, 0x52, 0x6e, 0x6b, 0x18, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdb, 0xd6, 0x74, 0x7c, 0xb1, 0x63, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0x70, 0x5b, 0x2e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x0d, 0x4b, 0x72, 0x8c, 0x9e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xe7, 0xb4, 0x8c, 0xb1, 0x63, 0xb1, 0x63, 0x70, 0x5b, 0x12, 0x74, 0x7e, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x3a, 0xc6, 0xf6, 0x94, 0xdc, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xf7, 0xd9, 0xb5, 0x5e, 0xef, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb4, 0x8c, 0x70, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0xd1, 0x73, 0x5a, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xe7, 0x33, 0x74, 0xb1, 0x63, 0xf2, 0x6b, 0xd1, 0x6b, 0x70, 0x5b, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0xed, 0x52, 0x11, 0x84, 0xfc, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x57, 0xa5, 0xb1, 0x63, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0x90, 0x63, 0x2e, 0x53, 0x0d, 0x4b, 0xed, 0x4a, 0x0d, 0x4b, 0xf1, 0x73, 0x1c, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0xd6, 0x33, 0x74, 0x91, 0x63, 0x70, 0x5b, 0x12, 0x74, 0xbb, 0xd6, 0xff, 0xff, 0x3d, 0xe7, 0x33, 0x7c, 0xf2, 0x6b, 0x74, 0x84, 0x36, 0x9d, 0x37, 0x9d, 0x57, 0x9d, 0x77, 0xa5, 0xb5, 0x8c, 0x13, 0x74, 0x53, 0x7c, 0x1c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x94, 0xd2, 0x6b, 0x2f, 0x53, 0xd1, 0x6b, 0x39, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xc6, 0x13, 0x74, 0xd2, 0x6b, 0xf2, 0x73, 0xd1, 0x6b, 0x4f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0x0d, 0x53, 0x93, 0x94, 0xbe, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xbd, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xb1, 0x63, 0x2f, 0x53, 0x0d, 0x4b, 0x0d, 0x4b, 0x0d, 0x4b, 0x8f, 0x63, 0xfc, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x19, 0xbe, 0xb1, 0x63, 0x70, 0x5b, 0xd1, 0x6b, 0x74, 0x84, 0xd5, 0x8c, 0x33, 0x7c, 0x70, 0x5b, 0x90, 0x5b, 0xb1, 0x63, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xb1, 0x63, 0x50, 0x5b, 0x4f, 0x5b, 0x12, 0x74, 0xf5, 0x94, 0xf6, 0x94, 0x74, 0x84, 0xb1, 0x63, 0x70, 0x5b, 0x97, 0xad, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xef, 0xd5, 0x8c, 0xf2, 0x6b, 0xf2, 0x6b, 0xf3, 0x73, 0xb1, 0x63, 0x4f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xed, 0x4a, 0x4f, 0x63, 0xf8, 0xc5, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xbe, 0x13, 0x74, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xd1, 0x6b, 0x4f, 0x53, 0x0d, 0x4b, 0x0e, 0x4b, 0x0d, 0x4b, 0x2e, 0x53, 0xdb, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x97, 0xa5, 0xb1, 0x63, 0xb1, 0x63, 0xd2, 0x6b, 0xd2, 0x6b, 0xb1, 0x63, 0x90, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x5b, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0xd1, 0x6b, 0xd2, 0x6b, 0xb1, 0x63, 0xb1, 0x6b, 0xb7, 0xad, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xdf, 0x33, 0x74, 0xf2, 0x6b, 0x13, 0x74, 0xf2, 0x6b, 0xb1, 0x63, 0x4f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xed, 0x4a, 0xb0, 0x6b, 0xfb, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xe7, 0xb5, 0x8c, 0xb1, 0x63, 0xd1, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0x6f, 0x5b, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0x35, 0x9d, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x9d, 0xd1, 0x6b, 0x70, 0x5b, 0x90, 0x63, 0xb0, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb0, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x53, 0xb0, 0x63, 0x16, 0x9d, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, 0xce, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0x90, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0xed, 0x4a, 0x6f, 0x5b, 0x97, 0xad, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xef, 0xb4, 0x84, 0xb1, 0x63, 0xd1, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0x90, 0x63, 0x2e, 0x53, 0x0e, 0x4b, 0x0d, 0x4b, 0xcd, 0x4a, 0xf1, 0x73, 0x1c, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xf7, 0xd8, 0xb5, 0x32, 0x74, 0x90, 0x63, 0x2f, 0x53, 0x70, 0x5b, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x50, 0x5b, 0x90, 0x63, 0x97, 0xad, 0xdf, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x95, 0xf3, 0x6b, 0x13, 0x74, 0x33, 0x74, 0xd1, 0x6b, 0x4f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xd0, 0x6b, 0x76, 0xa5, 0x3f, 0xe7, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7e, 0xef, 0x36, 0x9d, 0xf2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xb1, 0x63, 0x4f, 0x5b, 0x0d, 0x4b, 0x0d, 0x4b, 0xed, 0x4a, 0x2e, 0x53, 0xd4, 0x94, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xe7, 0x36, 0x9d, 0x33, 0x7c, 0xf2, 0x73, 0xb1, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0xf1, 0x73, 0x59, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, 0xd6, 0x74, 0x7c, 0x13, 0x74, 0x33, 0x74, 0x33, 0x74, 0xb1, 0x63, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0d, 0x4b, 0xed, 0x4a, 0x8f, 0x63, 0x76, 0xa5, 0x7d, 0xef, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x77, 0xa5, 0x53, 0x7c, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0x70, 0x5b, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x53, 0xed, 0x4a, 0xf1, 0x73, 0xbe, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5d, 0xe7, 0xf9, 0xb5, 0xd1, 0x6b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x4f, 0x5b, 0x4f, 0x63, 0xf1, 0x7b, 0x5a, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x94, 0x13, 0x74, 0x33, 0x74, 0x33, 0x74, 0xf2, 0x6b, 0x70, 0x5b, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0d, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0x4f, 0x5b, 0xf1, 0x6b, 0x5f, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7a, 0xc6, 0x94, 0x84, 0xf2, 0x6b, 0x90, 0x5b, 0xb1, 0x63, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd2, 0x6b, 0x91, 0x63, 0x4f, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0xed, 0x4a, 0x6f, 0x5b, 0xf8, 0xb5, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x73, 0x84, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x4f, 0x5b, 0x2e, 0x5b, 0xaf, 0x73, 0x7a, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xbe, 0x74, 0x7c, 0x13, 0x74, 0x54, 0x7c, 0x33, 0x74, 0xb1, 0x63, 0x4f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xcd, 0x42, 0xcd, 0x42, 0xb7, 0xad, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x77, 0xad, 0xf2, 0x6b, 0x70, 0x5b, 0xb1, 0x63, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0x70, 0x5b, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x11, 0x74, 0xbe, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xb4, 0x8c, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x5b, 0x2f, 0x5b, 0x4f, 0x6b, 0xf5, 0xa4, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x84, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x13, 0x74, 0x70, 0x5b, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0xed, 0x4a, 0xed, 0x4a, 0xb3, 0x8c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x7e, 0xf7, 0xf2, 0x6b, 0x90, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0xb0, 0x63, 0x4f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x2f, 0x53, 0x77, 0xad, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xb4, 0x8c, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x5b, 0x90, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0x90, 0x6b, 0x3d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xbe, 0x54, 0x7c, 0x34, 0x74, 0x74, 0x7c, 0x34, 0x7c, 0xd1, 0x6b, 0x4f, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0xed, 0x4a, 0x0e, 0x53, 0x15, 0x9d, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0x33, 0x7c, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x5b, 0x4f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xb0, 0x63, 0x97, 0xad, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x94, 0x84, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0xb0, 0x6b, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, 0xce, 0x95, 0x84, 0x54, 0x7c, 0x74, 0x7c, 0x75, 0x7c, 0x13, 0x74, 0x6f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0d, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x4e, 0x5b, 0x39, 0xc6, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x19, 0xbe, 0xd1, 0x6b, 0x70, 0x5b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x6f, 0x5b, 0x2f, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x0e, 0x53, 0x11, 0x74, 0x19, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x94, 0x84, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0xb0, 0x73, 0x9e, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xe6, 0xf6, 0x94, 0x34, 0x74, 0x75, 0x7c, 0x95, 0x84, 0x54, 0x7c, 0xb1, 0x63, 0x2e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0xcd, 0x42, 0xcd, 0x42, 0xed, 0x42, 0xed, 0x4a, 0x0e, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0xb0, 0x73, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xef, 0x12, 0x74, 0x70, 0x5b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x91, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x12, 0x74, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x94, 0x84, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0xb0, 0x73, 0x9e, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x94, 0x75, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x75, 0x7c, 0xf2, 0x6b, 0x4f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0d, 0x4b, 0xed, 0x52, 0x4e, 0x5b, 0xb0, 0x63, 0xd0, 0x6b, 0x8f, 0x5b, 0x2e, 0x53, 0xed, 0x4a, 0xcd, 0x4a, 0x4f, 0x5b, 0x93, 0x94, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xbe, 0xf7, 0x94, 0x84, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x5b, 0x90, 0x5b, 0x90, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x91, 0x63, 0x90, 0x63, 0x90, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x5b, 0xf5, 0x94, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x94, 0x84, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0xb0, 0x6b, 0x9e, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0xa5, 0x75, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x95, 0x84, 0x33, 0x74, 0x90, 0x5b, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xcd, 0x4a, 0xed, 0x5a, 0x31, 0x84, 0x5a, 0xce, 0xfc, 0xde, 0xf4, 0x94, 0xd0, 0x6b, 0x4f, 0x5b, 0x4e, 0x5b, 0x31, 0x7c, 0x7d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xef, 0x12, 0x74, 0x70, 0x5b, 0x90, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0xf1, 0x73, 0x32, 0x84, 0x93, 0x8c, 0x12, 0x74, 0x90, 0x63, 0x90, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0xb1, 0x63, 0xb0, 0x63, 0x70, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0x90, 0x63, 0xd5, 0x94, 0xdf, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x94, 0x84, 0x90, 0x63, 0x6f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0xb0, 0x6b, 0x9e, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0x58, 0x9d, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x54, 0x7c, 0x90, 0x63, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x2e, 0x5b, 0x72, 0x94, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe7, 0xd5, 0x94, 0x16, 0x9d, 0x56, 0xa5, 0x56, 0xa5, 0xd8, 0xbd, 0x9e, 0xf7, 0xff, 0xff, 0x19, 0xc6, 0x73, 0x84, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0xb0, 0x63, 0xd4, 0x8c, 0x7e, 0xf7, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x94, 0x84, 0x90, 0x63, 0x6f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0xb0, 0x6b, 0x9e, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x58, 0xa5, 0x96, 0x84, 0x96, 0x84, 0xb6, 0x84, 0xb6, 0x84, 0x54, 0x7c, 0xb1, 0x63, 0x2e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x52, 0xf0, 0x7b, 0xdb, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0xef, 0x12, 0x74, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x32, 0x7c, 0x19, 0xbe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x94, 0x84, 0x90, 0x5b, 0x4f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0xb0, 0x6b, 0x9e, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0xd6, 0xf7, 0x94, 0x75, 0x7c, 0xb6, 0x84, 0xb6, 0x84, 0xb6, 0x84, 0x75, 0x7c, 0xd1, 0x6b, 0x2e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x4e, 0x6b, 0x96, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x77, 0xa5, 0xd1, 0x6b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x12, 0x74, 0x97, 0xad, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xf7, 0x93, 0x84, 0x70, 0x5b, 0x4f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0xb0, 0x6b, 0x9e, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd9, 0xad, 0xd6, 0x8c, 0x96, 0x84, 0xb6, 0x84, 0xd6, 0x8c, 0xb6, 0x84, 0x75, 0x7c, 0xd1, 0x6b, 0x2e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0xed, 0x4a, 0xed, 0x5a, 0xf0, 0x83, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x15, 0x95, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0xb1, 0x63, 0xb0, 0x63, 0x70, 0x5b, 0xf2, 0x6b, 0x36, 0x9d, 0x1d, 0xdf, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xbf, 0xf7, 0x93, 0x84, 0x70, 0x5b, 0x4f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0xb0, 0x6b, 0xbe, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0xde, 0x57, 0x9d, 0x96, 0x84, 0x75, 0x7c, 0x96, 0x84, 0xd7, 0x8c, 0xd7, 0x8c, 0x75, 0x7c, 0xb1, 0x63, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0xcd, 0x4a, 0x4e, 0x63, 0xd8, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xb7, 0xad, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xf2, 0x6b, 0x57, 0xa5, 0x3d, 0xe7, 0x9e, 0xef, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xbf, 0xf7, 0x94, 0x84, 0x70, 0x5b, 0x4f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x2f, 0x5b, 0xb0, 0x6b, 0xff, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9e, 0xef, 0x5e, 0xef, 0xd9, 0xad, 0x75, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0xb6, 0x84, 0xb6, 0x8c, 0xb6, 0x84, 0x54, 0x7c, 0xb1, 0x63, 0x2e, 0x53, 0x0d, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xcd, 0x4a, 0x4f, 0x5b, 0x59, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0x73, 0x84, 0x4f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0x13, 0x74, 0x94, 0x84, 0x7a, 0xce, 0xbf, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x93, 0x84, 0x70, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2e, 0x53, 0x90, 0x6b, 0x9e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7e, 0xf7, 0x5a, 0xc6, 0xd6, 0x8c, 0x95, 0x84, 0x75, 0x84, 0x75, 0x7c, 0x95, 0x84, 0xb6, 0x84, 0xb6, 0x84, 0x96, 0x84, 0x33, 0x74, 0x90, 0x5b, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x0e, 0x53, 0xf1, 0x6b, 0x3d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x56, 0xa5, 0xb1, 0x63, 0x50, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x5b, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x91, 0x63, 0xd1, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x63, 0xf2, 0x6b, 0x74, 0x7c, 0xf6, 0x94, 0xd9, 0xb5, 0x9b, 0xce, 0x1d, 0xe7, 0xff, 0xff, 0xbe, 0xf7, 0x32, 0x7c, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2e, 0x53, 0x90, 0x6b, 0xd8, 0xb5, 0x3d, 0xef, 0x3d, 0xe7, 0xbb, 0xd6, 0x98, 0xa5, 0xd6, 0x8c, 0x75, 0x84, 0x34, 0x7c, 0x54, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0xb6, 0x84, 0x96, 0x84, 0x54, 0x7c, 0xd2, 0x6b, 0x6f, 0x5b, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0xed, 0x4a, 0x2e, 0x53, 0x52, 0x7c, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xc6, 0x90, 0x63, 0x4f, 0x53, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x5b, 0x90, 0x63, 0xb1, 0x63, 0xd2, 0x6b, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0x13, 0x74, 0xb5, 0x84, 0xb8, 0xad, 0x77, 0xa5, 0xb1, 0x6b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x90, 0x63, 0x53, 0x7c, 0xd5, 0x8c, 0x95, 0x84, 0x13, 0x74, 0xf3, 0x6b, 0x13, 0x74, 0x54, 0x74, 0x74, 0x7c, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x54, 0x7c, 0xf2, 0x6b, 0x90, 0x63, 0x4e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0xcd, 0x42, 0x4f, 0x5b, 0xb3, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0xd6, 0x32, 0x74, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0xb1, 0x63, 0xd1, 0x6b, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x34, 0x74, 0x13, 0x74, 0x90, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x4f, 0x5b, 0x91, 0x63, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x33, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x34, 0x74, 0x12, 0x74, 0xb1, 0x63, 0x4f, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0xcc, 0x42, 0xd0, 0x6b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb4, 0x8c, 0x90, 0x5b, 0x4f, 0x5b, 0x90, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0xd2, 0x6b, 0xf2, 0x6b, 0x13, 0x74, 0x33, 0x74, 0x33, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x33, 0x74, 0x90, 0x63, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x4f, 0x5b, 0x91, 0x63, 0xf3, 0x6b, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x13, 0x74, 0xd2, 0x6b, 0x90, 0x5b, 0x4f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0d, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0xed, 0x4a, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0xac, 0x3a, 0xb0, 0x63, 0x1c, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x53, 0x7c, 0x4f, 0x53, 0x4f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x6f, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x6f, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0x12, 0x6c, 0x33, 0x74, 0x54, 0x7c, 0x95, 0x84, 0x54, 0x7c, 0x90, 0x63, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x91, 0x63, 0x13, 0x74, 0x33, 0x74, 0x13, 0x74, 0xf2, 0x73, 0xf2, 0x6b, 0xd1, 0x63, 0x90, 0x63, 0x6f, 0x5b, 0x4f, 0x5b, 0x2e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0xed, 0x52, 0x2e, 0x5b, 0x2e, 0x53, 0xed, 0x4a, 0xed, 0x4a, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0xf1, 0x73, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd5, 0x94, 0x90, 0x63, 0x2f, 0x53, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x70, 0x5b, 0x4f, 0x53, 0x2e, 0x5b, 0x6f, 0x63, 0x90, 0x63, 0x4f, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0x70, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x70, 0x5b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x4f, 0x5b, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x2e, 0x63, 0xd0, 0x7b, 0x97, 0xb5, 0x18, 0xbe, 0x11, 0x74, 0x0e, 0x4b, 0xcd, 0x42, 0x0e, 0x4b, 0x0e, 0x4b, 0xed, 0x4a, 0xcd, 0x42, 0xb0, 0x6b, 0x56, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0x32, 0x7c, 0x70, 0x5b, 0x2f, 0x53, 0x4f, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x2f, 0x53, 0x6f, 0x63, 0xb0, 0x7b, 0x73, 0x94, 0xb4, 0x8c, 0x12, 0x74, 0xb0, 0x63, 0x4f, 0x5b, 0x2f, 0x53, 0x4f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0d, 0x53, 0xed, 0x52, 0x4e, 0x63, 0x52, 0x8c, 0x9a, 0xde, 0xff, 0xff, 0x00, 0x00, 0xfb, 0xde, 0x32, 0x7c, 0x2e, 0x53, 0xed, 0x4a, 0xcd, 0x42, 0x0e, 0x53, 0xb0, 0x6b, 0xf4, 0x9c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xf7, 0x32, 0x7c, 0x90, 0x63, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x6f, 0x5b, 0xd0, 0x73, 0x52, 0x8c, 0xdc, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0xad, 0x11, 0x74, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0xed, 0x4a, 0xcc, 0x52, 0x6f, 0x73, 0x76, 0xb5, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb7, 0xad, 0x2e, 0x53, 0x2e, 0x53, 0xd0, 0x6b, 0xb7, 0xb5, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x94, 0xb1, 0x6b, 0x4f, 0x5b, 0xd1, 0x6b, 0x73, 0x8c, 0xdb, 0xde, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5e, 0xef, 0x73, 0x84, 0x6f, 0x5b, 0x2e, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xcc, 0x4a, 0x4e, 0x6b, 0x96, 0xb5, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x77, 0xa5, 0x15, 0x95, 0xb8, 0xb5, 0xdf, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x77, 0xa5, 0x90, 0x63, 0x0e, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0d, 0x4b, 0xed, 0x52, 0x11, 0x84, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x94, 0x90, 0x63, 0x0e, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0d, 0x4b, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0xed, 0x4a, 0x0e, 0x53, 0x72, 0x84, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf1, 0x73, 0x4f, 0x5b, 0x2e, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0x0d, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0x0d, 0x4b, 0x0e, 0x4b, 0x32, 0x7c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6f, 0x5b, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x0e, 0x53, 0xed, 0x52, 0x6f, 0x63, 0xd0, 0x6b, 0xb0, 0x63, 0x4f, 0x5b, 0x2e, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0xed, 0x4a, 0xed, 0x52, 0x4e, 0x5b, 0x8f, 0x6b, 0xd0, 0x73, 0x52, 0x84, 0x73, 0x84, 0x6f, 0x63, 0xcd, 0x42, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0x0d, 0x4b, 0xed, 0x4a, 0xf1, 0x73, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9b, 0xce, 0x4f, 0x5b, 0x0e, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x0e, 0x53, 0xed, 0x5a, 0xd0, 0x7b, 0xb7, 0xbd, 0xbb, 0xd6, 0x5a, 0xc6, 0xf5, 0x94, 0x6f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0xed, 0x4a, 0x2e, 0x5b, 0xd0, 0x7b, 0xd8, 0xbd, 0x9a, 0xd6, 0x7a, 0xd6, 0x3c, 0xe7, 0x9f, 0xf7, 0x35, 0x9d, 0x0e, 0x4b, 0x0d, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0xcd, 0x42, 0xb0, 0x63, 0x39, 0xc6, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd4, 0x8c, 0x2f, 0x53, 0x0e, 0x4b, 0x4f, 0x5b, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x8f, 0x73, 0x59, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0xf7, 0xd0, 0x6b, 0x2e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xed, 0x4a, 0xed, 0x52, 0xd0, 0x7b, 0xdb, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xef, 0x32, 0x74, 0xed, 0x4a, 0xed, 0x4a, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0x0d, 0x4b, 0xcd, 0x42, 0x6f, 0x5b, 0xb3, 0x94, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x76, 0xa5, 0x2e, 0x53, 0xed, 0x4a, 0x2e, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x6f, 0x63, 0x76, 0xad, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x11, 0x74, 0x4f, 0x5b, 0x0e, 0x4b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0xed, 0x4a, 0x2e, 0x63, 0xf4, 0xa4, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x97, 0xad, 0x2e, 0x53, 0xcd, 0x42, 0x0e, 0x4b, 0x0e, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0xcd, 0x42, 0xb0, 0x6b, 0x9b, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xf7, 0x52, 0x7c, 0x6f, 0x5b, 0xee, 0x4a, 0xed, 0x4a, 0x0e, 0x4b, 0x0e, 0x53, 0xee, 0x4a, 0x2e, 0x5b, 0x32, 0x84, 0xbe, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x93, 0x8c, 0x6f, 0x5b, 0xed, 0x4a, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x6f, 0x63, 0xdb, 0xde, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x5d, 0xef, 0x12, 0x74, 0xcd, 0x42, 0xac, 0x42, 0xcd, 0x4a, 0x0e, 0x53, 0x4f, 0x5b, 0xf1, 0x73, 0x5a, 0xce, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0xf7, 0xd8, 0xb5, 0x52, 0x7c, 0xd1, 0x6b, 0x6f, 0x5b, 0x2e, 0x53, 0x6f, 0x5b, 0x52, 0x84, 0x9a, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x94, 0x6f, 0x5b, 0xed, 0x4a, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0x0e, 0x53, 0x6f, 0x6b, 0xbe, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9a, 0xce, 0x52, 0x7c, 0xb0, 0x6b, 0x12, 0x74, 0xb3, 0x8c, 0x39, 0xc6, 0x9e, 0xf7, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbe, 0xf7, 0x3d, 0xe7, 0xf5, 0x94, 0x11, 0x74, 0xf8, 0xb5, 0xbf, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x35, 0x9d, 0x4f, 0x5b, 0xcd, 0x42, 0x0d, 0x4b, 0x0d, 0x4b, 0x0d, 0x4b, 0x0e, 0x4b, 0xed, 0x4a, 0x0e, 0x53, 0xd0, 0x73, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xf7, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xef, 0x8f, 0x63, 0xed, 0x4a, 0x0d, 0x4b, 0x0d, 0x4b, 0x0d, 0x4b, 0xed, 0x4a, 0xcd, 0x4a, 0x4f, 0x5b, 0x93, 0x94, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x76, 0xa5, 0x11, 0x74, 0x11, 0x74, 0x11, 0x74, 0x11, 0x74, 0xf1, 0x73, 0xd0, 0x6b, 0x73, 0x84, 0x7e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/*alpha channel*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0f, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x53, 0xff, 0x28, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0c, 0x2b, 0xff, 0xff, 0xa5, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x51, 0xff, 0xff, 0xff, 0xff, 0xff, 0x28, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x99, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xb2, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6b, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xc4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x01, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x0e, 0x00, 0x00, 0x00, 0x07, 0x2d, 0x82, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x46, 0x05, 0x00, 0x31, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xdc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbb, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, 0x3b, 0x34, 0x4e, 0xac, 0xff, 0xff, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xa8, 0x59, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xf3, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf3, 0xf0, 0xf3, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x95, 0x2e, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x4b, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x86, 0xe6, 0xff, 0xff, 0x93, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xaf, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xd2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xf4, 0xff, 0xff, 0xdc, 0xff, 0xff, 0xb1, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xcc, 0xff, 0xff, 0xff, 0xff, 0x4a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x89, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0x83, 0x02, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xbf, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xc8, 0xff, 0xff, 0xf9, 0xf9, 0xff, 0xff, 0xbb, 0x19, 0x00, 0x00, 0x02, 0x78, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x6b, 0x2c, 0xf7, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xa7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9f, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xe6, 0x20, 0x06, 0x76, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xd7, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xc4, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x8f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x12, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x62, 0x19, 0x14, 0x31, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x29, 0x0f, 0x04, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x03, 0x00, 0x00, 0x00, 0x07, 0x36, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x55, 0x0f, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x0b, 0x4f, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x40, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x5e, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0x89, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xc1, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x44, 0x7c, 0x70, 0x86, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x70, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xac, 0x80, 0x80, 0x78, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xf3, 0xe8, 0x64, 0x0b, 0x01, 0x02, 0x00, 0x04, 0x94, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xe6, 0xe8, 0xe6, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x11, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xcd, 0xcf, 0xad, 0xd5, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x19, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x51, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00,
0x00, 0x00, 0x04, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x00,
0x00, 0x00, 0x02, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x08, 0x92, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xad, 0x29, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x05, 0x41, 0xd8, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x46, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xa6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x83, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x7f, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0x85, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x17, 0x79, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x8c, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xf7, 0xff, 0xff, 0x5b, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x8a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb9, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xff, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xfb, 0xff, 0xff, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xe9, 0xff, 0xe2, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xde, 0xff, 0xb6, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x91, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x95, 0xff, 0xf4, 0xff, 0xd9, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0xce, 0xfb, 0xf7, 0xff, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x78, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xff, 0xff, 0xff, 0xd5, 0x04, 0x00, 0x0f, 0xff, 0xff, 0xe8, 0xaf, 0xb5, 0xb4, 0xae, 0xe6, 0xff, 0xff, 0xb3, 0x03, 0x01, 0xcb, 0xff, 0xff, 0xff, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xed, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0xff, 0xff, 0xf8, 0xff, 0xdd, 0x02, 0x00, 0x00, 0x15, 0x79, 0x0d, 0x00, 0x01, 0x01, 0x00, 0x0a, 0x77, 0x3b, 0x01, 0x00, 0x02, 0xdf, 0xff, 0xf3, 0xff, 0xcb, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x26, 0x01, 0x02, 0x02, 0x03, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xf4, 0xff, 0xff, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xd5, 0xdc, 0xdf, 0xff, 0xe6, 0x0d, 0x00,
0x00, 0x00, 0x09, 0x11, 0x0b, 0x1a, 0x50, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x42, 0x02, 0x03, 0x04, 0x04, 0x05, 0x05, 0x04, 0x04, 0x04, 0x05, 0x03, 0x05, 0x13, 0x81, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xb1, 0x11, 0x03, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x02, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x01,
0x00, 0x20, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x99, 0x65, 0x81, 0x80, 0x89, 0x8b, 0x89, 0x88, 0x87, 0x89, 0x78, 0xaf, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x08,
0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb6, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x3a,
0x51, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xaf,
0x60, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff,
0x3b, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff,
0x3d, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e,
0x2d, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0b,
0x0b, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x93, 0x56, 0x5b, 0x5b, 0x62, 0x62, 0x5a, 0x5c, 0x64, 0x53, 0x90, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x79, 0x85, 0x83, 0x83, 0x83, 0x83, 0x7e, 0x8b, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0x60, 0x16, 0x0d, 0x08, 0x00,
0x00, 0x16, 0xa1, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x1d, 0x04, 0x02, 0x02, 0x02, 0x03, 0x03, 0x02, 0x02, 0x03, 0x02, 0x05, 0x11, 0x71, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xff, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xf8, 0xff, 0xfb, 0xff, 0xff, 0xf7, 0xff, 0xff, 0x2b, 0x03, 0x06, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x32, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x0c, 0x0b, 0x07, 0x19, 0x90, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xb2, 0x05, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3b, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x50, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x29, 0x00, 0x02, 0x78, 0xed, 0x40, 0x01, 0x02, 0x02, 0x01, 0x20, 0x9e, 0x23, 0x00, 0x00, 0x02, 0xd9, 0xff, 0xfb, 0xff, 0xff, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7c, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0xff, 0xff, 0xff, 0xff, 0x58, 0x06, 0x2e, 0xff, 0xff, 0xff, 0xbc, 0xbe, 0xc1, 0xbc, 0xfc, 0xff, 0xff, 0x37, 0x02, 0x07, 0xd9, 0xff, 0xff, 0xff, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x68, 0xff, 0xff, 0xff, 0xff, 0xe8, 0xfc, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0xd9, 0xf8, 0xff, 0xff, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x54, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8d, 0xff, 0xe8, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xef, 0xff, 0x6d, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xee, 0xff, 0xfc, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xf8, 0xff, 0xd9, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6c, 0xff, 0xff, 0xfc, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x76, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x53, 0x09, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x29, 0x90, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xa4, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x84, 0x18, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x90, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x35, 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x57, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x64, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5b, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x05, 0x86, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x11, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x09, 0x00, 0x00,
0x00, 0x01, 0x00, 0x1b, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x05, 0x00, 0x00,
0x00, 0x00, 0x00, 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x7d, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x58, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x07, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x27, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x00, 0x15, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x55, 0x35, 0xca, 0xd6, 0xca, 0xdc, 0xf8, 0x19, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0xc6, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xc8, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xce, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xaa, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xbd, 0x9b, 0x99, 0xa3, 0x93, 0x25, 0x0b, 0x74, 0xf6, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xd5, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x2c, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0x7f, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x48, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0x7a, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x12, 0x92, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0xc8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xcd, 0x38, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x13, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x3e, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0xa8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xac, 0x31, 0x22, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x13, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x1f, 0x23, 0x86, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x57, 0x1a, 0x08, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x0f, 0x28, 0x68, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x75, 0x3b, 0x33, 0x12, 0x26, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x3b, 0x2d, 0x39, 0xa3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0xac, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xba, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe8, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xee, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xe2, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xd2, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0x8b, 0x73, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xff, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xeb, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xdd, 0xd2, 0xe3, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xfc, 0x4e, 0x03, 0x00, 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbd, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xe6, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xe8, 0x42, 0x09, 0x03, 0x0c, 0x93, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x72, 0x07, 0x00, 0x00, 0x00, 0x00, 0x10, 0x66, 0xf6, 0xd8, 0xe6, 0x8b, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xd0, 0xff, 0xff, 0xff, 0xf6, 0x4e, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x0c, 0x0f, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x9b, 0xa0, 0x91, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf9, 0xf9, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf9, 0xf7, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x53, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x66, 0x3a, 0x50, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x58, 0x40, 0x4e, 0x3f, 0x2e, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x59, 0x00, 0x00, 0x00, 0x24, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xc2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x05, 0x00, 0x01, 0x00, 0x0c, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x82, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0x29, 0x00, 0x00, 0x00, 0x00, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x52, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x95, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, 0x01, 0x00, 0x00, 0x12, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x68, 0xff, 0xff, 0xff, 0xff, 0x6a, 0x25, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0a, 0x16, 0x39, 0xeb, 0xff, 0x63, 0x17, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x1e, 0x1e, 0x1f, 0x1c, 0x06, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x1a, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0xb8, 0xff, 0xe7, 0xe2, 0xe4, 0xe7, 0xff, 0xf7, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x0c, 0x0c, 0x0b, 0x10, 0x18, 0x12, 0x0b, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const lv_img_dsc_t img_benchmark_cogwheel_rgb565a8 = {
.header.cf = LV_IMG_CF_RGB565A8,
.header.always_zero = 0,
.header.reserved = 0,
.header.w = 100,
.header.h = 100,
.data_size = 30000,
.data = img_benchmark_cogwheel_rgb565a8_map,
};

View File

@@ -42,6 +42,11 @@
#define LINE_POINT_DIFF_MAX LV_MAX(LV_HOR_RES / (LINE_POINT_NUM + 2), LINE_POINT_DIFF_MIN * 2)
#define ARC_WIDTH_THIN LV_MAX(LV_DPI_DEF / 50, 2)
#define ARC_WIDTH_THICK LV_MAX(LV_DPI_DEF / 10, 5)
#ifndef dimof
#define dimof(__array) (sizeof(__array) / sizeof(__array[0]))
#endif
/**********************
* TYPEDEFS
**********************/
@@ -56,7 +61,7 @@ typedef struct {
uint32_t fps_normal;
uint32_t fps_opa;
uint8_t weight;
}scene_dsc_t;
} scene_dsc_t;
/**********************
* STATIC PROTOTYPES
@@ -64,8 +69,16 @@ typedef struct {
static lv_style_t style_common;
static bool opa_mode = true;
static bool run_max_speed = false;
static finished_cb_t * benchmark_finished_cb = NULL;
static uint32_t disp_ori_timer_period;
static uint32_t anim_ori_timer_period;
LV_IMG_DECLARE(img_benchmark_cogwheel_argb);
#if LV_DEMO_BENCHMARK_RGB565A8 && LV_COLOR_DEPTH == 16
LV_IMG_DECLARE(img_benchmark_cogwheel_rgb565a8);
#else
LV_IMG_DECLARE(img_benchmark_cogwheel_argb);
#endif
LV_IMG_DECLARE(img_benchmark_cogwheel_rgb);
LV_IMG_DECLARE(img_benchmark_cogwheel_chroma_keyed);
LV_IMG_DECLARE(img_benchmark_cogwheel_indexed16);
@@ -85,6 +98,7 @@ static void arc_create(lv_style_t * style);
static void fall_anim(lv_obj_t * obj);
static void rnd_reset(void);
static int32_t rnd_next(int32_t min, int32_t max);
static void report_cb(lv_timer_t * timer);
static void rectangle_cb(void)
{
@@ -248,8 +262,12 @@ static void img_argb_cb(void)
{
lv_style_reset(&style_common);
lv_style_set_img_opa(&style_common, opa_mode ? LV_OPA_50 : LV_OPA_COVER);
img_create(&style_common, &img_benchmark_cogwheel_argb, false, false, false);
#if LV_DEMO_BENCHMARK_RGB565A8 && LV_COLOR_DEPTH == 16
img_create(&style_common, &img_benchmark_cogwheel_rgb565a8, false, false, false);
#else
img_create(&style_common, &img_benchmark_cogwheel_argb, false, false, false);
#endif
}
static void img_ckey_cb(void)
@@ -290,7 +308,11 @@ static void img_argb_recolor_cb(void)
lv_style_reset(&style_common);
lv_style_set_img_opa(&style_common, opa_mode ? LV_OPA_50 : LV_OPA_COVER);
lv_style_set_img_recolor_opa(&style_common, LV_OPA_50);
#if LV_DEMO_BENCHMARK_RGB565A8 && LV_COLOR_DEPTH == 16
img_create(&style_common, &img_benchmark_cogwheel_rgb565a8, false, false, false);
#else
img_create(&style_common, &img_benchmark_cogwheel_argb, false, false, false);
#endif
}
static void img_ckey_recolor_cb(void)
@@ -328,14 +350,22 @@ static void img_argb_rot_cb(void)
{
lv_style_reset(&style_common);
lv_style_set_img_opa(&style_common, opa_mode ? LV_OPA_50 : LV_OPA_COVER);
#if LV_DEMO_BENCHMARK_RGB565A8 && LV_COLOR_DEPTH == 16
img_create(&style_common, &img_benchmark_cogwheel_rgb565a8, true, false, false);
#else
img_create(&style_common, &img_benchmark_cogwheel_argb, true, false, false);
#endif
}
static void img_argb_rot_aa_cb(void)
{
lv_style_reset(&style_common);
lv_style_set_img_opa(&style_common, opa_mode ? LV_OPA_50 : LV_OPA_COVER);
#if LV_DEMO_BENCHMARK_RGB565A8 && LV_COLOR_DEPTH == 16
img_create(&style_common, &img_benchmark_cogwheel_rgb565a8, true, false, true);
#else
img_create(&style_common, &img_benchmark_cogwheel_argb, true, false, true);
#endif
}
static void img_rgb_zoom_cb(void)
@@ -359,7 +389,11 @@ static void img_argb_zoom_cb(void)
{
lv_style_reset(&style_common);
lv_style_set_img_opa(&style_common, opa_mode ? LV_OPA_50 : LV_OPA_COVER);
#if LV_DEMO_BENCHMARK_RGB565A8 && LV_COLOR_DEPTH == 16
img_create(&style_common, &img_benchmark_cogwheel_rgb565a8, false, true, false);
#else
img_create(&style_common, &img_benchmark_cogwheel_argb, false, true, false);
#endif
}
@@ -367,7 +401,11 @@ static void img_argb_zoom_aa_cb(void)
{
lv_style_reset(&style_common);
lv_style_set_img_opa(&style_common, opa_mode ? LV_OPA_50 : LV_OPA_COVER);
#if LV_DEMO_BENCHMARK_RGB565A8 && LV_COLOR_DEPTH == 16
img_create(&style_common, &img_benchmark_cogwheel_rgb565a8, false, true, true);
#else
img_create(&style_common, &img_benchmark_cogwheel_argb, false, true, true);
#endif
}
static void txt_small_cb(void)
@@ -491,8 +529,11 @@ static void sub_img_cb(void)
lv_style_reset(&style_common);
lv_style_set_img_opa(&style_common, opa_mode ? LV_OPA_50 : LV_OPA_COVER);
lv_style_set_blend_mode(&style_common, LV_BLEND_MODE_SUBTRACTIVE);
#if LV_DEMO_BENCHMARK_RGB565A8 && LV_COLOR_DEPTH == 16
img_create(&style_common, &img_benchmark_cogwheel_rgb565a8, false, false, false);
#else
img_create(&style_common, &img_benchmark_cogwheel_argb, false, false, false);
#endif
}
static void sub_line_cb(void)
{
@@ -527,66 +568,67 @@ static void sub_text_cb(void)
/**********************
* STATIC VARIABLES
**********************/
static scene_dsc_t scenes[] = {
{.name = "Rectangle", .weight = 30, .create_cb = rectangle_cb},
{.name = "Rectangle rounded", .weight = 20, .create_cb = rectangle_rounded_cb},
{.name = "Circle", .weight = 10, .create_cb = rectangle_circle_cb},
{.name = "Border", .weight = 20, .create_cb = border_cb},
{.name = "Border rounded", .weight = 30, .create_cb = border_rounded_cb},
{.name = "Circle border", .weight = 10, .create_cb = border_circle_cb},
{.name = "Border top", .weight = 3, .create_cb = border_top_cb},
{.name = "Border left", .weight = 3, .create_cb = border_left_cb},
{.name = "Border top + left", .weight = 3, .create_cb = border_top_left_cb},
{.name = "Border left + right", .weight = 3, .create_cb = border_left_right_cb},
{.name = "Border top + bottom", .weight = 3, .create_cb = border_top_bottom_cb},
{.name = "Rectangle", .weight = 30, .create_cb = rectangle_cb},
{.name = "Rectangle rounded", .weight = 20, .create_cb = rectangle_rounded_cb},
{.name = "Circle", .weight = 10, .create_cb = rectangle_circle_cb},
{.name = "Border", .weight = 20, .create_cb = border_cb},
{.name = "Border rounded", .weight = 30, .create_cb = border_rounded_cb},
{.name = "Circle border", .weight = 10, .create_cb = border_circle_cb},
{.name = "Border top", .weight = 3, .create_cb = border_top_cb},
{.name = "Border left", .weight = 3, .create_cb = border_left_cb},
{.name = "Border top + left", .weight = 3, .create_cb = border_top_left_cb},
{.name = "Border left + right", .weight = 3, .create_cb = border_left_right_cb},
{.name = "Border top + bottom", .weight = 3, .create_cb = border_top_bottom_cb},
{.name = "Shadow small", .weight = 3, .create_cb = shadow_small_cb},
{.name = "Shadow small offset", .weight = 5, .create_cb = shadow_small_ofs_cb},
{.name = "Shadow large", .weight = 5, .create_cb = shadow_large_cb},
{.name = "Shadow large offset", .weight = 3, .create_cb = shadow_large_ofs_cb},
{.name = "Shadow small", .weight = 3, .create_cb = shadow_small_cb},
{.name = "Shadow small offset", .weight = 5, .create_cb = shadow_small_ofs_cb},
{.name = "Shadow large", .weight = 5, .create_cb = shadow_large_cb},
{.name = "Shadow large offset", .weight = 3, .create_cb = shadow_large_ofs_cb},
{.name = "Image RGB", .weight = 20, .create_cb = img_rgb_cb},
{.name = "Image ARGB", .weight = 20, .create_cb = img_argb_cb},
{.name = "Image chorma keyed", .weight = 5, .create_cb = img_ckey_cb},
{.name = "Image indexed", .weight = 5, .create_cb = img_index_cb},
{.name = "Image alpha only", .weight = 5, .create_cb = img_alpha_cb},
{.name = "Image RGB", .weight = 20, .create_cb = img_rgb_cb},
{.name = "Image ARGB", .weight = 20, .create_cb = img_argb_cb},
{.name = "Image chorma keyed", .weight = 5, .create_cb = img_ckey_cb},
{.name = "Image indexed", .weight = 5, .create_cb = img_index_cb},
{.name = "Image alpha only", .weight = 5, .create_cb = img_alpha_cb},
{.name = "Image RGB recolor", .weight = 5, .create_cb = img_rgb_recolor_cb},
{.name = "Image ARGB recolor", .weight = 20, .create_cb = img_argb_recolor_cb},
{.name = "Image chorma keyed recolor", .weight = 3, .create_cb = img_ckey_recolor_cb},
{.name = "Image indexed recolor", .weight = 3, .create_cb = img_index_recolor_cb},
{.name = "Image RGB recolor", .weight = 5, .create_cb = img_rgb_recolor_cb},
{.name = "Image ARGB recolor", .weight = 20, .create_cb = img_argb_recolor_cb},
{.name = "Image chorma keyed recolor", .weight = 3, .create_cb = img_ckey_recolor_cb},
{.name = "Image indexed recolor", .weight = 3, .create_cb = img_index_recolor_cb},
{.name = "Image RGB rotate", .weight = 3, .create_cb = img_rgb_rot_cb},
{.name = "Image RGB rotate anti aliased", .weight = 3, .create_cb = img_rgb_rot_aa_cb},
{.name = "Image ARGB rotate", .weight = 5, .create_cb = img_argb_rot_cb},
{.name = "Image ARGB rotate anti aliased", .weight = 5, .create_cb = img_argb_rot_aa_cb},
{.name = "Image RGB zoom", .weight = 3, .create_cb = img_rgb_zoom_cb},
{.name = "Image RGB zoom anti aliased", .weight = 3, .create_cb = img_rgb_zoom_aa_cb},
{.name = "Image ARGB zoom", .weight = 5, .create_cb = img_argb_zoom_cb},
{.name = "Image ARGB zoom anti aliased", .weight = 5, .create_cb = img_argb_zoom_aa_cb},
{.name = "Image RGB rotate", .weight = 3, .create_cb = img_rgb_rot_cb},
{.name = "Image RGB rotate anti aliased", .weight = 3, .create_cb = img_rgb_rot_aa_cb},
{.name = "Image ARGB rotate", .weight = 5, .create_cb = img_argb_rot_cb},
{.name = "Image ARGB rotate anti aliased", .weight = 5, .create_cb = img_argb_rot_aa_cb},
{.name = "Image RGB zoom", .weight = 3, .create_cb = img_rgb_zoom_cb},
{.name = "Image RGB zoom anti aliased", .weight = 3, .create_cb = img_rgb_zoom_aa_cb},
{.name = "Image ARGB zoom", .weight = 5, .create_cb = img_argb_zoom_cb},
{.name = "Image ARGB zoom anti aliased", .weight = 5, .create_cb = img_argb_zoom_aa_cb},
{.name = "Text small", .weight = 20, .create_cb = txt_small_cb},
{.name = "Text medium", .weight = 30, .create_cb = txt_medium_cb},
{.name = "Text large", .weight = 20, .create_cb = txt_large_cb},
{.name = "Text small", .weight = 20, .create_cb = txt_small_cb},
{.name = "Text medium", .weight = 30, .create_cb = txt_medium_cb},
{.name = "Text large", .weight = 20, .create_cb = txt_large_cb},
{.name = "Text small compressed", .weight = 3, .create_cb = txt_small_compr_cb},
{.name = "Text medium compressed", .weight = 5, .create_cb = txt_medium_compr_cb},
{.name = "Text large compressed", .weight = 10, .create_cb = txt_large_compr_cb},
{.name = "Text small compressed", .weight = 3, .create_cb = txt_small_compr_cb},
{.name = "Text medium compressed", .weight = 5, .create_cb = txt_medium_compr_cb},
{.name = "Text large compressed", .weight = 10, .create_cb = txt_large_compr_cb},
{.name = "Line", .weight = 10, .create_cb = line_cb},
{.name = "Line", .weight = 10, .create_cb = line_cb},
{.name = "Arc think", .weight = 10, .create_cb = arc_think_cb},
{.name = "Arc thick", .weight = 10, .create_cb = arc_thick_cb},
{.name = "Arc think", .weight = 10, .create_cb = arc_think_cb},
{.name = "Arc thick", .weight = 10, .create_cb = arc_thick_cb},
{.name = "Substr. rectangle", .weight = 10, .create_cb = sub_rectangle_cb},
{.name = "Substr. border", .weight = 10, .create_cb = sub_border_cb},
{.name = "Substr. shadow", .weight = 10, .create_cb = sub_shadow_cb},
{.name = "Substr. image", .weight = 10, .create_cb = sub_img_cb},
{.name = "Substr. line", .weight = 10, .create_cb = sub_line_cb},
{.name = "Substr. arc", .weight = 10, .create_cb = sub_arc_cb},
{.name = "Substr. text", .weight = 10, .create_cb = sub_text_cb},
{.name = "Substr. rectangle", .weight = 10, .create_cb = sub_rectangle_cb},
{.name = "Substr. border", .weight = 10, .create_cb = sub_border_cb},
{.name = "Substr. shadow", .weight = 10, .create_cb = sub_shadow_cb},
{.name = "Substr. image", .weight = 10, .create_cb = sub_img_cb},
{.name = "Substr. line", .weight = 10, .create_cb = sub_line_cb},
{.name = "Substr. arc", .weight = 10, .create_cb = sub_arc_cb},
{.name = "Substr. text", .weight = 10, .create_cb = sub_text_cb},
{.name = "", .create_cb = NULL}
{.name = "", .create_cb = NULL}
};
static int32_t scene_act = -1;
@@ -596,23 +638,23 @@ static lv_obj_t * subtitle;
static uint32_t rnd_act;
static uint32_t rnd_map[] = {
0xbd13204f, 0x67d8167f, 0x20211c99, 0xb0a7cc05,
0x06d5c703, 0xeafb01a7, 0xd0473b5c, 0xc999aaa2,
0x86f9d5d9, 0x294bdb29, 0x12a3c207, 0x78914d14,
0x10a30006, 0x6134c7db, 0x194443af, 0x142d1099,
0x376292d5, 0x20f433c5, 0x074d2a59, 0x4e74c293,
0x072a0810, 0xdd0f136d, 0x5cca6dbc, 0x623bfdd8,
0xb645eb2f, 0xbe50894a, 0xc9b56717, 0xe0f912c8,
0x4f6b5e24, 0xfe44b128, 0xe12d57a8, 0x9b15c9cc,
0xab2ae1d3, 0xb4dc5074, 0x67d457c8, 0x8e46b00c,
0xa29a1871, 0xcee40332, 0x80f93aa1, 0x85286096,
0x09bd6b49, 0x95072088, 0x2093924b, 0x6a27328f,
0xa796079b, 0xc3b488bc, 0xe29bcce0, 0x07048a4c,
0x7d81bd99, 0x27aacb30, 0x44fc7a0e, 0xa2382241,
0x8357a17d, 0x97e9c9cc, 0xad10ff52, 0x9923fc5c,
0x8f2c840a, 0x20356ba2, 0x7997a677, 0x9a7f1800,
0x35c7562b, 0xd901fe51, 0x8f4e053d, 0xa5b94923,
static const uint32_t rnd_map[] = {
0xbd13204f, 0x67d8167f, 0x20211c99, 0xb0a7cc05,
0x06d5c703, 0xeafb01a7, 0xd0473b5c, 0xc999aaa2,
0x86f9d5d9, 0x294bdb29, 0x12a3c207, 0x78914d14,
0x10a30006, 0x6134c7db, 0x194443af, 0x142d1099,
0x376292d5, 0x20f433c5, 0x074d2a59, 0x4e74c293,
0x072a0810, 0xdd0f136d, 0x5cca6dbc, 0x623bfdd8,
0xb645eb2f, 0xbe50894a, 0xc9b56717, 0xe0f912c8,
0x4f6b5e24, 0xfe44b128, 0xe12d57a8, 0x9b15c9cc,
0xab2ae1d3, 0xb4dc5074, 0x67d457c8, 0x8e46b00c,
0xa29a1871, 0xcee40332, 0x80f93aa1, 0x85286096,
0x09bd6b49, 0x95072088, 0x2093924b, 0x6a27328f,
0xa796079b, 0xc3b488bc, 0xe29bcce0, 0x07048a4c,
0x7d81bd99, 0x27aacb30, 0x44fc7a0e, 0xa2382241,
0x8357a17d, 0x97e9c9cc, 0xad10ff52, 0x9923fc5c,
0x8f2c840a, 0x20356ba2, 0x7997a677, 0x9a7f1800,
0x35c7562b, 0xd901fe51, 0x8f4e053d, 0xa5b94923,
};
/**********************
@@ -623,11 +665,23 @@ static uint32_t rnd_map[] = {
* GLOBAL FUNCTIONS
**********************/
void lv_demo_benchmark(void)
static void benchmark_init(void)
{
lv_disp_t * disp = lv_disp_get_next(NULL);
lv_disp_t * disp = lv_disp_get_default();
disp->driver->monitor_cb = monitor_cb;
/*Force to run at maximum frame rate*/
if(run_max_speed) {
if(disp->refr_timer) {
disp_ori_timer_period = disp->refr_timer->period;
lv_timer_set_period(disp->refr_timer, 1);
}
lv_timer_t * anim_timer = lv_anim_get_timer();
anim_ori_timer_period = anim_timer->period;
lv_timer_set_period(anim_timer, 1);
}
lv_obj_t * scr = lv_scr_act();
lv_obj_remove_style_all(scr);
lv_obj_set_style_bg_opa(scr, LV_OPA_COVER, 0);
@@ -646,11 +700,55 @@ void lv_demo_benchmark(void)
lv_style_init(&style_common);
lv_obj_update_layout(scr);
}
void lv_demo_benchmark(void)
{
benchmark_init();
/*Manually start scenes*/
scene_next_task_cb(NULL);
}
void lv_demo_benchmark_run_scene(int_fast16_t scene_no)
{
benchmark_init();
if(((scene_no >> 1) >= dimof(scenes))) {
/* invalid scene number */
return ;
}
opa_mode = scene_no & 0x01;
scene_act = scene_no >> 1;
if(scenes[scene_act].create_cb) {
lv_label_set_text_fmt(title, "%"LV_PRId32"/%"LV_PRId32": %s%s", scene_act * 2 + (opa_mode ? 1 : 0),
(int32_t)(dimof(scenes) * 2) - 2,
scenes[scene_act].name, opa_mode ? " + opa" : "");
lv_label_set_text(subtitle, "");
rnd_reset();
scenes[scene_act].create_cb();
lv_timer_t * t = lv_timer_create(report_cb, SCENE_TIME, NULL);
lv_timer_set_repeat_count(t, 1);
}
}
void lv_demo_benchmark_set_finished_cb(finished_cb_t * finished_cb)
{
benchmark_finished_cb = finished_cb;
}
void lv_demo_benchmark_set_max_speed(bool en)
{
run_max_speed = en;
}
/**********************
* STATIC FUNCTIONS
**********************/
@@ -662,12 +760,217 @@ static void monitor_cb(lv_disp_drv_t * drv, uint32_t time, uint32_t px)
if(opa_mode) {
scenes[scene_act].refr_cnt_opa ++;
scenes[scene_act].time_sum_opa += time;
} else {
}
else {
scenes[scene_act].refr_cnt_normal ++;
scenes[scene_act].time_sum_normal += time;
}
// lv_obj_invalidate(lv_scr_act());
// lv_obj_invalidate(lv_scr_act());
}
static void generate_report(void)
{
uint32_t weight_sum = 0;
uint32_t weight_normal_sum = 0;
uint32_t weight_opa_sum = 0;
uint32_t fps_sum = 0;
uint32_t fps_normal_sum = 0;
uint32_t fps_opa_sum = 0;
uint32_t i;
for(i = 0; scenes[i].create_cb; i++) {
fps_normal_sum += scenes[i].fps_normal * scenes[i].weight;
weight_normal_sum += scenes[i].weight;
uint32_t w = LV_MAX(scenes[i].weight / 2, 1);
fps_opa_sum += scenes[i].fps_opa * w;
weight_opa_sum += w;
}
fps_sum = fps_normal_sum + fps_opa_sum;
weight_sum = weight_normal_sum + weight_opa_sum;
uint32_t fps_weighted = fps_sum / weight_sum;
uint32_t fps_normal_unweighted = fps_normal_sum / weight_normal_sum;
uint32_t fps_opa_unweighted = fps_opa_sum / weight_opa_sum;
uint32_t opa_speed_pct = (fps_opa_unweighted * 100) / fps_normal_unweighted;
if(NULL != benchmark_finished_cb) {
(*benchmark_finished_cb)();
}
lv_obj_clean(lv_scr_act());
scene_bg = NULL;
lv_obj_set_flex_flow(lv_scr_act(), LV_FLEX_FLOW_COLUMN);
title = lv_label_create(lv_scr_act());
lv_label_set_text_fmt(title, "Weighted FPS: %"LV_PRIu32, fps_weighted);
subtitle = lv_label_create(lv_scr_act());
lv_label_set_text_fmt(subtitle, "Opa. speed: %"LV_PRIu32"%%", opa_speed_pct);
lv_coord_t w = lv_obj_get_content_width(lv_scr_act());
lv_obj_t * table = lv_table_create(lv_scr_act());
// lv_obj_clean_style_list(table, LV_PART_MAIN);
lv_table_set_col_cnt(table, 2);
lv_table_set_col_width(table, 0, (w * 3) / 4 - 3);
lv_table_set_col_width(table, 1, w / 4 - 3);
lv_obj_set_width(table, lv_pct(100));
// static lv_style_t style_cell_slow;
// static lv_style_t style_cell_very_slow;
// static lv_style_t style_cell_title;
//
// lv_style_init(&style_cell_title);
// lv_style_set_bg_color(&style_cell_title, LV_STATE_DEFAULT, lv_palette_main(LV_PALETTE_GREY));
// lv_style_set_bg_opa(&style_cell_title, LV_STATE_DEFAULT, LV_OPA_50);
//
// lv_style_init(&style_cell_slow);
// lv_style_set_text_color(&style_cell_slow, LV_STATE_DEFAULT, LV_COLOR_ORANGE);
//
// lv_style_init(&style_cell_very_slow);
// lv_style_set_text_color(&style_cell_very_slow, LV_STATE_DEFAULT, lv_palette_main(LV_PALETTE_RED));
// lv_obj_add_style(table, LV_TABLE_PART_CELL2, &style_cell_slow);
// lv_obj_add_style(table, LV_TABLE_PART_CELL3, &style_cell_very_slow);
// lv_obj_add_style(table, LV_TABLE_PART_CELL4, &style_cell_title);
uint16_t row = 0;
lv_table_add_cell_ctrl(table, row, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
lv_table_set_cell_value(table, row, 0, "Slow but common cases");
// lv_table_set_cell_type(table, row, 0, 4);
LV_LOG("\r\n"
"LVGL v%d.%d.%d " LVGL_VERSION_INFO
" Benchmark (in csv format)\r\n",
LVGL_VERSION_MAJOR, LVGL_VERSION_MINOR, LVGL_VERSION_PATCH);
LV_LOG("Weighted FPS: %"LV_PRIu32"\r\n", fps_weighted);
LV_LOG("Opa. speed: %"LV_PRIu32"%%\r\n", opa_speed_pct);
row++;
char buf[256];
for(i = 0; scenes[i].create_cb; i++) {
if(scenes[i].fps_normal < 20 && scenes[i].weight >= 10) {
lv_table_set_cell_value(table, row, 0, scenes[i].name);
lv_snprintf(buf, sizeof(buf), "%"LV_PRIu32, scenes[i].fps_normal);
lv_table_set_cell_value(table, row, 1, buf);
// lv_table_set_cell_type(table, row, 0, 2);
// lv_table_set_cell_type(table, row, 1, 2);
//LV_LOG("%s,%s\r\n", scenes[i].name, buf);
row++;
}
if(scenes[i].fps_opa < 20 && LV_MAX(scenes[i].weight / 2, 1) >= 10) {
lv_snprintf(buf, sizeof(buf), "%s + opa", scenes[i].name);
lv_table_set_cell_value(table, row, 0, buf);
//LV_LOG("%s,", buf);
lv_snprintf(buf, sizeof(buf), "%"LV_PRIu32, scenes[i].fps_opa);
lv_table_set_cell_value(table, row, 1, buf);
// lv_table_set_cell_type(table, row, 0, 2);
// lv_table_set_cell_type(table, row, 1, 2);
//LV_LOG("%s\r\n", buf);
row++;
}
}
/*No 'slow but common cases'*/
if(row == 1) {
lv_table_add_cell_ctrl(table, row, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
lv_table_set_cell_value(table, row, 0, "All good");
row++;
}
lv_table_add_cell_ctrl(table, row, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
lv_table_set_cell_value(table, row, 0, "All cases");
// lv_table_set_cell_type(table, row, 0, 4);
row++;
for(i = 0; scenes[i].create_cb; i++) {
lv_table_set_cell_value(table, row, 0, scenes[i].name);
lv_snprintf(buf, sizeof(buf), "%"LV_PRIu32, scenes[i].fps_normal);
lv_table_set_cell_value(table, row, 1, buf);
if(scenes[i].fps_normal < 10) {
// lv_table_set_cell_type(table, row, 0, 3);
// lv_table_set_cell_type(table, row, 1, 3);
}
else if(scenes[i].fps_normal < 20) {
// lv_table_set_cell_type(table, row, 0, 2);
// lv_table_set_cell_type(table, row, 1, 2);
}
LV_LOG("%s,%s\r\n", scenes[i].name, buf);
row++;
lv_snprintf(buf, sizeof(buf), "%s + opa", scenes[i].name);
lv_table_set_cell_value(table, row, 0, buf);
LV_LOG("%s,", buf);
lv_snprintf(buf, sizeof(buf), "%"LV_PRIu32, scenes[i].fps_opa);
lv_table_set_cell_value(table, row, 1, buf);
if(scenes[i].fps_opa < 10) {
// lv_table_set_cell_type(table, row, 0, 3);
// lv_table_set_cell_type(table, row, 1, 3);
}
else if(scenes[i].fps_opa < 20) {
// lv_table_set_cell_type(table, row, 0, 2);
// lv_table_set_cell_type(table, row, 1, 2);
}
LV_LOG("%s\r\n", buf);
row++;
}
// lv_page_set_scrl_layout(page, LV_LAYOUT_COLUMN_LEFT);
}
static void report_cb(lv_timer_t * timer)
{
if(NULL != benchmark_finished_cb) {
(*benchmark_finished_cb)();
}
if(opa_mode) {
if(scene_act >= 0) {
if(scenes[scene_act].time_sum_opa == 0) scenes[scene_act].time_sum_opa = 1;
scenes[scene_act].fps_opa = (1000 * scenes[scene_act].refr_cnt_opa) / scenes[scene_act].time_sum_opa;
}
lv_label_set_text_fmt(subtitle, "Result : %"LV_PRId32" FPS",
scenes[scene_act].fps_opa);
LV_LOG("Result of \"%s + opa\": %"LV_PRId32" FPS", scenes[scene_act].name,
scenes[scene_act].fps_opa);
}
else {
if(scenes[scene_act].time_sum_normal == 0) scenes[scene_act].time_sum_normal = 1;
scenes[scene_act].fps_normal = (1000 * scenes[scene_act].refr_cnt_normal) / scenes[scene_act].time_sum_normal;
lv_label_set_text_fmt(subtitle, "Result : %"LV_PRId32" FPS",
scenes[scene_act].fps_normal);
LV_LOG("Result of \"%s\": %"LV_PRId32" FPS", scenes[scene_act].name,
scenes[scene_act].fps_normal);
}
}
static void scene_next_task_cb(lv_timer_t * timer)
@@ -680,24 +983,31 @@ static void scene_next_task_cb(lv_timer_t * timer)
if(scenes[scene_act].time_sum_opa == 0) scenes[scene_act].time_sum_opa = 1;
scenes[scene_act].fps_opa = (1000 * scenes[scene_act].refr_cnt_opa) / scenes[scene_act].time_sum_opa;
if(scenes[scene_act].create_cb) scene_act++; /*If still there are scenes go to the next*/
} else {
scene_act ++;
}
else {
scene_act++;
}
opa_mode = false;
} else {
}
else {
if(scenes[scene_act].time_sum_normal == 0) scenes[scene_act].time_sum_normal = 1;
scenes[scene_act].fps_normal = (1000 * scenes[scene_act].refr_cnt_normal) / scenes[scene_act].time_sum_normal;
opa_mode = true;
}
if(scenes[scene_act].create_cb) {
lv_label_set_text_fmt(title, "%"LV_PRId32"/%d: %s%s", scene_act * 2 + (opa_mode ? 1 : 0), (sizeof(scenes) / sizeof(scene_dsc_t) * 2) - 2, scenes[scene_act].name, opa_mode ? " + opa" : "");
lv_label_set_text_fmt(title, "%"LV_PRId32"/%"LV_PRId32": %s%s", scene_act * 2 + (opa_mode ? 1 : 0),
(int32_t)(dimof(scenes) * 2) - 2, scenes[scene_act].name, opa_mode ? " + opa" : "");
if(opa_mode) {
lv_label_set_text_fmt(subtitle, "Result of \"%s\": %"LV_PRId32" FPS", scenes[scene_act].name, scenes[scene_act].fps_normal);
} else {
lv_label_set_text_fmt(subtitle, "Result of \"%s\": %"LV_PRId32" FPS", scenes[scene_act].name,
scenes[scene_act].fps_normal);
}
else {
if(scene_act > 0) {
lv_label_set_text_fmt(subtitle, "Result of \"%s + opa\": %"LV_PRId32" FPS", scenes[scene_act - 1].name, scenes[scene_act - 1].fps_opa);
} else {
lv_label_set_text_fmt(subtitle, "Result of \"%s + opa\": %"LV_PRId32" FPS", scenes[scene_act - 1].name,
scenes[scene_act - 1].fps_opa);
}
else {
lv_label_set_text(subtitle, "");
}
}
@@ -710,156 +1020,20 @@ static void scene_next_task_cb(lv_timer_t * timer)
}
/*Ready*/
else {
uint32_t weight_sum = 0;
uint32_t weight_normal_sum = 0;
uint32_t weight_opa_sum = 0;
uint32_t fps_sum = 0;
uint32_t fps_normal_sum = 0;
uint32_t fps_opa_sum = 0;
uint32_t i;
for(i = 0; scenes[i].create_cb; i++) {
fps_normal_sum += scenes[i].fps_normal * scenes[i].weight;
weight_normal_sum += scenes[i].weight;
uint32_t w = LV_MAX(scenes[i].weight / 2, 1);
fps_opa_sum += scenes[i].fps_opa * w;
weight_opa_sum += w;
}
/*Restore original frame rate*/
if(run_max_speed) {
lv_timer_t * anim_timer = lv_anim_get_timer();
lv_timer_set_period(anim_timer, anim_ori_timer_period);
fps_sum = fps_normal_sum + fps_opa_sum;
weight_sum = weight_normal_sum + weight_opa_sum;
uint32_t fps_weighted = fps_sum / weight_sum;
uint32_t fps_normal_unweighted = fps_normal_sum / weight_normal_sum;
uint32_t fps_opa_unweighted = fps_opa_sum / weight_opa_sum;
uint32_t opa_speed_pct = (fps_opa_unweighted * 100) / fps_normal_unweighted;
lv_obj_clean(lv_scr_act());
scene_bg = NULL;
lv_obj_set_flex_flow(lv_scr_act(), LV_FLEX_FLOW_COLUMN);
title = lv_label_create(lv_scr_act());
lv_label_set_text_fmt(title, "Weighted FPS: %"LV_PRIu32, fps_weighted);
subtitle = lv_label_create(lv_scr_act());
lv_label_set_text_fmt(subtitle, "Opa. speed: %"LV_PRIu32"%%", opa_speed_pct);
lv_coord_t w = lv_obj_get_content_width(lv_scr_act());
lv_obj_t * table = lv_table_create(lv_scr_act());
// lv_obj_clean_style_list(table, LV_PART_MAIN);
lv_table_set_col_cnt(table, 2);
lv_table_set_col_width(table, 0, (w * 3) / 4 - 3);
lv_table_set_col_width(table, 1, w / 4 - 3);
lv_obj_set_width(table, lv_pct(100));
// static lv_style_t style_cell_slow;
// static lv_style_t style_cell_very_slow;
// static lv_style_t style_cell_title;
//
// lv_style_init(&style_cell_title);
// lv_style_set_bg_color(&style_cell_title, LV_STATE_DEFAULT, lv_palette_main(LV_PALETTE_GREY));
// lv_style_set_bg_opa(&style_cell_title, LV_STATE_DEFAULT, LV_OPA_50);
//
// lv_style_init(&style_cell_slow);
// lv_style_set_text_color(&style_cell_slow, LV_STATE_DEFAULT, LV_COLOR_ORANGE);
//
// lv_style_init(&style_cell_very_slow);
// lv_style_set_text_color(&style_cell_very_slow, LV_STATE_DEFAULT, lv_palette_main(LV_PALETTE_RED));
// lv_obj_add_style(table, LV_TABLE_PART_CELL2, &style_cell_slow);
// lv_obj_add_style(table, LV_TABLE_PART_CELL3, &style_cell_very_slow);
// lv_obj_add_style(table, LV_TABLE_PART_CELL4, &style_cell_title);
uint16_t row = 0;
lv_table_add_cell_ctrl(table, row, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
lv_table_set_cell_value(table, row, 0, "Slow but common cases");
// lv_table_set_cell_type(table, row, 0, 4);
row++;
char buf[256];
for(i = 0; i < sizeof(scenes) / sizeof(scene_dsc_t) - 1; i++) {
if(scenes[i].fps_normal < 20 && scenes[i].weight >= 10) {
lv_table_set_cell_value(table, row, 0, scenes[i].name);
lv_snprintf(buf, sizeof(buf), "%"LV_PRIu32, scenes[i].fps_normal);
lv_table_set_cell_value(table, row, 1, buf);
// lv_table_set_cell_type(table, row, 0, 2);
// lv_table_set_cell_type(table, row, 1, 2);
row++;
}
if(scenes[i].fps_opa < 20 && LV_MAX(scenes[i].weight / 2, 1) >= 10) {
lv_snprintf(buf, sizeof(buf), "%s + opa", scenes[i].name);
lv_table_set_cell_value(table, row, 0, buf);
lv_snprintf(buf, sizeof(buf), "%"LV_PRIu32, scenes[i].fps_opa);
lv_table_set_cell_value(table, row, 1, buf);
// lv_table_set_cell_type(table, row, 0, 2);
// lv_table_set_cell_type(table, row, 1, 2);
row++;
lv_disp_t * disp = lv_disp_get_default();
lv_timer_t * refr_timer = _lv_disp_get_refr_timer(disp);
if(refr_timer) {
lv_timer_set_period(refr_timer, disp_ori_timer_period);
}
}
/*No 'slow but common cases'*/
if(row == 1) {
lv_table_add_cell_ctrl(table, row, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
lv_table_set_cell_value(table, row, 0, "All good");
row++;
}
lv_table_add_cell_ctrl(table, row, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
lv_table_set_cell_value(table, row, 0, "All cases");
// lv_table_set_cell_type(table, row, 0, 4);
row++;
for(i = 0; i < sizeof(scenes) / sizeof(scene_dsc_t) - 1; i++) {
lv_table_set_cell_value(table, row, 0, scenes[i].name);
lv_snprintf(buf, sizeof(buf), "%"LV_PRIu32, scenes[i].fps_normal);
lv_table_set_cell_value(table, row, 1, buf);
if(scenes[i].fps_normal < 10) {
// lv_table_set_cell_type(table, row, 0, 3);
// lv_table_set_cell_type(table, row, 1, 3);
}
else if(scenes[i].fps_normal < 20) {
// lv_table_set_cell_type(table, row, 0, 2);
// lv_table_set_cell_type(table, row, 1, 2);
}
row++;
lv_snprintf(buf, sizeof(buf), "%s + opa", scenes[i].name);
lv_table_set_cell_value(table, row, 0, buf);
lv_snprintf(buf, sizeof(buf), "%"LV_PRIu32, scenes[i].fps_opa);
lv_table_set_cell_value(table, row, 1, buf);
if(scenes[i].fps_opa < 10) {
// lv_table_set_cell_type(table, row, 0, 3);
// lv_table_set_cell_type(table, row, 1, 3);
}
else if(scenes[i].fps_opa < 20) {
// lv_table_set_cell_type(table, row, 0, 2);
// lv_table_set_cell_type(table, row, 1, 2);
}
row++;
}
// lv_page_set_scrl_layout(page, LV_LAYOUT_COLUMN_LEFT);
generate_report(); /* generate report */
}
}
@@ -928,7 +1102,7 @@ static void line_create(lv_style_t * style)
uint32_t j;
for(j = 1; j < LINE_POINT_NUM; j++) {
points[i][j].x = points[i][j - 1].x + rnd_next(LINE_POINT_DIFF_MIN, LINE_POINT_DIFF_MAX);
points[i][j].y = rnd_next(LINE_POINT_DIFF_MIN, LINE_POINT_DIFF_MAX) ;
points[i][j].y = rnd_next(LINE_POINT_DIFF_MIN, LINE_POINT_DIFF_MAX);
}
@@ -945,6 +1119,11 @@ static void line_create(lv_style_t * style)
}
static void arc_anim_end_angle_cb(void * var, int32_t v)
{
lv_arc_set_end_angle(var, v);
}
static void arc_create(lv_style_t * style)
{
uint32_t i;
@@ -962,7 +1141,7 @@ static void arc_create(lv_style_t * style)
lv_anim_t a;
lv_anim_init(&a);
lv_anim_set_var(&a, obj);
lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t) lv_arc_set_end_angle);
lv_anim_set_exec_cb(&a, arc_anim_end_angle_cb);
lv_anim_set_values(&a, 0, 359);
lv_anim_set_time(&a, t);
lv_anim_set_playback_time(&a, t);
@@ -974,6 +1153,11 @@ static void arc_create(lv_style_t * style)
}
static void fall_anim_y_cb(void * var, int32_t v)
{
lv_obj_set_y(var, v);
}
static void fall_anim(lv_obj_t * obj)
{
lv_obj_set_x(obj, rnd_next(0, lv_obj_get_width(scene_bg) - lv_obj_get_width(obj)));
@@ -983,7 +1167,7 @@ static void fall_anim(lv_obj_t * obj)
lv_anim_t a;
lv_anim_init(&a);
lv_anim_set_var(&a, obj);
lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t) lv_obj_set_y);
lv_anim_set_exec_cb(&a, fall_anim_y_cb);
lv_anim_set_values(&a, 0, lv_obj_get_height(scene_bg) - lv_obj_get_height(obj));
lv_anim_set_time(&a, t);
lv_anim_set_playback_time(&a, t);

View File

@@ -22,12 +22,24 @@ extern "C" {
/**********************
* TYPEDEFS
**********************/
typedef void finished_cb_t(void);
/**********************
* GLOBAL PROTOTYPES
**********************/
void lv_demo_benchmark(void);
void lv_demo_benchmark_run_scene(int_fast16_t scene_no);
void lv_demo_benchmark_set_finished_cb(finished_cb_t * finished_cb);
/**
* Make the benchmark work at the highest frame rate
* @param en true: highest frame rate; false: default frame rate
*/
void lv_demo_benchmark_set_max_speed(bool en);
/**********************
* MACROS
**********************/

View File

@@ -2,9 +2,9 @@
## Overview
LVGL allows you to control the widgets with keypad and/or encoder without touchpad.
This demo shows how to handle buttons, drop-down lists, rollers, sliders, switches and text inputs without touchpad.
Learn more about the touchpad-less usage of LVGL [here](https://docs.lvgl.io/master/porting/indev.html#keypad-or-keyboard).
LVGL allows you to control the widgets with keypad and/or encoder without touchpad.
This demo shows how to handle buttons, drop-down lists, rollers, sliders, switches and text inputs without touchpad.
Learn more about the touchpad-less usage of LVGL [here](https://docs.lvgl.io/master/overview/indev.html#keypad-and-encoder).
![Keypad and encoder navigation in LVGL embedded GUI library](screenshot1.gif)

View File

@@ -31,7 +31,7 @@ static void ta_event_cb(lv_event_t * e);
/**********************
* STATIC VARIABLES
**********************/
static lv_group_t* g;
static lv_group_t * g;
static lv_obj_t * tv;
static lv_obj_t * t1;
static lv_obj_t * t2;
@@ -49,18 +49,18 @@ void lv_demo_keypad_encoder(void)
g = lv_group_create();
lv_group_set_default(g);
lv_indev_t* cur_drv = NULL;
for (;;) {
lv_indev_t * cur_drv = NULL;
for(;;) {
cur_drv = lv_indev_get_next(cur_drv);
if (!cur_drv) {
if(!cur_drv) {
break;
}
if (cur_drv->driver->type == LV_INDEV_TYPE_KEYPAD) {
if(cur_drv->driver->type == LV_INDEV_TYPE_KEYPAD) {
lv_indev_set_group(cur_drv, g);
}
if (cur_drv->driver->type == LV_INDEV_TYPE_ENCODER) {
if(cur_drv->driver->type == LV_INDEV_TYPE_ENCODER) {
lv_indev_set_group(cur_drv, g);
}
}
@@ -152,7 +152,7 @@ static void text_input_create(lv_obj_t * parent)
lv_textarea_set_one_line(ta2, true);
lv_textarea_set_placeholder_text(ta2, "Type something");
lv_obj_t *kb = lv_keyboard_create(lv_scr_act());
lv_obj_t * kb = lv_keyboard_create(lv_scr_act());
lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_event_cb(ta1, ta_event_cb, LV_EVENT_ALL, kb);
@@ -166,9 +166,6 @@ static void msgbox_create(void)
lv_obj_add_event_cb(mbox, msgbox_event_cb, LV_EVENT_ALL, NULL);
lv_group_focus_obj(lv_msgbox_get_btns(mbox));
lv_obj_add_state(lv_msgbox_get_btns(mbox), LV_STATE_FOCUS_KEY);
#if LV_EX_MOUSEWHEEL
lv_group_set_editing(g, true);
#endif
lv_group_focus_freeze(g, true);
lv_obj_align(mbox, LV_ALIGN_CENTER, 0, 0);

View File

@@ -16,23 +16,23 @@ extern "C" {
#include "../lvgl.h"
#if LV_USE_DEMO_WIDGETS
#include "widgets/lv_demo_widgets.h"
#include "widgets/lv_demo_widgets.h"
#endif
#if LV_USE_DEMO_BENCHMARK
#include "benchmark/lv_demo_benchmark.h"
#include "benchmark/lv_demo_benchmark.h"
#endif
#if LV_USE_DEMO_STRESS
#include "stress/lv_demo_stress.h"
#include "stress/lv_demo_stress.h"
#endif
#if LV_USE_DEMO_KEYPAD_AND_ENCODER
#include "keypad_encoder/lv_demo_keypad_encoder.h"
#include "keypad_encoder/lv_demo_keypad_encoder.h"
#endif
#if LV_USE_DEMO_MUSIC
#include "music/lv_demo_music.h"
#include "music/lv_demo_music.h"
#endif
/*********************

View File

@@ -1,10 +1,10 @@
# Music player demo
## Overview
The music player demo shows what kind of modern, smartphone-like user interfaces can be created on LVGL. It works the best with display with 480x272 or 272x480 resolution.
The music player demo shows what kind of modern, smartphone-like user interfaces can be created on LVGL. It works the best with display with 480x272 or 272x480 resolution.
![Music player demo with LVGL embedded GUI library](https://github.com/lvgl/lv_examples/blob/master/src/lv_demo_music/screenshot1.gif?raw=true)
![Music player demo with LVGL embedded GUI library](screenshot1.gif)
## Run the demo
- In `lv_conf.h` or equivalent places set `LV_USE_DEMO_MUSIC 1`
@@ -15,7 +15,7 @@ The music player demo shows what kind of modern, smartphone-like user interfaces
- `assets/spectrum.py` creates an array of spectrum values from a music. 4 band are created with 33 samples/sec: bass, bass-mid, mid, mid-treble.
- The spectrum meter UI does the followings:
- Zoom the album cover proportionality to the current bass value
- Display the 4 bands on the left side of a circle by default at 0°, 45°, 90°, 135°
- Display the 4 bands on the left side of a circle by default at 0°, 45°, 90°, 135°
- Add extra bars next to the "main bars" with a cosine shape. Add more bars for the lower bands.
- If there is a large enough bass, add a random offset to the position of the bars. E.g. start from 63° instead of 0°. (bars greater than 180° start again from 0°)
- If there is no bass, add 1 to the offset of the bars (it creates a "walking" effect)

View File

@@ -18,7 +18,7 @@ fs = int(len(S) / fn)
fout.write("const uint16_t spectrum[][4] = {\n")
for t in range(0,len(S[0]-1)):
fout.write("{ ")
f_prev = 0
f_prev = 0
for f in [8, 45, 300, 600]:
v = 0
for i in range(f_prev, f): v += S[i][t]

View File

@@ -25,7 +25,7 @@
* STATIC PROTOTYPES
**********************/
#if LV_DEMO_MUSIC_AUTO_PLAY
static void auto_step_cb(lv_timer_t * timer);
static void auto_step_cb(lv_timer_t * timer);
#endif
/**********************
@@ -87,20 +87,20 @@ static const char * genre_list[] = {
};
static const uint32_t time_list[] = {
1*60 + 14,
2*60 + 26,
1*60 + 54,
2*60 + 24,
2*60 + 37,
3*60 + 33,
1*60 + 56,
3*60 + 31,
2*60 + 20,
2*60 + 19,
2*60 + 20,
2*60 + 19,
2*60 + 20,
2*60 + 19,
1 * 60 + 14,
2 * 60 + 26,
1 * 60 + 54,
2 * 60 + 24,
2 * 60 + 37,
3 * 60 + 33,
1 * 60 + 56,
3 * 60 + 31,
2 * 60 + 20,
2 * 60 + 19,
2 * 60 + 20,
2 * 60 + 19,
2 * 60 + 20,
2 * 60 + 19,
};
/**********************
@@ -166,84 +166,84 @@ static void auto_step_cb(lv_timer_t * t)
#endif
switch(state) {
case 5:
_lv_demo_music_album_next(true);
break;
case 5:
_lv_demo_music_album_next(true);
break;
case 6:
_lv_demo_music_album_next(true);
break;
case 7:
_lv_demo_music_album_next(true);
break;
case 8:
_lv_demo_music_play(0);
break;
case 6:
_lv_demo_music_album_next(true);
break;
case 7:
_lv_demo_music_album_next(true);
break;
case 8:
_lv_demo_music_play(0);
break;
#if LV_DEMO_MUSIC_SQUARE || LV_DEMO_MUSIC_ROUND
case 11:
lv_obj_scroll_by(ctrl, 0, -LV_VER_RES, LV_ANIM_ON);
break;
case 13:
lv_obj_scroll_by(ctrl, 0, -LV_VER_RES, LV_ANIM_ON);
break;
case 11:
lv_obj_scroll_by(ctrl, 0, -LV_VER_RES, LV_ANIM_ON);
break;
case 13:
lv_obj_scroll_by(ctrl, 0, -LV_VER_RES, LV_ANIM_ON);
break;
#else
case 12:
lv_obj_scroll_by(ctrl, 0, -LV_VER_RES, LV_ANIM_ON);
break;
case 12:
lv_obj_scroll_by(ctrl, 0, -LV_VER_RES, LV_ANIM_ON);
break;
#endif
case 15:
lv_obj_scroll_by(list, 0, -300, LV_ANIM_ON);
break;
case 16:
lv_obj_scroll_by(list, 0, 300, LV_ANIM_ON);
break;
case 18:
_lv_demo_music_play(1);
break;
case 19:
lv_obj_scroll_by(ctrl, 0, LV_VER_RES, LV_ANIM_ON);
break;
case 15:
lv_obj_scroll_by(list, 0, -300, LV_ANIM_ON);
break;
case 16:
lv_obj_scroll_by(list, 0, 300, LV_ANIM_ON);
break;
case 18:
_lv_demo_music_play(1);
break;
case 19:
lv_obj_scroll_by(ctrl, 0, LV_VER_RES, LV_ANIM_ON);
break;
#if LV_DEMO_MUSIC_SQUARE || LV_DEMO_MUSIC_ROUND
case 20:
lv_obj_scroll_by(ctrl, 0, LV_VER_RES, LV_ANIM_ON);
break;
case 20:
lv_obj_scroll_by(ctrl, 0, LV_VER_RES, LV_ANIM_ON);
break;
#endif
case 30:
_lv_demo_music_play(2);
break;
case 40: {
lv_obj_t * bg = lv_layer_top();
lv_obj_set_style_bg_color(bg, lv_color_hex(0x6f8af6), 0);
lv_obj_set_style_text_color(bg, lv_color_white(), 0);
lv_obj_set_style_bg_opa(bg, LV_OPA_COVER, 0);
lv_obj_fade_in(bg, 400, 0);
lv_obj_t * dsc = lv_label_create(bg);
lv_obj_set_style_text_font(dsc, font_small, 0);
lv_label_set_text(dsc, "The average FPS is");
lv_obj_align(dsc, LV_ALIGN_TOP_MID, 0, 90);
case 30:
_lv_demo_music_play(2);
break;
case 40: {
lv_obj_t * bg = lv_layer_top();
lv_obj_set_style_bg_color(bg, lv_color_hex(0x6f8af6), 0);
lv_obj_set_style_text_color(bg, lv_color_white(), 0);
lv_obj_set_style_bg_opa(bg, LV_OPA_COVER, 0);
lv_obj_fade_in(bg, 400, 0);
lv_obj_t * dsc = lv_label_create(bg);
lv_obj_set_style_text_font(dsc, font_small, 0);
lv_label_set_text(dsc, "The average FPS is");
lv_obj_align(dsc, LV_ALIGN_TOP_MID, 0, 90);
lv_obj_t * num = lv_label_create(bg);
lv_obj_set_style_text_font(num, font_large, 0);
lv_obj_t * num = lv_label_create(bg);
lv_obj_set_style_text_font(num, font_large, 0);
#if LV_USE_PERF_MONITOR
lv_label_set_text_fmt(num, "%d", lv_refr_get_fps_avg());
lv_label_set_text_fmt(num, "%d", lv_refr_get_fps_avg());
#endif
lv_obj_align(num, LV_ALIGN_TOP_MID, 0, 120);
lv_obj_align(num, LV_ALIGN_TOP_MID, 0, 120);
lv_obj_t * attr = lv_label_create(bg);
lv_obj_set_style_text_align(attr, LV_TEXT_ALIGN_CENTER, 0);
lv_obj_set_style_text_font(attr, font_small, 0);
lv_obj_t * attr = lv_label_create(bg);
lv_obj_set_style_text_align(attr, LV_TEXT_ALIGN_CENTER, 0);
lv_obj_set_style_text_font(attr, font_small, 0);
#if LV_DEMO_MUSIC_SQUARE || LV_DEMO_MUSIC_ROUND
lv_label_set_text(attr, "Copyright 2020 LVGL Kft.\nwww.lvgl.io | lvgl@lvgl.io");
lv_label_set_text(attr, "Copyright 2020 LVGL Kft.\nwww.lvgl.io | lvgl@lvgl.io");
#else
lv_label_set_text(attr, "Copyright 2020 LVGL Kft. | www.lvgl.io | lvgl@lvgl.io");
lv_label_set_text(attr, "Copyright 2020 LVGL Kft. | www.lvgl.io | lvgl@lvgl.io");
#endif
lv_obj_align(attr, LV_ALIGN_BOTTOM_MID, 0, -10);
break;
}
case 41:
lv_scr_load(lv_obj_create(NULL));
_lv_demo_music_pause();
break;
lv_obj_align(attr, LV_ALIGN_BOTTOM_MID, 0, -10);
break;
}
case 41:
lv_scr_load(lv_obj_create(NULL));
_lv_demo_music_pause();
break;
}
state++;
}

View File

@@ -102,7 +102,7 @@ lv_obj_t * _lv_demo_music_list_create(lv_obj_t * parent)
lv_style_init(&style_artist);
lv_style_set_text_font(&style_artist, font_small);
lv_style_set_text_color(&style_artist,lv_color_hex(0xb1b0be));
lv_style_set_text_color(&style_artist, lv_color_hex(0xb1b0be));
lv_style_init(&style_time);
lv_style_set_text_font(&style_time, font_medium);

View File

@@ -23,11 +23,11 @@
#define BAR_COLOR2 lv_color_hex(0x6f8af6)
#define BAR_COLOR3 lv_color_hex(0xffffff)
#if LV_DEMO_MUSIC_LARGE
# define BAR_COLOR1_STOP 160
# define BAR_COLOR2_STOP 200
#define BAR_COLOR1_STOP 160
#define BAR_COLOR2_STOP 200
#else
# define BAR_COLOR1_STOP 80
# define BAR_COLOR2_STOP 100
#define BAR_COLOR1_STOP 80
#define BAR_COLOR2_STOP 100
#endif
#define BAR_COLOR3_STOP (2 * LV_HOR_RES / 3)
#define BAR_CNT 20
@@ -62,6 +62,7 @@ static void timer_cb(lv_timer_t * t);
static void track_load(uint32_t id);
static void stop_start_anim(lv_timer_t * t);
static void spectrum_end_cb(lv_anim_t * a);
static void album_fade_anim_cb(void * var, int32_t v);
static int32_t get_cos(int32_t deg, int32_t a);
static int32_t get_sin(int32_t deg, int32_t a);
@@ -82,7 +83,7 @@ static uint32_t bar_ofs = 0;
static uint32_t spectrum_lane_ofs_start = 0;
static uint32_t bar_rot = 0;
static uint32_t time_act;
static lv_timer_t * sec_counter_timer;
static lv_timer_t * sec_counter_timer;
static const lv_font_t * font_small;
static const lv_font_t * font_large;
static uint32_t track_id;
@@ -106,16 +107,18 @@ static const uint16_t rnd_array[30] = {994, 285, 553, 11, 792, 707, 966, 641, 85
* Callback adapter function to convert parameter types to avoid compile-time
* warning.
*/
static void _img_set_zoom_anim_cb(void * obj, int32_t zoom) {
lv_img_set_zoom((lv_obj_t*)obj, (uint16_t)zoom);
static void _img_set_zoom_anim_cb(void * obj, int32_t zoom)
{
lv_img_set_zoom((lv_obj_t *)obj, (uint16_t)zoom);
}
/*
* Callback adapter function to convert parameter types to avoid compile-time
* warning.
*/
static void _obj_set_x_anim_cb(void * obj, int32_t x) {
lv_obj_set_x((lv_obj_t*)obj, (lv_coord_t)x);
static void _obj_set_x_anim_cb(void * obj, int32_t x)
{
lv_obj_set_x((lv_obj_t *)obj, (lv_coord_t)x);
}
lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent)
@@ -145,16 +148,17 @@ lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent)
#if LV_DEMO_MUSIC_SQUARE || LV_DEMO_MUSIC_ROUND
static const lv_coord_t grid_cols[] = {LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
static lv_coord_t grid_rows[] = {LV_DEMO_MUSIC_HANDLE_SIZE, /*Spacing*/
0, /*Spectrum obj, set later*/
LV_GRID_CONTENT, /*Title box*/
LV_GRID_FR(3), /*Spacer*/
LV_GRID_CONTENT, /*Icon box*/
LV_GRID_FR(3), /*Spacer*/
LV_GRID_CONTENT, /*Control box*/
LV_GRID_FR(3), /*Spacer*/
LV_GRID_CONTENT, /*Handle box*/
LV_DEMO_MUSIC_HANDLE_SIZE, /*Spacing*/
LV_GRID_TEMPLATE_LAST};
0, /*Spectrum obj, set later*/
LV_GRID_CONTENT, /*Title box*/
LV_GRID_FR(3), /*Spacer*/
LV_GRID_CONTENT, /*Icon box*/
LV_GRID_FR(3), /*Spacer*/
LV_GRID_CONTENT, /*Control box*/
LV_GRID_FR(3), /*Spacer*/
LV_GRID_CONTENT, /*Handle box*/
LV_DEMO_MUSIC_HANDLE_SIZE, /*Spacing*/
LV_GRID_TEMPLATE_LAST
};
grid_rows[1] = LV_VER_RES;
@@ -184,7 +188,8 @@ lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent)
LV_GRID_CONTENT, /*Handle box*/
LV_GRID_FR(1), /*Spacer*/
LV_DEMO_MUSIC_HANDLE_SIZE, /*Spacing*/
LV_GRID_TEMPLATE_LAST};
LV_GRID_TEMPLATE_LAST
};
lv_obj_set_grid_dsc_array(cont, grid_cols, grid_rows);
lv_obj_set_style_grid_row_align(cont, LV_GRID_ALIGN_SPACE_BETWEEN, 0);
@@ -207,7 +212,8 @@ lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent)
LV_GRID_CONTENT, /*Handle box*/
LV_GRID_FR(1), /*Spacer*/
LV_DEMO_MUSIC_HANDLE_SIZE, /*Spacing*/
LV_GRID_TEMPLATE_LAST};
LV_GRID_TEMPLATE_LAST
};
lv_obj_set_grid_dsc_array(cont, grid_cols, grid_rows);
lv_obj_set_style_grid_row_align(cont, LV_GRID_ALIGN_SPACE_BETWEEN, 0);
@@ -292,17 +298,20 @@ void _lv_demo_music_album_next(bool next)
if(next) {
id++;
if(id >= ACTIVE_TRACK_CNT) id = 0;
} else {
}
else {
if(id == 0) {
id = ACTIVE_TRACK_CNT - 1;
} else {
}
else {
id--;
}
}
if(playing) {
_lv_demo_music_play(id);
} else {
}
else {
track_load(id);
}
}
@@ -381,21 +390,21 @@ static lv_obj_t * create_cont(lv_obj_t * parent)
lv_obj_t * placeholder1 = lv_obj_create(main_cont);
lv_obj_remove_style_all(placeholder1);
lv_obj_clear_flag(placeholder1, LV_OBJ_FLAG_CLICKABLE);
// lv_obj_set_style_bg_color(placeholder1, lv_color_hex(0xff0000), 0);
// lv_obj_set_style_bg_opa(placeholder1, LV_OPA_50, 0);
// lv_obj_set_style_bg_color(placeholder1, lv_color_hex(0xff0000), 0);
// lv_obj_set_style_bg_opa(placeholder1, LV_OPA_50, 0);
lv_obj_t * placeholder2 = lv_obj_create(main_cont);
lv_obj_remove_style_all(placeholder2);
lv_obj_clear_flag(placeholder2, LV_OBJ_FLAG_CLICKABLE);
// lv_obj_set_style_bg_color(placeholder2, lv_color_hex(0x00ff00), 0);
// lv_obj_set_style_bg_opa(placeholder2, LV_OPA_50, 0);
// lv_obj_set_style_bg_color(placeholder2, lv_color_hex(0x00ff00), 0);
// lv_obj_set_style_bg_opa(placeholder2, LV_OPA_50, 0);
#if LV_DEMO_MUSIC_SQUARE || LV_DEMO_MUSIC_ROUND
lv_obj_t * placeholder3 = lv_obj_create(main_cont);
lv_obj_remove_style_all(placeholder3);
lv_obj_clear_flag(placeholder3, LV_OBJ_FLAG_CLICKABLE);
// lv_obj_set_style_bg_color(placeholder3, lv_color_hex(0x0000ff), 0);
// lv_obj_set_style_bg_opa(placeholder3, LV_OPA_20, 0);
// lv_obj_set_style_bg_color(placeholder3, lv_color_hex(0x0000ff), 0);
// lv_obj_set_style_bg_opa(placeholder3, LV_OPA_20, 0);
lv_obj_set_size(placeholder1, lv_pct(100), LV_VER_RES);
lv_obj_set_y(placeholder1, 0);
@@ -423,13 +432,13 @@ static void create_wave_images(lv_obj_t * parent)
LV_IMG_DECLARE(img_lv_demo_music_wave_top);
LV_IMG_DECLARE(img_lv_demo_music_wave_bottom);
lv_obj_t * wave_top = lv_img_create(parent);
lv_img_set_src(wave_top,&img_lv_demo_music_wave_top);
lv_img_set_src(wave_top, &img_lv_demo_music_wave_top);
lv_obj_set_width(wave_top, LV_HOR_RES);
lv_obj_align(wave_top, LV_ALIGN_TOP_MID, 0, 0);
lv_obj_add_flag(wave_top, LV_OBJ_FLAG_IGNORE_LAYOUT);
lv_obj_t * wave_bottom = lv_img_create(parent);
lv_img_set_src(wave_bottom,&img_lv_demo_music_wave_bottom);
lv_img_set_src(wave_bottom, &img_lv_demo_music_wave_bottom);
lv_obj_set_width(wave_bottom, LV_HOR_RES);
lv_obj_align(wave_bottom, LV_ALIGN_BOTTOM_MID, 0, 0);
lv_obj_add_flag(wave_bottom, LV_OBJ_FLAG_IGNORE_LAYOUT);
@@ -538,7 +547,7 @@ static lv_obj_t * create_ctrl_box(lv_obj_t * parent)
#else
lv_obj_set_style_pad_bottom(cont, 8, 0);
#endif
static const lv_coord_t grid_col[] = {LV_GRID_FR(2), LV_GRID_FR(3),LV_GRID_FR(5), LV_GRID_FR(5), LV_GRID_FR(5), LV_GRID_FR(3), LV_GRID_FR(2), LV_GRID_TEMPLATE_LAST};
static const lv_coord_t grid_col[] = {LV_GRID_FR(2), LV_GRID_FR(3), LV_GRID_FR(5), LV_GRID_FR(5), LV_GRID_FR(5), LV_GRID_FR(3), LV_GRID_FR(2), LV_GRID_TEMPLATE_LAST};
static const lv_coord_t grid_row[] = {LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
lv_obj_set_grid_dsc_array(cont, grid_col, grid_row);
@@ -659,9 +668,14 @@ static void track_load(uint32_t id)
lv_label_set_text(artist_label, _lv_demo_music_get_artist(track_id));
lv_label_set_text(genre_label, _lv_demo_music_get_genre(track_id));
lv_obj_fade_out(album_img_obj, 500, 0);
lv_anim_t a;
lv_anim_init(&a);
lv_anim_set_var(&a, album_img_obj);
lv_anim_set_values(&a, lv_obj_get_style_img_opa(album_img_obj, 0), LV_OPA_TRANSP);
lv_anim_set_exec_cb(&a, album_fade_anim_cb);
lv_anim_set_time(&a, 500);
lv_anim_start(&a);
lv_anim_init(&a);
lv_anim_set_var(&a, album_img_obj);
lv_anim_set_time(&a, 500);
@@ -669,13 +683,15 @@ static void track_load(uint32_t id)
#if LV_DEMO_MUSIC_LANDSCAPE
if(next) {
lv_anim_set_values(&a, 0, - LV_HOR_RES / 7);
} else {
}
else {
lv_anim_set_values(&a, 0, LV_HOR_RES / 7);
}
#else
if(next) {
lv_anim_set_values(&a, 0, - LV_HOR_RES / 2);
} else {
}
else {
lv_anim_set_values(&a, 0, LV_HOR_RES / 2);
}
#endif
@@ -692,7 +708,6 @@ static void track_load(uint32_t id)
lv_anim_start(&a);
album_img_obj = album_img_create(spectrum_obj);
lv_obj_fade_in(album_img_obj, 500, 100);
lv_anim_set_path_cb(&a, lv_anim_path_overshoot);
lv_anim_set_var(&a, album_img_obj);
@@ -702,6 +717,14 @@ static void track_load(uint32_t id)
lv_anim_set_exec_cb(&a, _img_set_zoom_anim_cb);
lv_anim_set_ready_cb(&a, NULL);
lv_anim_start(&a);
lv_anim_init(&a);
lv_anim_set_var(&a, album_img_obj);
lv_anim_set_values(&a, 0, LV_OPA_COVER);
lv_anim_set_exec_cb(&a, album_fade_anim_cb);
lv_anim_set_time(&a, 500);
lv_anim_set_delay(&a, 100);
lv_anim_start(&a);
}
int32_t get_cos(int32_t deg, int32_t a)
@@ -768,18 +791,18 @@ static void spectrum_draw_event_cb(lv_event_t * e)
uint32_t f;
uint32_t band_w = 0; /*Real number of bars in this band.*/
switch(s) {
case 0:
band_w = 20;
break;
case 1:
band_w = 8;
break;
case 2:
band_w = 4;
break;
case 3:
band_w = 2;
break;
case 0:
band_w = 20;
break;
case 1:
band_w = 8;
break;
case 2:
band_w = 4;
break;
case 3:
band_w = 2;
break;
}
/* Add "side bars" with cosine characteristic.*/
@@ -799,7 +822,7 @@ static void spectrum_draw_event_cb(lv_event_t * e)
for(i = 0; i < BAR_CNT; i++) {
uint32_t deg_space = 1;
uint32_t deg = i * DEG_STEP + 90;
uint32_t j = (i + bar_rot + rnd_array[bar_ofs %10]) % BAR_CNT;
uint32_t j = (i + bar_rot + rnd_array[bar_ofs % 10]) % BAR_CNT;
uint32_t k = (i + bar_rot + rnd_array[(bar_ofs + 1) % 10]) % BAR_CNT;
uint32_t v = (r[k] * animv + r[j] * (amax - animv)) / amax;
@@ -811,8 +834,10 @@ static void spectrum_draw_event_cb(lv_event_t * e)
if(v < BAR_COLOR1_STOP) draw_dsc.bg_color = BAR_COLOR1;
else if(v > BAR_COLOR3_STOP) draw_dsc.bg_color = BAR_COLOR3;
else if(v > BAR_COLOR2_STOP) draw_dsc.bg_color = lv_color_mix(BAR_COLOR3, BAR_COLOR2, ((v - BAR_COLOR2_STOP) * 255) / (BAR_COLOR3_STOP-BAR_COLOR2_STOP));
else draw_dsc.bg_color = lv_color_mix(BAR_COLOR2, BAR_COLOR1, ((v - BAR_COLOR1_STOP) * 255) / (BAR_COLOR2_STOP - BAR_COLOR1_STOP));
else if(v > BAR_COLOR2_STOP) draw_dsc.bg_color = lv_color_mix(BAR_COLOR3, BAR_COLOR2,
((v - BAR_COLOR2_STOP) * 255) / (BAR_COLOR3_STOP - BAR_COLOR2_STOP));
else draw_dsc.bg_color = lv_color_mix(BAR_COLOR2, BAR_COLOR1,
((v - BAR_COLOR1_STOP) * 255) / (BAR_COLOR2_STOP - BAR_COLOR1_STOP));
uint32_t di = deg + deg_space;
@@ -859,7 +884,7 @@ static void spectrum_anim_cb(void * a, int32_t v)
static int32_t last_bass = -1000;
static int32_t dir = 1;
if(spectrum[spectrum_i][0] > 12) {
if(spectrum_i-last_bass > 5) {
if(spectrum_i - last_bass > 5) {
bass_cnt++;
last_bass = spectrum_i;
if(bass_cnt >= 2) {
@@ -869,7 +894,7 @@ static void spectrum_anim_cb(void * a, int32_t v)
}
}
}
if(spectrum[spectrum_i][0] < 4) bar_rot+= dir;
if(spectrum[spectrum_i][0] < 4) bar_rot += dir;
lv_img_set_zoom(album_img_obj, LV_IMG_ZOOM_NONE + spectrum[spectrum_i][0]);
}
@@ -891,21 +916,21 @@ static lv_obj_t * album_img_create(lv_obj_t * parent)
img = lv_img_create(parent);
switch(track_id) {
case 2:
lv_img_set_src(img, &img_lv_demo_music_cover_3);
spectrum = spectrum_3;
spectrum_len = sizeof(spectrum_3) / sizeof(spectrum_3[0]);
break;
case 1:
lv_img_set_src(img, &img_lv_demo_music_cover_2);
spectrum = spectrum_2;
spectrum_len = sizeof(spectrum_2) / sizeof(spectrum_2[0]);
break;
case 0:
lv_img_set_src(img, &img_lv_demo_music_cover_1);
spectrum = spectrum_1;
spectrum_len = sizeof(spectrum_1) / sizeof(spectrum_1[0]);
break;
case 2:
lv_img_set_src(img, &img_lv_demo_music_cover_3);
spectrum = spectrum_3;
spectrum_len = sizeof(spectrum_3) / sizeof(spectrum_3[0]);
break;
case 1:
lv_img_set_src(img, &img_lv_demo_music_cover_2);
spectrum = spectrum_2;
spectrum_len = sizeof(spectrum_2) / sizeof(spectrum_2[0]);
break;
case 0:
lv_img_set_src(img, &img_lv_demo_music_cover_1);
spectrum = spectrum_1;
spectrum_len = sizeof(spectrum_1) / sizeof(spectrum_1[0]);
break;
}
lv_img_set_antialias(img, false);
lv_obj_align(img, LV_ALIGN_CENTER, 0, 0);
@@ -929,7 +954,8 @@ static void play_event_click_cb(lv_event_t * e)
lv_obj_t * obj = lv_event_get_target(e);
if(lv_obj_has_state(obj, LV_STATE_CHECKED)) {
_lv_demo_music_resume();
} else {
}
else {
_lv_demo_music_pause();
}
}
@@ -970,5 +996,10 @@ static void stop_start_anim(lv_timer_t * t)
start_anim = false;
lv_obj_refresh_ext_draw_size(spectrum_obj);
}
static void album_fade_anim_cb(void * var, int32_t v)
{
lv_obj_set_style_img_opa(var, v, 0);
}
#endif /*LV_USE_DEMO_MUSIC*/

View File

@@ -2,10 +2,10 @@
## Overview
A stress test for LVGL.
It contains a lot of object creation, deletion, animations, styles usage, and so on. It can be used if there is any memory corruption during heavy usage or any memory leaks.
A stress test for LVGL.
It contains a lot of object creation, deletion, animations, styles usage, and so on. It can be used if there is any memory corruption during heavy usage or any memory leaks.
![Printer demo with LVGL embedded GUI library](https://github.com/lvgl/lv_examples/blob/master/src/lv_demo_stress/screenshot1.gif?raw=true)
![Stress demo with LVGL embedded GUI library](screenshot1.gif)
## Run the demo
- In `lv_conf.h` or equivalent places set `LV_USE_DEMO_STRESS 1`

View File

@@ -1,318 +0,0 @@
#include "../../../lvgl.h"
#if LV_USE_DEMO_STRESS
/*******************************************************************************
* Size: 12 px
* Bpp: 4
* Opts:
******************************************************************************/
#ifndef LV_FONT_MONTSERRAT_12_COMPR_AZ
#define LV_FONT_MONTSERRAT_12_COMPR_AZ 1
#endif
#if LV_FONT_MONTSERRAT_12_COMPR_AZ
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = {
/* U+20 " " */
/* U+61 "a" */
0x8, 0xdf, 0xc3, 0x0, 0x14, 0xea, 0xf0, 0x2,
0x90, 0xa0, 0x84, 0x23, 0x7b, 0xc0, 0xd1, 0xb3,
0xb8, 0x1, 0x84, 0x1c, 0x0, 0x8f, 0xdb, 0xe0,
0x0,
/* U+62 "b" */
0xe4, 0x0, 0xff, 0xe4, 0x1e, 0x7e, 0x20, 0x2,
0x27, 0x52, 0xc8, 0x25, 0x4a, 0x12, 0x80, 0x80,
0x23, 0x20, 0x20, 0x8, 0xc8, 0x25, 0x4a, 0x12,
0x82, 0x63, 0x52, 0xc8,
/* U+63 "c" */
0x2, 0xbf, 0xe8, 0x0, 0x78, 0xed, 0x21, 0xa8,
0x51, 0x26, 0x19, 0x30, 0x7, 0x13, 0x0, 0x72,
0x85, 0x12, 0x69, 0x87, 0x8e, 0xd2, 0x98,
/* U+64 "d" */
0x0, 0xe1, 0xf1, 0x0, 0xff, 0xe2, 0x95, 0xfe,
0xb8, 0x5, 0x85, 0xbd, 0x60, 0x5, 0x39, 0x23,
0x90, 0x1, 0x30, 0x4, 0xa0, 0x2, 0x60, 0x8,
0x80, 0xa, 0x72, 0x25, 0xc0, 0x16, 0x17, 0x65,
0x80, 0x0,
/* U+65 "e" */
0x2, 0xbf, 0xd5, 0x0, 0x61, 0xf4, 0xda, 0x29,
0x40, 0xa4, 0x79, 0x1f, 0x75, 0xe, 0x44, 0xee,
0xd8, 0xa7, 0x24, 0x74, 0x41, 0x85, 0xba, 0x32,
/* U+66 "f" */
0x1, 0xcf, 0x60, 0x86, 0xe7, 0x2, 0xc1, 0x16,
0xa4, 0xf9, 0xea, 0x4f, 0x98, 0x7, 0xff, 0x34,
/* U+67 "g" */
0x2, 0xbf, 0xe6, 0xe2, 0xc, 0x1d, 0xd5, 0x8,
0x29, 0xd1, 0x1f, 0x0, 0x9, 0x80, 0x22, 0x0,
0x13, 0x0, 0x44, 0x0, 0x53, 0xa2, 0x3f, 0x0,
0xb0, 0x77, 0x50, 0x1, 0x15, 0xff, 0x38, 0x10,
0x63, 0x11, 0xca, 0x80, 0x2a, 0xf7, 0x43, 0x60,
/* U+68 "h" */
0xe4, 0x0, 0xff, 0xe4, 0x1e, 0xfe, 0x10, 0x2,
0x65, 0xad, 0xc0, 0x8, 0x42, 0x83, 0x0, 0x10,
0x0, 0x80, 0x40, 0x3c, 0x60, 0x1f, 0xfc, 0x20,
/* U+69 "i" */
0xd, 0x40, 0x56, 0x8, 0x20, 0xe4, 0x0, 0xff,
0xe3, 0x0,
/* U+6A "j" */
0x0, 0xb5, 0x40, 0x2a, 0x70, 0x9, 0xc8, 0x2,
0xd4, 0x0, 0xff, 0xec, 0x11, 0x4c, 0x1f, 0xae,
0x40,
/* U+6B "k" */
0xe4, 0x0, 0xff, 0xe5, 0xdd, 0x0, 0x6b, 0xa,
0x0, 0xad, 0xec, 0x2, 0xa4, 0x10, 0xc, 0x5c,
0x12, 0x1, 0x40, 0xfb, 0x20, 0x6, 0x29, 0xa1,
/* U+6C "l" */
0xe4, 0x0, 0xff, 0xe3, 0x0,
/* U+6D "m" */
0xe7, 0xdf, 0xb2, 0x9e, 0xe4, 0x0, 0x2b, 0xb5,
0xf4, 0xb3, 0x59, 0x42, 0xcc, 0xa0, 0x28, 0x8d,
0xf0, 0x8, 0x0, 0xe0, 0x20, 0x1, 0x30, 0xf,
0xfe, 0xa8,
/* U+6E "n" */
0xe6, 0xdf, 0xc2, 0x0, 0x44, 0xf3, 0x70, 0x2,
0x10, 0x6c, 0xc0, 0x4, 0x0, 0x10, 0x10, 0xf,
0x18, 0x7, 0xff, 0x8,
/* U+6F "o" */
0x2, 0xbf, 0xe8, 0x0, 0xb0, 0x77, 0x4d, 0x0,
0xa7, 0x44, 0x74, 0xe0, 0x4c, 0x1, 0x28, 0x9,
0x30, 0x4, 0xa0, 0x2a, 0x14, 0x47, 0x4e, 0x0,
0xf1, 0xdd, 0x34, 0x0,
/* U+70 "p" */
0xe7, 0xdf, 0xc4, 0x0, 0x44, 0xf5, 0x59, 0x4,
0xa0, 0xb2, 0xd0, 0x10, 0x4, 0x44, 0x3, 0x0,
0x8c, 0x82, 0x14, 0xa1, 0x28, 0x26, 0x5a, 0x96,
0x40, 0x59, 0xf8, 0x80, 0x1f, 0xfc, 0x30,
/* U+71 "q" */
0x2, 0xbf, 0xd5, 0xf1, 0xc, 0x1d, 0xeb, 0x0,
0x29, 0xd1, 0x1d, 0x0, 0x9, 0x80, 0x25, 0x0,
0x13, 0x0, 0x4a, 0x0, 0x53, 0xa2, 0x3a, 0x0,
0xb0, 0x77, 0xac, 0x2, 0x2b, 0xfd, 0x40, 0xf,
0xfe, 0x30,
/* U+72 "r" */
0xe6, 0xd8, 0x8, 0xb9, 0x9, 0x61, 0x3, 0x0,
0xff, 0xe1, 0x0,
/* U+73 "s" */
0x9, 0xef, 0xc2, 0x64, 0xcd, 0xa3, 0x10, 0x1,
0x30, 0xba, 0x6f, 0x48, 0x84, 0xfe, 0x2c, 0x2b,
0x10, 0x38, 0x8a, 0xb7, 0x6, 0x0,
/* U+74 "t" */
0x5, 0x30, 0xb, 0x94, 0x1, 0xa9, 0x3e, 0x7a,
0x93, 0xe6, 0x1, 0xff, 0xc4, 0x1c, 0x11, 0x4,
0x3f, 0x38,
/* U+75 "u" */
0xf3, 0x0, 0x17, 0x80, 0x7f, 0xf2, 0x85, 0xc0,
0xc, 0x0, 0x4f, 0x22, 0x40, 0x2, 0xc3, 0x72,
0x80, 0x0,
/* U+76 "v" */
0xd, 0x50, 0xa, 0x60, 0x2e, 0x40, 0x26, 0xa0,
0x73, 0x20, 0x64, 0x20, 0x15, 0xa0, 0xae, 0x0,
0xa5, 0x8c, 0x94, 0x2, 0x33, 0x73, 0x0, 0x75,
0x95, 0x0, 0x0,
/* U+77 "w" */
0xc5, 0x0, 0x1f, 0x88, 0x1, 0xe2, 0xbc, 0x1,
0x40, 0xe0, 0xa, 0xb7, 0x50, 0x3, 0xc6, 0x81,
0x1, 0x8a, 0x2a, 0x13, 0xa8, 0xd2, 0x80, 0x37,
0xf6, 0x81, 0x1d, 0x6c, 0x0, 0xea, 0xee, 0xe,
0x80, 0x30, 0x0, 0xa2, 0x88, 0x20, 0x28, 0x0,
/* U+78 "x" */
0x5d, 0x0, 0x27, 0xa, 0xbc, 0x8d, 0x50, 0x42,
0xdf, 0x1d, 0x0, 0x2, 0xc5, 0x0, 0x11, 0x32,
0x58, 0x5, 0xd3, 0x6e, 0xc0, 0xe0, 0xe1, 0xd2,
0x40,
/* U+79 "y" */
0xd, 0x50, 0xa, 0x60, 0x2b, 0x80, 0x27, 0xa0,
0x64, 0x20, 0x52, 0x20, 0xa, 0xa8, 0x3a, 0x40,
0x2e, 0xa1, 0x55, 0x0, 0x48, 0x74, 0xe0, 0x1c,
0xc9, 0x40, 0x1d, 0xa4, 0x60, 0x12, 0x94, 0xd8,
0x4, 0x33, 0xaa, 0xc0, 0x10,
/* U+7A "z" */
0x7f, 0xfd, 0x6f, 0xfe, 0xd0, 0x80, 0xb, 0xa0,
0xc0, 0x12, 0xee, 0x0, 0x23, 0xd0, 0x0, 0x6a,
0xc4, 0x1, 0x23, 0x5f, 0xed
};
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */,
{.bitmap_index = 0, .adv_w = 52, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 0, .adv_w = 115, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 25, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 53, .adv_w = 110, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 76, .adv_w = 131, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 110, .adv_w = 118, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 134, .adv_w = 68, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 150, .adv_w = 132, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 190, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 214, .adv_w = 54, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 224, .adv_w = 55, .box_w = 5, .box_h = 13, .ofs_x = -2, .ofs_y = -3},
{.bitmap_index = 241, .adv_w = 118, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 265, .adv_w = 54, .box_w = 2, .box_h = 10, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 270, .adv_w = 203, .box_w = 11, .box_h = 7, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 296, .adv_w = 131, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 316, .adv_w = 122, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 344, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = -3},
{.bitmap_index = 375, .adv_w = 131, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 409, .adv_w = 79, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 420, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 442, .adv_w = 79, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 460, .adv_w = 130, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 478, .adv_w = 107, .box_w = 8, .box_h = 7, .ofs_x = -1, .ofs_y = 0},
{.bitmap_index = 505, .adv_w = 173, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 545, .adv_w = 106, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 570, .adv_w = 107, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = -3},
{.bitmap_index = 607, .adv_w = 100, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}
};
/*---------------------
* CHARACTER MAPPING
*--------------------*/
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 32, .range_length = 1, .glyph_id_start = 1,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
},
{
.range_start = 97, .range_length = 26, .glyph_id_start = 2,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
}
};
/*-----------------
* KERNING
*----------------*/
/*Map glyph_ids to kern left classes*/
static const uint8_t kern_left_class_mapping[] =
{
0, 0, 1, 2, 3, 4, 5, 6,
0, 1, 0, 0, 7, 4, 1, 1,
2, 2, 8, 9, 10, 11, 0, 12,
12, 13, 12, 14
};
/*Map glyph_ids to kern right classes*/
static const uint8_t kern_right_class_mapping[] =
{
0, 0, 1, 2, 3, 3, 3, 0,
3, 2, 4, 5, 2, 2, 4, 4,
3, 4, 3, 4, 6, 7, 8, 9,
9, 10, 9, 11
};
/*Kern values between classes*/
static const int8_t kern_class_values[] =
{
0, 0, 1, 0, 0, 0, 0, 0,
-2, 0, 0, -1, 0, 0, 0, 0,
0, 0, 0, -3, -3, -2, 0, -1,
-2, 0, 0, 0, 1, 0, -1, -3,
-1, 0, 0, 0, 0, 0, 0, 2,
0, 0, 0, 0, -3, 0, 0, 0,
0, 0, 0, 0, -2, -3, -1, -2,
0, -2, 15, 8, 0, 0, 0, 2,
0, 0, -2, 0, -4, -1, 0, -3,
0, -2, -5, -4, -2, 0, 0, 0,
0, 10, 0, 0, 0, 0, 0, 0,
-2, -1, -2, -1, 0, -1, 3, 0,
3, -1, 0, 0, 0, 0, 0, 0,
0, 0, 0, -2, -2, 0, 0, 0,
-3, 0, 0, 0, -2, 0, -2, 0,
0, -3, 0, -3, 0, -3, -1, 3,
0, -2, -6, -2, -2, 0, -3, 0,
1, -2, 0, -2, -6, 0, -2, 0,
0, -2, 0, 0, 0, 0, 0, -2,
-2, 0
};
/*Collect the kern class' data in one place*/
static const lv_font_fmt_txt_kern_classes_t kern_classes =
{
.class_pair_values = kern_class_values,
.left_class_mapping = kern_left_class_mapping,
.right_class_mapping = kern_right_class_mapping,
.left_class_cnt = 14,
.right_class_cnt = 11,
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
/*Store all the custom data of the font*/
static lv_font_fmt_txt_dsc_t font_dsc = {
.glyph_bitmap = gylph_bitmap,
.glyph_dsc = glyph_dsc,
.cmaps = cmaps,
.kern_dsc = &kern_classes,
.kern_scale = 16,
.cmap_num = 2,
.bpp = 4,
.kern_classes = 1,
.bitmap_format = 1
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
lv_font_t lv_font_montserrat_12_compr_az = {
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 13, /*The maximum line height required by the font*/
.base_line = 3, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
.dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
};
#endif /*#if LV_FONT_MONTSERRAT_12_COMPR_AZ*/
#endif

View File

@@ -1,357 +0,0 @@
#include "../../../lvgl.h"
#if LV_USE_DEMO_STRESS
/*******************************************************************************
* Size: 16 px
* Bpp: 4
* Opts:
******************************************************************************/
#ifndef LV_FONT_MONTSERRAT_16_COMPR_AZ
#define LV_FONT_MONTSERRAT_16_COMPR_AZ 1
#endif
#if LV_FONT_MONTSERRAT_16_COMPR_AZ
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = {
/* U+20 " " */
/* U+61 "a" */
0x1, 0x9e, 0xfd, 0x80, 0xb, 0x5d, 0xa1, 0xdd,
0x20, 0xe, 0xe4, 0x3d, 0x2b, 0x0, 0x8, 0x3,
0x60, 0x10, 0x15, 0xf7, 0xfa, 0x40, 0x2c, 0x7a,
0xdd, 0x40, 0x0, 0x86, 0x50, 0x88, 0x1, 0x10,
0xca, 0x13, 0xc0, 0x5, 0x8f, 0x7b, 0x92, 0x0,
/* U+62 "b" */
0x8f, 0x0, 0xff, 0xe9, 0x15, 0xff, 0x59, 0x80,
0x6c, 0x78, 0x65, 0xc3, 0x0, 0x93, 0x1e, 0x3c,
0x7c, 0x2, 0x80, 0x8, 0x64, 0xc4, 0x0, 0x40,
0x18, 0x80, 0x80, 0x4, 0x1, 0x88, 0x8, 0x1,
0x0, 0x10, 0xc9, 0x8, 0x1, 0x31, 0xe3, 0xc7,
0x80, 0x3, 0x8f, 0xc, 0xb8, 0x60,
/* U+63 "c" */
0x0, 0x1d, 0x77, 0xe2, 0x0, 0x13, 0x1d, 0xa0,
0x2d, 0x2, 0x4b, 0x61, 0xf2, 0x14, 0xca, 0xc0,
0x33, 0x8b, 0x82, 0x80, 0x79, 0xc1, 0x40, 0x3c,
0x65, 0x60, 0x19, 0x84, 0x24, 0xb5, 0xdd, 0x92,
0xa0, 0x98, 0xf3, 0x1, 0x68,
/* U+64 "d" */
0x0, 0xf8, 0x7d, 0xc0, 0x3f, 0xf9, 0x47, 0x7f,
0xea, 0x20, 0x9, 0x31, 0x9e, 0x1b, 0x40, 0x2a,
0x2d, 0x87, 0xc5, 0x0, 0x18, 0xd8, 0x6, 0x80,
0x3, 0x82, 0x80, 0x62, 0x0, 0x38, 0x30, 0x6,
0x20, 0x1, 0x8c, 0x80, 0x69, 0x0, 0xa8, 0xf1,
0x96, 0xd0, 0x2, 0x4c, 0x79, 0xa0, 0xc0, 0x0,
/* U+65 "e" */
0x0, 0x1d, 0xff, 0x51, 0x0, 0x49, 0x8f, 0x32,
0x4c, 0x20, 0x5, 0x1e, 0x33, 0xf8, 0x40, 0x18,
0xc8, 0x4, 0x32, 0xa0, 0xe1, 0x5f, 0xfa, 0x0,
0x5c, 0x23, 0x77, 0xc2, 0x63, 0x64, 0x58, 0x8,
0x1, 0x47, 0xb0, 0xf5, 0xaa, 0x0, 0x4c, 0x76,
0x87, 0x95, 0x0,
/* U+66 "f" */
0x0, 0x2e, 0xfe, 0x0, 0xa, 0x9a, 0xac, 0x0,
0xc1, 0xa, 0xe1, 0x96, 0x19, 0xf4, 0x10, 0xe1,
0x15, 0x20, 0x9a, 0x8, 0xa6, 0x1, 0xff, 0xdf,
/* U+67 "g" */
0x0, 0x1d, 0xff, 0xac, 0xba, 0x41, 0x31, 0x5e,
0x1f, 0x44, 0x1, 0x45, 0xf0, 0xf8, 0xa0, 0x3,
0x1b, 0x10, 0xa, 0xc0, 0xe, 0x4, 0x1, 0x84,
0x0, 0xe0, 0x40, 0x18, 0x40, 0x6, 0x36, 0x1,
0xa0, 0x2, 0xa2, 0xd8, 0x7c, 0x60, 0x10, 0x4c,
0x67, 0x87, 0xc0, 0xf0, 0x1, 0xdf, 0xfa, 0xd8,
0xc, 0x27, 0xa5, 0xdd, 0x54, 0x44, 0x4, 0x4a,
0xc4, 0x1d, 0xd6, 0x0,
/* U+68 "h" */
0x8f, 0x0, 0xff, 0xe7, 0x95, 0xff, 0x50, 0x80,
0x5a, 0xe, 0xe5, 0xc0, 0x9, 0xee, 0x26, 0x44,
0x80, 0x9, 0x0, 0x9c, 0xc, 0x0, 0x20, 0x10,
0x87, 0x80, 0x7f, 0xf6, 0x0,
/* U+69 "i" */
0x9e, 0x13, 0x13, 0xaf, 0x28, 0xf0, 0xf, 0xfe,
0x68,
/* U+6A "j" */
0x0, 0x9f, 0x88, 0x2, 0xe1, 0x10, 0x5, 0x3e,
0x60, 0x13, 0xf8, 0x80, 0x7f, 0xf9, 0xfc, 0x4,
0x50, 0xcc, 0x30, 0x26, 0x92, 0xe0,
/* U+6B "k" */
0x8f, 0x0, 0xff, 0xe9, 0xe, 0xe8, 0x40, 0x30,
0xe1, 0xf8, 0x80, 0x43, 0x87, 0x84, 0x1, 0x16,
0x16, 0x90, 0x6, 0xc2, 0x4, 0x0, 0xf6, 0xa4,
0x18, 0x6, 0xc2, 0xa1, 0xd1, 0x0, 0x88, 0x7,
0x46, 0x80, 0x3c, 0x70, 0x8e,
/* U+6C "l" */
0x8f, 0x0, 0xff, 0xe5, 0x0,
/* U+6D "m" */
0x8e, 0x3c, 0xfe, 0x91, 0x3b, 0xfe, 0xa2, 0x0,
0xe, 0x2c, 0xbb, 0x6e, 0x3c, 0xb2, 0xf8, 0x5,
0x12, 0xd2, 0xc6, 0x6c, 0x68, 0xa2, 0x50, 0x3,
0x0, 0x58, 0x14, 0x1, 0x20, 0x10, 0x0, 0x40,
0x21, 0x2, 0x0, 0x84, 0x3c, 0x3, 0xff, 0xe0,
/* U+6E "n" */
0x8e, 0x3b, 0xfe, 0xa1, 0x0, 0xe, 0xc, 0xb2,
0xe0, 0x4, 0xf4, 0xd1, 0x24, 0x80, 0x9, 0x0,
0x9c, 0xc, 0x0, 0x20, 0x10, 0x87, 0x80, 0x7f,
0xf6, 0x0,
/* U+6F "o" */
0x0, 0x1d, 0xf7, 0xe2, 0x0, 0x49, 0x8c, 0xc8,
0xb, 0x60, 0x5, 0x16, 0xc3, 0xe2, 0x48, 0x98,
0xd8, 0x6, 0x80, 0x47, 0x5, 0x0, 0xc4, 0x4,
0xe0, 0xa0, 0x18, 0x80, 0x8c, 0x6c, 0x3, 0x40,
0x20, 0x51, 0x6b, 0xbb, 0x12, 0x44, 0x13, 0x1a,
0x60, 0x2d, 0x80,
/* U+70 "p" */
0x8e, 0x3b, 0xfe, 0xb3, 0x0, 0x87, 0x2, 0xa5,
0xb0, 0xc0, 0x26, 0xb5, 0x7d, 0x2f, 0x0, 0xa0,
0x3, 0x51, 0x88, 0x0, 0x40, 0x31, 0x1, 0x0,
0x8, 0x3, 0x10, 0x10, 0x2, 0x0, 0x21, 0x92,
0x10, 0x2, 0x63, 0xc7, 0x8f, 0x0, 0x58, 0xf0,
0xcb, 0x86, 0x1, 0x15, 0xff, 0x59, 0x80, 0x7f,
0xf2, 0x80,
/* U+71 "q" */
0x0, 0x1d, 0xff, 0xa8, 0xbd, 0xc1, 0x31, 0x9e,
0x1f, 0x0, 0x2a, 0x2d, 0x87, 0xd5, 0x0, 0x18,
0xd8, 0x6, 0x80, 0x3, 0x82, 0x80, 0x62, 0x0,
0x38, 0x28, 0x6, 0x20, 0x1, 0x8d, 0x80, 0x68,
0x0, 0xa8, 0xb5, 0xdd, 0x8a, 0x1, 0x26, 0x34,
0x41, 0xb4, 0x3, 0x1d, 0xff, 0xa8, 0x80, 0x3f,
0xf9, 0x40,
/* U+72 "r" */
0x8e, 0x2b, 0xf0, 0x0, 0xe3, 0x30, 0x2, 0x4d,
0x90, 0xa, 0x0, 0x38, 0x80, 0x3f, 0xf9, 0xe0,
/* U+73 "s" */
0x2, 0xae, 0xfd, 0x91, 0x16, 0x3c, 0xc9, 0x10,
0x2a, 0x3c, 0xed, 0x3a, 0xc, 0x10, 0x82, 0x1,
0x14, 0xad, 0xf6, 0xb0, 0x1, 0xbb, 0x94, 0xd2,
0xa0, 0x20, 0x2b, 0x60, 0x4b, 0xd4, 0xed, 0x60,
0x88, 0x67, 0x88, 0x3d, 0x98,
/* U+74 "t" */
0x5, 0xf3, 0x0, 0xff, 0x65, 0x6, 0x7d, 0x4,
0x38, 0x45, 0x48, 0x26, 0x82, 0x29, 0x80, 0x7f,
0xf2, 0xc4, 0x1c, 0x3, 0x28, 0x43, 0x40, 0x0,
0x68, 0x65, 0x4,
/* U+75 "u" */
0xae, 0x0, 0xc5, 0xea, 0x1, 0xff, 0xd8, 0x31,
0x0, 0xcc, 0x0, 0xf0, 0x30, 0xb, 0x80, 0xe,
0x3a, 0xed, 0x6a, 0x0, 0x1c, 0x59, 0x90, 0x60,
0x0,
/* U+76 "v" */
0xd, 0xc0, 0xe, 0xcb, 0xb, 0x32, 0x0, 0x88,
0xf8, 0x18, 0x2c, 0x2, 0xb1, 0x50, 0x3, 0x38,
0x4, 0xcc, 0x0, 0xac, 0x58, 0x18, 0x24, 0x2,
0x23, 0xa0, 0xa4, 0x10, 0xd, 0x26, 0xc7, 0xe0,
0x1c, 0xa3, 0x24, 0x80, 0x1e, 0x60, 0xa0, 0x8,
/* U+77 "w" */
0xbb, 0x0, 0x69, 0xf1, 0x0, 0x93, 0xc7, 0x50,
0x40, 0x27, 0x7, 0x0, 0xb4, 0xc5, 0x81, 0xc0,
0xa, 0x27, 0xa0, 0x13, 0x50, 0x1, 0x68, 0x1,
0xe9, 0x28, 0x20, 0xa0, 0xe0, 0xf, 0x31, 0x5,
0xe5, 0x6, 0xf, 0x41, 0x0, 0x28, 0x33, 0x1,
0x41, 0xac, 0x17, 0x80, 0x32, 0xde, 0xa8, 0x3,
0x4e, 0x1, 0x40, 0x37, 0x1a, 0x70, 0x1, 0x5,
0xd4, 0x3, 0x90, 0x44, 0x80, 0x13, 0x7, 0x0,
0x40,
/* U+78 "x" */
0x4f, 0x70, 0xa, 0x7c, 0x91, 0xe0, 0xc1, 0x5a,
0x88, 0x20, 0xf8, 0xad, 0x94, 0x2, 0xe2, 0xd3,
0x90, 0xc, 0x4a, 0x16, 0x1, 0xc8, 0xa5, 0x2,
0x1, 0xd, 0x26, 0x9e, 0x80, 0x54, 0x14, 0x1c,
0x70, 0xc, 0x94, 0x20, 0x70, 0xe8,
/* U+79 "y" */
0xd, 0xc0, 0xe, 0xcb, 0xb, 0x33, 0x0, 0x44,
0x7e, 0xc, 0x32, 0x1, 0x59, 0x20, 0x1, 0x94,
0x40, 0x5a, 0x80, 0x29, 0x6, 0x6, 0x6, 0x0,
0x85, 0x64, 0x29, 0x84, 0x3, 0x48, 0xc9, 0x58,
0x7, 0x19, 0x99, 0x8, 0x3, 0xd4, 0x1e, 0x1,
0xf6, 0x12, 0x0, 0x43, 0x8f, 0x2b, 0x0, 0x1c,
0xd2, 0xf0, 0xa0, 0x18,
/* U+7A "z" */
0x4f, 0xff, 0x4a, 0xd5, 0x64, 0xd, 0x15, 0x58,
0x51, 0xd0, 0x2, 0x1a, 0x38, 0x0, 0xd4, 0x1a,
0x1, 0xa1, 0x28, 0x40, 0x24, 0x78, 0x40, 0x8,
0x68, 0x49, 0x56, 0x34, 0x11, 0x55, 0x6f
};
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */,
{.bitmap_index = 0, .adv_w = 69, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 0, .adv_w = 153, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 40, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 86, .adv_w = 146, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 123, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 171, .adv_w = 157, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 214, .adv_w = 90, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 238, .adv_w = 177, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 298, .adv_w = 174, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 327, .adv_w = 71, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 336, .adv_w = 73, .box_w = 6, .box_h = 15, .ofs_x = -2, .ofs_y = -3},
{.bitmap_index = 358, .adv_w = 158, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 395, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 400, .adv_w = 271, .box_w = 15, .box_h = 9, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 440, .adv_w = 174, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 466, .adv_w = 163, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 509, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -3},
{.bitmap_index = 559, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 609, .adv_w = 105, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 625, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 662, .adv_w = 106, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 689, .adv_w = 173, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 714, .adv_w = 143, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0},
{.bitmap_index = 754, .adv_w = 230, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 819, .adv_w = 141, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 857, .adv_w = 143, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -3},
{.bitmap_index = 909, .adv_w = 133, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}
};
/*---------------------
* CHARACTER MAPPING
*--------------------*/
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 32, .range_length = 1, .glyph_id_start = 1,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
},
{
.range_start = 97, .range_length = 26, .glyph_id_start = 2,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
}
};
/*-----------------
* KERNING
*----------------*/
/*Map glyph_ids to kern left classes*/
static const uint8_t kern_left_class_mapping[] =
{
0, 0, 1, 2, 3, 4, 5, 6,
0, 1, 0, 0, 7, 4, 1, 1,
2, 2, 8, 9, 10, 11, 0, 12,
12, 13, 12, 14
};
/*Map glyph_ids to kern right classes*/
static const uint8_t kern_right_class_mapping[] =
{
0, 0, 1, 2, 3, 3, 3, 0,
3, 2, 4, 5, 2, 2, 4, 4,
3, 4, 3, 4, 6, 7, 8, 9,
9, 10, 9, 11
};
/*Kern values between classes*/
static const int8_t kern_class_values[] =
{
0, 0, 1, 0, 0, 0, 0, 0,
-3, 0, 0, -1, 0, 0, 0, 0,
0, 0, 0, -4, -5, -2, 0, -2,
-2, 0, 0, 0, 2, 0, -2, -4,
-2, 0, 0, 0, 0, 0, 0, 3,
0, 0, 0, 0, -4, 0, 0, 0,
0, 0, 0, 0, -3, -4, -1, -3,
0, -2, 20, 11, 0, 0, 0, 3,
0, 0, -3, 0, -6, -2, 0, -4,
0, -3, -7, -5, -3, 0, 0, 0,
0, 13, 0, 0, 0, 0, 0, 0,
-2, -2, -3, -2, 0, -1, 4, 0,
4, -2, 0, 0, 0, 0, 0, 0,
0, 0, 0, -3, -3, 0, 0, 0,
-5, 0, 0, 0, -3, 0, -3, 0,
0, -4, 0, -4, 0, -4, -2, 4,
0, -2, -8, -3, -3, 0, -5, 0,
2, -3, 0, -3, -8, 0, -3, 0,
0, -2, 0, 0, 0, 1, 0, -3,
-3, 0
};
/*Collect the kern class' data in one place*/
static const lv_font_fmt_txt_kern_classes_t kern_classes =
{
.class_pair_values = kern_class_values,
.left_class_mapping = kern_left_class_mapping,
.right_class_mapping = kern_right_class_mapping,
.left_class_cnt = 14,
.right_class_cnt = 11,
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
/*Store all the custom data of the font*/
static lv_font_fmt_txt_dsc_t font_dsc = {
.glyph_bitmap = gylph_bitmap,
.glyph_dsc = glyph_dsc,
.cmaps = cmaps,
.kern_dsc = &kern_classes,
.kern_scale = 16,
.cmap_num = 2,
.bpp = 4,
.kern_classes = 1,
.bitmap_format = 1
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
lv_font_t lv_font_montserrat_16_compr_az = {
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 15, /*The maximum line height required by the font*/
.base_line = 3, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
.dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
};
#endif /*#if LV_FONT_MONTSERRAT_16_COMPR_AZ*/
#endif

View File

@@ -1,507 +0,0 @@
#include "../../../lvgl.h"
#if LV_USE_DEMO_STRESS
/*******************************************************************************
* Size: 28 px
* Bpp: 4
* Opts:
******************************************************************************/
#ifndef LV_FONT_MONTSERRAT_28_COMPR_AZ
#define LV_FONT_MONTSERRAT_28_COMPR_AZ 1
#endif
#if LV_FONT_MONTSERRAT_28_COMPR_AZ
/*-----------------
* BITMAPS
*----------------*/
/*Store the image of the glyphs*/
static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = {
/* U+20 " " */
/* U+61 "a" */
0x0, 0xb, 0xdf, 0x7f, 0xb6, 0x90, 0x3, 0x47,
0x42, 0x8, 0x0, 0x96, 0xe4, 0x2, 0x50, 0x15,
0x9a, 0x95, 0x0, 0x33, 0x0, 0x1d, 0x1d, 0x4c,
0xad, 0x5a, 0x0, 0x80, 0x1, 0xb8, 0x7, 0x89,
0xc0, 0x48, 0x3, 0xfd, 0xc0, 0x6, 0x0, 0x14,
0x67, 0x73, 0xfe, 0x90, 0xc, 0xda, 0xe6, 0x22,
0x0, 0xf0, 0x94, 0x80, 0xd7, 0x7f, 0xe9, 0x0,
0x94, 0x1, 0x4a, 0x20, 0x1f, 0xb8, 0x0, 0xa0,
0x1e, 0xe0, 0xb, 0x80, 0x8, 0x1, 0xc4, 0xe0,
0x12, 0x80, 0x2d, 0x40, 0x2, 0xd8, 0x1, 0x8a,
0x80, 0x6b, 0xfd, 0xd2, 0x2c, 0x1, 0x97, 0x58,
0x40, 0x4, 0xdb, 0x40, 0x10,
/* U+62 "b" */
0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xf9,
0x4b, 0x7d, 0xfb, 0x6a, 0x1, 0xf3, 0x65, 0x20,
0x81, 0x25, 0x69, 0x0, 0x75, 0x98, 0x2c, 0x4b,
0x88, 0x16, 0x90, 0x6, 0x12, 0xda, 0x76, 0x8e,
0x60, 0x7, 0x80, 0x77, 0x90, 0x7, 0x4a, 0x81,
0x28, 0x4, 0xc4, 0x1, 0xf4, 0x0, 0x3c, 0x2,
0xc0, 0xf, 0xc4, 0x20, 0xc0, 0x13, 0x0, 0x7f,
0x18, 0x10, 0x4, 0xc0, 0x1f, 0xc6, 0x4, 0x1,
0x60, 0x7, 0xe3, 0x10, 0x60, 0x9, 0x88, 0x3,
0xe8, 0x0, 0x78, 0x6, 0xf2, 0x0, 0xe9, 0x40,
0x25, 0x0, 0x88, 0x9b, 0x4e, 0xd1, 0xcc, 0x0,
0xf0, 0xd, 0xc6, 0xb, 0x12, 0xe2, 0x5, 0xa4,
0x1, 0x87, 0x29, 0x4, 0x5, 0x2b, 0x48, 0x0,
/* U+63 "c" */
0x0, 0xc7, 0x3b, 0xfe, 0xd9, 0x30, 0xe, 0x1b,
0xc6, 0x20, 0x1, 0x36, 0x48, 0x4, 0x38, 0x80,
0x2d, 0x32, 0x60, 0x3, 0x40, 0x2, 0x88, 0x17,
0xa5, 0x99, 0x3c, 0x60, 0x11, 0xa0, 0x1d, 0x0,
0x70, 0xee, 0xa0, 0x2c, 0x1, 0x0, 0x1f, 0x9,
0x0, 0xc, 0x0, 0x80, 0x1f, 0xf3, 0x80, 0x80,
0x7f, 0xf0, 0x1c, 0x4, 0x3, 0xff, 0x80, 0x60,
0x4, 0x0, 0xff, 0xa8, 0x1, 0x0, 0x1f, 0x9,
0x0, 0x9, 0x0, 0xe8, 0x3, 0x87, 0x75, 0x0,
0xa, 0x20, 0x5e, 0x96, 0x64, 0xf1, 0x80, 0x61,
0xc4, 0x1, 0x69, 0x93, 0x0, 0x1e, 0x0, 0x21,
0xbc, 0x62, 0x0, 0x13, 0x64, 0x0, 0x0,
/* U+64 "d" */
0x0, 0xff, 0xe0, 0x17, 0xfa, 0x0, 0x3f, 0xff,
0xe0, 0x1f, 0xcb, 0x5b, 0xfd, 0x8c, 0x1, 0xf1,
0x65, 0x29, 0x0, 0x9c, 0xeb, 0x0, 0x61, 0xc3,
0x1, 0x69, 0x92, 0x81, 0x50, 0x6, 0xd1, 0x5,
0xe9, 0x66, 0x57, 0x18, 0x80, 0x46, 0x60, 0x3a,
0x0, 0xe1, 0xd1, 0x0, 0xa8, 0x1, 0x0, 0x1f,
0xb, 0x0, 0x44, 0x0, 0x40, 0xf, 0xd6, 0x1,
0x38, 0x8, 0x7, 0xf0, 0x80, 0x4e, 0x2, 0x1,
0xfc, 0x20, 0x11, 0x0, 0xc, 0x3, 0xf2, 0x0,
0x54, 0x0, 0x80, 0xf, 0xd4, 0x1, 0x19, 0x81,
0x20, 0x3, 0xd6, 0x40, 0x1b, 0x44, 0x1f, 0x18,
0xd1, 0xf9, 0x4, 0x3, 0xe, 0x18, 0x1c, 0xe5,
0xc0, 0x8b, 0x40, 0x38, 0xb2, 0x90, 0x80, 0x4e,
0x38, 0xc0, 0x20,
/* U+65 "e" */
0x0, 0xc9, 0x7b, 0xfd, 0x8c, 0x20, 0x1c, 0x39,
0x68, 0x40, 0x27, 0x3e, 0x80, 0x10, 0xf9, 0x82,
0x4d, 0xd3, 0x0, 0xda, 0x0, 0x28, 0x42, 0xec,
0xc8, 0xb3, 0xa4, 0x14, 0x26, 0x81, 0x28, 0x1,
0xc5, 0xe0, 0x2f, 0x40, 0x6, 0x0, 0xf8, 0x90,
0x34, 0x80, 0x1f, 0xff, 0xc8, 0xc, 0xe0, 0x1f,
0xfc, 0x13, 0x70, 0x7, 0xff, 0xfd, 0xc6, 0x0,
0x40, 0xf, 0xfa, 0xc0, 0x10, 0x1, 0xf8, 0x40,
0x6, 0x80, 0x76, 0x20, 0x1c, 0xbe, 0x60, 0xa,
0x20, 0x4e, 0x96, 0x64, 0x65, 0xf, 0x80, 0x7,
0x10, 0x0, 0xd3, 0x27, 0x30, 0x2e, 0x0, 0x86,
0xf1, 0x88, 0x40, 0x56, 0xb4, 0x80,
/* U+66 "f" */
0x0, 0xc3, 0x1b, 0xfd, 0x68, 0x1, 0xe, 0x39,
0x0, 0xa6, 0x80, 0x50, 0x40, 0xb7, 0x66, 0xa0,
0x9, 0xc0, 0xa9, 0x11, 0x26, 0x1, 0x8, 0x20,
0x7, 0xc2, 0x1, 0xfa, 0x7f, 0x80, 0xd, 0xff,
0x70, 0x7, 0xff, 0x2, 0xf2, 0xc0, 0x9, 0x99,
0x68, 0x11, 0xa8, 0x0, 0x4c, 0xf0, 0x7, 0xff,
0xfc, 0x3, 0xff, 0xc6,
/* U+67 "g" */
0x0, 0xcb, 0x7b, 0xfd, 0x8e, 0x21, 0x9f, 0x80,
0x3, 0xda, 0x42, 0x1, 0x38, 0xf4, 0x0, 0xc7,
0x84, 0x4, 0xf3, 0x27, 0x11, 0x59, 0x0, 0x5c,
0x0, 0x7d, 0x86, 0x64, 0x73, 0x80, 0x80, 0x14,
0x81, 0xa0, 0x3, 0xd0, 0xc0, 0x17, 0x80, 0x2c,
0x3, 0xf5, 0x80, 0x4c, 0x2, 0x40, 0x1f, 0x88,
0x40, 0x30, 0x80, 0x7f, 0x84, 0x0, 0xc0, 0x2,
0x0, 0xfc, 0x40, 0x17, 0x80, 0x20, 0x3, 0xf4,
0x0, 0x4a, 0x40, 0xb2, 0x1, 0xe9, 0x50, 0xd,
0xe0, 0x6, 0xe9, 0x66, 0x4f, 0x30, 0x7, 0x16,
0x10, 0xb, 0x4c, 0x98, 0x45, 0x60, 0x7, 0x0,
0x1e, 0xd2, 0x10, 0x9, 0xc7, 0xa0, 0x0, 0x40,
0x32, 0xde, 0xff, 0x63, 0x89, 0x0, 0xc, 0x3,
0xff, 0x81, 0x40, 0xc, 0x3, 0xe6, 0x0, 0xf9,
0x5c, 0x5, 0x43, 0xc6, 0x7a, 0x9d, 0x99, 0x19,
0x40, 0xb, 0x0, 0x71, 0x80, 0xac, 0x4c, 0x9c,
0xc0, 0x12, 0xa0, 0x2, 0xcc, 0x3a, 0x8, 0x0,
0x52, 0x39, 0x80, 0x0,
/* U+68 "h" */
0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xf8,
0x8d, 0x7d, 0xfd, 0x6a, 0x1, 0xe6, 0xd9, 0x41,
0x1, 0x4a, 0xb0, 0xe, 0xa2, 0x16, 0x88, 0x28,
0x1, 0x24, 0x3, 0x93, 0xa5, 0xdd, 0x58, 0x0,
0x62, 0x0, 0x86, 0xc0, 0x38, 0xe0, 0x0, 0x80,
0x14, 0x80, 0x7c, 0x80, 0xe, 0x0, 0x8c, 0x3,
0xe2, 0x0, 0x8, 0x4, 0xe0, 0x1f, 0xe3, 0x0,
0xff, 0xff, 0x80, 0x7f, 0xf4, 0x80,
/* U+69 "i" */
0x5e, 0xd3, 0x81, 0x29, 0x60, 0x6, 0xdc, 0xd3,
0x83, 0x28, 0x7, 0x3f, 0xf8, 0xc0, 0x3f, 0xfd,
0x80,
/* U+6A "j" */
0x0, 0xe3, 0xee, 0x20, 0x7, 0x40, 0x8a, 0x0,
0x38, 0x80, 0xa, 0x1, 0xd3, 0x38, 0x3, 0xcc,
0xc0, 0xf, 0xfe, 0x1a, 0xff, 0x98, 0x3, 0xff,
0xfe, 0x1, 0xff, 0xef, 0x30, 0xe, 0xc0, 0x3,
0x5, 0xb2, 0xc3, 0x0, 0x9a, 0xa4, 0xd3, 0x80,
0x28, 0x1d, 0x48, 0x5, 0x31, 0x0,
/* U+6B "k" */
0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xf9,
0xe9, 0xfe, 0xe2, 0x0, 0xff, 0x2d, 0x80, 0xe1,
0x0, 0x7f, 0x35, 0x0, 0xe1, 0x0, 0x7f, 0x3c,
0x80, 0xe1, 0x0, 0x7f, 0x44, 0x0, 0x70, 0x80,
0x3f, 0xa5, 0xc0, 0x70, 0x80, 0x3f, 0x3d, 0x30,
0x1, 0xc8, 0x3, 0xfa, 0x94, 0x2, 0x65, 0x0,
0xfe, 0x10, 0x3a, 0x0, 0x51, 0x0, 0x7f, 0x26,
0x2b, 0x80, 0x3c, 0x3, 0xf2, 0xd8, 0x2, 0x10,
0xa, 0x80, 0x3e, 0x90, 0xd, 0x64, 0xa, 0xe0,
0x1f, 0xfc, 0xf, 0x0, 0x42, 0x0, 0x7f, 0xc5,
0x40, 0xa, 0x10, 0xf, 0xf9, 0x5c, 0x7, 0x40,
/* U+6C "l" */
0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x38,
/* U+6D "m" */
0x7f, 0xf1, 0xc, 0x67, 0x7e, 0xc9, 0x80, 0x45,
0x1b, 0xfe, 0xd9, 0x20, 0xf, 0x3f, 0xb9, 0x88,
0x13, 0x63, 0x83, 0xeb, 0x90, 0x0, 0x9b, 0x58,
0x3, 0xa8, 0x4e, 0x6e, 0x94, 0x1, 0x15, 0x0,
0x73, 0x74, 0xa0, 0x9, 0x30, 0xe, 0x7c, 0x64,
0x5a, 0x90, 0x2, 0x83, 0xe3, 0x22, 0xd4, 0x0,
0x20, 0x3, 0x14, 0x0, 0x73, 0x10, 0x0, 0xe0,
0x3, 0x9c, 0x81, 0x0, 0x35, 0x0, 0x7c, 0x80,
0xb, 0x0, 0xf9, 0x0, 0x2, 0x1, 0x18, 0x7,
0xdc, 0x0, 0x30, 0xf, 0x84, 0x0, 0x60, 0x13,
0x80, 0x7f, 0x9c, 0x3, 0xfc, 0x20, 0x1f, 0xff,
0xf0, 0xf, 0xff, 0xf8, 0x7, 0xff, 0x50,
/* U+6E "n" */
0x7f, 0xf1, 0x3, 0xe7, 0x7f, 0x5a, 0x80, 0x79,
0xfa, 0xc, 0x40, 0x52, 0xac, 0x3, 0xa8, 0x4a,
0x2a, 0x8e, 0x20, 0x92, 0x1, 0xcd, 0xae, 0xaa,
0x8c, 0x10, 0x62, 0x0, 0x8a, 0x40, 0x38, 0xa4,
0x0, 0x80, 0x15, 0x0, 0x7c, 0xa0, 0xe, 0x0,
0x8c, 0x3, 0xe3, 0x0, 0x8, 0x4, 0xe0, 0x1f,
0xe3, 0x0, 0xff, 0xff, 0x80, 0x7f, 0xf4, 0x80,
/* U+6F "o" */
0x0, 0xc9, 0x5b, 0xfd, 0xb0, 0x40, 0x1e, 0x1b,
0xb2, 0x90, 0x9, 0x3e, 0xc0, 0x6, 0x1f, 0x40,
0x16, 0x99, 0x28, 0x1, 0xec, 0x2, 0xa1, 0x5,
0xe9, 0x66, 0x57, 0x18, 0x23, 0x81, 0xa0, 0x1d,
0x0, 0x70, 0xe8, 0x84, 0x85, 0x80, 0x20, 0x3,
0xe1, 0x90, 0x15, 0x30, 0x2, 0x0, 0x7e, 0x40,
0x1, 0x38, 0x8, 0x7, 0xf0, 0x80, 0x39, 0xc0,
0x40, 0x3f, 0x84, 0x1, 0xc6, 0x0, 0x40, 0xf,
0xd6, 0x0, 0x2b, 0x0, 0x40, 0x7, 0xc2, 0xc0,
0x2a, 0x68, 0x7, 0x40, 0x1c, 0x3a, 0x21, 0x20,
0xa, 0x20, 0x5e, 0x96, 0x65, 0x71, 0x82, 0x38,
0x0, 0x71, 0x0, 0x5a, 0x64, 0xa0, 0x7, 0xb0,
0xc, 0x37, 0x65, 0x20, 0x12, 0x6d, 0x80, 0x8,
/* U+70 "p" */
0x7f, 0xf1, 0x3, 0x5f, 0x7e, 0xda, 0x80, 0x7c,
0xdb, 0x28, 0x20, 0x49, 0x5a, 0x40, 0x1d, 0x44,
0x2f, 0x76, 0x93, 0x2, 0xd2, 0x0, 0xc2, 0x7f,
0x8, 0x86, 0xc8, 0x0, 0x78, 0x6, 0x1d, 0x10,
0xe, 0x76, 0x2, 0x50, 0x9, 0x84, 0x3, 0xeb,
0x0, 0x78, 0x5, 0x80, 0x1f, 0x88, 0x41, 0x80,
0x27, 0x0, 0xfe, 0x30, 0x20, 0x9, 0x80, 0x3f,
0x8c, 0x8, 0x2, 0xc0, 0xf, 0xc6, 0x20, 0xc0,
0x13, 0x10, 0x7, 0xd0, 0x0, 0xf0, 0xd, 0xe4,
0x1, 0xd2, 0x80, 0x4a, 0x1, 0x9, 0x6d, 0x3b,
0x47, 0x30, 0x3, 0xc0, 0x35, 0x18, 0x2c, 0x4b,
0x88, 0x16, 0x90, 0x6, 0x7c, 0xa4, 0x10, 0x14,
0xad, 0x20, 0xf, 0x96, 0xfb, 0xfa, 0xd4, 0x3,
0xff, 0xf0,
/* U+71 "q" */
0x0, 0xcb, 0x5b, 0xfd, 0x8c, 0x0, 0xff, 0x40,
0x0, 0xb2, 0x94, 0x80, 0x4e, 0x74, 0x80, 0x30,
0xe1, 0x80, 0xb4, 0xc9, 0x40, 0xb0, 0x3, 0x68,
0x82, 0xf4, 0xb3, 0x2b, 0x4c, 0x40, 0x23, 0x30,
0x1d, 0x0, 0x71, 0x68, 0x80, 0x54, 0x0, 0x80,
0xf, 0x86, 0x40, 0x22, 0x0, 0x20, 0x7, 0xe4,
0x0, 0x9c, 0x4, 0x3, 0xf8, 0x40, 0x27, 0x1,
0x0, 0xfe, 0x10, 0x8, 0x80, 0x8, 0x1, 0xfa,
0xc0, 0x2a, 0x0, 0x40, 0x7, 0xc2, 0xc0, 0x11,
0x98, 0xe, 0x80, 0x38, 0x74, 0x40, 0x36, 0x88,
0x2f, 0x4b, 0x32, 0xb8, 0xc4, 0x3, 0xe, 0x18,
0xb, 0x4c, 0x94, 0xf, 0x40, 0x38, 0xb2, 0x90,
0x80, 0x4e, 0x70, 0x40, 0x3e, 0x5b, 0xdf, 0xec,
0x60, 0xf, 0xff, 0xc8,
/* U+72 "r" */
0x7f, 0xf1, 0x3, 0x67, 0x40, 0x4, 0x3b, 0x26,
0x20, 0x1b, 0x88, 0xd, 0xb4, 0x2, 0x22, 0x6e,
0x4a, 0x80, 0x6c, 0x20, 0xf, 0x38, 0x80, 0x7d,
0xa0, 0x1f, 0x98, 0x3, 0xff, 0xf0,
/* U+73 "s" */
0x0, 0x8a, 0x77, 0xfd, 0xd9, 0x6, 0x1, 0xa3,
0x58, 0x80, 0x2, 0x6f, 0x90, 0x0, 0x57, 0x1,
0x79, 0xa9, 0x61, 0xa, 0x0, 0x70, 0x3, 0x21,
0x95, 0xa7, 0xb0, 0x80, 0xc, 0x4, 0x40, 0xf,
0x18, 0x4, 0xc0, 0x4e, 0x1, 0xfe, 0x80, 0x4,
0x75, 0xc2, 0x88, 0x7, 0x1d, 0x90, 0xa, 0x3d,
0x76, 0xa8, 0x6, 0x4d, 0xc9, 0x63, 0x0, 0x15,
0x38, 0x7, 0x1b, 0x4e, 0x7d, 0x8, 0x40, 0x7,
0xf9, 0x58, 0x0, 0x40, 0xae, 0x1, 0xf1, 0x80,
0xc, 0x2e, 0x3e, 0x9d, 0x54, 0xf8, 0x80, 0x82,
0x22, 0x0, 0x2c, 0x55, 0x20, 0xc0, 0xe8, 0x7,
0x30, 0xe6, 0x20, 0x2, 0x5a, 0xc1, 0x0,
/* U+74 "t" */
0x0, 0xa2, 0xa, 0x1, 0xf0, 0xbb, 0xbc, 0x3,
0xff, 0x9f, 0x3f, 0xc0, 0x5, 0xff, 0xb8, 0x3,
0xff, 0x81, 0x79, 0x60, 0x4, 0xcc, 0xb4, 0x8,
0xd4, 0x0, 0x26, 0x78, 0x3, 0xff, 0xf2, 0x20,
0x1f, 0xfc, 0x14, 0x0, 0xfc, 0xa0, 0x36, 0xaa,
0xa4, 0x0, 0xa0, 0x41, 0x2a, 0x8b, 0xe0, 0x11,
0x7b, 0x8, 0xa, 0xc0,
/* U+75 "u" */
0x9f, 0xf0, 0x80, 0x7c, 0xbf, 0xe6, 0x0, 0xff,
0xff, 0x80, 0x7f, 0xf8, 0x44, 0x0, 0x40, 0x1f,
0x68, 0x5, 0xa0, 0x4, 0x0, 0xf9, 0x80, 0x24,
0x0, 0x49, 0x0, 0x75, 0x8, 0x4, 0x2e, 0x3,
0x90, 0x88, 0x6d, 0x50, 0xe, 0x85, 0x1, 0x7b,
0xb4, 0x90, 0xd0, 0x7, 0x55, 0xa8, 0x80, 0x9c,
0x73, 0x80, 0x40,
/* U+76 "v" */
0xd, 0xfe, 0x0, 0xfe, 0x2f, 0xf3, 0x85, 0x80,
0xb0, 0x7, 0xeb, 0x0, 0x30, 0x30, 0x85, 0x0,
0x7c, 0x2c, 0xc, 0x20, 0x6, 0x3, 0x30, 0x7,
0x98, 0x1, 0x60, 0x15, 0x0, 0x24, 0x3, 0xd2,
0x8, 0x40, 0x11, 0x28, 0x28, 0x80, 0x65, 0x10,
0xf0, 0xe, 0x90, 0x4, 0x80, 0x69, 0x2, 0x40,
0xe, 0x32, 0x6, 0x0, 0x8c, 0xc1, 0x60, 0x1f,
0x58, 0xa, 0x80, 0x24, 0x0, 0xc0, 0x1f, 0x30,
0x84, 0x80, 0xa8, 0x30, 0x7, 0xf3, 0x1, 0x99,
0x80, 0x16, 0x1, 0xfd, 0x20, 0x9, 0x90, 0x21,
0x0, 0x7f, 0xa, 0x82, 0x88, 0x78, 0x7, 0xfd,
0x20, 0x11, 0x20, 0x7, 0xfc, 0x66, 0x0, 0x58,
0x7, 0x80,
/* U+77 "w" */
0xaf, 0xe0, 0xf, 0xd5, 0xfc, 0x1, 0xfa, 0x7f,
0x78, 0x5, 0x0, 0x3c, 0x2a, 0x2, 0xa0, 0x1f,
0x38, 0x52, 0x8, 0x68, 0x7, 0x9c, 0x2, 0xe0,
0xf, 0x28, 0x83, 0x3, 0x3, 0x0, 0x7a, 0x80,
0x24, 0x10, 0xe, 0xe0, 0x41, 0xa, 0x0, 0x28,
0x6, 0x23, 0xa, 0x0, 0x38, 0x6, 0x14, 0xe,
0x0, 0x11, 0x87, 0x0, 0x6a, 0x2, 0x54, 0xa,
0x0, 0xce, 0x2, 0xa0, 0x15, 0x82, 0x8, 0x4,
0xc1, 0x41, 0xc0, 0x64, 0x1, 0x50, 0x38, 0x6,
0x60, 0x3, 0x80, 0x10, 0x41, 0x81, 0x44, 0x28,
0x0, 0x46, 0x14, 0x1, 0x85, 0x2, 0x80, 0x1c,
0x8, 0x20, 0x7, 0x6, 0x0, 0x50, 0x11, 0x80,
0x77, 0x1, 0x90, 0xa8, 0x70, 0x5, 0x40, 0x28,
0xc, 0x14, 0x1, 0xe5, 0x10, 0xa7, 0x0, 0x28,
0x4, 0x66, 0xd, 0x41, 0x6, 0x0, 0xf9, 0xc1,
0x68, 0x18, 0x3, 0xa8, 0x1b, 0x81, 0x4, 0x3,
0xea, 0x2, 0x30, 0xa0, 0xe, 0x70, 0x2, 0x86,
0x80, 0x7e, 0x32, 0x0, 0x11, 0x80, 0x70, 0xa8,
0x4, 0xc0, 0x1f, 0xd4, 0x0, 0xa0, 0xf, 0xb8,
0x0, 0xa0, 0x1c,
/* U+78 "x" */
0x1e, 0xfe, 0x10, 0xf, 0x4f, 0xf9, 0x40, 0x74,
0x7, 0x40, 0x39, 0x58, 0x19, 0x40, 0x7, 0x20,
0x70, 0x1, 0x15, 0x81, 0xc8, 0x6, 0x65, 0x7,
0x50, 0x7, 0x8, 0x70, 0x7, 0xa8, 0x82, 0xca,
0x4c, 0x28, 0x80, 0x3e, 0xf0, 0x1c, 0x60, 0x75,
0x0, 0xfc, 0x52, 0x2, 0x7, 0x0, 0x1f, 0xe6,
0x10, 0x4, 0x80, 0x7f, 0xd4, 0x20, 0xb, 0x20,
0xf, 0xe6, 0x50, 0x50, 0x1e, 0x0, 0xfc, 0x72,
0x7, 0x54, 0x3, 0x90, 0xf, 0xf, 0x0, 0xe8,
0x2b, 0x3, 0x28, 0x7, 0x51, 0x5, 0x8, 0x2,
0x48, 0x28, 0x80, 0x27, 0x40, 0x74, 0x0, 0xde,
0x0, 0xf0, 0x1, 0xc0, 0x1c, 0x0, 0x71, 0x50,
0x15, 0x0,
/* U+79 "y" */
0xd, 0xfe, 0x0, 0xfe, 0x2f, 0xf3, 0x85, 0x80,
0xb0, 0x7, 0xeb, 0x0, 0x38, 0x30, 0x85, 0x80,
0x7c, 0x2c, 0xe, 0x1, 0x48, 0x12, 0x80, 0x7a,
0x40, 0x12, 0x1, 0x30, 0x2, 0x40, 0x3c, 0xc0,
0xa2, 0x1, 0xb, 0x1, 0x98, 0x3, 0x30, 0x84,
0x80, 0x75, 0x80, 0x24, 0x3, 0x58, 0x19, 0x80,
0x38, 0x94, 0x14, 0x40, 0x8, 0x41, 0x0, 0x1f,
0x48, 0x2, 0x40, 0x1e, 0x4, 0x80, 0x1f, 0x19,
0x81, 0xc0, 0x90, 0x2c, 0x3, 0xfa, 0x0, 0xf,
0x60, 0x2c, 0x1, 0xfc, 0x84, 0x12, 0xc1, 0x20,
0x1f, 0xf5, 0x80, 0x80, 0x18, 0x3, 0xfe, 0x61,
0x0, 0x30, 0x80, 0x7f, 0xf0, 0x1c, 0x1, 0x60,
0x1f, 0xfc, 0x1, 0x60, 0x42, 0x0, 0xf8, 0x40,
0x34, 0x0, 0x20, 0x3, 0xf7, 0xdb, 0x2d, 0x30,
0x29, 0x80, 0x7c, 0xc2, 0x93, 0x4a, 0x5, 0x60,
0x1f, 0x9a, 0x4c, 0x0, 0x51, 0xa2, 0x1, 0xf8,
/* U+7A "z" */
0xbf, 0xff, 0xf9, 0x40, 0x3f, 0xf8, 0x3, 0x39,
0x9f, 0x38, 0x1, 0x10, 0x46, 0x7e, 0x17, 0x2,
0xa0, 0xf, 0x87, 0xc0, 0x1c, 0x20, 0x1f, 0x51,
0x5, 0x18, 0x7, 0xd0, 0x80, 0xea, 0x1, 0xf2,
0x38, 0x24, 0x0, 0x7c, 0x56, 0x3, 0x40, 0x1f,
0xbc, 0x1, 0xa2, 0x1, 0xf5, 0x10, 0x49, 0x80,
0x7c, 0xea, 0xc, 0xc0, 0xf, 0x92, 0x0, 0x68,
0xcf, 0xe1, 0x90, 0x0, 0xe6, 0x7e, 0x93, 0x0,
0xff, 0xe0, 0x0
};
/*---------------------
* GLYPH DESCRIPTION
*--------------------*/
static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */,
{.bitmap_index = 0, .adv_w = 121, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 0, .adv_w = 268, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 93, .adv_w = 306, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0},
{.bitmap_index = 197, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 292, .adv_w = 306, .box_w = 16, .box_h = 21, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 399, .adv_w = 274, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 493, .adv_w = 158, .box_w = 11, .box_h = 21, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 545, .adv_w = 309, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = -5},
{.bitmap_index = 685, .adv_w = 305, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = 0},
{.bitmap_index = 747, .adv_w = 125, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0},
{.bitmap_index = 764, .adv_w = 127, .box_w = 9, .box_h = 26, .ofs_x = -3, .ofs_y = -5},
{.bitmap_index = 810, .adv_w = 276, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0},
{.bitmap_index = 898, .adv_w = 125, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0},
{.bitmap_index = 905, .adv_w = 474, .box_w = 26, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
{.bitmap_index = 1000, .adv_w = 305, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
{.bitmap_index = 1056, .adv_w = 284, .box_w = 16, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 1160, .adv_w = 306, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = -5},
{.bitmap_index = 1266, .adv_w = 306, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = -5},
{.bitmap_index = 1374, .adv_w = 184, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
{.bitmap_index = 1404, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 1499, .adv_w = 185, .box_w = 11, .box_h = 19, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 1551, .adv_w = 303, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
{.bitmap_index = 1602, .adv_w = 250, .box_w = 17, .box_h = 15, .ofs_x = -1, .ofs_y = 0},
{.bitmap_index = 1700, .adv_w = 403, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 1855, .adv_w = 247, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 1953, .adv_w = 250, .box_w = 17, .box_h = 20, .ofs_x = -1, .ofs_y = -5},
{.bitmap_index = 2081, .adv_w = 233, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}
};
/*---------------------
* CHARACTER MAPPING
*--------------------*/
/*Collect the unicode lists and glyph_id offsets*/
static const lv_font_fmt_txt_cmap_t cmaps[] =
{
{
.range_start = 32, .range_length = 1, .glyph_id_start = 1,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
},
{
.range_start = 97, .range_length = 26, .glyph_id_start = 2,
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
}
};
/*-----------------
* KERNING
*----------------*/
/*Map glyph_ids to kern left classes*/
static const uint8_t kern_left_class_mapping[] =
{
0, 0, 1, 2, 3, 4, 5, 6,
0, 1, 0, 0, 7, 4, 1, 1,
2, 2, 8, 9, 10, 11, 0, 12,
12, 13, 12, 14
};
/*Map glyph_ids to kern right classes*/
static const uint8_t kern_right_class_mapping[] =
{
0, 0, 1, 2, 3, 3, 3, 0,
3, 2, 4, 5, 2, 2, 4, 4,
3, 4, 3, 4, 6, 7, 8, 9,
9, 10, 9, 11
};
/*Kern values between classes*/
static const int8_t kern_class_values[] =
{
0, 0, 1, 0, 0, 0, 0, 0,
-4, 0, 0, -2, 0, 0, 0, 0,
0, 0, 0, -7, -8, -4, 0, -3,
-4, 0, 0, 0, 3, 0, -3, -8,
-3, 0, 0, 0, 0, 0, 0, 6,
0, 0, 0, 0, -7, 0, 0, 0,
0, 0, 0, 0, -4, -7, -2, -4,
0, -4, 36, 19, 0, 0, 0, 4,
0, 0, -4, 0, -10, -3, 0, -8,
0, -4, -13, -9, -5, 0, 0, 0,
0, 22, 0, 0, 0, 0, 0, 0,
-4, -3, -5, -3, 0, -1, 7, 0,
7, -3, 0, 0, 0, 0, 0, 0,
0, 0, 0, -4, -4, 0, 0, 0,
-8, 0, 0, 0, -6, 0, -4, 0,
0, -8, 0, -7, 0, -7, -3, 7,
0, -4, -13, -4, -4, 0, -8, 0,
3, -4, 0, -4, -13, 0, -4, 0,
0, -4, 0, 0, 0, 1, 0, -4,
-4, 0
};
/*Collect the kern class' data in one place*/
static const lv_font_fmt_txt_kern_classes_t kern_classes =
{
.class_pair_values = kern_class_values,
.left_class_mapping = kern_left_class_mapping,
.right_class_mapping = kern_right_class_mapping,
.left_class_cnt = 14,
.right_class_cnt = 11,
};
/*--------------------
* ALL CUSTOM DATA
*--------------------*/
/*Store all the custom data of the font*/
static lv_font_fmt_txt_dsc_t font_dsc = {
.glyph_bitmap = gylph_bitmap,
.glyph_dsc = glyph_dsc,
.cmaps = cmaps,
.kern_dsc = &kern_classes,
.kern_scale = 16,
.cmap_num = 2,
.bpp = 4,
.kern_classes = 1,
.bitmap_format = 1
};
/*-----------------
* PUBLIC FONT
*----------------*/
/*Initialize a public general font descriptor*/
lv_font_t lv_font_montserrat_28_compr_az = {
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/
.get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 26, /*The maximum line height required by the font*/
.base_line = 5, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE,
#endif
.dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
};
#endif /*#if LV_FONT_MONTSERRAT_28_COMPR_AZ*/
#endif

View File

@@ -44,6 +44,7 @@ static uint32_t mem_free_start = 0;
void lv_demo_stress(void)
{
LV_LOG_USER("Starting stress test. (< 100 bytes permanent memory leak is normal due to fragmentation)");
lv_timer_create(obj_test_task_cb, LV_DEMO_STRESS_TIME_STEP, NULL);
}
@@ -59,28 +60,27 @@ static void obj_test_task_cb(lv_timer_t * tmr)
lv_anim_t a;
lv_obj_t * obj;
// printf("step start: %d\n", state);
// printf("step start: %d\n", state);
switch(state) {
case -1:
{
lv_res_t res = lv_mem_test();
if(res != LV_RES_OK) {
LV_LOG_ERROR("Memory integrity error");
case -1: {
lv_res_t res = lv_mem_test();
if(res != LV_RES_OK) {
LV_LOG_ERROR("Memory integrity error");
}
lv_mem_monitor_t mon;
lv_mem_monitor(&mon);
if(mem_free_start == 0) mem_free_start = mon.free_size;
LV_LOG_USER("mem leak since start: %d, frag: %3d %%", mem_free_start - mon.free_size, mon.frag_pct);
}
lv_mem_monitor_t mon;
lv_mem_monitor(&mon);
if(mem_free_start == 0) mem_free_start = mon.free_size;
LV_LOG_USER("mem leak since start: %d, frag: %3d %%", mem_free_start - mon.free_size, mon.frag_pct);
}
break;
case 0:
/* Holder for all object types */
main_page = lv_obj_create(lv_scr_act());
lv_obj_set_size(main_page, LV_HOR_RES / 2 , LV_VER_RES);
lv_obj_set_size(main_page, LV_HOR_RES / 2, LV_VER_RES);
lv_obj_set_flex_flow(main_page, LV_FLEX_FLOW_COLUMN);
@@ -90,25 +90,24 @@ static void obj_test_task_cb(lv_timer_t * tmr)
lv_label_set_text(obj, "Multi line\n"LV_SYMBOL_OK LV_SYMBOL_CLOSE LV_SYMBOL_WIFI);
break;
case 1:
{
obj = lv_tabview_create(lv_scr_act(), LV_DIR_TOP, 50);
lv_obj_set_size(obj, LV_HOR_RES / 2, LV_VER_RES / 2);
lv_obj_align(obj, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
lv_obj_t * t = lv_tabview_add_tab(obj, "First");
case 1: {
obj = lv_tabview_create(lv_scr_act(), LV_DIR_TOP, 50);
lv_obj_set_size(obj, LV_HOR_RES / 2, LV_VER_RES / 2);
lv_obj_align(obj, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
lv_obj_t * t = lv_tabview_add_tab(obj, "First");
t = lv_tabview_add_tab(obj, "Second");
lv_obj_t * c = lv_colorwheel_create(t, true);
lv_obj_set_size(c, 150, 150);
// c = lv_led_create(t, NULL);
// lv_obj_set_pos(c, 160, 20);
t = lv_tabview_add_tab(obj, LV_SYMBOL_EDIT " Edit");
t = lv_tabview_add_tab(obj, LV_SYMBOL_CLOSE);
t = lv_tabview_add_tab(obj, "Second");
lv_obj_t * c = lv_colorwheel_create(t, true);
lv_obj_set_size(c, 150, 150);
// c = lv_led_create(t, NULL);
// lv_obj_set_pos(c, 160, 20);
t = lv_tabview_add_tab(obj, LV_SYMBOL_EDIT " Edit");
t = lv_tabview_add_tab(obj, LV_SYMBOL_CLOSE);
lv_tabview_set_act(obj, 1, LV_ANIM_ON);
auto_del(obj, LV_DEMO_STRESS_TIME_STEP * 5 + 30);
}
break;
lv_tabview_set_act(obj, 1, LV_ANIM_ON);
auto_del(obj, LV_DEMO_STRESS_TIME_STEP * 5 + 30);
}
break;
case 2:
obj = lv_btn_create(main_page);
@@ -147,12 +146,12 @@ static void obj_test_task_cb(lv_timer_t * tmr)
lv_obj_set_style_bg_img_src(obj, LV_SYMBOL_DUMMY"Text from\nstyle", 0);
lv_obj_del_async(obj); /*Delete on next call of `lv_task_handler` (so not now)*/
// obj = lv_btn_create(main_page);
// lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
// lv_obj_set_style_bg_img_src(obj, LV_SYMBOL_LEFT);
// lv_obj_set_style_bg_img_opa(obj, LV_OPA_50);
// lv_obj_set_style_bg_img_tiled(obj, true);
// lv_obj_scroll_to_view(obj, LV_ANIM_ON);
// obj = lv_btn_create(main_page);
// lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
// lv_obj_set_style_bg_img_src(obj, LV_SYMBOL_LEFT);
// lv_obj_set_style_bg_img_opa(obj, LV_OPA_50);
// lv_obj_set_style_bg_img_tiled(obj, true);
// lv_obj_scroll_to_view(obj, LV_ANIM_ON);
break;
case 5:
@@ -183,19 +182,19 @@ static void obj_test_task_cb(lv_timer_t * tmr)
break;
case 8:
obj = lv_win_create(lv_scr_act(), 50);
lv_obj_set_size(obj, LV_HOR_RES / 2, LV_VER_RES / 2);
lv_obj_align(obj, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
lv_win_add_title(obj, "Window title");
lv_win_add_btn(obj, LV_SYMBOL_CLOSE, 40);
lv_win_add_btn(obj, LV_SYMBOL_DOWN, 40);
auto_del(obj, LV_DEMO_STRESS_TIME_STEP * 3 + 5);
obj = lv_win_create(lv_scr_act(), 50);
lv_obj_set_size(obj, LV_HOR_RES / 2, LV_VER_RES / 2);
lv_obj_align(obj, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
lv_win_add_title(obj, "Window title");
lv_win_add_btn(obj, LV_SYMBOL_CLOSE, 40);
lv_win_add_btn(obj, LV_SYMBOL_DOWN, 40);
auto_del(obj, LV_DEMO_STRESS_TIME_STEP * 3 + 5);
obj = lv_calendar_create(lv_win_get_content(obj));
break;
obj = lv_calendar_create(lv_win_get_content(obj));
break;
case 9:
lv_textarea_set_text(ta, "A very very long text which will should make the text area scrollable"
"Here area some dummy sentences to be sure the text area will be really scrollable.");
"Here area some dummy sentences to be sure the text area will be really scrollable.");
break;
case 10:
obj = lv_keyboard_create(lv_scr_act());
@@ -257,27 +256,26 @@ static void obj_test_task_cb(lv_timer_t * tmr)
lv_textarea_set_one_line(ta, false);
break;
case 16:
{
lv_obj_t * tv = lv_tileview_create(lv_scr_act());
lv_obj_set_size(tv, 200, 200);
auto_del(tv, LV_DEMO_STRESS_TIME_STEP * 4 + 5);
case 16: {
lv_obj_t * tv = lv_tileview_create(lv_scr_act());
lv_obj_set_size(tv, 200, 200);
auto_del(tv, LV_DEMO_STRESS_TIME_STEP * 4 + 5);
obj = lv_tileview_add_tile(tv, 0, 0, LV_DIR_ALL);
obj = lv_label_create(obj);
lv_label_set_text(obj, "Tile: 0;0");
obj = lv_tileview_add_tile(tv, 0, 0, LV_DIR_ALL);
obj = lv_label_create(obj);
lv_label_set_text(obj, "Tile: 0;0");
obj = lv_tileview_add_tile(tv, 0, 1, LV_DIR_ALL);
obj = lv_label_create(obj);
lv_label_set_text(obj, "Tile: 0;1");
obj = lv_tileview_add_tile(tv, 0, 1, LV_DIR_ALL);
obj = lv_label_create(obj);
lv_label_set_text(obj, "Tile: 0;1");
obj = lv_tileview_add_tile(tv, 1, 1, LV_DIR_ALL);
obj = lv_label_create(obj);
lv_label_set_text(obj, "Tile: 1;1");
obj = lv_tileview_add_tile(tv, 1, 1, LV_DIR_ALL);
obj = lv_label_create(obj);
lv_label_set_text(obj, "Tile: 1;1");
lv_obj_set_tile_id(tv, 1, 1, LV_ANIM_ON);
}
break;
lv_obj_set_tile_id(tv, 1, 1, LV_ANIM_ON);
}
break;
case 18:
obj = lv_list_create(main_page);
@@ -423,8 +421,8 @@ static void obj_test_task_cb(lv_timer_t * tmr)
break;
}
// printf("step end: %d\n", state);
state ++;
// printf("step end: %d\n", state);
state++;
}
static void auto_del(lv_obj_t * obj, uint32_t delay)

View File

@@ -11,7 +11,7 @@
#if LV_USE_DEMO_WIDGETS
#if LV_MEM_CUSTOM == 0 && LV_MEM_SIZE < (38ul * 1024ul)
#error Insufficient memory for lv_demo_widgets. Please set LV_MEM_SIZE to at least 38KB (38ul * 1024ul). 48KB is recommended.
#error Insufficient memory for lv_demo_widgets. Please set LV_MEM_SIZE to at least 38KB (38ul * 1024ul). 48KB is recommended.
#endif
/*********************
@@ -25,7 +25,7 @@ typedef enum {
DISP_SMALL,
DISP_MEDIUM,
DISP_LARGE,
}disp_size_t;
} disp_size_t;
/**********************
* STATIC PROTOTYPES
@@ -35,8 +35,10 @@ static void analytics_create(lv_obj_t * parent);
static void shop_create(lv_obj_t * parent);
static void color_changer_create(lv_obj_t * parent);
static lv_obj_t * create_meter_box(lv_obj_t * parent, const char * title, const char * text1, const char * text2, const char * text3);
static lv_obj_t * create_shop_item(lv_obj_t * parent, const void * img_src, const char * name, const char * category, const char * price);
static lv_obj_t * create_meter_box(lv_obj_t * parent, const char * title, const char * text1, const char * text2,
const char * text3);
static lv_obj_t * create_shop_item(lv_obj_t * parent, const void * img_src, const char * name, const char * category,
const char * price);
static void color_changer_event_cb(lv_event_t * e);
static void color_event_cb(lv_event_t * e);
@@ -114,7 +116,8 @@ void lv_demo_widgets(void)
#else
LV_LOG_WARN("LV_FONT_MONTSERRAT_16 is not enabled for the widgets demo. Using LV_FONT_DEFAULT instead.");
#endif
} else if(disp_size == DISP_MEDIUM) {
}
else if(disp_size == DISP_MEDIUM) {
tab_h = 45;
#if LV_FONT_MONTSERRAT_20
font_large = &lv_font_montserrat_20;
@@ -126,22 +129,24 @@ void lv_demo_widgets(void)
#else
LV_LOG_WARN("LV_FONT_MONTSERRAT_14 is not enabled for the widgets demo. Using LV_FONT_DEFAULT instead.");
#endif
} else { /* disp_size == DISP_SMALL */
}
else { /* disp_size == DISP_SMALL */
tab_h = 45;
#if LV_FONT_MONTSERRAT_18
font_large = &lv_font_montserrat_18;
#else
LV_LOG_WARN("LV_FONT_MONTSERRAT_18 is not enabled for the widgets demo. Using LV_FONT_DEFAULT instead.");
LV_LOG_WARN("LV_FONT_MONTSERRAT_18 is not enabled for the widgets demo. Using LV_FONT_DEFAULT instead.");
#endif
#if LV_FONT_MONTSERRAT_12
font_normal = &lv_font_montserrat_12;
#else
LV_LOG_WARN("LV_FONT_MONTSERRAT_12 is not enabled for the widgets demo. Using LV_FONT_DEFAULT instead.");
LV_LOG_WARN("LV_FONT_MONTSERRAT_12 is not enabled for the widgets demo. Using LV_FONT_DEFAULT instead.");
#endif
}
#if LV_USE_THEME_DEFAULT
lv_theme_default_init(NULL, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_RED), LV_THEME_DEFAULT_DARK, font_normal);
lv_theme_default_init(NULL, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_RED), LV_THEME_DEFAULT_DARK,
font_normal);
#endif
lv_style_init(&style_text_muted);
@@ -210,7 +215,7 @@ static void profile_create(lv_obj_t * parent)
lv_obj_t * dsc = lv_label_create(panel1);
lv_obj_add_style(dsc, &style_text_muted, 0);
lv_label_set_text(dsc, "This is a short description of me. Take a look at my profile!" );
lv_label_set_text(dsc, "This is a short description of me. Take a look at my profile!");
lv_label_set_long_mode(dsc, LV_LABEL_LONG_WRAP);
lv_obj_t * email_icn = lv_label_create(panel1);
@@ -325,14 +330,14 @@ static void profile_create(lv_obj_t * parent)
static lv_coord_t grid_2_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
static lv_coord_t grid_2_row_dsc[] = {
LV_GRID_CONTENT, /*Title*/
5, /*Separator*/
LV_GRID_CONTENT, /*Box title*/
30, /*Boxes*/
5, /*Separator*/
LV_GRID_CONTENT, /*Box title*/
30, /*Boxes*/
LV_GRID_TEMPLATE_LAST
LV_GRID_CONTENT, /*Title*/
5, /*Separator*/
LV_GRID_CONTENT, /*Box title*/
30, /*Boxes*/
5, /*Separator*/
LV_GRID_CONTENT, /*Box title*/
30, /*Boxes*/
LV_GRID_TEMPLATE_LAST
};
@@ -382,27 +387,28 @@ static void profile_create(lv_obj_t * parent)
/*Create the top panel*/
static lv_coord_t grid_1_col_dsc[] = {LV_GRID_CONTENT, 1, LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
static lv_coord_t grid_1_row_dsc[] = {
LV_GRID_CONTENT, /*Name*/
LV_GRID_CONTENT, /*Description*/
LV_GRID_CONTENT, /*Email*/
-20,
LV_GRID_CONTENT, /*Phone*/
LV_GRID_CONTENT, /*Buttons*/
LV_GRID_TEMPLATE_LAST};
LV_GRID_CONTENT, /*Name*/
LV_GRID_CONTENT, /*Description*/
LV_GRID_CONTENT, /*Email*/
-20,
LV_GRID_CONTENT, /*Phone*/
LV_GRID_CONTENT, /*Buttons*/
LV_GRID_TEMPLATE_LAST
};
static lv_coord_t grid_2_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
static lv_coord_t grid_2_row_dsc[] = {
LV_GRID_CONTENT, /*Title*/
5, /*Separator*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_TEMPLATE_LAST
LV_GRID_CONTENT, /*Title*/
5, /*Separator*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_TEMPLATE_LAST
};
@@ -454,29 +460,30 @@ static void profile_create(lv_obj_t * parent)
/*Create the top panel*/
static lv_coord_t grid_1_col_dsc[] = {LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
static lv_coord_t grid_1_row_dsc[] = {LV_GRID_CONTENT, /*Avatar*/
LV_GRID_CONTENT, /*Name*/
LV_GRID_CONTENT, /*Description*/
LV_GRID_CONTENT, /*Email*/
LV_GRID_CONTENT, /*Phone number*/
LV_GRID_CONTENT, /*Button1*/
LV_GRID_CONTENT, /*Button2*/
LV_GRID_TEMPLATE_LAST};
LV_GRID_CONTENT, /*Name*/
LV_GRID_CONTENT, /*Description*/
LV_GRID_CONTENT, /*Email*/
LV_GRID_CONTENT, /*Phone number*/
LV_GRID_CONTENT, /*Button1*/
LV_GRID_CONTENT, /*Button2*/
LV_GRID_TEMPLATE_LAST
};
lv_obj_set_grid_dsc_array(panel1, grid_1_col_dsc, grid_1_row_dsc);
static lv_coord_t grid_2_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
static lv_coord_t grid_2_row_dsc[] = {
LV_GRID_CONTENT, /*Title*/
5, /*Separator*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_CONTENT, /*Box title*/
40, LV_GRID_TEMPLATE_LAST /*Box*/
LV_GRID_CONTENT, /*Title*/
5, /*Separator*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_CONTENT, /*Box title*/
40, /*Box*/
LV_GRID_CONTENT, /*Box title*/
40, LV_GRID_TEMPLATE_LAST /*Box*/
};
lv_obj_set_grid_dsc_array(panel2, grid_2_col_dsc, grid_2_row_dsc);
@@ -638,7 +645,7 @@ static void analytics_create(lv_obj_t * parent)
lv_chart_set_next_value(chart2, ser3, lv_rand(10, 80));
lv_meter_scale_t * scale;
lv_meter_indicator_t *indic;
lv_meter_indicator_t * indic;
meter1 = create_meter_box(parent, "Monthly Target", "Revenue: 63%", "Sales: 44%", "Costs: 58%");
lv_obj_add_flag(lv_obj_get_parent(meter1), LV_OBJ_FLAG_FLEX_IN_NEW_TRACK);
scale = lv_meter_add_scale(meter1);
@@ -715,7 +722,8 @@ static void analytics_create(lv_obj_t * parent)
lv_meter_set_indicator_start_value(meter3, indic, 0);
lv_meter_set_indicator_end_value(meter3, indic, 20);
indic = lv_meter_add_scale_lines(meter3, scale, lv_palette_darken(LV_PALETTE_RED, 3), lv_palette_darken(LV_PALETTE_RED, 3), true, 0);
indic = lv_meter_add_scale_lines(meter3, scale, lv_palette_darken(LV_PALETTE_RED, 3), lv_palette_darken(LV_PALETTE_RED,
3), true, 0);
lv_meter_set_indicator_start_value(meter3, indic, 0);
lv_meter_set_indicator_end_value(meter3, indic, 20);
@@ -723,7 +731,8 @@ static void analytics_create(lv_obj_t * parent)
lv_meter_set_indicator_start_value(meter3, indic, 20);
lv_meter_set_indicator_end_value(meter3, indic, 40);
indic = lv_meter_add_scale_lines(meter3, scale, lv_palette_darken(LV_PALETTE_BLUE, 3), lv_palette_darken(LV_PALETTE_BLUE, 3), true, 0);
indic = lv_meter_add_scale_lines(meter3, scale, lv_palette_darken(LV_PALETTE_BLUE, 3),
lv_palette_darken(LV_PALETTE_BLUE, 3), true, 0);
lv_meter_set_indicator_start_value(meter3, indic, 20);
lv_meter_set_indicator_end_value(meter3, indic, 40);
@@ -731,7 +740,8 @@ static void analytics_create(lv_obj_t * parent)
lv_meter_set_indicator_start_value(meter3, indic, 40);
lv_meter_set_indicator_end_value(meter3, indic, 60);
indic = lv_meter_add_scale_lines(meter3, scale, lv_palette_darken(LV_PALETTE_GREEN, 3), lv_palette_darken(LV_PALETTE_GREEN, 3), true, 0);
indic = lv_meter_add_scale_lines(meter3, scale, lv_palette_darken(LV_PALETTE_GREEN, 3),
lv_palette_darken(LV_PALETTE_GREEN, 3), true, 0);
lv_meter_set_indicator_start_value(meter3, indic, 40);
lv_meter_set_indicator_end_value(meter3, indic, 60);
@@ -758,7 +768,8 @@ static void analytics_create(lv_obj_t * parent)
lv_obj_set_size(meter1, 200, 200);
lv_obj_set_size(meter2, 200, 200);
lv_obj_set_size(meter3, 200, 200);
} else {
}
else {
lv_coord_t meter_w = lv_obj_get_width(meter1);
lv_obj_set_height(meter1, meter_w);
lv_obj_set_height(meter2, meter_w);
@@ -836,13 +847,14 @@ void shop_create(lv_obj_t * parent)
lv_obj_set_grid_cell(amount, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 3, 1);
lv_obj_set_grid_cell(hint, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 4, 1);
lv_obj_set_grid_cell(chart3, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_STRETCH, 0, 5);
} else if(disp_size == DISP_MEDIUM) {
}
else if(disp_size == DISP_MEDIUM) {
static lv_coord_t grid1_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
static lv_coord_t grid1_row_dsc[] = {
LV_GRID_CONTENT, /*Title + Date*/
LV_GRID_CONTENT, /*Amount + Hint*/
200, /*Chart*/
LV_GRID_TEMPLATE_LAST
LV_GRID_CONTENT, /*Title + Date*/
LV_GRID_CONTENT, /*Amount + Hint*/
200, /*Chart*/
LV_GRID_TEMPLATE_LAST
};
lv_obj_update_layout(panel1);
@@ -855,15 +867,16 @@ void shop_create(lv_obj_t * parent)
lv_obj_set_grid_cell(amount, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_CENTER, 1, 1);
lv_obj_set_grid_cell(hint, LV_GRID_ALIGN_START, 1, 1, LV_GRID_ALIGN_CENTER, 1, 1);
lv_obj_set_grid_cell(chart3, LV_GRID_ALIGN_END, 0, 2, LV_GRID_ALIGN_STRETCH, 2, 1);
} else if(disp_size == DISP_SMALL) {
}
else if(disp_size == DISP_SMALL) {
static lv_coord_t grid1_col_dsc[] = {LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
static lv_coord_t grid1_row_dsc[] = {
LV_GRID_CONTENT, /*Title*/
LV_GRID_CONTENT, /*Date*/
LV_GRID_CONTENT, /*Amount*/
LV_GRID_CONTENT, /*Hint*/
LV_GRID_CONTENT, /*Chart*/
LV_GRID_TEMPLATE_LAST
LV_GRID_CONTENT, /*Title*/
LV_GRID_CONTENT, /*Date*/
LV_GRID_CONTENT, /*Amount*/
LV_GRID_CONTENT, /*Hint*/
LV_GRID_CONTENT, /*Chart*/
LV_GRID_TEMPLATE_LAST
};
lv_obj_set_width(chart3, LV_PCT(95));
@@ -883,7 +896,8 @@ void shop_create(lv_obj_t * parent)
if(disp_size == DISP_SMALL) {
lv_obj_add_flag(list, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK);
lv_obj_set_height(list, LV_PCT(100));
} else {
}
else {
lv_obj_set_height(list, LV_PCT(100));
lv_obj_set_style_max_height(list, 300, 0);
}
@@ -907,7 +921,8 @@ void shop_create(lv_obj_t * parent)
if(disp_size == DISP_SMALL) {
lv_obj_add_flag(notifications, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK);
lv_obj_set_height(notifications, LV_PCT(100));
} else {
}
else {
lv_obj_set_height(notifications, LV_PCT(100));
lv_obj_set_style_max_height(notifications, 300, 0);
}
@@ -947,8 +962,9 @@ void shop_create(lv_obj_t * parent)
static void color_changer_create(lv_obj_t * parent)
{
static lv_palette_t palette[] = {
LV_PALETTE_BLUE, LV_PALETTE_GREEN, LV_PALETTE_BLUE_GREY, LV_PALETTE_ORANGE,
LV_PALETTE_RED, LV_PALETTE_PURPLE, LV_PALETTE_TEAL, _LV_PALETTE_LAST };
LV_PALETTE_BLUE, LV_PALETTE_GREEN, LV_PALETTE_BLUE_GREY, LV_PALETTE_ORANGE,
LV_PALETTE_RED, LV_PALETTE_PURPLE, LV_PALETTE_TEAL, _LV_PALETTE_LAST
};
lv_obj_t * color_cont = lv_obj_create(parent);
lv_obj_remove_style_all(color_cont);
@@ -987,12 +1003,13 @@ static void color_changer_create(lv_obj_t * parent)
lv_obj_set_style_bg_img_src(btn, LV_SYMBOL_TINT, 0);
if(disp_size == DISP_SMALL) {
lv_obj_set_size(btn, LV_DPX(42), LV_DPX(42));
lv_obj_align(btn, LV_ALIGN_BOTTOM_RIGHT, -LV_DPX(15), -LV_DPX(15));
} else {
lv_obj_set_size(btn, LV_DPX(50), LV_DPX(50));
lv_obj_align(btn, LV_ALIGN_BOTTOM_RIGHT, -LV_DPX(15), -LV_DPX(15));
}
lv_obj_set_size(btn, LV_DPX(42), LV_DPX(42));
lv_obj_align(btn, LV_ALIGN_BOTTOM_RIGHT, -LV_DPX(15), -LV_DPX(15));
}
else {
lv_obj_set_size(btn, LV_DPX(50), LV_DPX(50));
lv_obj_align(btn, LV_ALIGN_BOTTOM_RIGHT, -LV_DPX(15), -LV_DPX(15));
}
}
static void color_changer_anim_cb(void * var, int32_t v)
@@ -1005,7 +1022,8 @@ static void color_changer_anim_cb(void * var, int32_t v)
w = lv_map(v, 0, 256, LV_DPX(52), max_w);
lv_obj_set_width(obj, w);
lv_obj_align(obj, LV_ALIGN_BOTTOM_RIGHT, - LV_DPX(10), - LV_DPX(10));
} else {
}
else {
w = lv_map(v, 0, 256, LV_DPX(60), max_w);
lv_obj_set_width(obj, w);
lv_obj_align(obj, LV_ALIGN_BOTTOM_RIGHT, - LV_DPX(10), - LV_DPX(10));
@@ -1020,7 +1038,7 @@ static void color_changer_anim_cb(void * var, int32_t v)
}
static void color_changer_event_cb(lv_event_t *e)
static void color_changer_event_cb(lv_event_t * e)
{
if(lv_event_get_code(e) == LV_EVENT_CLICKED) {
lv_obj_t * color_cont = lv_event_get_user_data(e);
@@ -1032,7 +1050,8 @@ static void color_changer_event_cb(lv_event_t *e)
lv_anim_set_values(&a, 0, 256);
lv_anim_set_time(&a, 200);
lv_anim_start(&a);
} else {
}
else {
lv_anim_t a;
lv_anim_init(&a);
lv_anim_set_var(&a, color_cont);
@@ -1064,9 +1083,10 @@ static void color_event_cb(lv_event_t * e)
lv_palette_t * palette_primary = lv_event_get_user_data(e);
lv_palette_t palette_secondary = (*palette_primary) + 3; /*Use another palette as secondary*/
if(palette_secondary >= _LV_PALETTE_LAST) palette_secondary = 0;
lv_theme_default_init(NULL, lv_palette_main(*palette_primary), lv_palette_main(palette_secondary), LV_THEME_DEFAULT_DARK, font_normal);
#if LV_USE_THEME_DEFAULT
lv_theme_default_init(NULL, lv_palette_main(*palette_primary), lv_palette_main(palette_secondary),
LV_THEME_DEFAULT_DARK, font_normal);
#endif
lv_color_t color = lv_palette_main(*palette_primary);
lv_style_set_text_color(&style_icon, color);
lv_chart_set_series_color(chart1, ser1, color);
@@ -1074,7 +1094,8 @@ static void color_event_cb(lv_event_t * e)
}
}
static lv_obj_t * create_meter_box(lv_obj_t * parent, const char * title, const char * text1, const char * text2, const char * text3)
static lv_obj_t * create_meter_box(lv_obj_t * parent, const char * title, const char * text1, const char * text2,
const char * text3)
{
lv_obj_t * cont = lv_obj_create(parent);
lv_obj_set_height(cont, LV_SIZE_CONTENT);
@@ -1114,7 +1135,7 @@ static lv_obj_t * create_meter_box(lv_obj_t * parent, const char * title, const
lv_label_set_text(label3, text3);
if(disp_size == DISP_MEDIUM) {
static lv_coord_t grid_col_dsc[] = {LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_CONTENT,LV_GRID_FR(8), LV_GRID_TEMPLATE_LAST};
static lv_coord_t grid_col_dsc[] = {LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_CONTENT, LV_GRID_FR(8), LV_GRID_TEMPLATE_LAST};
static lv_coord_t grid_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
lv_obj_set_grid_dsc_array(cont, grid_col_dsc, grid_row_dsc);
@@ -1146,7 +1167,8 @@ static lv_obj_t * create_meter_box(lv_obj_t * parent, const char * title, const
}
static lv_obj_t * create_shop_item(lv_obj_t * parent, const void * img_src, const char * name, const char * category, const char * price)
static lv_obj_t * create_shop_item(lv_obj_t * parent, const void * img_src, const char * name, const char * category,
const char * price)
{
static lv_coord_t grid_col_dsc[] = {LV_GRID_CONTENT, 5, LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
static lv_coord_t grid_row_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
@@ -1257,9 +1279,10 @@ static void slider_event_cb(lv_event_t * e)
lv_obj_t * obj = lv_event_get_target(e);
if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) {
lv_coord_t *s = lv_event_get_param(e);
lv_coord_t * s = lv_event_get_param(e);
*s = LV_MAX(*s, 60);
} else if(code == LV_EVENT_DRAW_PART_END) {
}
else if(code == LV_EVENT_DRAW_PART_END) {
lv_obj_draw_part_dsc_t * dsc = lv_event_get_param(e);
if(dsc->part == LV_PART_KNOB && lv_obj_has_state(obj, LV_STATE_PRESSED)) {
char buf[8];
@@ -1310,7 +1333,8 @@ static void chart_event_cb(lv_event_t * e)
if(lv_chart_get_type(obj) == LV_CHART_TYPE_BAR) {
const char * month[] = {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII"};
lv_snprintf(dsc->text, dsc->text_length, "%s", month[dsc->value]);
} else {
}
else {
const char * month[] = {"Jan", "Febr", "March", "Apr", "May", "Jun", "July", "Aug", "Sept", "Oct", "Nov", "Dec"};
lv_snprintf(dsc->text, dsc->text_length, "%s", month[dsc->value]);
}
@@ -1322,13 +1346,15 @@ static void chart_event_cb(lv_event_t * e)
/*Add a line mask that keeps the area below the line*/
if(dsc->p1 && dsc->p2) {
lv_draw_mask_line_param_t line_mask_param;
lv_draw_mask_line_points_init(&line_mask_param, dsc->p1->x, dsc->p1->y, dsc->p2->x, dsc->p2->y, LV_DRAW_MASK_LINE_SIDE_BOTTOM);
lv_draw_mask_line_points_init(&line_mask_param, dsc->p1->x, dsc->p1->y, dsc->p2->x, dsc->p2->y,
LV_DRAW_MASK_LINE_SIDE_BOTTOM);
int16_t line_mask_id = lv_draw_mask_add(&line_mask_param, NULL);
/*Add a fade effect: transparent bottom covering top*/
lv_coord_t h = lv_obj_get_height(obj);
lv_draw_mask_fade_param_t fade_mask_param;
lv_draw_mask_fade_init(&fade_mask_param, &obj->coords, LV_OPA_COVER, obj->coords.y1 + h / 8, LV_OPA_TRANSP, obj->coords.y2);
lv_draw_mask_fade_init(&fade_mask_param, &obj->coords, LV_OPA_COVER, obj->coords.y1 + h / 8, LV_OPA_TRANSP,
obj->coords.y2);
int16_t fade_mask_id = lv_draw_mask_add(&fade_mask_param, NULL);
/*Draw a rectangle that will be affected by the mask*/
@@ -1361,7 +1387,8 @@ static void chart_event_cb(lv_event_t * e)
if(lv_chart_get_type(obj) == LV_CHART_TYPE_LINE) {
dsc->rect_dsc->outline_color = lv_color_white();
dsc->rect_dsc->outline_width = 2;
} else {
}
else {
dsc->rect_dsc->shadow_color = ser->color;
dsc->rect_dsc->shadow_width = 15;
dsc->rect_dsc->shadow_spread = 0;
@@ -1380,11 +1407,13 @@ static void chart_event_cb(lv_event_t * e)
if(ser == lv_chart_get_series_next(obj, NULL)) {
txt_area.x1 = dsc->draw_area->x1 + lv_area_get_width(dsc->draw_area) / 2;
txt_area.x2 = txt_area.x1 + text_size.x;
} else {
}
else {
txt_area.x2 = dsc->draw_area->x1 + lv_area_get_width(dsc->draw_area) / 2;
txt_area.x1 = txt_area.x2 - text_size.x;
}
} else {
}
else {
txt_area.x1 = dsc->draw_area->x1 + lv_area_get_width(dsc->draw_area) / 2 - text_size.x / 2;
txt_area.x2 = txt_area.x1 + text_size.x;
txt_area.y2 = dsc->draw_area->y1 - LV_DPX(15);
@@ -1408,7 +1437,8 @@ static void chart_event_cb(lv_event_t * e)
label_dsc.color = lv_color_white();
label_dsc.font = font_normal;
lv_draw_label(dsc->draw_ctx, &label_dsc, &txt_area, buf, NULL);
} else {
}
else {
dsc->rect_dsc->outline_width = 0;
dsc->rect_dsc->shadow_width = 0;
}
@@ -1455,15 +1485,15 @@ static void shop_chart_event_cb(lv_event_t * e)
lv_draw_rect(dsc->draw_ctx, &draw_rect_dsc, &a);
a.y1 = a.y2 - 4; /*-4 to overlap the radius*/
a.y2 = a.y1 + (clothes[dsc->id] * h) / 100;
a.y2 = a.y1 + (clothes[dsc->id] * h) / 100;
draw_rect_dsc.bg_color = lv_palette_main(LV_PALETTE_BLUE);
draw_rect_dsc.radius = 0;
lv_draw_rect( dsc->draw_ctx, &draw_rect_dsc, &a);
lv_draw_rect(dsc->draw_ctx, &draw_rect_dsc, &a);
a.y1 = a.y2;
a.y2 = a.y1 + (services[dsc->id] * h) / 100;
draw_rect_dsc.bg_color = lv_palette_main(LV_PALETTE_GREEN);
lv_draw_rect( dsc->draw_ctx, &draw_rect_dsc, &a);
lv_draw_rect(dsc->draw_ctx, &draw_rect_dsc, &a);
}
}
}
@@ -1509,7 +1539,8 @@ static void meter2_timer_cb(lv_timer_t * timer)
if(down1) {
session_desktop -= 137;
if(session_desktop < 1400) down1 = false;
} else {
}
else {
session_desktop += 116;
if(session_desktop > 4500) down1 = true;
}
@@ -1517,7 +1548,8 @@ static void meter2_timer_cb(lv_timer_t * timer)
if(down2) {
session_tablet -= 3;
if(session_tablet < 1400) down2 = false;
} else {
}
else {
session_tablet += 9;
if(session_tablet > 4500) down2 = true;
}
@@ -1525,7 +1557,8 @@ static void meter2_timer_cb(lv_timer_t * timer)
if(down3) {
session_mobile -= 57;
if(session_mobile < 1400) down3 = false;
} else {
}
else {
session_mobile += 76;
if(session_mobile > 4500) down3 = true;
}

View File

@@ -17,7 +17,7 @@ LV_DPI =130
LV_ANIM_REPEAT_INFINITE = -1
# Register SDL display driver.
disp_buf1 = lv.disp_buf_t()
buf1_1 = bytes(480 * 10)
disp_buf1.init(buf1_1, None, len(buf1_1)//4)
@@ -32,7 +32,7 @@ disp_drv.register()
# Register SDL mouse driver
indev_drv = lv.indev_drv_t()
indev_drv.init()
indev_drv.init()
indev_drv.type = lv.INDEV_TYPE.POINTER
indev_drv.read_cb = SDL.mouse_read
indev_drv.register()
@@ -55,7 +55,7 @@ def LV_DPX(n):
return tmp
else:
return 1
def color_chg_event_cb(sw, e):
if e == lv.EVENT.VALUE_CHANGED:
flag = lv.THEME_MATERIAL_FLAG.LIGHT
@@ -63,7 +63,7 @@ def color_chg_event_cb(sw, e):
flag=lv.THEME_MATERIAL_FLAG.DARK
theme = lv.theme_material_init(LV_THEME_DEFAULT_COLOR_PRIMARY,LV_THEME_DEFAULT_COLOR_SECONDARY,flag,
lv.theme_get_font_small(), lv.theme_get_font_normal(), lv.theme_get_font_subtitle(),
lv.theme_get_font_title())
lv.theme_get_font_title())
def slider_event_cb(slider, e):
if e == lv.EVENT.VALUE_CHANGED:
if slider.get_type() == lv.slider.TYPE.NORMAL:
@@ -75,19 +75,19 @@ def slider_event_cb(slider, e):
slider_string = str(slider_left) + '-' + str(slider_right)
# print("slider left value: %d, slider right value: %d"%(slider_left,slider_right))
slider.set_style_local_value_str(lv.slider.PART.INDIC, lv.STATE.DEFAULT, slider_string)
def linemeter_anim(a,lmeter, value):
lmeter.set_value(value)
label = lmeter.get_child(None)
label.set_text(str(value))
label.align(lmeter, lv.ALIGN.CENTER, 0, 0)
def gauge_anim(a,gauge,val):
gauge.set_value(0,val)
label=gauge.get_child(None)
label.set_text(str(val))
label.align(gauge, lv.ALIGN.CENTER, 0, 0)
def bar_anim(task,bar):
val = bar.get_value()
# print("bar value: ",val)
@@ -95,11 +95,11 @@ def bar_anim(task,bar):
val += 1
if val > max_value:
val=0
bar.set_value(val,lv.ANIM.OFF)
bar.set_value(val,lv.ANIM.OFF)
cpy_string = "Copying %d/%d"% (val, max_value)
# print(cpy_string)
bar.set_style_local_value_str(lv.bar.PART.BG, lv.STATE.DEFAULT, cpy_string)
def arc_phase1_ready_cb(a,arc):
a_arc=lv.anim_t()
a_arc.init()
@@ -117,19 +117,19 @@ def arc_phase2_ready_cb(a,arc):
a_arc.set_values(0, 360)
a_arc.set_ready_cb(lambda a: arc_phase1_ready_cb(a,arc))
lv.anim_t.start(a_arc)
def anim_phase1(a,arc,val):
arc.set_end_angle(val)
label = arc.get_child(None)
label.set_text(str(val))
label.align(arc, lv.ALIGN.CENTER, 0, 0)
def anim_phase2(a,arc,val):
arc.set_end_angle(val)
label = arc.get_child(None)
label.set_text(str(val))
label.align(arc, lv.ALIGN.CENTER, 0, 0)
def controls_create(parent):
lv.page.set_scrl_layout(lv.page.__cast__(parent), lv.LAYOUT.PRETTY_TOP)
if LV_DEMO_WIDGETS_SLIDESHOW == 0:
@@ -139,15 +139,15 @@ def controls_create(parent):
btnm = lv.btnmatrix.__cast__(m.get_btnmatrix())
# print("type(btnm): ",type(btnm))
btnm.set_btn_ctrl(1, lv.btnmatrix.CTRL.CHECK_STATE)
h = lv.cont(parent, None)
h.set_layout(lv.LAYOUT.PRETTY_MID)
h.add_style(lv.cont.PART.MAIN, style_box)
h.set_drag_parent(True)
h.set_style_local_value_str(lv.cont.PART.MAIN, lv.STATE.DEFAULT, "Basics")
disp_size = display.get_size_category()
disp_size = display.get_size_category()
if disp_size <= lv.DISP_SIZE.SMALL:
grid_w= lv.page.get_width_grid(lv.page.__cast__(parent),1,1)
# print("grid_w: ",grid_w)
@@ -157,23 +157,23 @@ def controls_create(parent):
h.set_fit2(lv.FIT.NONE, lv.FIT.TIGHT)
h.set_width(grid_w)
btn = lv.btn(h,None)
btn = lv.btn(h,None)
btn.set_fit2(lv.FIT.NONE, lv.FIT.TIGHT)
if disp_size <= lv.DISP_SIZE.SMALL:
button_width=h.get_width_grid(1,1)
else:
button_width=h.get_width_grid(2,1)
# print("button_width: %d"%button_width)
btn.set_width(button_width)
label = lv.label(btn, None)
label.set_text("Button")
btn = lv.btn(h, btn)
btn.toggle()
label = lv.label(btn, None)
label.set_text("Button")
lv.switch(h, None)
lv.checkbox(h, None)
@@ -184,7 +184,7 @@ def controls_create(parent):
slider.set_value(40, lv.ANIM.OFF)
slider.set_event_cb(slider_event_cb)
slider.set_width_margin(fit_w);
# Use the knobs style value the display the current value in focused state
slider.set_style_local_margin_top(lv.slider.PART.BG, lv.STATE.DEFAULT, LV_DPX(25))
slider.set_style_local_value_font(lv.slider.PART.KNOB, lv.STATE.DEFAULT, lv.theme_get_font_small())
@@ -194,7 +194,7 @@ def controls_create(parent):
slider.set_style_local_transition_time(lv.slider.PART.KNOB, lv.STATE.DEFAULT, 300)
slider.set_style_local_transition_prop_5(lv.slider.PART.KNOB, lv.STATE.DEFAULT, lv.STYLE.VALUE_OFS_Y)
slider.set_style_local_transition_prop_6(lv.slider.PART.KNOB, lv.STATE.DEFAULT, lv.STYLE.VALUE_OPA)
slider = lv.slider(h, None)
slider.set_type(lv.slider.TYPE.RANGE)
slider.set_value(70, lv.ANIM.OFF)
@@ -206,11 +206,11 @@ def controls_create(parent):
lv.event_send(slider,lv.EVENT.VALUE_CHANGED, None) # To refresh the text
if slider.get_width() > fit_w:
slider.set_width(fit_w)
h = lv.cont(parent, h)
h.set_fit(lv.FIT.NONE)
h.set_style_local_value_str(lv.cont.PART.MAIN, lv.STATE.DEFAULT, "Text input")
ta = lv.textarea(h, None)
lv.cont.set_fit2(h,lv.FIT.PARENT, lv.FIT.NONE)
ta.set_text("")
@@ -258,7 +258,7 @@ def visuals_create(parent):
chart.set_div_line_count(3, 0)
chart.set_point_count(8)
chart.set_type(lv.chart.TYPE.LINE)
if disp_size > lv.DISP_SIZE.SMALL:
chart.set_style_local_pad_left(lv.chart.PART.BG, lv.STATE.DEFAULT, 4 * (LV_DPI // 10))
chart.set_style_local_pad_bottom(lv.chart.PART.BG, lv.STATE.DEFAULT, 3 * (LV_DPI // 10))
@@ -268,7 +268,7 @@ def visuals_create(parent):
chart.set_x_tick_length(0, 0)
chart.set_y_tick_texts("600\n500\n400\n300\n200", 0, lv.chart.AXIS.DRAW_LAST_TICK)
chart.set_x_tick_texts("Jan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug", 0, lv.chart.AXIS.DRAW_LAST_TICK)
s1 = chart.add_series(LV_THEME_DEFAULT_COLOR_PRIMARY)
s2 = chart.add_series(LV_THEME_DEFAULT_COLOR_SECONDARY)
@@ -282,7 +282,7 @@ def visuals_create(parent):
chart.set_next(s1, 60)
chart.set_next(s1, 10)
chart.set_next(s1, 90)
chart.set_next(s2, 32)
chart.set_next(s2, 66)
chart.set_next(s2, 5)
@@ -333,7 +333,7 @@ def visuals_create(parent):
grid_w_meter = lv.page.get_width_grid(page, 2, 1)
else:
grid_w_meter = lv.page.get_width_grid(page, 3, 1)
meter_h = lv.page.get_height_fit(page)
if grid_w_meter < meter_h:
meter_size = grid_w_meter
@@ -359,7 +359,7 @@ def visuals_create(parent):
a_lm.set_playback_time(1000)
a_lm.set_repeat_count(LV_ANIM_REPEAT_INFINITE)
lv.anim_t.start(a_lm)
gauge = lv.gauge(parent, None)
gauge.set_drag_parent(True)
gauge.set_size(meter_size, meter_size)
@@ -378,7 +378,7 @@ def visuals_create(parent):
a_ga.set_repeat_count(LV_ANIM_REPEAT_INFINITE)
a_ga.set_custom_exec_cb(lambda a, val: gauge_anim(a,gauge,val))
lv.anim_t.start(a_ga)
arc = lv.arc(parent,None)
arc.set_drag_parent(True)
arc.set_bg_angles(0, 360)
@@ -412,7 +412,7 @@ def visuals_create(parent):
bar_h.set_width(lv.page.get_width_grid(page, 2, 1))
else:
bar_h.set_width(lv.page.get_width_grid(parent, 3, 2))
bar = lv.bar(bar_h,None)
bar.set_width(lv.cont.get_width_fit(bar_h))
bar.set_style_local_value_font(lv.bar.PART.BG, lv.STATE.DEFAULT, lv.theme_get_font_small())
@@ -421,7 +421,7 @@ def visuals_create(parent):
bar.set_style_local_margin_bottom(lv.bar.PART.BG, lv.STATE.DEFAULT, LV_DPI // 7)
bar.align(None, lv.ALIGN.CENTER, 0, 0)
bar.set_value(30,lv.ANIM.OFF)
led_h = lv.cont(parent, None)
led_h.set_layout(lv.LAYOUT.PRETTY_MID)
if disp_size <= lv.DISP_SIZE.SMALL:
@@ -459,9 +459,9 @@ def visuals_create(parent):
def selectors_create(parent):
page = lv.page.__cast__(parent)
lv.page.set_scrl_layout(page, lv.LAYOUT.PRETTY_MID)
grid_h = page.get_height_grid(1, 1)
if disp_size <= lv.DISP_SIZE.SMALL:
grid_w = page.get_width_grid(1, 1)
else:
@@ -497,7 +497,7 @@ def selectors_create(parent):
h.set_style_local_pad_top(lv.cont.PART_MAIN, LV_STATE_DEFAULT, 0);
h.set_size(min(grid_h, grid_w), min(grid_h, grid_w))
h.set_layout(lv.LAYOUT.PRETTY_TOP)
roller = lv.roller(h, None)
roller.add_style(lv.cont.PART.MAIN, style_box)
roller.set_style_local_value_str(lv.cont.PART.MAIN, lv.STATE.DEFAULT, "Roller")
@@ -508,8 +508,8 @@ def selectors_create(parent):
roller.set_width(lv.cont.get_width_grid(h, 1 , 1))
else:
roller.set_width(lv.cont.get_width_grid(h, 2 , 1))
dd = lv.dropdown(h, None)
dd.add_style(lv.cont.PART.MAIN, style_box)
dd.set_style_local_value_str(lv.cont.PART.MAIN, lv.STATE.DEFAULT, "Dropdown")
@@ -517,20 +517,20 @@ def selectors_create(parent):
dd.set_width(lv.cont.get_width_grid(h, 1 , 1))
else:
dd.set_width(lv.cont.get_width_grid(h, 2 , 1))
dd.set_options("Alpha\nBravo\nCharlie\nDelta\nEcho\nFoxtrot\nGolf\nHotel\nIndia\nJuliette\nKilo\nLima\nMike\nNovember\n"
"Oscar\nPapa\nQuebec\nRomeo\nSierra\nTango\nUniform\nVictor\nWhiskey\nXray\nYankee\nZulu")
list = lv.list(parent, None)
list.set_scroll_propagation(True)
list.set_size(grid_w, grid_h)
txts = [lv.SYMBOL.SAVE, "Save", lv.SYMBOL.CUT, "Cut", lv.SYMBOL.COPY, "Copy",
lv.SYMBOL.OK, "This is a quite long text to scroll on the list", lv.SYMBOL.EDIT, "Edit", lv.SYMBOL.WIFI, "Wifi",
lv.SYMBOL.BLUETOOTH, "Bluetooth", lv.SYMBOL.GPS, "GPS", lv.SYMBOL.USB, "USB",
lv.SYMBOL.SD_CARD, "SD card", lv.SYMBOL.CLOSE, "Close"]
for i in range(0,len(txts)//2,2):
btn = list.add_btn(txts[i], txts[i + 1]);
lv.btn.set_checkable(lv.btn.__cast__(btn),True)
@@ -538,9 +538,9 @@ def selectors_create(parent):
# Make a button disabled
if i == 4:
btn.set_state(lv.btn.STATE.DISABLED)
cal.set_highlighted_dates(hl, 2)
tv = lv.tabview(lv.scr_act(), None)
display = scr.get_disp()
disp_size = display.get_size_category()
@@ -549,7 +549,7 @@ tv.set_style_local_pad_left(lv.tabview.PART.TAB_BG, lv.STATE.DEFAULT, disp_drv.h
sw = lv.switch(lv.scr_act(), None)
if lv.theme_get_flags() & lv.THEME_MATERIAL_FLAG.DARK:
sw.on(LV_ANIM_OFF)
sw.set_event_cb(color_chg_event_cb)
sw.set_event_cb(color_chg_event_cb)
sw.set_pos(LV_DPX(10), LV_DPX(10))
sw.set_style_local_value_str(lv.switch.PART.BG, lv.STATE.DEFAULT, "Dark")
sw.set_style_local_value_align(lv.switch.PART.BG, lv.STATE.DEFAULT, lv.ALIGN.OUT_RIGHT_MID)
@@ -567,6 +567,6 @@ style_box.set_value_ofs_y(lv.STATE.DEFAULT, - LV_DPX(10))
style_box.set_margin_top(lv.STATE.DEFAULT, LV_DPX(30))
controls_create(t1)
visuals_create(t2)
visuals_create(t2)
selectors_create(t3)

File diff suppressed because it is too large Load Diff

View File

@@ -87,3 +87,38 @@ void lv_label_set_text(lv_obj_t * label, const char * text)
Use 4 spaces indentation instead of tab.
You can use **astyle** to format the code. Run `code-formatter.sh` from the `scrips` folder.
#### pre-commit
[pre-commit](https://pre-commit.com/) is a multi-language package manager for pre-commit hooks.
See the [instalation guide](https://pre-commit.com/#installation) to get pre-commit python package
installed into your development machine.
Once you have `pre-commit` installed you will need to [set up the git hook scripts](https://pre-commit.com/#3-install-the-git-hook-scripts) with:
```console
pre-commit install
```
now `pre-commit` will run automatically on `git commit`!
##### Hooks
The `format-source` local hook (see `.pre-commit-config.yaml`) runs **astyle** on all the staged source and header
files (that are not excluded, see `exclude` key of the hook configuration) before entering the commit message,
if any file gets formatted by **astyle** you will need to add the change to the staging area and run `git commit` again.
The `trailing-whitespace` hook fixes trailing whitespaces on all of the files.
##### Skipping hooks
If you want to skip any particular hook you can do so with:
```console
SKIP=name-of-the-hook git commit
```
##### Testing hooks
It's no necessary to do a commit to test the hooks, you can test hooks by adding the files into the staging area and run:
```console
pre-commit run name-of-the-hook
```

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/CONTRIBUTING.md
```
# Contributing
@@ -9,22 +5,22 @@
Join LVGL's community and leave your footprint in the library!
There are a lot of ways to contribute to LVGL even if you are new to the library or even new to programming.
There are a lot of ways to contribute to LVGL even if you are new to the library or even new to programming.
It might be scary to make the first step but you have nothing to be afraid of.
It might be scary to make the first step but you have nothing to be afraid of.
A friendly and helpful community is waiting for you. Get to know like-minded people and make something great together.
So let's find which contribution option fits you the best and help you join the development of LVGL!
Before getting started here are some guidelines to make contribution smoother:
- Be kind and friendly.
- Be kind and friendly.
- Be sure to read the relevant part of the documentation before posting a question.
- Ask questions in the [Forum](https://forum.lvgl.io/) and use [GitHub](https://github.com/lvgl/) for development-related discussions.
- Always fill out the post or issue templates in the Forum or GitHub (or at least provide equivalent information). It makes understanding your contribution or issue easier and you will get a useful response faster.
- If possible send an absolute minimal but buildable code example in order to reproduce the issue. Be sure it contains all the required variable declarations, constants, and assets (images, fonts).
- Use [Markdown](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) to format your posts. You can learn it in 10 minutes.
- Speak about one thing in one issue or topic. It makes your post easier to find later for someone with the same question.
- Give feedback and close the issue or mark the topic as solved if your question is answered.
- Give feedback and close the issue or mark the topic as solved if your question is answered.
- For non-trivial fixes and features, it's better to open an issue first to discuss the details instead of sending a pull request directly.
- Please read and follow the <a href="https://github.com/lvgl/lvgl/blob/master/docs/CODING_STYLE.md">Coding style</a> guide.
@@ -32,7 +28,7 @@ Before getting started here are some guidelines to make contribution smoother:
Merging new code into the lvgl, documentation, blog, examples, and other repositories happen via *Pull requests* (PR for short).
A PR is a notification like "Hey, I made some updates to your project. Here are the changes, you can add them if you want."
To do this you need a copy (called fork) of the original project under your account, make some changes there, and notify the original repository about your updates.
To do this you need a copy (called fork) of the original project under your account, make some changes there, and notify the original repository about your updates.
You can see what it looks like on GitHub for LVGL here: [https://github.com/lvgl/lvgl/pulls](https://github.com/lvgl/lvgl/pulls).
To add your changes you can edit files online on GitHub and send a new Pull request from there (recommended for small changes) or
@@ -48,13 +44,13 @@ To add your changes you can edit files online on GitHub and send a new Pull requ
### From command line
The instructions describe the main `lvgl` repository but it works the same way for the other repositories.
1. Fork the [lvgl repository](https://github.com/lvgl/lvgl). To do this click the "Fork" button in the top right corner.
1. Fork the [lvgl repository](https://github.com/lvgl/lvgl). To do this click the "Fork" button in the top right corner.
It will "copy" the `lvgl` repository to your GitHub account (`https://github.com/<YOUR_NAME>?tab=repositories`)
2. Clone your forked repository.
3. Add your changes. You can create a *feature branch* from *master* for the updates: `git checkout -b the-new-feature`
3. Add your changes. You can create a *feature branch* from *master* for the updates: `git checkout -b the-new-feature`
4. Commit and push your changes to the forked `lvgl` repository.
5. Create a PR on GitHub from the page of your `lvgl` repository (`https://github.com/<YOUR_NAME>/lvgl`) by clicking the *"New pull request"* button. Don't forget to select the branch where you added your changes.
7. Set the base branch. It means where you want to merge your update. In the `lvgl` repo both the fixes and new features go to `master` branch.
7. Set the base branch. It means where you want to merge your update. In the `lvgl` repo both the fixes and new features go to `master` branch.
8. Describe what is in the update. An example code is welcome if applicable.
9. If you need to make more changes, just update your forked `lvgl` repo with new commits. They will automatically appear in the PR.
@@ -72,7 +68,7 @@ The following structure should be used:
Possible `<type>`s:
- `fix` bugfix in the source code.
- `feat` new feature
- `feat` new feature
- `arch` architectural changes
- `perf` changes that affect the performance
- `example` anything related to examples (even fixes and new examples)
@@ -91,8 +87,8 @@ For example `img`, `layout`, `txt`, `anim`. The scope can be omitted.
`<body>` optional and can be used to describe the details of this change.
`<footer>` shall contain
- the words "BREAKING CHANGE" if the changes break the API
`<footer>` shall contain
- the words "BREAKING CHANGE" if the changes break the API
- reference to the GitHub issue or Pull Request if applicable.
Some examples:
@@ -137,7 +133,7 @@ To make the DCO easier to digest, here are some practical guides about specific
#### Your own work
The simplest case is when the contribution is solely your own work.
The simplest case is when the contribution is solely your own work.
In this case you can just send a Pull Request without worrying about any licensing issues.
#### Use code from online source
@@ -161,14 +157,14 @@ As LVGL is MIT licensed, other MIT licensed code can be integrated without issue
The MIT license requires a copyright notice be added to the derived work. Any derivative work based on MIT licensed code must copy the original work's license file or text.
#### Use GPL licensed code
The GPL license is not compatible with the MIT license. Therefore, LVGL can not accept GPL licensed code.
The GPL license is not compatible with the MIT license. Therefore, LVGL can not accept GPL licensed code.
## Ways to contribute
Even if you're just getting started with LVGL there are plenty of ways to get your feet wet.
Most of these options don't even require knowing a single line of LVGL code.
Even if you're just getting started with LVGL there are plenty of ways to get your feet wet.
Most of these options don't even require knowing a single line of LVGL code.
Below we have collected some opportunities about the ways you can contribute to LVGL.
Below we have collected some opportunities about the ways you can contribute to LVGL.
### Give LVGL a Star
@@ -178,36 +174,36 @@ Show that you like LVGL by giving it star on GitHub!
<!-- Place this tag where you want the button to render. -->
<a class="github-button" href="https://github.com/lvgl/lvgl" data-icon="octicon-star" data-size="large" data-show-count="true" aria-label="Star lvgl/lvgl on GitHub">Star</a>
This simple click makes LVGL more visible on GitHub and makes it more attractive to other people.
So with this, you already helped a lot!
This simple click makes LVGL more visible on GitHub and makes it more attractive to other people.
So with this, you already helped a lot!
### Tell what you have achieved
Have you already started using LVGL in a [Simulator](/get-started/pc-simulator), a development board, or on your custom hardware?
Was it easy or were there some obstacles? Are you happy with the result?
Have you already started using LVGL in a [Simulator](/get-started/platforms/pc-simulator), a development board, or on your custom hardware?
Was it easy or were there some obstacles? Are you happy with the result?
Showing your project to others is a win-win situation because it increases your and LVGL's reputation at the same time.
You can post about your project on Twitter, Facebook, LinkedIn, create a YouTube video, and so on.
Only one thing: On social media don't forget to add a link to `https://lvgl.io` or `https://github.com/lvgl` and use the hashtag `#lvgl`. Thank you! :)
You can post about your project on Twitter, Facebook, LinkedIn, create a YouTube video, and so on.
Only one thing: On social media don't forget to add a link to `https://lvgl.io` or `https://github.com/lvgl` and use the hashtag `#lvgl`. Thank you! :)
You can also open a new topic in the [My projects](https://forum.lvgl.io/c/my-projects/10) category of the Forum.
The [LVGL Blog](https://blog.lvgl.io) welcomes posts from anyone.
The [LVGL Blog](https://blog.lvgl.io) welcomes posts from anyone.
It's a good place to talk about a project you created with LVGL, write a tutorial, or share some nice tricks.
The latest blog posts are shown on the [homepage of LVGL](https://lvgl.io) to make your work more visible.
The blog is hosted on GitHub. If you add a post GitHub automatically turns it into a website.
The blog is hosted on GitHub. If you add a post GitHub automatically turns it into a website.
See the [README](https://github.com/lvgl/blog) of the blog repo to see how to add your post.
Any of these help to spread the word and familiarize new developers with LVGL.
If you don't want to speak about your project publicly, feel free to use [Contact form](https://lvgl.io/#contact) on lvgl.io to private message to us.
If you don't want to speak about your project publicly, feel free to use [Contact form](https://lvgl.io/#contact) on lvgl.io to private message to us.
### Write examples
As you learn LVGL you will probably play with the features of widgets. Why not publish your experiments?
Each widgets' documentation contains examples. For instance, here are the examples of the [Drop-down list](/widgets/core/dropdown#examples) widget.
The examples are directly loaded from the [lvgl/examples](https://github.com/lvgl/lvgl/tree/master/examples) folder.
Each widgets' documentation contains examples. For instance, here are the examples of the [Drop-down list](/widgets/core/dropdown#examples) widget.
The examples are directly loaded from the [lvgl/examples](https://github.com/lvgl/lvgl/tree/master/examples) folder.
So all you need to do is send a [Pull request](#pull-request) to the [lvgl](https://github.com/lvgl/lvgl) repository and follow some conventions:
- Name the examples like `lv_example_<widget_name>_<index>`.
@@ -219,14 +215,14 @@ So all you need to do is send a [Pull request](#pull-request) to the [lvgl](http
### Improve the docs
As you read the documentation you might see some typos or unclear sentences. All the documentation is located in the [lvgl/docs](https://github.com/lvgl/lvgl/tree/master/docs) folder.
For typos and straightforward fixes, you can simply edit the file on GitHub.
For typos and straightforward fixes, you can simply edit the file on GitHub.
Note that the documentation is also formatted in [Markdown](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet).
Note that the documentation is also formatted in [Markdown](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet).
### Report bugs
As you use LVGL you might find bugs. Before reporting them be sure to check the relevant parts of the documentation.
If it really seems like a bug feel free to open an [issue on GitHub](https://github.com/lvgl/lvgl/issues).
If it really seems like a bug feel free to open an [issue on GitHub](https://github.com/lvgl/lvgl/issues).
When filing the issue be sure to fill out the template. It helps find the root of the problem while avoiding extensive questions and exchanges with other developers.
@@ -249,17 +245,17 @@ Just read the titles and if you are familiar with the topic don't hesitate to sh
Participating in the discussions is one of the best ways to become part of the project and get to know like-minded people!
### Add features
If you have created a cool widget, or added useful feature to LVGL feel free to open a new PR for it.
We collect the optional features (a.k.a. plugins) in [lvgl/src/extra](https://github.com/lvgl/lvgl/tree/master/src/extra) folder so if you are interested in adding a new features please use this folder.
If you have created a cool widget, or added useful feature to LVGL feel free to open a new PR for it.
We collect the optional features (a.k.a. plugins) in [lvgl/src/extra](https://github.com/lvgl/lvgl/tree/master/src/extra) folder so if you are interested in adding a new features please use this folder.
The [README](https://github.com/lvgl/lvgl/blob/master/src/extra/README.md) file describes the basics rules of contribution and also lists some ideas.
For further ideas take a look at the [Roadmap](/ROADMAP) page. If you are interested in any of them feel free to share your opinion and/or participate in the implementation.
Other features which are (still) not on the road map are listed in the [Feature request](https://forum.lvgl.io/c/feature-request/9) category of the Forum.
Other features which are (still) not on the road map are listed in the [Feature request](https://forum.lvgl.io/c/feature-request/9) category of the Forum.
When adding a new features the followings also needs to be updated:
- Update [lv_conf_template.h](https://github.com/lvgl/lvgl/blob/master/lv_conf_template.h)
- Add description in the [docs](https://github.com/lvgl/lvgl/tree/master/docs)
- Add description in the [docs](https://github.com/lvgl/lvgl/tree/master/docs)
- Add [examples](https://github.com/lvgl/lvgl/tree/master/examples)
- Update the [changelog](https://github.com/lvgl/lvgl/tree/master/docs/CHANGELOG.md)
@@ -279,22 +275,22 @@ You can become a maintainer by invitation, however the following conditions need
2. Send > 5 non-trivial pull requests to the repo where you would like to be a maintainer
If you are interested, just send a message (e.g. from the Forum) to the current maintainers of the repository. They will check if the prerequisites are met.
Note that meeting the prerequisites is not a guarantee of acceptance, i.e. if the conditions are met you won't automatically become a maintainer.
If you are interested, just send a message (e.g. from the Forum) to the current maintainers of the repository. They will check if the prerequisites are met.
Note that meeting the prerequisites is not a guarantee of acceptance, i.e. if the conditions are met you won't automatically become a maintainer.
It's up to the current maintainers to make the decision.
### Move your project repository under LVGL organization
Besides the core `lvgl` repository there are other repos for ports to development boards, IDEs or other environment.
Besides the core `lvgl` repository there are other repos for ports to development boards, IDEs or other environment.
If you ported LVGL to a new platform we can host it under the LVGL organization among the other repos.
This way your project will become part of the whole LVGL project and can get more visibility.
If you are interested in this opportunity just open an [issue in lvgl repo](https://github.com/lvgl/lvgl/issues) and tell what you have!
This way your project will become part of the whole LVGL project and can get more visibility.
If you are interested in this opportunity just open an [issue in lvgl repo](https://github.com/lvgl/lvgl/issues) and tell what you have!
If we agree that your port fit well into the LVGL organization, we will open a repository for your project where you will have admin rights.
If we agree that your port fit well into the LVGL organization, we will open a repository for your project where you will have admin rights.
To make this concept sustainable there a few rules to follow:
- You need to add a README to your repo.
- We expect to maintain the repo to some extent:
- Follow at least the major versions of LVGL
- Follow at least the major versions of LVGL
- Respond to the issues (in a reasonable time)
- If there is no activity in a repo for 1 year it will be archived

View File

@@ -57,7 +57,7 @@ class LvExample(Directive):
env = self.state.document.settings.env
iframe_html = ""
c_path = self.get_example_code_path(example_path, 'c')
py_path = self.get_example_code_path(example_path, 'py')
@@ -69,9 +69,9 @@ class LvExample(Directive):
'<i class="fa fa-play"></i>&nbsp;Simulator': f"https://sim.lvgl.io/v{env.config.version}/micropython/ports/javascript/index.html?script_startup=https://raw.githubusercontent.com/lvgl/lvgl/{env.config.repo_commit_hash}/examples/header.py&script=https://raw.githubusercontent.com/lvgl/lvgl/{env.config.repo_commit_hash}/examples/{example_path}.py"
})
if not 'c' in excluded_languages:
if not 'c' in excluded_languages:
if env.app.tags.has('html'):
iframe_html = f"<div class='lv-example' data-real-src='/{env.config.version}/_static/built_lv_examples?example={example_name}&w=320&h=240'></div>"
iframe_html = f"<div class='lv-example' data-real-src='/{env.config.version}/_static/built_lv_examples/index.html?example={example_name}&w=320&h=240'></div>"
description_html = f"<div class='lv-example-description'>{self.options.get('description', '')}</div>"
layout_node = nodes.raw(text=f"<div class='lv-example-container'>{iframe_html}{description_html}</div>", format='html')

View File

@@ -7,12 +7,12 @@ td {
text-align:center;
}
span.pre
{
{
padding-right:8px;
}
span.pre:first-child
{
{
padding-right:0px;
}
@@ -26,18 +26,18 @@ code.sig-name
display: block;
clear: both;
cursor: pointer;
font-weight: bold;
font-weight: bold;
}
.toggle .header:before {
font-family: FontAwesome, "Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;
content: "\f0da \00a0 Show ";
content: "\f0da \00a0 Show ";
display: inline-block;
font-size: 1.1em;
}
.toggle .header.open:before {
content: "\f0d7 \00a0 Hide ";
content: "\f0d7 \00a0 Hide ";
}
.header p {
@@ -56,7 +56,7 @@ code.sig-name
.home-img {
width:32%;
width:32%;
transition: transform .3s ease-out;
}
@@ -111,3 +111,23 @@ code.sig-name
.lv-example-link-button:visited {
color: white;
}
dl.cpp.unexpanded dd {
display: none;
}
.lv-api-expansion-button {
padding: 4px;
}
.lv-api-expansion-button::before {
font-family: FontAwesome, "Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;
display: inline-block;
font-size: 1.1em;
cursor: pointer;
}
.unexpanded .lv-api-expansion-button::before {
content: "\f0da \00a0";
}
.expanded .lv-api-expansion-button::before {
content: "\f0d7 \00a0";
}

18
docs/_static/js/custom.js vendored Normal file
View File

@@ -0,0 +1,18 @@
/* API collapsing */
document.addEventListener('DOMContentLoaded', (event) => {
document.querySelectorAll("dl.cpp").forEach(cppListing => {
const dt = cppListing.querySelector("dt");
let shouldBeExpanded = false;
if(dt.id == document.location.hash.substring(1))
shouldBeExpanded = true;
cppListing.classList.add(shouldBeExpanded ? "expanded" : "unexpanded");
const button = document.createElement("span");
button.classList.add("lv-api-expansion-button");
button.addEventListener("click", () => {
cppListing.classList.toggle("unexpanded");
cppListing.classList.toggle("expanded");
});
dt.insertBefore(button, dt.firstChild);
});
})

View File

@@ -29,7 +29,7 @@ function add_version_selector()
p.innerHTML = `
<select name="versions" id="versions" onchange="ver_sel()" style="border-radius:5px; margin-bottom:15px">
${versions.map(version => {
let versionName = "";
let versionName = "";
if(version == "master") versionName = "master (latest)";
else versionName = "v" + ((version.indexOf(".") != -1) ? version : (version + " (latest minor)"));
return `<option value="${version}">${versionName}</option>`;
@@ -49,7 +49,7 @@ document.addEventListener('DOMContentLoaded', (event) => {
var value = window.location.pathname.split('/')[1];
document.getElementById("versions").value = value;
});
})
document.addEventListener('DOMContentLoaded', (event) => {
function onIntersection(entries) {

View File

@@ -18,7 +18,7 @@ def cmd(s):
print(s)
print("-------------------------------------")
r = os.system(s)
if r != 0:
if r != 0:
print("Exit build due to previous error")
exit(-1)
@@ -31,15 +31,9 @@ br = re.sub('\* ', '', br)
ex.exec()
urlpath = re.sub('release/', '', br)
# Be sure the GitHub links point to the right branch
f = open("header.rst", "w")
f.write(".. |github_link_base| replace:: https://github.com/lvgl/lvgl/blob/" + gitcommit + "/docs")
f.close()
base_html = "html_baseurl = 'https://docs.lvgl.io/" + urlpath + "/en/html/'"
os.system("sed -i \"s|html_baseurl = .*|" + base_html +"|\" conf.py")
os.environ['LVGL_URLPATH'] = urlpath
os.environ['LVGL_GITCOMMIT'] = gitcommit
clean = 0
trans = 0
@@ -48,7 +42,7 @@ args = sys.argv[1:]
if len(args) >= 1:
if "clean" in args: clean = 1
if "skip_latex" in args: skip_latex = True
lang = "en"
print("")
print("****************")

View File

@@ -18,14 +18,16 @@
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
import os
import sys
import subprocess
import sys
sys.path.insert(0, os.path.abspath('./_ext'))
from subprocess import PIPE, Popen
import recommonmark
from recommonmark.transform import AutoStructify
from sphinx.builders.html import StandaloneHTMLBuilder
from subprocess import Popen, PIPE
# -- General configuration ------------------------------------------------
@@ -49,7 +51,7 @@ extensions = ['sphinx.ext.autodoc',
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The default language to highlight source code in. The default is 'python'.
# The default language to highlight source code in. The default is 'python'.
# The value should be a valid Pygments lexer name, see Showing code examples for more details.
@@ -88,8 +90,8 @@ language = None
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This patterns also effect to html_static_path and html_extra_path
exclude_patterns = ['_build', 'doxygen_html', 'Thumbs.db', '.DS_Store',
'README.md', 'lv_examples', 'out_html' ]
exclude_patterns = ['_build', 'doxygen_html', 'Thumbs.db', '.DS_Store',
'README.md', 'lv_examples', 'out_html', 'env' ]
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
@@ -114,9 +116,23 @@ html_theme_options = {
'logo_only': True,
}
# For site map generation
html_baseurl = 'https://docs.lvgl.io/' + version + "/"
html_baseurl = f"https://docs.lvgl.io/{os.environ['LVGL_URLPATH']}/en/html/"
sitemap_url_scheme = "{link}"
#lvgl_github_url = f"https://github.com/lvgl/lvgl/blob/{os.environ['LVGL_GITCOMMIT']}/docs"
#extlinks = {'github_link_base': (github_url + '%s', github_url)}
html_context = {
'github_version': os.environ['LVGL_GITCOMMIT'],
'github_user': 'lvgl',
'github_repo': 'lvgl',
'display_github': True,
'conf_py_path': '/docs/'
}
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
@@ -134,6 +150,10 @@ html_sidebars = {
]
}
html_js_files = [
'js/custom.js'
]
html_favicon = 'favicon.png'
html_logo = 'logo_lvgl.png'
@@ -164,7 +184,7 @@ latex_elements = {
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
'inputenc': '',
'utf8extra': '',
'classoptions': ',openany,oneside',

View File

@@ -21,13 +21,13 @@ def process_index_rst(path):
line = fp.readline()
return(d)
h1= {
"get_started":"Get started",
"styles":"Styles",
"anim":"Animations",
"event":"Events",
"layouts":"Layouts",
"get_started":"Get started",
"styles":"Styles",
"anim":"Animations",
"event":"Events",
"layouts":"Layouts",
"scroll":"Scrolling",
"widgets":"Widgets"
}
@@ -103,7 +103,6 @@ def exec():
d_all.update(d_act)
fout.write("```eval_rst\n")
fout.write(".. include:: /header.rst\n")
fout.write(":github_url: |github_link_base|/examples.md\n")
fout.write("```\n")
fout.write("\n")
@@ -111,7 +110,7 @@ def exec():
for h in h1:
fout.write("## " + h1[h] + "\n")
if h == "widgets":
for w in widgets:
fout.write("### " + widgets[w] + "\n")
@@ -121,7 +120,6 @@ def exec():
fout.write("### " + layouts[l] + "\n")
print_item(h + "/" + l, 4, d_all, fout)
else:
print_item(h, 3, d_all, fout)
print_item(h, 3, d_all, fout)
fout.write("")

View File

@@ -0,0 +1,4 @@
# Cpp
In progress: https://github.com/lvgl/lv_binding_cpp

View File

@@ -0,0 +1,12 @@
# Bindings
```eval_rst
.. toctree::
:maxdepth: 2
micropython
cpp
```

View File

@@ -1,12 +1,8 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/get-started/micropython.md
```
# Micropython
## What is Micropython?
[Micropython](http://micropython.org/) is Python for microcontrollers.
[Micropython](http://micropython.org/) is Python for microcontrollers.
Using Micropython, you can write Python3 code and run it even on a bare metal architecture with limited resources.
### Highlights of Micropython
@@ -27,15 +23,15 @@ Currently, Micropython [does not have a good high-level GUI library](https://for
### Here are some advantages of using LVGL in Micropython:
- Develop GUI in Python, a very popular high level language. Use paradigms such as Object-Oriented Programming.
- Usually, GUI development requires multiple iterations to get things right. With C, each iteration consists of **`Change code` > `Build` > `Flash` > `Run`**.
- Usually, GUI development requires multiple iterations to get things right. With C, each iteration consists of **`Change code` > `Build` > `Flash` > `Run`**.
In Micropython it's just **`Change code` > `Run`** ! You can even run commands interactively using the [REPL](https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop) (the interactive prompt)
### Micropython + LVGL could be used for:
- Fast prototyping GUI.
- Fast prototyping GUI.
- Shortening the cycle of changing and fine-tuning the GUI.
- Modelling the GUI in a more abstract way by defining reusable composite objects, taking advantage of Python's language features such as Inheritance, Closures, List Comprehension, Generators, Exception Handling, Arbitrary Precision Integers and others.
- Make LVGL accessible to a larger audience. No need to know C to create a nice GUI on an embedded system.
- Make LVGL accessible to a larger audience. No need to know C to create a nice GUI on an embedded system.
This goes well with [CircuitPython vision](https://learn.adafruit.com/welcome-to-circuitpython/what-is-circuitpython). CircuitPython was designed with education in mind, to make it easier for new or inexperienced users to get started with embedded development.
- Creating tools to work with LVGL at a higher level (e.g. drag-and-drop designer).
@@ -46,7 +42,7 @@ This goes well with [CircuitPython vision](https://learn.adafruit.com/welcome-to
> TL;DR:
> It's very much like the C API, but Object-Oriented for LVGL components.
Let's dive right into an example!
Let's dive right into an example!
### A simple example
@@ -65,7 +61,7 @@ lv.scr_load(scr)
### Online Simulator
If you want to experiment with LVGL + Micropython without downloading anything - you can use our online simulator!
If you want to experiment with LVGL + Micropython without downloading anything - you can use our online simulator!
It's a fully functional LVGL + Micropython that runs entirely in the browser and allows you to edit a python script and run it.
[Click here to experiment on the online simulator](https://sim.lvgl.io/)
@@ -76,14 +72,14 @@ Note: the online simulator is available for lvgl v6 and v7.
### PC Simulator
Micropython is ported to many platforms. One notable port is "unix", which allows you to build and run Micropython (+LVGL) on a Linux machine. (On a Windows machine you might need Virtual Box or WSL or MinGW or Cygwin etc.)
Micropython is ported to many platforms. One notable port is "unix", which allows you to build and run Micropython (+LVGL) on a Linux machine. (On a Windows machine you might need Virtual Box or WSL or MinGW or Cygwin etc.)
[Click here to know more information about building and running the unix port](https://github.com/lvgl/lv_micropython)
### Embedded platform
In the end, the goal is to run it all on an embedded platform.
Both Micropython and LVGL can be used on many embedded architectures, such as stm32, ESP32 etc.
In the end, the goal is to run it all on an embedded platform.
Both Micropython and LVGL can be used on many embedded architectures, such as stm32, ESP32 etc.
You would also need display and input drivers. We have some sample drivers (ESP32+ILI9341, as well as some other examples), but chances are you would want to create your own input/display drivers for your specific hardware.
Drivers can be implemented either in C as a Micropython module, or in pure Micropython!

View File

@@ -1,21 +1,17 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/get-started/index.md
```
# Get started
There are several ways to get your feet wet with LVGL. Here is one recommended order of documents to read and things to play with when you are learning to use LVGL:
1. Check the [Online demos](https://lvgl.io/demos) to see LVGL in action (3 minutes)
2. Read the [Introduction](https://docs.lvgl.io/latest/en/html/intro/index.html) page of the documentation (5 minutes)
3. Read the [Quick overview](https://docs.lvgl.io/master/get-started/quick-overview.html) page of the documentation (15 minutes)
4. Set up a [Simulator](https://docs.lvgl.io/master/get-started/pc-simulator.html) (10 minutes)
4. Set up a [Simulator](https://docs.lvgl.io/master/get-started/platforms/pc-simulator.html) (10 minutes)
5. Try out some [Examples](https://docs.lvgl.io/master/examples.html)
6. Check out the Platform-specific tutorials. (in this section below). (10 minutes)
6. Check out the Platform-specific tutorials. (in this section below). (10 minutes)
7. Port LVGL to a board. See the [Porting](https://docs.lvgl.io/master/porting/index.html) guide or check the ready to use [Projects](https://github.com/lvgl?q=lv_port_&type=&language=)
8. Read the [Overview](https://docs.lvgl.io/master/overview/index.html) page to get a better understanding of the library. (2-3 hours)
9. Check the documentation of the [Widgets](https://docs.lvgl.io/master/widgets/index.html) to see their features and usage
10. If you have questions got to the [Forum](http://forum.lvgl.io/)
11. Read the [Contributing](https://docs.lvgl.io/master/CONTRIBUTING.html) guide to see how you can help to improve LVGL (15 minutes)
11. Read the [Contributing](https://docs.lvgl.io/master/CONTRIBUTING.html) guide to see how you can help to improve LVGL (15 minutes)
```eval_rst
@@ -24,15 +20,8 @@ There are several ways to get your feet wet with LVGL. Here is one recommended o
:maxdepth: 2
quick-overview
pc-simulator
stm32
nxp
espressif
arduino
micropython
tasmota-berry
nuttx
rt-thread
cmake
platforms/index
os/index
bindings/index
```

View File

@@ -1,71 +0,0 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/get-started/nxp.md
```
# NXP
NXP has integrated LVGL into the MCUXpresso SDK packages for several of their general
purpose and crossover microcontrollers, allowing easy evaluation and migration into your
product design. [Download an SDK for a supported board](https://www.nxp.com/design/software/embedded-software/littlevgl-open-source-graphics-library:LITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY?&tid=vanLITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY)
today and get started with your next GUI application.
## Creating new project with LVGL
Downloading the MCU SDK example project is recommended as a starting point. It comes fully
configured with LVGL (and with PXP support if module is present), no additional integration
work is required.
## Adding HW acceleration for NXP iMX RT platforms using PXP (PiXel Pipeline) engine for existing projects
Several drawing features in LVGL can be offloaded to the PXP engine. The CPU is available for other operations while the PXP is running. An RTOS is required to block the LVGL drawing thread and switch to another task or suspend the CPU for power savings.
#### Features supported:
- RGB565 color format
- Area fill + optional transparency
- BLIT (BLock Image Transfer) + optional transparency
- Color keying + optional transparency
- Recoloring (color tint) + optional transparency
- RTOS integration layer
- Default FreeRTOS and bare metal code provided
#### Basic configuration:
- Select NXP PXP engine in lv_conf.h: Set `LV_USE_GPU_NXP_PXP` to 1
- Enable default implementation for interrupt handling, PXP start function and automatic initialization: Set `LV_USE_GPU_NXP_PXP_AUTO_INIT` to 1
- If `FSL_RTOS_FREE_RTOS` symbol is defined, FreeRTOS implementation will be used, otherwise bare metal code will be included
#### Basic initialization:
- If `LV_USE_GPU_NXP_PXP_AUTO_INIT` is enabled, no user code is required; PXP is initialized automatically in `lv_init()`
- For manual PXP initialization, default configuration structure for callbacks can be used. Initialize PXP before calling `lv_init()`
```c
#if LV_USE_GPU_NXP_PXP
#include "lv_gpu/lv_gpu_nxp_pxp.h"
#include "lv_gpu/lv_gpu_nxp_pxp_osa.h"
#endif
. . .
#if LV_USE_GPU_NXP_PXP
if (lv_gpu_nxp_pxp_init(&pxp_default_cfg) != LV_RES_OK) {
PRINTF("PXP init error. STOP.\n");
for ( ; ; ) ;
}
#endif
```
#### Project setup:
- Add PXP related files to project:
- lv_gpu/lv_gpu_nxp.c, lv_gpu/lv_gpu_nxp.h: low level drawing calls for LVGL
- lv_gpu/lv_gpu_nxp_osa.c, lv_gpu/lv_gpu_osa.h: default implementation of OS-specific functions (bare metal and FreeRTOS only)
- optional, required only if `LV_USE_GPU_NXP_PXP_AUTO_INIT` is set to 1
- PXP related code depends on two drivers provided by MCU SDK. These drivers need to be added to project:
- fsl_pxp.c, fsl_pxp.h: PXP driver
- fsl_cache.c, fsl_cache.h: CPU cache handling functions
#### Advanced configuration:
- Implementation depends on multiple OS-specific functions. The struct `lv_nxp_pxp_cfg_t` with callback pointers is used
as a parameter for the `lv_gpu_nxp_pxp_init()` function. Default implementation for FreeRTOS and baremetal is provided in lv_gpu_nxp_osa.c
- `pxp_interrupt_init()`: Initialize PXP interrupt (HW setup, OS setup)
- `pxp_interrupt_deinit()`: Deinitialize PXP interrupt (HW setup, OS setup)
- `pxp_run()`: Start PXP job. Use OS-specific mechanism to block drawing thread. PXP must finish drawing before leaving this function.
- There are configurable area thresholds which are used to decide whether the area will be processed by CPU, or by PXP. Areas smaller than a
defined value will be processed by CPU and those bigger than the threshold will be processed by PXP. These thresholds may be defined as
preprocessor variables. Default values are defined lv_gpu/lv_gpu_nxp_pxp.h
- `GPU_NXP_PXP_BLIT_SIZE_LIMIT`: size threshold for image BLIT, BLIT with color keying, and BLIT with recolor (OPA > LV_OPA_MAX)
- `GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT`: size threshold for image BLIT and BLIT with color keying with transparency (OPA < LV_OPA_MAX)
- `GPU_NXP_PXP_FILL_SIZE_LIMIT`: size threshold for fill operation (OPA > LV_OPA_MAX)
- `GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT`: size threshold for fill operation with transparency (OPA < LV_OPA_MAX)

View File

@@ -0,0 +1,3 @@
# FreeRTOS
TODO

View File

@@ -0,0 +1,13 @@
# (RT)OS
```eval_rst
.. toctree::
:maxdepth: 2
nuttx
rt-thread
freertos
zephyr
```

View File

@@ -1,12 +1,8 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/get-started/nuttx.md
```
# NuttX RTOS
## What is NuttX?
[NuttX](https://nuttx.apache.org/) is a mature and secure real-time operating system (RTOS) with an emphasis on technical standards compliance and small size.
[NuttX](https://nuttx.apache.org/) is a mature and secure real-time operating system (RTOS) with an emphasis on technical standards compliance and small size.
It is scalable from 8-bit to 64-bit microcontrollers and microprocessors and compliant with the Portable Operating System Interface (POSIX) and the American National Standards Institute (ANSI) standards and with many Linux-like subsystems.
The best way to think about NuttX is to think of it as a small Unix/Linux for microcontrollers.
@@ -23,8 +19,8 @@ The best way to think about NuttX is to think of it as a small Unix/Linux for mi
## Why NuttX + LVGL?
Although NuttX has its own graphic library called [NX](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=139629474), LVGL is a good alternative because users could find more eye-candy demos and they can reuse code from previous projects.
LVGL is an [Object-Oriented Component Based](https://blog.lvgl.io/2018-12-13/extend-lvgl-objects) high-level GUI library, that could fit very well for a RTOS with advanced features like NuttX.
Although NuttX has its own graphic library called [NX](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=139629474), LVGL is a good alternative because users could find more eye-candy demos and they can reuse code from previous projects.
LVGL is an [Object-Oriented Component Based](https://blog.lvgl.io/2018-12-13/extend-lvgl-objects) high-level GUI library, that could fit very well for a RTOS with advanced features like NuttX.
LVGL is implemented in C and its APIs are in C.
### Here are some advantages of using LVGL in NuttX
@@ -80,7 +76,7 @@ $ make
If everything went fine you should have now the file `nuttx.bin` to flash on your board:
```shell
$ ls -l nuttx.bin
$ ls -l nuttx.bin
-rwxrwxr-x 1 alan alan 287144 Jun 27 09:26 nuttx.bin
```

View File

@@ -1,16 +1,14 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/get-started/rt-thread.md
```
# RT-Thread RTOS
<img src="https://raw.githubusercontent.com/RT-Thread/rt-thread/master/documentation/figures/logo.png" width=40% style="float: center;" >
## What is RT-Thread?
[Introduce about RT-Thread and how to run LVGL on RT-Thread in simulators](https://www.youtube.com/watch?v=k7QYk6hSwnc)
[**RT-Thread**](https://www.rt-thread.io/) is an [open source](https://github.com/RT-Thread/rt-thread), neutral, and community-based real-time operating system (RTOS). RT-Thread has **Standard version** and **Nano version**. For resource-constrained microcontroller (MCU) systems, the Nano version that requires only 3 KB Flash and 1.2 KB RAM memory resources can be tailored with easy-to-use tools. For resource-rich IoT devices, RT-Thread can use the **online software package** management tool, together with system configuration tools, to achieve intuitive and rapid modular cutting, seamlessly import rich software packages; thus, achieving complex functions like Android's graphical interface and touch sliding effects, smart voice interaction effects, and so on.
Key features:
### Key features
- Designed for resource-constrained devices, the minimum kernel requires only 1.2KB of RAM and 3 KB of Flash.
- A variety of standard interfaces, such as POSIX, CMSIS, C++ application environment.
@@ -22,7 +20,6 @@ Key features:
- Supports a wide range of <a href="https://www.rt-thread.io/board.html">architectures and chips</a>.
## How to run LVGL on RT-Thread?
[中文文档](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/packages-manual/lvgl-docs/introduction)
@@ -31,12 +28,21 @@ LVGL has registered as a [software package](https://packages.rt-thread.org/en/de
| BSP | Note |
| ------------------------------------------------------------ | ---- |
| [QEMU simulator](https://github.com/RT-Thread/rt-thread/tree/master/bsp/qemu-vexpress-a9) | |
| [Visual Studio simulator](https://github.com/RT-Thread/rt-thread/tree/master/bsp/simulator) | |
| [QEMU simulator](https://github.com/RT-Thread/rt-thread/tree/master/bsp/qemu-vexpress-a9/applications/lvgl) | |
| [Visual Studio simulator](https://github.com/RT-Thread/rt-thread/tree/master/bsp/simulator/applications/lvgl) | |
| [Nuvoton numaker-iot-m487](https://github.com/RT-Thread/rt-thread/tree/master/bsp/nuvoton/numaker-iot-m487/applications/lvgl) | |
| [Nuvoton numaker-pfm-m487](https://github.com/RT-Thread/rt-thread/tree/master/bsp/nuvoton/numaker-pfm-m487/applications/lvgl) | |
| [Nuvoton nk-980iot](https://github.com/RT-Thread/rt-thread/tree/master/bsp/nuvoton/nk-980iot/applications/lvgl) | |
| [Nuvoton numaker-m2354](https://github.com/RT-Thread/rt-thread/tree/master/bsp/nuvoton/numaker-m2354/applications/lvgl) | |
| [Nuvoton nk-n9h30](https://github.com/RT-Thread/rt-thread/tree/master/bsp/nuvoton/nk-n9h30/applications/lvgl) | |
| [STM32L475 pandora](https://github.com/RT-Thread/rt-thread/tree/master/bsp/stm32/stm32l475-atk-pandora) | |
| [Nuvoton numaker-m032ki](https://github.com/RT-Thread/rt-thread/tree/master/bsp/nuvoton/numaker-m032ki/applications/lvgl) | |
| [NXP imxrt1060-evk](https://github.com/RT-Thread/rt-thread/tree/master/bsp/imxrt/imxrt1060-nxp-evk/applications/lvgl) | |
| [STM32L475 pandora](https://github.com/RT-Thread/rt-thread/tree/master/bsp/stm32/stm32l475-atk-pandora/applications/lvgl) | |
| [STM32F407 explorer](https://github.com/RT-Thread/rt-thread/tree/master/bsp/stm32/stm32f407-atk-explorer/applications/lvgl) | |
| [STM32F469 Discovery](https://github.com/RT-Thread/rt-thread/tree/master/bsp/stm32/stm32f469-st-disco/applications/lvgl) | |
| [Raspberry PICO](https://github.com/RT-Thread/rt-thread/tree/master/bsp/raspberry-pico/applications/lvgl) | |
### Import a BSP project into RT-Thread Studio
Clone the latest code from RT-Thread official repository. Open the RT-Thread Studio and select `File -> Import`. In the Import menu, please select `RT-Thread BSP Project into Workspace`, and click `next` button. In the `BSP location area`, please select the root path of the BSP which you prefer to import, such as `C:\Users\xxx\Desktop\rt-thread\bsp\stm32\stm32l475-atk-pandora`. In the `Project Name area`, please type a name for this project, then, press `Finish` button.

View File

@@ -0,0 +1,3 @@
# Zephyr
TODO

View File

@@ -1,13 +1,9 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/get-started/arduino.md
```
# Arduino
The [LVGL library](https://github.com/lvgl/lvgl) is directly available as Arduino libraries.
Note that you need to choose a board powerful enough to run LVGL and your GUI. See the [requirements of LVGL](https://docs.lvgl.io/master/intro/index.html#requirements).
Note that you need to choose a board powerful enough to run LVGL and your GUI. See the [requirements of LVGL](https://docs.lvgl.io/master/intro/index.html#requirements).
For example ESP32 is a good candidate to create UI's with LVGL.
@@ -15,13 +11,13 @@ For example ESP32 is a good candidate to create UI's with LVGL.
LVGL can be installed via the Arduino IDE Library Manager or as a .ZIP library.
You can [Download](https://github.com/lvgl/lvgl/archive/refs/heads/master.zip) the latest version of LVGL from GitHub and simply copy it to Arduino's library folder.
You can [Download](https://github.com/lvgl/lvgl/archive/refs/heads/master.zip) the latest version of LVGL from GitHub and simply copy it to Arduino's library folder.
## Set up drivers
To get started it's recommended to use [TFT_eSPI](https://github.com/Bodmer/TFT_eSPI) library as a TFT driver to simplify testing.
To get started it's recommended to use [TFT_eSPI](https://github.com/Bodmer/TFT_eSPI) library as a TFT driver to simplify testing.
To make it work, setup `TFT_eSPI` according to your TFT display type via editing either
- `User_Setup.h`
- `User_Setup.h`
- or by selecting a configuration in the `User_Setup_Select.h`
Both files are located in `TFT_eSPI` library's folder.
@@ -56,13 +52,18 @@ In the INO file you can see how to register a display and a touchpad for LVGL an
Note that, there is no dedicated INO file for every example. Instead, you can load an example by calling an `lv_example_...` function. For example `lv_example_btn_1()`.
**IMPORTANT**
**IMPORTANT NOTE 1**
Due to some the limitations of Arduino's build system you need to copy `lvgl/examples` to `lvgl/src/examples`. Similarly for the demos `lvgl/demos` to `lvgl/src/demos`.
**IMPORTANT NOTE 2**
Note that the `lv_examples` library is for LVGL v7 and you shouldn't install it for this version (since LVGL v8)
as the examples and demos are now part of the main LVGL library.
## Debugging and logging
LVGL can display debug information in case of trouble.
In the `LVGL_Arduino.ino` example there is a `my_print` method, which sends this debug information to the serial interface.
LVGL can display debug information in case of trouble.
In the `LVGL_Arduino.ino` example there is a `my_print` method, which sends this debug information to the serial interface.
To enable this feature you have to edit the `lv_conf.h` file and enable logging in the section `log settings`:
```c

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/get-started/cmake.md
```
# CMake
LVGL supports integrating with [CMake](https://cmake.org/). It comes with preconfigured targets for:
@@ -46,14 +42,14 @@ This configuration declares a dependency between the two targets **MyFirmware**
### Additional CMake options
Besides `LV_CONF_PATH` there are two additional CMake options to specify include paths.
`LV_LVGL_H_INCLUDE_SIMPLE` which specifies whether to `#include "lvgl.h"` absolut or relative
`LV_LVGL_H_INCLUDE_SIMPLE` which specifies whether to `#include "lvgl.h"` absolut or relative
| ON (default) | OFF |
| ------------ | -------------- |
| "lvgl.h" | "../../lvgl.h" |
`LV_CONF_INCLUDE_SIMPLE` which specifies whether to `#include "lv_conf.h"` and `"lv_drv_conf.h"` absolut or relative
`LV_CONF_INCLUDE_SIMPLE` which specifies whether to `#include "lv_conf.h"` and `"lv_drv_conf.h"` absolut or relative
| ON (default) | OFF |
| --------------- | --------------------- |
@@ -71,23 +67,23 @@ target_link_libraries(MyFirmware PRIVATE lvgl::lvgl lvgl::examples)
```
## Building LVGL drivers and demos with CMake
Exactly the same goes for the [drivers](https://github.com/lvgl/lv_drivers) and the [demos](https://github.com/lvgl/lv_demos).
Exactly the same goes for the [drivers](https://github.com/lvgl/lv_drivers) and the [demos](https://github.com/lvgl/lvgl/demos).
```cmake
# Specify path to own LVGL demos config header
set(LV_DEMO_CONF_PATH
${CMAKE_CURRENT_SOURCE_DIR}/src/lv_demo_conf.h
CACHE STRING "" FORCE)
FetchContent_Declare(lv_drivers
GIT_REPOSITORY https://github.com/lvgl/lv_drivers)
FetchContent_MakeAvailable(lv_drivers)
FetchContent_Declare(lv_demos
GIT_REPOSITORY https://github.com/lvgl/lv_demos.git)
FetchContent_MakeAvailable(lv_demos)
# The target "MyFirmware" depends on LVGL, drivers and demos
target_link_libraries(MyFirmware PRIVATE lvgl::lvgl lvgl::drivers lvgl::examples)
```
Just like the [lv_conf.h](https://github.com/lvgl/lvgl/blob/master/lv_conf_template.h) header demos comes with its own config header called [lv_demo_conf.h](https://github.com/lvgl/lv_demos/blob/master/lv_demo_conf_template.h). Analogous to `LV_CONF_PATH` its path can be set by using the option `LV_DEMO_CONF_PATH`.
# Build shared libraries with CMake
By default, LVGL will be built as a static library (archive). CMake can instead be instructed to build LVGL as shared library (.so/.dll/etc.):
```cmake
set(BUILD_SHARED_LIBS ON)
```
OR
```
$ cmake "-DBUILD_SHARED_LIBS=ON" .
```

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/get-started/espressif.md
```
# Espressif (ESP32 chip series)
LVGL can be used and configured as a standard [ESP-IDF](https://github.com/espressif/esp-idf) component.
@@ -10,7 +6,7 @@ More information about ESP-IDF build system can be found [here](https://docs.esp
## LVGL demo project for ESP32
We've created [lv_port_esp32](https://github.com/lvgl/lv_port_esp32), a project using ESP-IDF and LVGL to show one of the demos from [lv_demos](https://github.com/lvgl/lv_demos).
We've created [lv_port_esp32](https://github.com/lvgl/lv_port_esp32), a project using ESP-IDF and LVGL to show one of the demos from [demos](https://github.com/lvgl/lvgl/demos).
You can configure the project to use one of the many supported display controllers and targets (chips).
See [lvgl_esp32_drivers](https://github.com/lvgl/lvgl_esp32_drivers) repository for a complete list

View File

@@ -0,0 +1,17 @@
# Platforms
```eval_rst
.. toctree::
:maxdepth: 2
pc-simulator
nxp
stm32
espressif
renesas
arduino
tasmota-berry
cmake
```

View File

@@ -0,0 +1,182 @@
# NXP
NXP has integrated LVGL into the MCUXpresso SDK packages for general purpose and crossover microcontrollers, allowing
easy evaluation and migration into your product design.
[Download an SDK for a supported board](https://www.nxp.com/design/software/embedded-software/littlevgl-open-source-graphics-library:LITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY?&tid=vanLITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY)
today and get started with your next GUI application.
## Creating new project with LVGL
Downloading the MCU SDK example project is recommended as a starting point. It comes fully configured with LVGL (and
with PXP/VGLite support if the modules are present), no additional integration work is required.
## HW acceleration for NXP iMX RT platforms
Depending on the RT platform used, the acceleration can be done by NXP PXP (PiXel Pipeline) and/or the Verisilicon GPU
through an API named VGLite. Each accelerator has its own context that allows them to be used individually as well
simultaneously (in LVGL multithreading mode).
### PXP accelerator
Several drawing features in LVGL can be offloaded to the PXP engine. The CPU is available for other operations while the
PXP is running. RTOS is required to block the LVGL drawing thread and switch to another task or suspend the CPU for
power savings.
Supported draw callbacks are available in "src/draw/nxp/pxp/lv_draw_pxp.c":
```c
pxp_draw_ctx->base_draw.draw_img_decoded = lv_draw_pxp_img_decoded;
pxp_draw_ctx->blend = lv_draw_pxp_blend;
pxp_draw_ctx->base_draw.wait_for_finish = lv_draw_pxp_wait_for_finish;
pxp_draw_ctx->base_draw.buffer_copy = lv_draw_pxp_buffer_copy;
```
#### Features supported:
All operations can be used in conjunction with optional transparency.
- RGB565 and ARGB8888 color formats
- Area fill with color
- BLIT (BLock Image Transfer)
- Screen Rotation (90, 180, 270 degree)
- Color keying
- Recoloring (color tint)
- Image Rotation (90, 180, 270 degree)
- Buffer copy
- RTOS integration layer
- Default FreeRTOS and bare metal code provided
- Combination of recolor and/or rotation + color key/alpha blend/transparency is supported.
That is achieved by PXP in two steps:
- First step is to recolor/rotate the image to a temporary buffer (statically allocated)
- Second step is required to handle color keying, alpha channel or to apply transparency
#### Known limitations:
- Rotation is not supported for images unaligned to blocks of 16x16 pixels.
PXP is set to process 16x16 blocks to optimize the system for memory bandwidth and image processing time.
The output engine essentially truncates any output pixels after the desired number of pixels has been written.
When rotating a source image and the output is not divisible by the block size, the incorrect pixels could be truncated
and the final output image can look shifted.
#### Basic configuration:
- Select NXP PXP engine in lv_conf.h: Set `LV_USE_GPU_NXP_PXP` to 1
- Enable default implementation for interrupt handling, PXP start function and automatic initialization:
Set `LV_USE_GPU_NXP_PXP_AUTO_INIT` to 1
- If `SDK_OS_FREE_RTOS` symbol is defined, FreeRTOS implementation will be used, otherwise bare metal code will be
included
#### Basic initialization:
- If `LV_USE_GPU_NXP_PXP_AUTO_INIT` is enabled, no user code is required; PXP is initialized automatically in
`lv_init()`
- For manual PXP initialization, default configuration structure for callbacks can be used. Initialize PXP before
calling `lv_init()`
```c
#if LV_USE_GPU_NXP_PXP
#include "src/draw/nxp/pxp/lv_gpu_nxp_pxp.h"
#endif
. . .
#if LV_USE_GPU_NXP_PXP
PXP_COND_STOP(!lv_gpu_nxp_pxp_init(), "PXP init failed.");
#endif
```
#### Project setup:
- Add PXP related files to project:
- src/draw/nxp/pxp/lv_draw_pxp.c[.h]: draw context callbacks
- src/draw/nxp/pxp/lv_draw_pxp_blend.c[.h]: fill and blit (with optional transformation)
- src/draw/nxp/pxp/lv_gpu_nxp_pxp.c[.h]: init, uninit, run/wait PXP device
- src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c[.h]: OS abstraction (FreeRTOS or bare metal)
- optional, required only if `LV_USE_GPU_NXP_PXP_AUTO_INIT` is set to 1
- PXP related code depends on two drivers provided by MCU SDK. These drivers need to be added to project:
- fsl_pxp.c[.h]: PXP driver
- fsl_cache.c[.h]: CPU cache handling functions
#### Logging:
- By default, `LV_GPU_NXP_PXP_LOG_ERRORS` is enabled so that any PXP error will be seen on SDK debug console
- By default, `LV_GPU_NXP_PXP_LOG_TRACES` is disabled. Enable it for tracing logs (like PXP limitations)
#### Advanced configuration:
- Implementation depends on multiple OS-specific functions. The struct `lv_nxp_pxp_cfg_t` with callback pointers is
used as a parameter for the `lv_gpu_nxp_pxp_init()` function. Default implementation for FreeRTOS and bare metal is
provided in lv_gpu_nxp_pxp_osa.c
- `pxp_interrupt_init()`: Initialize PXP interrupt (HW setup, OS setup)
- `pxp_interrupt_deinit()`: Deinitialize PXP interrupt (HW setup, OS setup)
- `pxp_run()`: Start PXP job. Use OS-specific mechanism to block drawing thread. PXP must finish drawing before
leaving this function.
- Area threshold (size limit) is configurable and used to decide whether the area will be processed by PXP or not.
Areas smaller than the defined value will be processed by CPU and those bigger than the threshold will be processed by
PXP. The threshold is defined as a macro in lv_draw_pxp.c
- `LV_GPU_NXP_PXP_SIZE_LIMIT`: size threshold for fill/blit (with optional transformation)
### VGLite accelerator
Extra drawing features in LVGL can be handled by the VGLite engine. The CPU is available for other operations while the
VGLite is running. An RTOS is required to block the LVGL drawing thread and switch to another task or suspend the CPU
for power savings.
Supported draw callbacks are available in "src/draw/nxp/vglite/lv_draw_vglite.c":
```c
vglite_draw_ctx->base_draw.init_buf = lv_draw_vglite_init_buf;
vglite_draw_ctx->base_draw.draw_line = lv_draw_vglite_line;
vglite_draw_ctx->base_draw.draw_arc = lv_draw_vglite_arc;
vglite_draw_ctx->base_draw.draw_rect = lv_draw_vglite_rect;
vglite_draw_ctx->base_draw.draw_img_decoded = lv_draw_vglite_img_decoded;
vglite_draw_ctx->blend = lv_draw_vglite_blend;
vglite_draw_ctx->base_draw.wait_for_finish = lv_draw_vglite_wait_for_finish;
vglite_draw_ctx->base_draw.buffer_copy = lv_draw_vglite_buffer_copy;
```
#### Features supported:
All operations can be used in conjunction with optional transparency.
- RGB565 and ARGB8888 color formats
- Area fill with color
- BLIT (BLock Image Transfer)
- Image Rotation (any degree with decimal)
- Image Scale
- Draw rectangle background with optional radius or gradient
- Blit rectangle background image
- Draw rectangle border/outline with optional rounded corners
- Draw arc with optional rounded ending
- Draw line or dashed line with optional rounded ending
- Buffer copy
#### Known limitations:
- Source image alignment:
The byte alignment requirement for a pixel depends on the specific pixel format. Both buffer address and buffer stride
must be aligned. As general rule, the alignment is set to 16 pixels. This makes the buffer address alignment to be
32 bytes for RGB565 and 64 bytes for ARGB8888.
- For pixel engine (PE) destination, the alignment should be 64 bytes for all tiled (4x4) buffer layouts.
The pixel engine has no additional alignment requirement for linear buffer layouts (`VG_LITE_LINEAR`).
#### Basic configuration:
- Select NXP VGLite engine in lv_conf.h: Set `LV_USE_GPU_NXP_VG_LITE` to 1
- `SDK_OS_FREE_RTOS` symbol needs to be defined so that the FreeRTOS implementation will be used
#### Basic initialization:
- Initialize VGLite before calling `lv_init()` by specifying the width/height of tessellation window. Value should be
a multiple of 16; minimum value is 16 pixels, maximum cannot be greater than the frame width. If less than or equal
to 0, then no tessellation buffer is created, in which case VGLite is initialized only for blitting.
```c
#if LV_USE_GPU_NXP_VG_LITE
#include "vg_lite.h"
#endif
. . .
#if LV_USE_GPU_NXP_VG_LITE
VG_LITE_COND_STOP(vg_lite_init(64, 64) != VG_LITE_SUCCESS, "VGLite init failed.");
#endif
```
#### Project setup:
- Add VGLite related files to project:
- src/draw/nxp/vglite/lv_draw_vglite.c[.h]: draw context callbacks
- src/draw/nxp/vglite/lv_draw_vglite_blend.c[.h]: fill and blit (with optional transformation)
- src/draw/nxp/vglite/lv_draw_vglite_rect.c[.h]: draw rectangle
- src/draw/nxp/vglite/lv_draw_vglite_arc.c[.h]: draw arc
- src/draw/nxp/vglite/lv_draw_vglite_line.c[.h]: draw line
- src/draw/nxp/vglite/lv_vglite_buf.c[.h]: init/get vglite buffer
- src/draw/nxp/vglite/lv_vglite_utils.c[.h]: function helpers
#### Logging:
- By default, `LV_GPU_NXP_VG_LITE_LOG_ERRORS` is enabled so that any VGLite error will be seen on SDK debug console
- By default, `LV_GPU_NXP_VG_LITE_LOG_TRACES` is disabled. Enable it for tracing logs (like blit split workaround or
VGLite fallback to CPU due to any error on the driver)
#### Advanced configuration:
- Area threshold (size limit) is configurable and used to decide whether the area will be processed by VGLite or not.
Areas smaller than the defined value will be processed by CPU and those bigger than the threshold will be processed by
VGLite. The threshold is defined as a macro in lv_draw_vglite.c
- `LV_GPU_NXP_VG_LITE_SIZE_LIMIT`: size threshold for fill/blit (with optional transformation)

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/get-started/pc-simulator.md
```
# Simulator on PC
@@ -9,7 +5,7 @@ You can try out LVGL **using only your PC** (i.e. without any development boards
Using the simulator on a PC has the following advantages:
- Hardware independent - Write code, run it on the PC and see the result on a monitor.
- Cross-platform - Any Windows, Linux or macOS system can run the PC simulator.
- Cross-platform - Any Windows, Linux or macOS system can run the PC simulator.
- Portability - The written code is portable, which means you can simply copy it when migrating to embedded hardware.
- Easy Validation - The simulator is also very useful to report bugs because it provides a common platform for every user. So it's a good idea to reproduce a bug in the simulator and use that code snippet in the [Forum](https://forum.lvgl.io).
@@ -22,10 +18,16 @@ The simulator is ported to various IDEs (Integrated Development Environments). C
- [VisualStudio with SDL driver](https://github.com/lvgl/lv_sim_visual_studio_sdl): For Windows
- [VSCode with SDL driver](https://github.com/lvgl/lv_sim_vscode_sdl): Recommended on Linux and Mac
- [PlatformIO with SDL driver](https://github.com/lvgl/lv_platformio): Recommended on Linux and Mac
- [MDK with FastModel](https://github.com/lvgl/lv_port_an547_cm55_sim): For Windows
External project not maintained by the LVGL organization:
- [QT Creator](https://github.com/Varanda-Labs/lvgl-qt-sim): Cross platform
You can use any IDE for development but, for simplicity, the configuration for Eclipse CDT is what we'll focus on in this tutorial.
The following section describes the set-up guide of Eclipse CDT in more detail.
**Note: If you are on Windows, it's usually better to use the Visual Studio or CodeBlocks projects instead. They work out of the box without requiring extra steps.**
## Set-up Eclipse CDT
@@ -34,7 +36,7 @@ The following section describes the set-up guide of Eclipse CDT in more detail.
[Eclipse CDT](https://eclipse.org/cdt/) is a C/C++ IDE.
Eclipse is a Java-based tool so be sure **Java Runtime Environment** is installed on your system.
Eclipse is a Java-based tool so be sure **Java Runtime Environment** is installed on your system.
On Debian-based distros (e.g. Ubuntu): `sudo apt-get install default-jre`
@@ -45,7 +47,7 @@ You can download Eclipse's CDT from: [https://www.eclipse.org/cdt/downloads.php]
### Install SDL 2
The PC simulator uses the [SDL 2](https://www.libsdl.org/download-2.0.php) cross-platform library to simulate a TFT display and a touchpad.
The PC simulator uses the [SDL 2](https://www.libsdl.org/download-2.0.php) cross-platform library to simulate a TFT display and a touchpad.
#### Linux
On **Linux** you can easily install SDL2 using a terminal:
@@ -58,14 +60,14 @@ On **Linux** you can easily install SDL2 using a terminal:
#### Windows
If you are using **Windows** firstly you need to install MinGW ([64 bit version](http://mingw-w64.org/doku.php/download)). After installing MinGW, do the following steps to add SDL2:
1. Download the development libraries of SDL.
1. Download the development libraries of SDL.
Go to [https://www.libsdl.org/download-2.0.php](https://www.libsdl.org/download-2.0.php) and download _Development Libraries: SDL2-devel-2.0.5-mingw.tar.gz_
2. Decompress the file and go to _x86_64-w64-mingw32_ directory (for 64 bit MinGW) or to _i686-w64-mingw32_ (for 32 bit MinGW)
3. Copy _..._mingw32/include/SDL2_ folder to _C:/MinGW/.../x86_64-w64-mingw32/include_
4. Copy _..._mingw32/lib/_ content to _C:/MinGW/.../x86_64-w64-mingw32/lib_
5. Copy _..._mingw32/bin/SDL2.dll_ to _{eclipse_workspace}/pc_simulator/Debug/_. Do it later when Eclipse is installed.
5. Copy _..._mingw32/bin/SDL2.dll_ to _{eclipse_workspace}/pc_simulator/Debug/_. Do it later when Eclipse is installed.
Note: If you are using **Microsoft Visual Studio** instead of Eclipse then you don't have to install MinGW.
Note: If you are using **Microsoft Visual Studio** instead of Eclipse then you don't have to install MinGW.
#### OSX
On **OSX** you can easily install SDL2 with brew: `brew install sdl2`
@@ -74,9 +76,9 @@ If something is not working, then please refer [this tutorial](http://lazyfoo.ne
### Pre-configured project
A pre-configured graphics library project (based on the latest release) is always available to get started easily.
A pre-configured graphics library project (based on the latest release) is always available to get started easily.
You can find the latest one on [GitHub](https://github.com/lvgl/lv_sim_eclipse_sdl).
(Please note that, the project is configured for Eclipse CDT).
(Please note that, the project is configured for Eclipse CDT).
### Add the pre-configured project to Eclipse CDT
@@ -86,7 +88,7 @@ Close the start-up window and go to **File-&gt;Import** and choose **General-&gt
On **Windows** you have to do two additional things:
- Copy the **SDL2.dll** into the project's Debug folder
- Copy the **SDL2.dll** into the project's Debug folder
- Right-click on the project -&gt; Project properties -&gt; C/C++ Build -&gt; Settings -&gt; Libraries -&gt; Add ... and add _mingw32_ above SDLmain and SDL. (The order is important: mingw32, SDLmain, SDL)
### Compile and Run

View File

@@ -0,0 +1,129 @@
# Renesas
The [HMI-Board](https://bit.ly/3I9nfUo) development board SDK now comes with LVGL integration for quick evaluation. Simply download the [SDK](https://github.com/RT-Thread-Studio/sdk-bsp-ra6m3-hmi-board/tree/main/projects/hmi-board-lvgl) for the supported motherboard and youll be on your way to creating your next GUI application in no time. For more information, check out the [Software design description](https://github.com/RT-Thread-Studio/sdk-bsp-ra6m3-hmi-board/blob/main/projects/hmi-board-lvgl/README.md).
## Creating new project with LVGL
It is recommended to start your project by downloading the HMI-Board SDK example project. It comes fully equipped with LVGL and dave-2d support (if the modules are present), so you wont need to do any additional integration work.
## HW acceleration for Renesas RA6M3 platforms
For RA6M3 platforms, hardware acceleration can be achieved using the dave-2d GPU, depending on the platform used. Each accelerator has its own context, allowing them to be used individually or simultaneously in LVGLs multithreading mode.
### Dave-2d accelerator
LVGL can offload several drawing features to the dave-2d engine, freeing up the CPU for other operations while dave-2d runs. An RTOS is required to block the LVGL drawing thread and switch to another task or suspend the CPU for power savings. Supported draw callbacks can be found in “src/draw/renesas/lv_gpu_d2_ra6m3.c”.
LVGL can offload several drawing features to the dave-2d engine, freeing up the CPU for other operations while dave-2d runs. An RTOS is required to block the LVGL drawing thread and switch to another task or suspend the CPU for power savings. Supported draw callbacks can be found in “src/draw/renesas/lv_gpu_d2_ra6m3.c”.
```c
ra_2d_draw_ctx->blend = lv_draw_ra6m3_2d_blend;
ra_2d_draw_ctx->base_draw.draw_img_decoded = lv_port_gpu_img_decoded;
ra_2d_draw_ctx->base_draw.wait_for_finish = lv_port_gpu_wait;
ra_2d_draw_ctx->base_draw.draw_letter = lv_draw_gpu_letter;
```
### Features supported:
All operations can be used in conjunction with optional transparency.
- RGB565 and ARGB8888 color formats
- Area fill with color
- BLIT (BLock Image Transfer)
- Color conversion
- Rotate and scale
- Alpha blending
- Bilinear filtering
- RTOS integration layer
- Default RT-Thread code provided
- Subpixel exact placement
### Basic configuration:
- Select Renesas dave-2d engine in lv_conf.h: Set `LV_USE_GPU_RA6M3_G2D` to 1
- Set referenced header file in lv_conf.h: `#define LV_GPU_RA6M3_G2D_INCLUDE "hal_data.h"`
### RT-Thread Example:
```c
#define COLOR_BUFFER (LV_HOR_RES_MAX * LV_VER_RES_MAX)
static lv_disp_drv_t disp_drv;
/*A static or global variable to store the buffers*/
static lv_color_t buf_1[COLOR_BUFFER];
```
- After initializing your peripherals (such as SPI, GPIOs, and LCD) in the `lv_port_disp_init()` function, you can initialize LVGL using [`lv_init()`.](https://docs.lvgl.io/master/API/core/lv_obj.html#_CPPv47lv_initv) Next, register the frame buffers using `lv_disp_draw_buf_init()` and create a new display driver using `lv_disp_drv_init()`.
```c
/*Initialize `disp_buf` with the buffer(s). With only one buffer use NULL instead buf_2 */
lv_disp_draw_buf_init(&disp_buf, buf_1, RT_NULL, COLOR_BUFFER);
lv_disp_drv_init(&disp_drv); /*Basic initialization*/
/*Set the resolution of the display*/
disp_drv.hor_res = LV_HOR_RES_MAX;
disp_drv.ver_res = LV_VER_RES_MAX;
/*Set a display buffer*/
disp_drv.draw_buf = &disp_buf;
/*Used to copy the buffer's content to the display*/
disp_drv.flush_cb = disp_flush;
/* Initialize GPU module */
lv_port_gpu_hw_init();
/*Finally register the driver*/
lv_disp_drv_register(&disp_drv);
```
* To run LVGL, youll need to create a thread. You can find examples of how to do this using RT-Thread in the `env_support/rt-thread/lv_rt_thread_port.c` file.
```c
static void lvgl_thread_entry(void *parameter)
{
#if LV_USE_LOG
lv_log_register_print_cb(lv_rt_log);
#endif /* LV_USE_LOG */
lv_init();
lv_port_disp_init();
lv_port_indev_init();
lv_user_gui_init();
/* handle the tasks of LVGL */
while(1)
{
lv_task_handler();
rt_thread_mdelay(LV_DISP_DEF_REFR_PERIOD);
}
}
static int lvgl_thread_init(void)
{
rt_err_t err;
/* create lvgl thread */
err = rt_thread_init(&lvgl_thread, "LVGL", lvgl_thread_entry, RT_NULL,
&lvgl_thread_stack[0], sizeof(lvgl_thread_stack), PKG_LVGL_THREAD_PRIO, 10);
if(err != RT_EOK)
{
LOG_E("Failed to create LVGL thread");
return -1;
}
rt_thread_startup(&lvgl_thread);
return 0;
}
INIT_ENV_EXPORT(lvgl_thread_init);
```
- The last step is to create a function to output the frame buffer to your LCD. The specifics of this function will depend on the features of your MCU. Heres an example for a typical MCU interface: `my_flush_cb`.
```c
static void my_flush_cb(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
{
#ifdef PKG_USING_ILI9341
lcd_fill_array_spi(area->x1, area->y1, area->x2, area->y2, color_p);
#elif LV_USE_GPU_RA6M3_G2D
lv_port_gpu_blit(area->x1, area->y1, color_p, area);
#else
......
#endif
lv_disp_flush_ready(disp_drv);
}
```

View File

@@ -0,0 +1,4 @@
# STM32
TODO

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/get-started/tasmota-berry.md
```
# Tasmota and berry
## What is Tasmota?
@@ -35,14 +31,14 @@ In 2021, Tasmota added full support of LVGL for ESP32 based devices. It also int
A comprehensive mapping of LVGL in Berry language is now available, similar to the mapping of Micropython. It allows to use +98% of all LVGL features. It is also possible to write custom widgets in Berry.
Versions supported: LVGL v8.0.2, LodePNG v20201017, Freetype 2.10.4
Versions supported: LVGL v8.3.0, LodePNG v20201017, Freetype 2.10.4
### Tasmota + Berry + LVGL could be used for:
- Fast prototyping GUI.
- Fast prototyping GUI.
- Shortening the cycle of changing and fine-tuning the GUI.
- Modelling the GUI in a more abstract way by defining reusable composite objects, taking advantage of Berry's language features such as Inheritance, Closures, Exception Handling...
- Make LVGL accessible to a larger audience. No need to know C to create a nice GUI on an embedded system.
- Make LVGL accessible to a larger audience. No need to know C to create a nice GUI on an embedded system.
A higher level interface compatible with [OpenHASP](https://github.com/HASwitchPlate/openHASP) is also under development.
@@ -53,7 +49,7 @@ A higher level interface compatible with [OpenHASP](https://github.com/HASwitchP
> TL;DR:
> Similar to MicroPython, it's very much like the C API, but Object-Oriented for LVGL components.
Let's dive right into an example!
Let's dive right into an example!
### A simple example

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/get-started/quick-overview.md
```
# Quick overview
@@ -10,11 +6,11 @@ You should read this first to get a general impression and read the detailed [Po
## Get started in a simulator
Instead of porting LVGL to embedded hardware straight away, it's highly recommended to get started in a simulator first.
Instead of porting LVGL to embedded hardware straight away, it's highly recommended to get started in a simulator first.
LVGL is ported to many IDEs to be sure you will find your favorite one.
Go to the [Simulators](/get-started/pc-simulator) section to get ready-to-use projects that can be run on your PC.
This way you can save the time of porting for now and get some experience with LVGL immediately.
LVGL is ported to many IDEs to be sure you will find your favorite one.
Go to the [Simulators](/get-started/pc-simulator) section to get ready-to-use projects that can be run on your PC.
This way you can save the time of porting for now and get some experience with LVGL immediately.
## Add LVGL into your project
If you would rather try LVGL on your own project follow these steps:
@@ -23,11 +19,11 @@ If you would rather try LVGL on your own project follow these steps:
- Copy the `lvgl` folder into your project.
- Copy `lvgl/lv_conf_template.h` as `lv_conf.h` next to the `lvgl` folder, change the first `#if 0` to `1` to enable the file's content and set the `LV_COLOR_DEPTH` defines.
- Include `lvgl/lvgl.h` in files where you need to use LVGL related functions.
- Call `lv_tick_inc(x)` every `x` milliseconds in a Timer or Task (`x` should be between 1 and 10). It is required for the internal timing of LVGL.
- Call `lv_tick_inc(x)` every `x` milliseconds in a Timer or Task (`x` should be between 1 and 10). It is required for the internal timing of LVGL.
Alternatively, configure `LV_TICK_CUSTOM` (see `lv_conf.h`) so that LVGL can retrieve the current time directly.
- Call `lv_init()`
- Create a draw buffer: LVGL will render the graphics here first, and send the rendered image to the display.
The buffer size can be set freely but 1/10 screen size is a good starting point.
- Create a draw buffer: LVGL will render the graphics here first, and send the rendered image to the display.
The buffer size can be set freely but 1/10 screen size is a good starting point.
```c
static lv_disp_draw_buf_t draw_buf;
static lv_color_t buf1[DISP_HOR_RES * DISP_VER_RES / 10]; /*Declare a buffer for 1/10 screen size*/
@@ -76,7 +72,7 @@ void my_touchpad_read(lv_indev_t * indev, lv_indev_data_t * data)
} else {
data->state = LV_INDEV_STATE_RELEASED;
}
}
```
- Call `lv_timer_handler()` periodically every few milliseconds in the main `while(1)` loop or in an operating system task.
@@ -90,13 +86,13 @@ For a more detailed guide go to the [Porting](/porting/index) section.
The graphical elements like Buttons, Labels, Sliders, Charts etc. are called objects or widgets. Go to [Widgets](/widgets/index) to see the full list of available widgets.
Every object has a parent object where it is created. For example, if a label is created on a button, the button is the parent of label.
Every object has a parent object where it is created. For example, if a label is created on a button, the button is the parent of label.
The child object moves with the parent and if the parent is deleted the children will be deleted too.
The child object moves with the parent and if the parent is deleted the children will be deleted too.
Children can be visible only within their parent's bounding area. In other words, the parts of the children outside the parent are clipped.
A Screen is the "root" parent. You can have any number of screens.
A Screen is the "root" parent. You can have any number of screens.
To get the current screen call `lv_scr_act()`, and to load a screen use `lv_scr_load(scr1)`.
@@ -124,8 +120,8 @@ To see the full API visit the documentation of the widgets or the related header
### Events
Events are used to inform the user that something has happened with an object.
You can assign one or more callbacks to an object which will be called if the object is clicked, released, dragged, being deleted, etc.
Events are used to inform the user that something has happened with an object.
You can assign one or more callbacks to an object which will be called if the object is clicked, released, dragged, being deleted, etc.
A callback is assigned like this:
@@ -140,7 +136,7 @@ void btn_event_cb(lv_event_t * e)
}
```
`LV_EVENT_ALL` can be used instead of `LV_EVENT_CLICKED` to invoke the callback for any event.
`LV_EVENT_ALL` can be used instead of `LV_EVENT_CLICKED` to invoke the callback for any event.
From `lv_event_t * e` the current event code can be retrieved with:
```c
@@ -166,13 +162,13 @@ Read the widgets' documentation to learn which parts each uses.
LVGL objects can be in a combination of the following states:
- `LV_STATE_DEFAULT` Normal, released state
- `LV_STATE_CHECKED` Toggled or checked state
- `LV_STATE_FOCUSED` Focused via keypad or encoder or clicked via touchpad/mouse
- `LV_STATE_FOCUS_KEY` Focused via keypad or encoder but not via touchpad/mouse
- `LV_STATE_FOCUSED` Focused via keypad or encoder or clicked via touchpad/mouse
- `LV_STATE_FOCUS_KEY` Focused via keypad or encoder but not via touchpad/mouse
- `LV_STATE_EDITED` Edit by an encoder
- `LV_STATE_HOVERED` Hovered by mouse (not supported now)
- `LV_STATE_PRESSED` Being pressed
- `LV_STATE_SCROLLED` Being scrolled
- `LV_STATE_DISABLED` Disabled
- `LV_STATE_DISABLED` Disabled
For example, if you press an object it will automatically go to the `LV_STATE_FOCUSED` and `LV_STATE_PRESSED` states and when you release it the `LV_STATE_PRESSED` state will be removed while focus remains active.
@@ -219,8 +215,8 @@ lv_obj_add_style(btn1, &style1, 0); /*Equal to LV_PART_MAIN | LV_STATE_DEFAULT*/
```
Styles can be cascaded (similarly to CSS). It means you can add more styles to a part of an object.
For example `style_btn` can set a default button appearance, and `style_btn_red` can overwrite the background color to make the button red:
Styles can be cascaded (similarly to CSS). It means you can add more styles to a part of an object.
For example `style_btn` can set a default button appearance, and `style_btn_red` can overwrite the background color to make the button red:
```c
lv_obj_add_style(btn1, &style_btn, 0);
lv_obj_add_style(btn1, &style1_btn_red, 0);
@@ -229,23 +225,23 @@ lv_obj_add_style(btn1, &style1_btn_red, 0);
If a property is not set on for the current state, the style with `LV_STATE_DEFAULT` will be used. A default value is used if the property is not defined in the default state.
Some properties (typically the text-related ones) can be inherited. This means if a property is not set in an object it will be searched for in its parents too.
For example, you can set the font once in the screen's style and all text on that screen will inherit it by default.
Some properties (typically the text-related ones) can be inherited. This means if a property is not set in an object it will be searched for in its parents too.
For example, you can set the font once in the screen's style and all text on that screen will inherit it by default.
Local style properties also can be added to objects. This creates a style which resides inside the object and is used only by the object:
```c
lv_obj_set_style_bg_color(slider1, lv_color_hex(0x2080bb), LV_PART_INDICATOR | LV_STATE_PRESSED);
```
```
To learn all the features of styles see the [Style overview](/overview/style) section.
### Themes
Themes are the default styles for objects. Styles from a theme are applied automatically when objects are created.
Themes are the default styles for objects. Styles from a theme are applied automatically when objects are created.
The theme for your application is a compile time configuration set in `lv_conf.h`.
The theme for your application is a compile time configuration set in `lv_conf.h`.
## Examples

View File

@@ -1,8 +0,0 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/get-started/stm32.md
```
# STM32
TODO

View File

@@ -1 +0,0 @@
.. |github_link_base| replace:: https://github.com/lvgl/lvgl/blob/c6f99ad200c7862c2f3cca3811bc2bdc2c95e971/docs

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/index.md
```
```eval_rst
@@ -13,20 +9,20 @@ PDF version: :download:`LVGL.pdf <LVGL.pdf>`
<img src="_static/img/home_banner.jpg" style="width:100%">
<div style="margin-bottom:48px">
<div style="margin-bottom:48px">
<a href="intro/index.html"><img class="home-img" src="_static/img/home_1.png" alt="Get familiar with the LVGL project"></a>
<a href="get-started/index.html"><img class="home-img" src="_static/img/home_2.png" alt="Learn the basic of LVGL and its usage on various platforms"></a>
<a href="porting/index.html"><img class="home-img" src="_static/img/home_3.png" alt="See how to port LVGL to any platform"></a>
<a href="overview/index.html"><img class="home-img" src="_static/img/home_4.png" alt="Learn the how LVGL works in more detail"></a>
<a href="widgets/index.html"><img class="home-img" src="_static/img/home_5.png" alt="Take a look at the description of the available widgets"></a>
<a href="CONTRIBUTING.html"><img class="home-img" src="_static/img/home_6.png" alt="Be part of the development of LVGL"></a>
</div>
</div>
```eval_rst
.. toctree::
:maxdepth: 2
intro/index
examples
get-started/index

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/intro/index.md
```
# Introduction
@@ -32,48 +28,45 @@ Basically, every modern controller which is able to drive a display is suitable
<li> 16, 32 or 64 bit microcontroller or processor</li>
<li>&gt; 16 MHz clock speed is recommended</li>
<li> Flash/ROM: &gt; 64 kB for the very essential components (&gt; 180 kB is recommended)</li>
<li> RAM:
<li> RAM:
<ul>
<li> Static RAM usage: ~2 kB depending on the used features and object types</li>
<li> Stack: &gt; 2kB (&gt; 8 kB is recommended)</li>
<li> Dynamic data (heap): &gt; 4 KB (&gt; 32 kB is recommended if using several objects).
<li> Dynamic data (heap): &gt; 4 KB (&gt; 48 kB is recommended if using several objects).
    Set by <em>LV_MEM_SIZE</em> in <em>lv_conf.h</em>. </li>
<li> Display buffer:  &gt; <em>"Horizontal resolution"</em> pixels (&gt; 10 &times; <em>"Horizontal resolution"</em> is recommended) </li>
<li> One frame buffer in the MCU or in an external display controller</li>
</ul>
</li>
<li> C99 or newer compiler</li>
<li> Basic C (or C++) knowledge:
<a href="https://www.tutorialspoint.com/cprogramming/c_pointers.htm">pointers</a>,
<a href="https://www.tutorialspoint.com/cprogramming/c_structures.htm">structs</a>,
<li> Basic C (or C++) knowledge:
<a href="https://www.tutorialspoint.com/cprogramming/c_pointers.htm">pointers</a>,
<a href="https://www.tutorialspoint.com/cprogramming/c_structures.htm">structs</a>,
<a href="https://www.geeksforgeeks.org/callbacks-in-c/">callbacks</a>.</li>
</ul>
<em>Note that memory usage may vary depending on architecture, compiler and build options.</em>
## License
The LVGL project (including all repositories) is licensed under [MIT license](https://github.com/lvgl/lvgl/blob/master/LICENCE.txt).
The LVGL project (including all repositories) is licensed under [MIT license](https://github.com/lvgl/lvgl/blob/master/LICENCE.txt).
This means you can use it even in commercial projects.
It's not mandatory, but we highly appreciate it if you write a few words about your project in the [My projects](https://forum.lvgl.io/c/my-projects/10) category of the forum or a private message to [lvgl.io](https://lvgl.io/#contact).
Although you can get LVGL for free there is a massive amount of work behind it. It's created by a group of volunteers who made it available for you in their free time.
To make the LVGL project sustainable, please consider [contributing](/CONTRIBUTING) to the project.
To make the LVGL project sustainable, please consider [contributing](/CONTRIBUTING) to the project.
You can choose from [many different ways of contributing](/CONTRIBUTING) such as simply writing a tweet about you using LVGL, fixing bugs, translating the documentation, or even becoming a maintainer.
## Repository layout
All repositories of the LVGL project are hosted on GitHub: https://github.com/lvgl
You will find these repositories there:
- [lvgl](https://github.com/lvgl/lvgl) The library itself with many [examples](https://github.com/lvgl/lvgl/blob/master/examples/).
- [lv_demos](https://github.com/lvgl/lv_demos) Demos created with LVGL.
- [lvgl](https://github.com/lvgl/lvgl) The library itself with many [examples](https://github.com/lvgl/lvgl/blob/master/examples/) and [demos](https://github.com/lvgl/lvgl/blob/master/demos/).
- [lv_drivers](https://github.com/lvgl/lv_drivers) Display and input device drivers
- [blog](https://github.com/lvgl/blog) Source of the blog's site (https://blog.lvgl.io)
- [sim](https://github.com/lvgl/sim) Source of the online simulator's site (https://sim.lvgl.io)
- [lv_sim_...](https://github.com/lvgl?q=lv_sim&type=&language=) Simulator projects for various IDEs and platforms
- [lv_port_...](https://github.com/lvgl?q=lv_port&type=&language=) LVGL ports to development boards
- [lv_port_...](https://github.com/lvgl?q=lv_port&type=&language=) LVGL ports to development boards or environments
- [lv_binding_..](https://github.com/lvgl?q=lv_binding&type=&language=l) Bindings to other languages
- [lv_...](https://github.com/lvgl?q=lv_&type=&language=) Ports to other platforms
## Release policy
@@ -91,7 +84,7 @@ Tags like `vX.Y.Z` are created for every release.
### Branches
The core repositories have at least the following branches:
- `master` latest version, patches are merged directly here.
- `master` latest version, patches are merged directly here.
- `release/vX.Y` stable versions of the minor releases
- `fix/some-description` temporary branches for bug fixes
- `feat/some-description` temporary branches for features
@@ -102,26 +95,26 @@ The core repositories have at least the following branches:
The changes are recorded in [CHANGELOG.md](/CHANGELOG).
### Version support
Before v8 every minor release of major releases is supported for 1 year.
Before v8 the last minor release of each major series was supported for 1 year.
Starting from v8, every minor release is supported for 1 year.
| Version | Release date | Support end | Active |
|---------|--------------|-------------|--------|
| v5.3 | Feb 1, 2019 |Feb 1, 2020 | No |
| v6.1 | Nov 26, 2019 |Nov 26, 2020 | No |
| v7.11 | Mar 16, 2021 |Mar 16, 2022 | Yes |
| v7.11 | Mar 16, 2021 |Mar 16, 2022 | No |
| v8.0 | 1 Jun, 2021 |1 Jun, 2022 | Yes |
| v8.1 | 10 Nov, 2021 |10 Nov, 2022 | Yes |
| v8.2 | In progress | | |
| v8.2 | 31 Jan, 2022 |31 Jan, 2023 | Yes |
| v8.3 | In progress | | |
## FAQ
### Where can I ask questions?
You can ask questions in the forum: [https://forum.lvgl.io/](https://forum.lvgl.io/).
We use [GitHub issues](https://github.com/lvgl/lvgl/issues) for development related discussion.
You should use them only if your question or issue is tightly related to the development of the library.
We use [GitHub issues](https://github.com/lvgl/lvgl/issues) for development related discussion.
You should use them only if your question or issue is tightly related to the development of the library.
Before posting a question, please ready this FAQ section as you might find answer to your issue here too.
@@ -129,17 +122,17 @@ Before posting a question, please ready this FAQ section as you might find answe
Every MCU which is capable of driving a display via parallel port, SPI, RGB interface or anything else and fulfills the [Requirements](#requirements) is supported by LVGL.
This includes:
- "Common" MCUs like STM32F, STM32H, NXP Kinetis, LPC, iMX, dsPIC33, PIC32 etc.
- "Common" MCUs like STM32F, STM32H, NXP Kinetis, LPC, iMX, dsPIC33, PIC32, SWM341 etc.
- Bluetooth, GSM, Wi-Fi modules like Nordic NRF and Espressif ESP32
- Linux with frame buffer device such as /dev/fb0. This includes Single-board computers like the Raspberry Pi
- Anything else with a strong enough MCU and a peripheral to drive a display
### Is my display supported?
LVGL needs just one simple driver function to copy an array of pixels into a given area of the display.
LVGL needs just one simple driver function to copy an array of pixels into a given area of the display.
If you can do this with your display then you can use it with LVGL.
Some examples of the supported display types:
- TFTs with 16 or 24 bit color depth
- TFTs with 16 or 32 bit color depth
- Monitors with an HDMI port
- Small monochrome displays
- Gray-scale displays
@@ -161,10 +154,10 @@ See the [Porting](/porting/display) section to learn more.
### My display driver is not called. What have I missed?
Be sure you are calling `lv_tick_inc(x)` in an interrupt and `lv_timer_handler()` in your main `while(1)`.
Learn more in the [Tick](/porting/tick) and [Task handler](/porting/task-handler) sections.
Learn more in the [Tick](/porting/tick) and [Timer handler](/porting/timer-handler) sections.
### Why is the display driver called only once? Only the upper part of the display is refreshed.
Be sure you are calling `lv_disp_flush_ready(drv)` at the end of your "*display flush callback*".
### Why is the display driver called only once? Only the upper part of the display is refreshed.
Be sure you are calling `lv_disp_flush_ready(drv)` at the end of your "*display flush callback*".
### Why do I see only garbage on the screen?
Probably there a bug in your display driver. Try the following code without using LVGL. You should see a square with red-blue gradient.
@@ -192,16 +185,16 @@ a.y2 = a.y1 + BUF_H - 1;
my_flush_cb(NULL, &a, buf);
```
### Why do I see nonsense colors on the screen?
### Why do I see nonsense colors on the screen?
Probably LVGL's color format is not compatible with your display's color format. Check `LV_COLOR_DEPTH` in *lv_conf.h*.
If you are using 16-bit colors with SPI (or another byte-oriented interface) you probably need to set `LV_COLOR_16_SWAP  1` in *lv_conf.h*.
If you are using 16-bit colors with SPI (or another byte-oriented interface) you probably need to set `LV_COLOR_16_SWAP  1` in *lv_conf.h*.
It swaps the upper and lower bytes of the pixels.
### How to speed up my UI?
- Turn on compiler optimization and enable cache if your MCU has it
- Increase the size of the display buffer
- Use two display buffers and flush the buffer with DMA (or similar peripheral) in the background
- Use two display buffers and flush the buffer with DMA (or similar peripheral) in the background
- Increase the clock speed of the SPI or parallel port if you use them to drive the display
- If your display has an SPI port consider changing to a model with a parallel interface because it has much higher throughput
- Keep the display buffer in internal RAM (not in external SRAM) because LVGL uses it a lot and it should have a fast access time
@@ -209,10 +202,10 @@ It swaps the upper and lower bytes of the pixels.
### How to reduce flash/ROM usage?
You can disable all the unused features (such as animations, file system, GPU etc.) and object types in *lv_conf.h*.
If you are using GCC you can add `-fdata-sections -ffunction-sections` compiler flags and `--gc-sections` linker flag to remove unused functions and variables from the final binary.
If you are using GCC/CLANG you can add `-fdata-sections -ffunction-sections` compiler flags and `--gc-sections` linker flag to remove unused functions and variables from the final binary. If possible, add the `-flto` compiler flag to enable link-time-optimisation together with `-Os` for GCC or `-Oz` for CLANG.
### How to reduce the RAM usage
- Lower the size of the *Display buffer*
- Lower the size of the *Display buffer*
- Reduce `LV_MEM_SIZE` in *lv_conf.h*. This memory is used when you create objects like buttons, labels, etc.
- To work with lower `LV_MEM_SIZE` you can create objects only when required and delete them when they are not needed anymore

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/layouts/flex.md
```
# Flex
@@ -13,14 +9,14 @@ It can arrange items into rows or columns (tracks), handle wrapping, adjust the
To make an object flex container call `lv_obj_set_layout(obj, LV_LAYOUT_FLEX)`.
Note that the flex layout feature of LVGL needs to be globally enabled with `LV_USE_FLEX` in `lv_conf.h`.
Note that the flex layout feature of LVGL needs to be globally enabled with `LV_USE_FLEX` in `lv_conf.h`.
## Terms
- tracks: the rows or columns
- main direction: row or column, the direction in which the items are placed
- cross direction: perpendicular to the main direction
- wrap: if there is no more space in the track a new track is started
- grow: if set on an item it will grow to fill the remaining space on the track.
- grow: if set on an item it will grow to fill the remaining space on the track.
The available space will be distributed among items respective to their grow value (larger value means more space)
- gap: the space between the rows and columns or the items on a track
@@ -54,8 +50,8 @@ The possible values are:
- `LV_FLEX_ALIGN_END` means right on a horizontally and bottom vertically
- `LV_FLEX_ALIGN_CENTER` simply center
- `LV_FLEX_ALIGN_SPACE_EVENLY` items are distributed so that the spacing between any two items (and the space to the edges) is equal. Does not apply to `track_cross_place`.
- `LV_FLEX_ALIGN_SPACE_AROUND` items are evenly distributed in the track with equal space around them.
Note that visually the spaces arent equal, since all the items have equal space on both sides.
- `LV_FLEX_ALIGN_SPACE_AROUND` items are evenly distributed in the track with equal space around them.
Note that visually the spaces arent equal, since all the items have equal space on both sides.
The first item will have one unit of space against the container edge, but two units of space between the next item because that next item has its own spacing that applies. Not applies to `track_cross_place`.
- `LV_FLEX_ALIGN_SPACE_BETWEEN` items are evenly distributed in the track: first item is on the start line, last item on the end line. Not applies to `track_cross_place`.
@@ -87,13 +83,13 @@ All the Flex-related values are style properties under the hood and you can use
To modify the minimum space flexbox inserts between objects, the following properties can be set on the flex container style:
- `pad_row` Sets the padding between the rows.
- `pad_row` Sets the padding between the rows.
- `pad_column` Sets the padding between the columns.
These can for example be used if you don't want any padding between your objects: `lv_style_set_pad_column(&row_container_style,0)`
## Other features
## Other features
### RTL
If the base direction of the container is set the `LV_BASE_DIR_RTL` the meaning of `LV_FLEX_ALIGN_START` and `LV_FLEX_ALIGN_END` is swapped on `ROW` layouts. I.e. `START` will mean right.

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/layouts/grid.md
```
# Grid
@@ -14,11 +10,11 @@ The track's size can be set in pixel, to the largest item (`LV_GRID_CONTENT`) or
To make an object a grid container call `lv_obj_set_layout(obj, LV_LAYOUT_GRID)`.
Note that the grid layout feature of LVGL needs to be globally enabled with `LV_USE_GRID` in `lv_conf.h`.
Note that the grid layout feature of LVGL needs to be globally enabled with `LV_USE_GRID` in `lv_conf.h`.
## Terms
- tracks: the rows or columns
- free unit (FR): if set on track's size is set in `FR` it will grow to fill the remaining space on the parent.
- free unit (FR): if set on track's size is set in `FR` it will grow to fill the remaining space on the parent.
- gap: the space between the rows and columns or the items on a track
## Simple interface
@@ -42,7 +38,7 @@ Besides simple settings the size in pixel you can use two special values:
- `LV_GRID_FR(X)` tell what portion of the remaining space should be used by this track. Larger value means larger space.
### Grid items
By default, the children are not added to the grid. They need to be added manually to a cell.
By default, the children are not added to the grid. They need to be added manually to a cell.
To do this call `lv_obj_set_grid_cell(child, column_align, column_pos, column_span, row_align, row_pos, row_span)`.
@@ -51,9 +47,9 @@ To do this call `lv_obj_set_grid_cell(child, column_align, column_pos, column_sp
- `LV_GRID_ALIGN_END` means right on a horizontally and bottom vertically
- `LV_GRID_ALIGN_CENTER` simply center
`colum_pos` and `row_pos` means the zero based index of the cell into the item should be placed.
`colum_pos` and `row_pos` means the zero based index of the cell into the item should be placed.
`colum_span` and `row_span` means how many tracks should the item involve from the start cell. Must be &gt; 1.
`colum_span` and `row_span` means how many tracks should the item involve from the start cell. Must be &gt; 1.
### Grid align
@@ -62,8 +58,8 @@ If there are some empty space the track can be aligned several ways:
- `LV_GRID_ALIGN_END` means right on a horizontally and bottom vertically
- `LV_GRID_ALIGN_CENTER` simply center
- `LV_GRID_ALIGN_SPACE_EVENLY` items are distributed so that the spacing between any two items (and the space to the edges) is equal. Not applies to `track_cross_place`.
- `LV_GRID_ALIGN_SPACE_AROUND` items are evenly distributed in the track with equal space around them.
Note that visually the spaces arent equal, since all the items have equal space on both sides.
- `LV_GRID_ALIGN_SPACE_AROUND` items are evenly distributed in the track with equal space around them.
Note that visually the spaces arent equal, since all the items have equal space on both sides.
The first item will have one unit of space against the container edge, but two units of space between the next item because that next item has its own spacing that applies. Not applies to `track_cross_place`.
- `LV_GRID_ALIGN_SPACE_BETWEEN` items are evenly distributed in the track: first item is on the start line, last item on the end line. Not applies to `track_cross_place`.
@@ -88,10 +84,10 @@ All the Grid related values are style properties under the hood and you can use
To modify the minimum space Grid inserts between objects, the following properties can be set on the Grid container style:
- `pad_row` Sets the padding between the rows.
- `pad_row` Sets the padding between the rows.
- `pad_column` Sets the padding between the columns.
## Other features
## Other features
### RTL
If the base direction of the container is set to `LV_BASE_DIR_RTL`, the meaning of `LV_GRID_ALIGN_START` and `LV_GRID_ALIGN_END` is swapped. I.e. `START` will mean right-most.

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/layouts/index.md
```
# Layouts
@@ -9,7 +5,7 @@
```eval_rst
.. toctree::
:maxdepth: 2
flex
grid
```

View File

@@ -1,23 +1,19 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/libs/bmp.md
```
# BMP decoder
# BMP decoder
This extension allows the use of BMP images in LVGL.
This extension allows the use of BMP images in LVGL.
This implementation uses [bmp-decoder](https://github.com/caj-johnson/bmp-decoder) library.
The pixels are read on demand (not the whole image is loaded) so using BMP images requires very little RAM.
The pixels are read on demand (not the whole image is loaded) so using BMP images requires very little RAM.
If enabled in `lv_conf.h` by `LV_USE_BMP` LVGL will register a new image decoder automatically so BMP files can be directly used as image sources. For example:
```
lv_img_set_src(my_img, "S:path/to/picture.bmp");
```
Note that, a file system driver needs to registered to open images from files. Read more about it [here](https://docs.lvgl.io/master/overview/file-system.html) or just enable one in `lv_conf.h` with `LV_USE_FS_...`
Note that, a file system driver needs to registered to open images from files. Read more about it [here](https://docs.lvgl.io/master/overview/file-system.html) or just enable one in `lv_conf.h` with `LV_USE_FS_...`
## Limitations
- Only BMP files are supported and BMP images as C array (`lv_img_dsc_t`) are not. It's because there is no practical differences between how the BMP files and LVGL's image format stores the image data.
- Only BMP files are supported and BMP images as C array (`lv_img_dsc_t`) are not. It's because there is no practical differences between how the BMP files and LVGL's image format stores the image data.
- BMP files can be loaded only from file. If you want to store them in flash it's better to convert them to C array with [LVGL's image converter](https://lvgl.io/tools/imageconverter).
- The BMP files color format needs to match with `LV_COLOR_DEPTH`. Use GIMP to save the image in the required format.
Both RGB888 and ARGB888 works with `LV_COLOR_DEPTH 32`

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/libs/ffmpeg.md
```
# FFmpeg support
[FFmpeg](https://www.ffmpeg.org/) A complete, cross-platform solution to record, convert and stream audio and video.
@@ -21,7 +17,7 @@ Enable `LV_USE_FFMPEG` in `lv_conf.h`.
See the examples below.
Note that, the FFmpeg extension doesn't use LVGL's file system.
Note that, the FFmpeg extension doesn't use LVGL's file system.
You can simply pass the path to the image or video as usual on your operating system or platform.
## Example

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/libs/freetype.md
```
# FreeType support
Interface to [FreeType](https://www.freetype.org/) to generate font bitmaps run time.
@@ -34,7 +30,7 @@ Font style supports bold and italic, you can use the following macros to set:
They can be combined.eg:`FT_FONT_STYLE_BOLD | FT_FONT_STYLE_ITALIC`.
Note that, the FreeType extension doesn't use LVGL's file system.
Note that, the FreeType extension doesn't use LVGL's file system.
You can simply pass the path to the font as usual on your operating system or platform.
## Example
@@ -44,7 +40,7 @@ You can simply pass the path to the font as usual on your operating system or pl
## Learn more
- FreeType [tutorial](https://www.freetype.org/freetype2/docs/tutorial/step1.html)
- FreeType [tutorial](https://www.freetype.org/freetype2/docs/tutorial/step1.html)
- LVGL's [font interface](https://docs.lvgl.io/v7/en/html/overview/font.html#add-a-new-font-engine)

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/libs/fsdrv.md
```
# File System Interfaces
@@ -20,6 +16,6 @@ You still need to provide the drivers and libraries, this extension provides onl
In `lv_conf.h` enable `LV_USE_FS_...` and assign an upper cased letter to `LV_FS_..._LETTER` (e.g. `'S'`).
After that you can access files using that driver letter. E.g. `"S:path/to/file.txt"`.
The work directory can be set with `LV_FS_..._PATH`. E.g. `"/home/joe/projects/"` The actual file/directory paths will be appended to it.
The work directory can be set with `LV_FS_..._PATH`. E.g. `"/home/joe/projects/"` The actual file/directory paths will be appended to it.
Cached reading is also supported if `LV_FS_..._CACHE_SIZE` is set to not `0` value. `lv_fs_read` caches this size of data to lower the number of actual reads from the storage.
Cached reading is also supported if `LV_FS_..._CACHE_SIZE` is set to not `0` value. `lv_fs_read` caches this size of data to lower the number of actual reads from the storage.

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/libs/gif.md
```
# GIF decoder
Allow using GIF images in LVGL. Based on https://github.com/lecram/gifdec
@@ -13,7 +9,7 @@ When enabled in `lv_conf.h` with `LV_USE_GIF` `lv_gif_create(parent)` can be use
## Convert GIF files to C array
To convert a GIF file to byte values array use [LVGL's online converter](https://lvgl.io/tools/imageconverter). Select "Raw" color format and "C array" Output format.
## Use GIF images from file
For example:
@@ -21,14 +17,14 @@ For example:
lv_gif_set_src(obj, "S:path/to/example.gif");
```
Note that, a file system driver needs to be registered to open images from files. Read more about it [here](https://docs.lvgl.io/master/overview/file-system.html) or just enable one in `lv_conf.h` with `LV_USE_FS_...`
Note that, a file system driver needs to be registered to open images from files. Read more about it [here](https://docs.lvgl.io/master/overview/file-system.html) or just enable one in `lv_conf.h` with `LV_USE_FS_...`
## Memory requirements
To decode and display a GIF animation the following amount of RAM is required:
- `LV_COLOR_DEPTH 8`: 3 x image width x image height
- `LV_COLOR_DEPTH 16`: 4 x image width x image height
- `LV_COLOR_DEPTH 32`: 5 x image width x image height
- `LV_COLOR_DEPTH 8`: 3 x image width x image height
- `LV_COLOR_DEPTH 16`: 4 x image width x image height
- `LV_COLOR_DEPTH 32`: 5 x image width x image height
## Example
```eval_rst

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/libs/index.md
```
# 3rd party libraries
@@ -9,7 +5,7 @@
.. toctree::
:maxdepth: 1
fsdrv
bmp
sjpg

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/libs/png.md
```
# PNG decoder
@@ -9,11 +5,11 @@ Allow the use of PNG images in LVGL. This implementation uses [lodepng](https://
If enabled in `lv_conf.h` by `LV_USE_PNG` LVGL will register a new image decoder automatically so PNG files can be directly used as any other image sources.
Note that, a file system driver needs to registered to open images from files. Read more about it [here](https://docs.lvgl.io/master/overview/file-system.html) or just enable one in `lv_conf.h` with `LV_USE_FS_...`
Note that, a file system driver needs to registered to open images from files. Read more about it [here](https://docs.lvgl.io/master/overview/file-system.html) or just enable one in `lv_conf.h` with `LV_USE_FS_...`
The whole PNG image is decoded so during decoding RAM equals to `image width x image height x 4` bytes are required.
As it might take significant time to decode PNG images LVGL's [images caching](https://docs.lvgl.io/master/overview/image.html#image-caching) feature can be useful.
As it might take significant time to decode PNG images LVGL's [images caching](https://docs.lvgl.io/master/overview/image.html#image-caching) feature can be useful.
## Example
```eval_rst

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/libs/qrcode.md
```
# QR code

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/libs/rlottie.md
```
# Lottie player
@@ -93,7 +89,7 @@ The default animation mode is **play forward with loop**.
If you don't enable looping, a `LV_EVENT_READY` is sent when the animation can not make more progress without looping.
To get the number of frames in an animation or the current frame index, you can cast the `lv_obj_t` instance to a `lv_rlottie_t` instance and inspect the `current_frame` and `total_frames` members.
To get the number of frames in an animation or the current frame index, you can cast the `lv_obj_t` instance to a `lv_rlottie_t` instance and inspect the `current_frame` and `total_frames` members.
## Example
```eval_rst

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/libs/sjpg.md
```
# JPG decoder
@@ -26,17 +22,17 @@ If enabled in `lv_conf.h` by `LV_USE_SJPG` LVGL will register a new image decode
lv_img_set_src(my_img, "S:path/to/picture.jpg");
```
Note that, a file system driver needs to registered to open images from files. Read more about it [here](https://docs.lvgl.io/master/overview/file-system.html) or just enable one in `lv_conf.h` with `LV_USE_FS_...`
Note that, a file system driver needs to registered to open images from files. Read more about it [here](https://docs.lvgl.io/master/overview/file-system.html) or just enable one in `lv_conf.h` with `LV_USE_FS_...`
## Converter
### Converting JPG to C array
- Use lvgl online tool https://lvgl.io/tools/imageconverter
- Use lvgl online tool https://lvgl.io/tools/imageconverter
- Color format = RAW, output format = C Array
### Converting JPG to SJPG
### Converting JPG to SJPG
python3 and the PIL library required. (PIL can be installed with `pip3 install pillow`)
To create SJPG from JPG:

77
docs/others/fragment.md Normal file
View File

@@ -0,0 +1,77 @@
# Fragment
Fragment is a concept copied from [Android](https://developer.android.com/guide/fragments).
It represents a reusable portion of your app's UI. A fragment defines and manages its own layout, has its own lifecycle,
and can handle its own events. Like Android's Fragment that must be hosted by an activity or another fragment, Fragment
in LVGL needs to be hosted by an object, or another fragment. The fragments view hierarchy becomes part of, or attaches
to, the hosts view hierarchy.
Such concept also has some similarities
to [UiViewController on iOS](https://developer.apple.com/documentation/uikit/uiviewcontroller).
Fragment Manager is a manager holding references to fragments attached to it, and has an internal stack to achieve
navigation. You can use fragment manager to build navigation stack, or multi pane application easily.
## Usage
Enable `LV_USE_FRAGMENT` in `lv_conf.h`.
### Create Fragment Class
```c
struct sample_fragment_t {
/* IMPORTANT: don't miss this part */
lv_fragment_t base;
/* States, object references and data fields for this fragment */
const char *title;
};
const lv_fragment_class_t sample_cls = {
/* Initialize something needed */
.constructor_cb = sample_fragment_ctor,
/* Create view objects */
.create_obj_cb = sample_fragment_create_obj,
/* IMPORTANT: size of your fragment struct */
.instance_size = sizeof(struct sample_fragment_t)
};
```
### Use `lv_fragment_manager`
```c
/* Create fragment instance, and objects will be added to container */
lv_fragment_manager_t *manager = lv_fragment_manager_create(container, NULL);
/* Replace current fragment with instance of sample_cls, and init_argument is user defined pointer */
lv_fragment_manager_replace(manager, &sample_cls, init_argument);
```
### Fragment Based Navigation
```c
/* Add one instance into manager stack. View object of current fragment will be destroyed,
* but instances created in class constructor will be kept.
*/
lv_fragment_manager_push(manager, &sample_cls, NULL);
/* Remove the top most fragment from the stack, and bring back previous one. */
lv_fragment_manager_pop(manager);
```
## Example
```eval_rst
.. include:: ../../examples/others/fragment/index.rst
```
## API
```eval_rst
.. doxygenfile:: lv_fragment.h
:project: lvgl
```

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/others/gridnav.md
```
# Grid navigation
Grid navigation (gridnav for short) is a feature that changes the currently focused child object as arrow keys are pressed.
@@ -10,35 +6,35 @@ If the children are arranged into a grid-like layout then the up, down, left and
in the respective direction.
It doesn't matter how the children are positioned, as only the current x and y coordinates are considered.
This means that gridnav works with manually positioned children, as well as [Flex](/layouts/flex.html) and [Grid](/layouts/grid.html) layouts.
This means that gridnav works with manually positioned children, as well as [Flex](/layouts/flex) and [Grid](/layouts/grid) layouts.
Gridnav also works if the children are arranged into a single row or column.
That makes it useful, for example, to simplify navigation on a [List widget](/widgets/extra/list.html).
That makes it useful, for example, to simplify navigation on a [List widget](/widgets/extra/list).
Gridnav assumes that the object to which gridnav is added is part of a [group](/overview/indev.html#groups).
Gridnav assumes that the object to which gridnav is added is part of a [group](/overview/indev.html#groups).
This way, if the object with gridnav is focused, the arrow key presses are automatically forwarded to the object
so that gridnav can process the arrow keys.
To move the focus to the next widget of the group use `LV_KEY_NEXT/PREV` or `lv_group_focus_next/prev()` or the `TAB` key on keyboard as usual.
To move the focus to the next widget of the group use `LV_KEY_NEXT/PREV` or `lv_group_focus_next/prev()` or the `TAB` key on keyboard as usual.
If the container is scrollable and the focused child is out of the view, gridnav will automatically scroll the child into view.
## Usage
To add the gridnav feature to an object use `lv_gridnav_add(cont, flags)`.
`flags` control the behavior of gridnav:
- `LV_GRIDNAV_CTRL_NONE` Default settings
- `LV_GRIDNAV_CTRL_ROLLOVER` If there is no next/previous object in a direction,
the focus goes to the object in the next/previous row (on left/right keys) or first/last row (on up/down keys
- `LV_GRIDNAV_CTRL_NONE` Default settings
- `LV_GRIDNAV_CTRL_ROLLOVER` If there is no next/previous object in a direction,
the focus goes to the object in the next/previous row (on left/right keys) or first/last row (on up/down keys
- `LV_GRIDNAV_CTRL_SCROLL_FIRST` If an arrow is pressed and the focused object can be scrolled in that direction
then it will be scrolled instead of going to the next/previous object. If there is no more room for scrolling the next/previous object will be focused normally
then it will be scrolled instead of going to the next/previous object. If there is no more room for scrolling the next/previous object will be focused normally
`lv_gridnav_remove(cont)` Removes gridnav from an object.
## Focusable objects
An object needs to be clickable or click focusable (`LV_OBJ_FLAG_CLICKABLE` or `LV_OBJ_FLAG_CLICK_FOCUSABLE`)
An object needs to be clickable or click focusable (`LV_OBJ_FLAG_CLICKABLE` or `LV_OBJ_FLAG_CLICK_FOCUSABLE`)
and not hidden (`LV_OBJ_FLAG_HIDDEN`) to be focusable by gridnav.

150
docs/others/ime_pinyin.md Normal file
View File

@@ -0,0 +1,150 @@
# Pinyin IME
Pinyin IME provides API to provide Chinese Pinyin input method (Chinese input) for keyboard object, which supports 26 key and 9 key input modes. You can think of `lv_ime_pinyin` as a Pinyin input method plug-in for keyboard objects.
Normally, an environment where [lv_keyboard](/widgets/extra/keyboard) can run can also run `lv_ime_pinyin`. There are two main influencing factors: the size of the font file and the size of the dictionary.
<details>
<summary>中文</summary>
<p>
`lv_ime_pinyin`为[键盘](/widgets/extra/keyboard)组件提供汉语拼音输入法(中文输入)的功能(后文简称为拼音输入法)支持26键和9键输入模式。您可以将 `lv_ime_pinyin` 看成是键盘组件的汉语拼音输入法插件。
一般情况下,只要是[键盘](/widgets/extra/keyboard)组件能运行的环境 `lv_ime_pinyin` 也能运行。有两个影响因素:字库的大小和词库的大小。
</p>
</details>
## Usage
Enable `LV_USE_IME_PINYIN` in `lv_conf.h`.
First use `lv_ime_pinyin_create(lv_scr_act())` to create a Pinyin input method plug-in, then use `lv_ime_pinyin_set_keyboard(pinyin_ime, kb)` to add the `keyboard` you created to the Pinyin input method plug-in.
You can use `lv_ime_pinyin_set_dict(pinyin_ime, your_dict)` to use a custom dictionary (if you don't want to use the built-in dictionary at first, you can disable `LV_IME_PINYIN_USE_DEFAULT_DICT` in `lv_conf.h`, which can save a lot of memory space).
The built-in thesaurus is customized based on the **LV_FONT_SIMSUN_16_CJK** font library, which currently only has more than `1,000` most common CJK radicals, so it is recommended to use custom fonts and thesaurus.
In the process of using the Pinyin input method plug-in, you can change the keyboard and dictionary at any time.
<details>
<summary>中文</summary>
<p>
`lv_conf.h` 中打开 `LV_USE_IME_PINYIN`
首先,使用 `lv_ime_pinyin_create(lv_scr_act())` 函数创建一个拼音输入法插件,
然后使用 `lv_ime_pinyin_set_keyboard(pinyin_ime, kb)` 函数将您创建的键盘组件添加到插件中。
内置的词库是基于 LVGL 的 **LV_FONT_SIMSUN_16_CJK** 字库定制,这个字库目前只有 `1000` 多个最常见的 CJK 部首,所以建议使用自定义字库和词库。
您可以使用 `lv_ime_pinyin_set_dict(pinyin_ime, your_dict)` 函数来设置使用自定义的词库,如果您一开始就不打算使用内置的词库,建议您在 `lv_conf.h` 中将 `LV_IME_PINYIN_USE_DEFAULT_DICT` 关闭,这可以节省一些内存空间。
</p>
</details>
## Custom dictionary
If you don't want to use the built-in Pinyin dictionary, you can use the custom dictionary.
Or if you think that the built-in phonetic dictionary consumes a lot of memory, you can also use a custom dictionary.
Customizing the dictionary is very simple.
First, set `LV_IME_PINYIN_USE_DEFAULT_DICT` to `0` in `lv_conf.h`
Then, write a dictionary in the following format.
<details>
<summary>中文</summary>
<p>
如果您不想使用内置的词库,可以通过下面的方法自定义词库。
自定义词典非常简单。
首先,在 `lv_conf.h``LV_IME_PINYIN_USE_DEFAULT_DICT` 设置为 0。
然后按照下面的格式编写词库。
</p>
</details>
### Dictionary format
The arrangement order of each pinyin syllable is very important. You need to customize your own thesaurus according to the Hanyu Pinyin syllable table. You can read [here](https://baike.baidu.com/item/%E6%B1%89%E8%AF%AD%E6%8B%BC%E9%9F%B3%E9%9F%B3%E8%8A%82/9167981) to learn about the Hanyu Pinyin syllables and the syllable table.
Then, write your own dictionary according to the following format:
<details>
<summary>中文</summary>
<p>
**注意**,各个拼音音节的排列顺序非常重要,您需要按照汉语拼音音节表定制自己的词库,可以阅读[这里](https://baike.baidu.com/item/%E6%B1%89%E8%AF%AD%E6%8B%BC%E9%9F%B3%E9%9F%B3%E8%8A%82/9167981)了解[汉语拼音音节](https://baike.baidu.com/item/%E6%B1%89%E8%AF%AD%E6%8B%BC%E9%9F%B3%E9%9F%B3%E8%8A%82/9167981)以及[音节表](https://baike.baidu.com/item/%E6%B1%89%E8%AF%AD%E6%8B%BC%E9%9F%B3%E9%9F%B3%E8%8A%82/9167981#1)。
然后,根据下面的格式编写自己的词库:
</p>
</details>
```c
lv_100ask_pinyin_dict_t your_pinyin_dict[] = {
{ "a", "啊阿呵吖" },
{ "ai", "埃挨哎唉哀皑蔼矮碍爱隘癌艾" },
{ "an", "按安暗岸俺案鞍氨胺厂广庵揞犴铵桉谙鹌埯黯" },
{ "ang", "昂肮盎仰" },
{ "ao", "凹敖熬翱袄傲奥懊澳" },
{ "ba", "芭捌叭吧笆八疤巴拔跋靶把坝霸罢爸扒耙" },
{ "bai", "白摆佰败拜柏百稗伯" },
/* ...... */
{ "zuo", "昨左佐做作坐座撮琢柞"},
{NULL, NULL}
```
**The last item** must end with `{null, null}` , or it will not work properly.
### Apply new dictionary
After writing a dictionary according to the above dictionary format, you only need to call this function to set up and use your dictionary:
<details>
<summary>中文</summary>
<p>
按照上面的词库格式编写好自己的词库之后,参考下面的用法,调用 `lv_100ask_pinyin_ime_set_dict(pinyin_ime, your_pinyin_dict)` 函数即可设置和使用新词库:
</p>
</details>
```c
lv_obj_t * pinyin_ime = lv_100ask_pinyin_ime_create(lv_scr_act());
lv_100ask_pinyin_ime_set_dict(pinyin_ime, your_pinyin_dict);
```
## Input modes
`lv_ime_pinyin` supports 26 key and 9 key input modes. The mode switching is very simple, just call the function `lv_ime_pinyin_set_mode`. If the second parameter of function `lv_ime_pinyin_set_mode` is' 1 ', switch to 26 key input mode; if it is' 0', switch to 9 key input mode, and the default is' 1 '.
<details>
<summary>中文</summary>
<p>
`lv_ime_pinyin` 支持26键和9键输入模式。模式的切换非常简单只需调用函数 `lv_ime_pinyin_set_mode` 即可。如果函数 `lv_ime_pinyin_set_mode` 的第2个参数为 `1` 则切换到 26 键输入模式,如果为 `0` 则切换到 9 键输入法模式,默认为 `1`
</p>
</details>
## Example
```eval_rst
.. include:: ../../examples/others/ime/index.rst
```
## API
```eval_rst
.. doxygenfile:: lv_ime_pinyin.h
:project: lvgl
```

25
docs/others/imgfont.md Normal file
View File

@@ -0,0 +1,25 @@
# Image font (imgfont)
Draw image in label or span obj with imgfont.
This is often used to display Unicode emoji icons in text.
Supported image formats: determined by LVGL image decoder.
## Usage
Enable `LV_USE_IMGFONT` in `lv_conf.h`.
To create a new imgfont use `lv_imgfont_create(height, path_cb)`.
`height` used to indicate the size of a imgfont.
`path_cb` Used to get the image path of the specified unicode.
Use `lv_imgfont_destroy(imgfont)` to destroy a imgfont that is no longer used.
## Example
```eval_rst
.. include:: ../../examples/others/imgfont/index.rst
```
## API
```eval_rst
.. doxygenfile:: lv_imgfont.h
:project: lvgl
```

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/others/index.md
```
# Others
@@ -9,9 +5,13 @@
.. toctree::
:maxdepth: 1
snapshot
monkey
gridnav
fragment
msg
imgfont
ime_pinyin
```

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/others/monkey.md
```
# Monkey
A simple monkey test. Use random input to stress test the application.

97
docs/others/msg.md Normal file
View File

@@ -0,0 +1,97 @@
# Messaging
Messaging (`lv_msg`) is a classic []publisher subscriber](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) implementation for LVGL.
## IDs
Both the publishers and the subscribers needs to know the message identifiers.
In `lv_msg` these are simple `uint32_t` integers. For example:
```c
#define MSG_DOOR_OPENED 1
#define MSG_DOOR_CLOSED 2
#define MSG_USER_NAME_CHANGED 100
#define MSG_USER_AVATAR_CHANGED 101
```
You can orgnaize the message IDs as you wish.
Both parties also need to know about the format of teh payload. E.g. in the above example
`MSG_DOOR_OPENED` and `MSG_DOOR_CLOSED` has no payload but `MSG_USER_NAME_CHANGED` can have a `const char *` payload containing the user name, and `MSG_USER_AVATAR_CHANGED` a `const void *` image source with the new avatar image.
## Send message
Messages can be sent with `lv_msg_send(msg_id, payload)`. E.g.
```c
lv_msg_send(MSG_USER_DOOR_OPENED, NULL);
lv_msg_send(MSG_USER_NAME_CHANGED, "John Smith");
```
## Subscribe to a message
`lv_msg_subscribe(msg_id, callback, user_data)` can be used to subscribe to message.
The callback should look like this:
```c
static void user_name_subscriber_cb(void * s, lv_msg_t * m)
{
/*s: a subscriber obeject, can be used to unscubscribe*/
/*m: a message object with the msg_id, payload, and user_data (set durung subscription)*/
...do something...
}
```
From `lv_msg_t` the followings can be used to get some data:
- `lv_msg_get_id(m)`
- `lv_msg_get_payload(m)`
- `lv_msg_get_user_data(m)`
## Subscribe with an lv_obj
It's quite typical that an LVGL widget is interested in some messages.
To make it simpler `lv_msg_subsribe_obj(msg_id, obj, user_data)` can be used.
If a new message is published with `msg_id` an `LV_EVENT_MSG_RECEIVED` event will be sent to the object.
For example:
```c
lv_obj_add_event_cb(user_name_label, user_name_label_event_cb, LV_EVENT_MSG_RECEIVED, NULL);
lv_msg_subsribe_obj(MSG_USER_NAME_CHANGED, user_name_label, NULL);
...
void user_name_label_event_cb(lv_event_t * e)
{
lv_obj_t * label = lv_event_get_target(e);
lv_msg_t * m = lv_event_get_msg(e);
lv_label_set_text(label, lv_msg_get_payload(m));
}
```
### Unsubscribe
`lv_msg_subscribe` returns a pointer which can be used to unsubscribe:
```c
void * s1;
s1 = lv_msg_subscribe(MSG_USER_DOOR_OPENED, some_callback, NULL);
...
lv_msg_unsubscribe(s1);
```
## Example
```eval_rst
.. include:: ../../examples/others/msg/index.rst
```
## API
```eval_rst
.. doxygenfile:: lv_msg.h
:project: lvgl
```

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/others/snapshot.md
```
# Snapshot
Snapshot provides APIs to take snapshot image for LVGL object together with its children. The image will look exactly like the object.

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/overview/animation.md
```
# Animations
You can automatically change the value of a variable between a start and an end value using animations.
@@ -29,10 +25,10 @@ lv_anim_init(&a);
*------------------*/
/*Set the "animator" function*/
lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t) lv_obj_set_x);
lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t) lv_obj_set_x);
/*Set target of the animation*/
lv_anim_set_var(&a, obj);
lv_anim_set_var(&a, obj);
/*Length of the animation [ms]*/
lv_anim_set_time(&a, duration);
@@ -52,6 +48,9 @@ lv_anim_set_path(&a, lv_anim_path_ease_in);
/*Set a callback to indicate when the animation is ready (idle).*/
lv_anim_set_ready_cb(&a, ready_cb);
/*Set a callback to indicate when the animation is deleted (idle).*/
lv_anim_set_deleted_cb(&a, deleted_cb);
/*Set a callback to indicate when the animation is started (after delay).*/
lv_anim_set_start_cb(&a, start_cb);

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/overview/color.md
```
# Colors
The color module handles all color-related functions like changing color depth, creating colors from hex code, converting between color depths, mixing colors, etc.
@@ -19,10 +15,10 @@ Create colors from Red, Green and Blue channel values:
lv_color_t c = lv_color_make(red, green, blue);
//From hex code 0x000000..0xFFFFFF interpreted as RED + GREEN + BLUE
lv_color_t c = lv_color_hex(0x123456);
lv_color_t c = lv_color_hex(0x123456);
//From 3 digits. Same as lv_color_hex(0x112233)
lv_color_t c = lv_color_hex3(0x123);
lv_color_t c = lv_color_hex3(0x123);
```
### HSV

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/overview/coords.md
```
# Positions, sizes, and layouts
## Overview
@@ -10,11 +6,11 @@ Similarly to many other parts of LVGL, the concept of setting the coordinates wa
In short this means:
- Explicitly set coordinates are stored in styles (size, position, layouts, etc.)
- support min-width, max-width, min-height, max-height
- have pixel, percentage, and "content" units
- have pixel, percentage, and "content" units
- x=0; y=0 coordinate means the top-left corner of the parent plus the left/top padding plus border width
- width/height means the full size, the "content area" is smaller with padding and border width
- width/height means the full size, the "content area" is smaller with padding and border width
- a subset of flexbox and grid layouts are supported
### Units
- pixel: Simply a position in pixels. An integer always means pixels. E.g. `lv_obj_set_x(btn, 10)`
- percentage: The percentage of the size of the object or its parent (depending on the property). `lv_pct(value)` converts a value to percentage. E.g. `lv_obj_set_width(btn, lv_pct(50))`
@@ -24,13 +20,13 @@ In short this means:
LVGL follows CSS's [border-box](https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing) model.
An object's "box" is built from the following parts:
- bounding box: the width/height of the elements.
- border width: the width of the border.
- padding: space between the sides of the object and its children.
- border width: the width of the border.
- padding: space between the sides of the object and its children.
- content: the content area which is the size of the bounding box reduced by the border width and padding.
![The box models of LVGL: The content area is smaller than the bounding box with the padding and border width](/misc/boxmodel.png)
The border is drawn inside the bounding box. Inside the border LVGL keeps a "padding margin" when placing an object's children.
The border is drawn inside the bounding box. Inside the border LVGL keeps a "padding margin" when placing an object's children.
The outline is drawn outside the bounding box.
@@ -38,19 +34,19 @@ The outline is drawn outside the bounding box.
This section describes special cases in which LVGL's behavior might be unexpected.
#### Postponed coordinate calculation
LVGL doesn't recalculate all the coordinate changes immediately. This is done to improve performance.
LVGL doesn't recalculate all the coordinate changes immediately. This is done to improve performance.
Instead, the objects are marked as "dirty" and before redrawing the screen LVGL checks if there are any "dirty" objects. If so it refreshes their position, size and layout.
In other words, if you need to get the coordinate of an object and the coordinates were just changed, LVGL needs to be forced to recalculate the coordinates.
In other words, if you need to get the coordinate of an object and the coordinates were just changed, LVGL needs to be forced to recalculate the coordinates.
To do this call `lv_obj_update_layout(obj)`.
The size and position might depend on the parent or layout. Therefore `lv_obj_update_layout` recalculates the coordinates of all objects on the screen of `obj`.
#### Removing styles
As it's described in the [Using styles](#using-styles) section, coordinates can also be set via style properties.
As it's described in the [Using styles](#using-styles) section, coordinates can also be set via style properties.
To be more precise, under the hood every style coordinate related property is stored as a style property. If you use `lv_obj_set_x(obj, 20)` LVGL saves `x=20` in the local style of the object.
This is an internal mechanism and doesn't matter much as you use LVGL. However, there is one case in which you need to be aware of the implementation. If the style(s) of an object are removed by
This is an internal mechanism and doesn't matter much as you use LVGL. However, there is one case in which you need to be aware of the implementation. If the style(s) of an object are removed by
```c
lv_obj_remove_style_all(obj)
```
@@ -83,20 +79,20 @@ lv_obj_set_y(obj, 20);
lv_obj_set_pos(obj, 10, 20); //Or in one function
```
By default, the x and y coordinates are measured from the top left corner of the parent's content area.
By default, the x and y coordinates are measured from the top left corner of the parent's content area.
For example if the parent has five pixels of padding on every side the above code will place `obj` at (15, 25) because the content area starts after the padding.
Percentage values are calculated from the parent's content area size.
Percentage values are calculated from the parent's content area size.
```c
lv_obj_set_x(btn, lv_pct(10)); //x = 10 % of parent content area width
```
### Align
In some cases it's convenient to change the origin of the positioning from the default top left. If the origin is changed e.g. to bottom-right, the (0,0) position means: align to the bottom-right corner.
In some cases it's convenient to change the origin of the positioning from the default top left. If the origin is changed e.g. to bottom-right, the (0,0) position means: align to the bottom-right corner.
To change the origin use:
```c
lv_obj_set_align(obj, align);
```
```
To change the alignment and set new coordinates:
```c
@@ -149,7 +145,7 @@ For example to align a label above a button and center the label horizontally:
lv_obj_align_to(label, btn, LV_ALIGN_OUT_TOP_MID, 0, -10);
```
Note that, unlike with `lv_obj_align()`, `lv_obj_align_to()` can not realign the object if its coordinates or the reference object's coordinates change.
Note that, unlike with `lv_obj_align()`, `lv_obj_align_to()` can not realign the object if its coordinates or the reference object's coordinates change.
## Size
@@ -166,7 +162,7 @@ Percentage values are calculated based on the parent's content area size. For ex
lv_obj_set_height(obj, lv_pct(100));
```
The size settings support a special value: `LV_SIZE_CONTENT`. It means the object's size in the respective direction will be set to the size of its children.
The size settings support a special value: `LV_SIZE_CONTENT`. It means the object's size in the respective direction will be set to the size of its children.
Note that only children on the right and bottom sides will be considered and children on the top and left remain cropped. This limitation makes the behavior more predictable.
Objects with `LV_OBJ_FLAG_HIDDEN` or `LV_OBJ_FLAG_FLOATING` will be ignored by the `LV_SIZE_CONTENT` calculation.
@@ -186,15 +182,15 @@ lv_coord_t content_h = lv_obj_get_content_height(obj);
```
## Using styles
Under the hood the position, size and alignment properties are style properties.
Under the hood the position, size and alignment properties are style properties.
The above described "simple functions" hide the style related code for the sake of simplicity and set the position, size, and alignment properties in the local styles of the object.
However, using styles to set the coordinates has some great advantages:
- It makes it easy to set the width/height/etc. for several objects together. E.g. make all the sliders 100x10 pixels sized.
- It makes it easy to set the width/height/etc. for several objects together. E.g. make all the sliders 100x10 pixels sized.
- It also makes possible to modify the values in one place.
- The values can be partially overwritten by other styles. For example `style_btn` makes the object `100x50` by default but adding `style_full_width` overwrites only the width of the object.
- The object can have different position or size depending on state. E.g. 100 px wide in `LV_STATE_DEFAULT` but 120 px in `LV_STATE_PRESSED`.
- Style transitions can be used to make the coordinate changes smooth.
- Style transitions can be used to make the coordinate changes smooth.
Here are some examples to set an object's size using a style:
@@ -207,13 +203,13 @@ lv_obj_t * btn = lv_btn_create(lv_scr_act());
lv_obj_add_style(btn, &style, LV_PART_MAIN);
```
As you will see below there are some other great features of size and position setting.
However, to keep the LVGL API lean, only the most common coordinate setting features have a "simple" version and the more complex features can be used via styles.
As you will see below there are some other great features of size and position setting.
However, to keep the LVGL API lean, only the most common coordinate setting features have a "simple" version and the more complex features can be used via styles.
## Translation
Let's say the there are 3 buttons next to each other. Their position is set as described above.
Now you want to move a button up a little when it's pressed.
Let's say the there are 3 buttons next to each other. Their position is set as described above.
Now you want to move a button up a little when it's pressed.
One way to achieve this is by setting a new Y coordinate for the pressed state:
```c
@@ -255,7 +251,7 @@ lv_obj_add_style(btn3, &style_normal, LV_STATE_DEFAULT);
lv_obj_add_style(btn3, &style_pressed, LV_STATE_PRESSED);
```
Translation is applied from the current position of the object.
Translation is applied from the current position of the object.
Percentage values can be used in translations as well. The percentage is relative to the size of the object (and not to the size of the parent). For example `lv_pct(50)` will move the object with half of its width/height.
@@ -265,11 +261,11 @@ The translation actually moves the object. That means it makes the scrollbars an
## Transformation
Similarly to position, an object's size can be changed relative to the current size as well.
Similarly to position, an object's size can be changed relative to the current size as well.
The transformed width and height are added on both sides of the object. This means a 10 px transformed width makes the object 2x10 pixels wider.
Unlike position translation, the size transformation doesn't make the object "really" larger. In other words scrollbars, layouts, and `LV_SIZE_CONTENT` will not react to the transformed size.
Hence, size transformation is "only" a visual effect.
Unlike position translation, the size transformation doesn't make the object "really" larger. In other words scrollbars, layouts, and `LV_SIZE_CONTENT` will not react to the transformed size.
Hence, size transformation is "only" a visual effect.
This code enlarges a button when it's pressed:
```c
@@ -282,7 +278,7 @@ lv_obj_add_style(btn, &style_pressed, LV_STATE_PRESSED);
```
### Min and Max size
Similarly to CSS, LVGL also supports `min-width`, `max-width`, `min-height` and `max-height`. These are limits preventing an object's size from becoming smaller/larger than these values.
Similarly to CSS, LVGL also supports `min-width`, `max-width`, `min-height` and `max-height`. These are limits preventing an object's size from becoming smaller/larger than these values.
They are especially useful if the size is set by percentage or `LV_SIZE_CONTENT`.
```c
static lv_style_t style_max_height;
@@ -306,9 +302,9 @@ lv_obj_add_style(obj, &style_max_height, LV_STATE_DEFAULT); //Limit the height t
## Layout
### Overview
Layouts can update the position and size of an object's children. They can be used to automatically arrange the children into a line or column, or in much more complicated forms.
Layouts can update the position and size of an object's children. They can be used to automatically arrange the children into a line or column, or in much more complicated forms.
The position and size set by the layout overwrites the "normal" x, y, width, and height settings.
The position and size set by the layout overwrites the "normal" x, y, width, and height settings.
There is only one function that is the same for every layout: `lv_obj_set_layout(obj, <LAYOUT_NAME>)` sets the layout on an object.
For further settings of the parent and children see the documentation of the given layout.

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/overview/display.md
```
# Displays
``` important:: The basic concept of a *display* in LVGL is explained in the [Porting](/porting/display) section. So before reading further, please read the [Porting](/porting/display) section first.
@@ -9,7 +5,7 @@
## Multiple display support
In LVGL you can have multiple displays, each with their own driver and objects. The only limitation is that every display needs to have the same color depth (as defined in `LV_COLOR_DEPTH`).
In LVGL you can have multiple displays, each with their own driver and objects. The only limitation is that every display needs to have the same color depth (as defined in `LV_COLOR_DEPTH`).
If the displays are different in this regard the rendered image can be converted to the correct format in the drivers `flush_cb`.
Creating more displays is easy: just initialize more display buffers and register another driver for every display.
@@ -61,17 +57,16 @@ Screens can be deleted with `lv_obj_del(scr)`, but ensure that you do not delete
### Transparent screens
Usually, the opacity of the screen is `LV_OPA_COVER` to provide a solid background for its children. If this is not the case (opacity &lt; 100%) the display's background color or image will be visible.
See the [Display background](#display-background) section for more details. If the display's background opacity is also not `LV_OPA_COVER` LVGL has no solid background to draw.
Usually, the opacity of the screen is `LV_OPA_COVER` to provide a solid background for its children. If this is not the case (opacity &lt; 100%) the display's background color or image will be visible.
See the [Display background](#display-background) section for more details. If the display's background opacity is also not `LV_OPA_COVER` LVGL has no solid background to draw.
This configuration (transparent screen and display) could be used to create for example OSD menus where a video is played on a lower layer, and a menu is overlayed on an upper layer.
To handle transparent displays, special (slower) color mixing algorithms need to be used by LVGL so this feature needs to enabled with `LV_COLOR_SCREEN_TRANSP` in `lv_conf.h`.
As this mode operates on the Alpha channel of the pixels `LV_COLOR_DEPTH = 32` is also required. The Alpha channel of 32-bit colors will be 0 where there are no objects and 255 where there are solid objects.
To handle transparent displays, special (slower) color mixing algorithms need to be used by LVGL so this feature needs to enabled with `LV_COLOR_SCREEN_TRANSP` in `lv_conf.h`.
The Alpha channel of 32-bit colors will be 0 where there are no objects and 255 where there are solid objects.
In summary, to enable transparent screens and displays for OSD menu-like UIs:
- Enable `LV_COLOR_SCREEN_TRANSP` in `lv_conf.h`
- Be sure to use `LV_COLOR_DEPTH 32`
- Set the screen's opacity to `LV_OPA_TRANSP` e.g. with `lv_obj_set_style_local_bg_opa(lv_scr_act(), LV_OBJMASK_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP)`
- Set the display opacity to `LV_OPA_TRANSP` with `lv_disp_set_bg_opa(NULL, LV_OPA_TRANSP);`
@@ -92,7 +87,7 @@ The background color is a simple color to fill the display. It can be adjusted w
The display background image is a path to a file or a pointer to an `lv_img_dsc_t` variable (converted image data) to be used as wallpaper. It can be set with `lv_disp_set_bg_image(disp, &my_img)`;
If a background image is configured the background won't be filled with `bg_color`.
The opacity of the background color or image can be adjusted with `lv_disp_set_bg_opa(disp, opa)`.
The opacity of the background color or image can be adjusted with `lv_disp_set_bg_opa(disp, opa)`.
The `disp` parameter of these functions can be `NULL` to select the default display.

View File

@@ -1,24 +1,20 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/overview/drawing.md
```
# Drawing
With LVGL, you don't need to draw anything manually. Just create objects (like buttons, labels, arc, etc.), move and change them, and LVGL will refresh and redraw what is required.
However, it can be useful to have a basic understanding of how drawing happens in LVGL to add customization, make it easier to find bugs or just out of curiosity.
The basic concept is to not draw directly onto the display but rather to first draw on an internal draw buffer. When a drawing (rendering) is ready that buffer is copied to the display.
The basic concept is to not draw directly onto the display but rather to first draw on an internal draw buffer. When a drawing (rendering) is ready that buffer is copied to the display.
The draw buffer can be smaller than a display's size. LVGL will simply render in "tiles" that fit into the given draw buffer.
This approach has two main advantages compared to directly drawing to the display:
1. It avoids flickering while the layers of the UI are drawn. For example, if LVGL drew directly onto the display, when drawing a *background + button + text*, each "stage" would be visible for a short time.
2. It's faster to modify a buffer in internal RAM and finally write one pixel only once than reading/writing the display directly on each pixel access.
(e.g. via a display controller with SPI interface).
2. It's faster to modify a buffer in internal RAM and finally write one pixel only once than reading/writing the display directly on each pixel access.
(e.g. via a display controller with SPI interface).
Note that this concept is different from "traditional" double buffering where there are two display sized frame buffers:
one holds the current image to show on the display, and rendering happens to the other (inactive) frame buffer, and they are swapped when the rendering is finished.
Note that this concept is different from "traditional" double buffering where there are two display sized frame buffers:
one holds the current image to show on the display, and rendering happens to the other (inactive) frame buffer, and they are swapped when the rendering is finished.
The main difference is that with LVGL you don't have to store two frame buffers (which usually requires external RAM) but only smaller draw buffer(s) that can easily fit into internal RAM.
@@ -35,7 +31,7 @@ LVGL refreshes the screen in the following steps:
- Objects on other screens are not added.
3. In every `LV_DISP_DEF_REFR_PERIOD` (set in `lv_conf.h`) the following happens:
- LVGL checks the invalid areas and joins those that are adjacent or intersecting.
- Takes the first joined area, if it's smaller than the *draw buffer*, then simply renders the area's content into the *draw buffer*.
- Takes the first joined area, if it's smaller than the *draw buffer*, then simply renders the area's content into the *draw buffer*.
If the area doesn't fit into the buffer, draw as many lines as possible to the *draw buffer*.
- When the area is rendered, call `flush_cb` from the display driver to refresh the display.
- If the area was larger than the buffer, render the remaining parts too.
@@ -50,27 +46,27 @@ The difference between buffering modes regarding the drawing mechanism is the fo
3. **Double buffering** - `flush_cb` should only swap the addresses of the frame buffers.
## Masking
*Masking* is the basic concept of LVGL's draw engine.
To use LVGL it's not required to know about the mechanisms described here but you might find interesting to know how drawing works under hood.
*Masking* is the basic concept of LVGL's draw engine.
To use LVGL it's not required to know about the mechanisms described here but you might find interesting to know how drawing works under hood.
Knowing about masking comes in handy if you want to customize drawing.
To learn about masking let's see the steps of drawing first.
To learn about masking let's see the steps of drawing first.
LVGL performs the following steps to render any shape, image or text. It can be considered as a drawing pipeline.
1. **Prepare the draw descriptors** Create a draw descriptor from an object's styles (e.g. `lv_draw_rect_dsc_t`). This gives us the parameters for drawing, for example colors, widths, opacity, fonts, radius, etc.
2. **Call the draw function** Call the draw function with the draw descriptor and some other parameters (e.g. `lv_draw_rect()`). It will render the primitive shape to the current draw buffer.
1. **Prepare the draw descriptors** Create a draw descriptor from an object's styles (e.g. `lv_draw_rect_dsc_t`). This gives us the parameters for drawing, for example colors, widths, opacity, fonts, radius, etc.
2. **Call the draw function** Call the draw function with the draw descriptor and some other parameters (e.g. `lv_draw_rect()`). It will render the primitive shape to the current draw buffer.
3. **Create masks** If the shape is very simple and doesn't require masks, go to #5. Otherwise, create the required masks in the draw function. (e.g. a rounded rectangle mask)
4. **Calculate all the added mask** It composites opacity values into a *mask buffer* with the "shape" of the created masks.
4. **Calculate all the added mask** It composites opacity values into a *mask buffer* with the "shape" of the created masks.
E.g. in case of a "line mask" according to the parameters of the mask, keep one side of the buffer as it is (255 by default) and set the rest to 0 to indicate that this side should be removed.
5. **Blend a color or image** During blending, masking (make some pixels transparent or opaque), blending modes (additive, subtractive, etc.) and color/image opacity are handled.
LVGL has the following built-in mask types which can be calculated and applied real-time:
- `LV_DRAW_MASK_TYPE_LINE` Removes a side from a line (top, bottom, left or right). `lv_draw_line` uses four instances of it.
- `LV_DRAW_MASK_TYPE_LINE` Removes a side from a line (top, bottom, left or right). `lv_draw_line` uses four instances of it.
Essentially, every (skew) line is bounded with four line masks forming a rectangle.
- `LV_DRAW_MASK_TYPE_RADIUS` Removes the inner or outer corners of a rectangle with a radiused transition. It's also used to create circles by setting the radius to large value (`LV_RADIUS_CIRCLE`)
- `LV_DRAW_MASK_TYPE_ANGLE` Removes a circular sector. It is used by `lv_draw_arc` to remove the "empty" sector.
- `LV_DRAW_MASK_TYPE_FADE` Create a vertical fade (change opacity)
- `LV_DRAW_MASK_TYPE_MAP` The mask is stored in a bitmap array and the necessary parts are applied
- `LV_DRAW_MASK_TYPE_RADIUS` Removes the inner or outer corners of a rectangle with a radiused transition. It's also used to create circles by setting the radius to large value (`LV_RADIUS_CIRCLE`)
- `LV_DRAW_MASK_TYPE_ANGLE` Removes a circular sector. It is used by `lv_draw_arc` to remove the "empty" sector.
- `LV_DRAW_MASK_TYPE_FADE` Create a vertical fade (change opacity)
- `LV_DRAW_MASK_TYPE_MAP` The mask is stored in a bitmap array and the necessary parts are applied
Masks are used to create almost every basic primitive:
- **letters** Create a mask from the letter and draw a rectangle with the letter's color using the mask.
@@ -91,18 +87,18 @@ Every mask type has a related parameter structure to describe the mask's data. T
- `lv_draw_mask_map_param_t`
1. Initialize a mask parameter with `lv_draw_mask_<type>_init`. See `lv_draw_mask.h` for the whole API.
2. Add the mask parameter to the draw engine with `int16_t mask_id = lv_draw_mask_add(&param, ptr)`. `ptr` can be any pointer to identify the mask, (`NULL` if unused).
2. Add the mask parameter to the draw engine with `int16_t mask_id = lv_draw_mask_add(&param, ptr)`. `ptr` can be any pointer to identify the mask, (`NULL` if unused).
3. Call the draw functions
4. Remove the mask from the draw engine with `lv_draw_mask_remove_id(mask_id)` or `lv_draw_mask_remove_custom(ptr)`.
5. Free the parameter with `lv_draw_mask_free_param(&param)`.
A parameter can be added and removed any number of times, but it needs to be freed when not required anymore.
A parameter can be added and removed any number of times, but it needs to be freed when not required anymore.
`lv_draw_mask_add` saves only the pointer of the mask so the parameter needs to be valid while in use.
`lv_draw_mask_add` saves only the pointer of the mask so the parameter needs to be valid while in use.
## Hook drawing
Although widgets can be easily customized by styles there might be cases when something more custom is required.
To ensure a great level of flexibility LVGL sends a lot of events during drawing with parameters that tell what LVGL is about to draw.
Although widgets can be easily customized by styles there might be cases when something more custom is required.
To ensure a great level of flexibility LVGL sends a lot of events during drawing with parameters that tell what LVGL is about to draw.
Some fields of these parameters can be modified to draw something else or any custom drawing operations can be added manually.
A good use case for this is the [Button matrix](/widgets/core/btnmatrix) widget. By default, its buttons can be styled in different states, but you can't style the buttons one by one.
@@ -114,7 +110,7 @@ Each of these events is described in detail below.
These events are related to the actual drawing of an object. E.g. the drawing of buttons, texts, etc. happens here.
`lv_event_get_clip_area(event)` can be used to get the current clip area. The clip area is required in draw functions to make them draw only on a limited area.
`lv_event_get_clip_area(event)` can be used to get the current clip area. The clip area is required in draw functions to make them draw only on a limited area.
#### LV_EVENT_DRAW_MAIN_BEGIN
@@ -131,7 +127,7 @@ Called when the main drawing is finished. You can draw anything here as well and
### Post drawing
Post drawing events are called when all the children of an object are drawn. For example LVGL use the post drawing phase to draw scrollbars because they should be above all of the children.
Post drawing events are called when all the children of an object are drawn. For example LVGL use the post drawing phase to draw scrollbars because they should be above all of the children.
`lv_event_get_clip_area(event)` can be used to get the current clip area.
@@ -152,7 +148,7 @@ Called when post drawing has finished. If masks were not removed in `LV_EVENT_DR
When LVGL draws a part of an object (e.g. a slider's indicator, a table's cell or a button matrix's button) it sends events before and after drawing that part with some context of the drawing.
This allows changing the parts on a very low level with masks, extra drawing, or changing the parameters that LVGL is planning to use for drawing.
In these events an `lv_obj_draw_part_t` structure is used to describe the context of the drawing. Not all fields are set for every part and widget.
In these events an `lv_obj_draw_part_t` structure is used to describe the context of the drawing. Not all fields are set for every part and widget.
To see which fields are set for a widget refer to the widget's documentation.
`lv_obj_draw_part_t` has the following fields:
@@ -170,14 +166,14 @@ lv_draw_line_dsc_t * line_dsc; // A draw descriptor that can be modified to
lv_draw_img_dsc_t * img_dsc; // A draw descriptor that can be modified to changed what LVGL will draw. Set only for image-like parts
lv_draw_arc_dsc_t * arc_dsc; // A draw descriptor that can be modified to changed what LVGL will draw. Set only for arc-like parts
// Other parameters
// Other parameters
lv_area_t * draw_area; // The area of the part being drawn
const lv_point_t * p1; // A point calculated during drawing. E.g. a point of a chart or the center of an arc.
const lv_point_t * p2; // A point calculated during drawing. E.g. a point of a chart.
char text[16]; // A text calculated during drawing. Can be modified. E.g. tick labels on a chart axis.
lv_coord_t radius; // E.g. the radius of an arc (not the corner radius).
int32_t value; // A value calculated during drawing. E.g. Chart's tick line value.
const void * sub_part_ptr; // A pointer the identifies something in the part. E.g. chart series.
const void * sub_part_ptr; // A pointer the identifies something in the part. E.g. chart series.
```
`lv_event_get_draw_part_dsc(event)` can be used to get a pointer to `lv_obj_draw_part_t`.
@@ -185,16 +181,16 @@ const void * sub_part_ptr; // A pointer the identifies something in the
#### LV_EVENT_DRAW_PART_BEGIN
Start the drawing of a part. This is a good place to modify the draw descriptors (e.g. `rect_dsc`), or add masks.
#### LV_EVENT_DRAW_PART_END
Finish the drawing of a part. This is a good place to draw extra content on the part or remove masks added in `LV_EVENT_DRAW_PART_BEGIN`.
### Others
#### LV_EVENT_COVER_CHECK
#### LV_EVENT_COVER_CHECK
This event is used to check whether an object fully covers an area or not.
This event is used to check whether an object fully covers an area or not.
`lv_event_get_cover_area(event)` returns a pointer to an area to check and `lv_event_set_cover_res(event, res)` can be used to set one of these results:
- `LV_COVER_RES_COVER` the area is fully covered by the object
@@ -207,19 +203,19 @@ Here are some reasons why an object would be unable to fully cover an area:
- It doesn't have 100% background opacity
- It's an ARGB or chroma keyed image
- It does not have normal blending mode. In this case LVGL needs to know the colors under the object to apply blending properly
- It's a text, etc
- It's a text, etc
In short if for any reason the area below an object is visible than the object doesn't cover that area.
Before sending this event LVGL checks if at least the widget's coordinates fully cover the area or not. If not the event is not called.
You need to check only the drawing you have added. The existing properties known by a widget are handled in its internal events.
E.g. if a widget has &gt; 0 radius it might not cover an area, but you need to handle `radius` only if you will modify it and the widget won't know about it.
You need to check only the drawing you have added. The existing properties known by a widget are handled in its internal events.
E.g. if a widget has &gt; 0 radius it might not cover an area, but you need to handle `radius` only if you will modify it and the widget won't know about it.
#### LV_EVENT_REFR_EXT_DRAW_SIZE
If you need to draw outside a widget, LVGL needs to know about it to provide extra space for drawing.
If you need to draw outside a widget, LVGL needs to know about it to provide extra space for drawing.
Let's say you create an event which writes the current value of a slider above its knob. In this case LVGL needs to know that the slider's draw area should be larger with the size required for the text.
You can simply set the required draw area with `lv_event_set_ext_draw_size(e, size)`.
You can simply set the required draw area with `lv_event_set_ext_draw_size(e, size)`.

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/overview/event.md
```
# Events
Events are triggered in LVGL when something happens which might be interesting to the user, e.g. when an object
@@ -42,7 +38,7 @@ lv_obj_add_event_cb(obj, increment_on_click, LV_EVENT_CLICKED, &num1);
lv_obj_add_event_cb(obj, increment_on_click, LV_EVENT_CLICKED, &num2);
```
The events will be called in the order as they were added.
The events will be called in the order as they were added.
Other objects can use the same *event callback*.
@@ -50,7 +46,7 @@ Other objects can use the same *event callback*.
## Remove event(s) from an object
Events can be removed from an object with the `lv_obj_remove_event_cb(obj, event_cb)` function or `lv_obj_remove_event_dsc(obj, event_dsc)`. `event_dsc` is a pointer returned by `lv_obj_add_event_cb`.
Events can be removed from an object with the `lv_obj_remove_event_cb(obj, event_cb)` function or `lv_obj_remove_event_dsc(obj, event_dsc)`. `event_dsc` is a pointer returned by `lv_obj_add_event_cb`.
## Event codes
@@ -61,9 +57,9 @@ The event codes can be grouped into these categories:
- Special events
- Custom events
All objects (such as Buttons/Labels/Sliders etc.) regardless their type receive the *Input device*, *Drawing* and *Other* events.
All objects (such as Buttons/Labels/Sliders etc.) regardless their type receive the *Input device*, *Drawing* and *Other* events.
However, the *Special events* are specific to a particular widget type. See the [widgets' documentation](/widgets/index) to learn when they are sent,
However, the *Special events* are specific to a particular widget type. See the [widgets' documentation](/widgets/index) to learn when they are sent,
*Custom events* are added by the user and are never sent by LVGL.
@@ -72,21 +68,21 @@ The following event codes exist:
### Input device events
- `LV_EVENT_PRESSED` An object has been pressed
- `LV_EVENT_PRESSING` An object is being pressed (called continuously while pressing)
- `LV_EVENT_PRESS_LOST` An object is still being pressed but slid cursor/finger off of the object
- `LV_EVENT_PRESS_LOST` An object is still being pressed but slid cursor/finger off of the object
- `LV_EVENT_SHORT_CLICKED` An object was pressed for a short period of time, then released. Not called if scrolled.
- `LV_EVENT_LONG_PRESSED` An object has been pressed for at least the `long_press_time` specified in the input device driver. Not called if scrolled.
- `LV_EVENT_LONG_PRESSED_REPEAT` Called after `long_press_time` in every `long_press_repeat_time` ms. Not called if scrolled.
- `LV_EVENT_CLICKED` Called on release if an object did not scroll (regardless of long press)
- `LV_EVENT_RELEASED` Called in every case when an object has been released
- `LV_EVENT_SCROLL_BEGIN` Scrolling begins. The event parameter is `NULL` or an `lv_anim_t *` with a scroll animation descriptor that can be modified if required.
- `LV_EVENT_SCROLL_BEGIN` Scrolling begins. The event parameter is `NULL` or an `lv_anim_t *` with a scroll animation descriptor that can be modified if required.
- `LV_EVENT_SCROLL_END` Scrolling ends.
- `LV_EVENT_SCROLL` An object was scrolled
- `LV_EVENT_GESTURE` A gesture is detected. Get the gesture with `lv_indev_get_gesture_dir(lv_indev_get_act());`
- `LV_EVENT_KEY` A key is sent to an object. Get the key with `lv_indev_get_key(lv_indev_get_act());`
- `LV_EVENT_FOCUSED` An object is focused
- `LV_EVENT_FOCUSED` An object is focused
- `LV_EVENT_DEFOCUSED` An object is unfocused
- `LV_EVENT_LEAVE` An object is unfocused but still selected
- `LV_EVENT_HIT_TEST` Perform advanced hit-testing. Use `lv_hit_test_info_t * a = lv_event_get_hit_test_info(e)` and check if `a->point` can click the object or not. If not set `a->res = false`
- `LV_EVENT_HIT_TEST` Perform advanced hit-testing. Use `lv_hit_test_info_t * a = lv_event_get_hit_test_info(e)` and check if `a->point` can click the object or not. If not set `a->res = false`
### Drawing events
@@ -102,7 +98,7 @@ The following event codes exist:
- `LV_EVENT_DRAW_PART_END` Finishing to draw a part. The event parameter is `lv_obj_draw_dsc_t *`. Learn more [here](/overview/drawing).
In `LV_EVENT_DRAW_...` events it's not allowed to adjust the widgets' properties. E.g. you can not call `lv_obj_set_width()`.
In other words only `get` functions can be called.
In other words only `get` functions can be called.
### Other events
- `LV_EVENT_DELETE` Object is being deleted
@@ -123,11 +119,11 @@ In other words only `get` functions can be called.
- `LV_EVENT_INSERT` Text is being inserted into the object. The event data is `char *` being inserted.
- `LV_EVENT_REFRESH` Notify the object to refresh something on it (for the user)
- `LV_EVENT_READY` A process has finished
- `LV_EVENT_CANCEL` A process has been canceled
- `LV_EVENT_CANCEL` A process has been canceled
### Custom events
Any custom event codes can be registered by `uint32_t MY_EVENT_1 = lv_event_register_id();`
Any custom event codes can be registered by `uint32_t MY_EVENT_1 = lv_event_register_id();`
They can be sent to any object with `lv_event_send(obj, MY_EVENT_1, &some_data)`
@@ -157,14 +153,14 @@ lv_event_send(mbox, LV_EVENT_VALUE_CHANGED, &btn_id);
- `lv_event_get_current_target(e)` get the object to which an event was sent. I.e. the object whose event handler is being called.
- `lv_event_get_target(e)` get the object that originally triggered the event (different from `lv_event_get_target` if [event bubbling](#event-bubbling) is enabled)
- `lv_event_get_user_data(e)` get the pointer passed as the last parameter of `lv_obj_add_event_cb`.
- `lv_event_get_param(e)` get the parameter passed as the last parameter of `lv_event_send`
- `lv_event_get_param(e)` get the parameter passed as the last parameter of `lv_event_send`
## Event bubbling
If `lv_obj_add_flag(obj, LV_OBJ_FLAG_EVENT_BUBBLE)` is enabled all events will be sent to an object's parent too. If the parent also has `LV_OBJ_FLAG_EVENT_BUBBLE` enabled the event will be sent to its parent and so on.
If `lv_obj_add_flag(obj, LV_OBJ_FLAG_EVENT_BUBBLE)` is enabled all events will be sent to an object's parent too. If the parent also has `LV_OBJ_FLAG_EVENT_BUBBLE` enabled the event will be sent to its parent and so on.
The *target* parameter of the event is always the current target object, not the original object. To get the original target call `lv_event_get_original_target(e)` in the event handler.
The *target* parameter of the event is always the current target object, not the original object. To get the original target call `lv_event_get_original_target(e)` in the event handler.

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/overview/file-system.md
```
# File system
LVGL has a 'File system' abstraction module that enables you to attach any type of file system.
@@ -21,7 +17,7 @@ static lv_fs_drv_t drv; /*Needs to be static or global*/
lv_fs_drv_init(&drv); /*Basic initialization*/
drv.letter = 'S'; /*An uppercase letter to identify the drive */
drv.cache_size = my_cahce_size; /*Cache size for reading in bytes. 0 to not cache.*/
drv.cache_size = my_cache_size; /*Cache size for reading in bytes. 0 to not cache.*/
drv.ready_cb = my_ready_cb; /*Callback to tell if the drive is ready to use */
drv.open_cb = my_open_cb; /*Callback to open a file */
@@ -54,7 +50,7 @@ void * (*open_cb)(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode);
`path` is the path after the drive letter (e.g. "S:path/to/file.txt" -> "path/to/file.txt"). `mode` can be `LV_FS_MODE_WR` or `LV_FS_MODE_RD` to open for writes or reads.
The return value is a pointer to a *file object* that describes the opened file or `NULL` if there were any issues (e.g. the file wasn't found).
The return value is a pointer to a *file object* that describes the opened file or `NULL` if there were any issues (e.g. the file wasn't found).
The returned file object will be passed to other file system related callbacks. (see below)
### Other callbacks
@@ -63,7 +59,7 @@ The other callbacks are quite similar. For example `write_cb` looks like this:
lv_fs_res_t (*write_cb)(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw);
```
For `file_p`, LVGL passes the return value of `open_cb`, `buf` is the data to write, `btw` is the Bytes To Write, `bw` is the actually written bytes.
For `file_p`, LVGL passes the return value of `open_cb`, `buf` is the data to write, `btw` is the Bytes To Write, `bw` is the actually written bytes.
For a template of these callbacks see [lv_fs_template.c](https://github.com/lvgl/lvgl/blob/master/examples/porting/lv_port_fs_template.c).

View File

@@ -1,10 +1,6 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/overview/font.md
```
# Fonts
In LVGL fonts are collections of bitmaps and other information required to render images of individual letters (glyph).
In LVGL fonts are collections of bitmaps and other information required to render images of individual letters (glyph).
A font is stored in a `lv_font_t` variable and can be set in a style's *text_font* field. For example:
```c
lv_style_set_text_font(&my_style, &lv_font_montserrat_28); /*Set a larger font*/
@@ -13,7 +9,7 @@ lv_style_set_text_font(&my_style, &lv_font_montserrat_28); /*Set a larger font*
Fonts have a **bpp (bits per pixel)** property. It shows how many bits are used to describe a pixel in a font. The value stored for a pixel determines the pixel's opacity.
This way, with higher *bpp*, the edges of the letter can be smoother. The possible *bpp* values are 1, 2, 4 and 8 (higher values mean better quality).
The *bpp* property also affects the amount of memory needed to store a font. For example, *bpp = 4* makes a font nearly four times larger compared to *bpp = 1*.
The *bpp* property also affects the amount of memory needed to store a font. For example, *bpp = 4* makes a font nearly four times larger compared to *bpp = 1*.
## Unicode support
@@ -54,7 +50,7 @@ Containing all the ASCII characters, the degree symbol (U+00B0), the bullet symb
- `LV_FONT_MONTSERRAT_48` 48 px font
### Special fonts
- `LV_FONT_MONTSERRAT_12_SUBPX` Same as normal 12 px font but with [subpixel rendering](#subpixel-rendering)
- `LV_FONT_MONTSERRAT_12_SUBPX` Same as normal 12 px font but with [subpixel rendering](#subpixel-rendering)
- `LV_FONT_MONTSERRAT_28_COMPRESSED` Same as normal 28 px font but stored as a [compressed font](#compress-fonts) with 3 bpp
- `LV_FONT_DEJAVU_16_PERSIAN_HEBREW` 16 px font with normal range + Hebrew, Arabic, Persian letters and all their forms
- `LV_FONT_SIMSUN_16_CJK`16 px font with normal range plus 1000 of the most common CJK radicals
@@ -75,7 +71,7 @@ The symbols can be used singly as:
lv_label_set_text(my_label, LV_SYMBOL_OK);
```
Or with together with strings (compile time string concatenation):
Or together with strings (compile time string concatenation):
```c
lv_label_set_text(my_label, LV_SYMBOL_OK "Apply");
```
@@ -88,7 +84,7 @@ lv_label_set_text(my_label, LV_SYMBOL_OK LV_SYMBOL_WIFI LV_SYMBOL_PLAY);
## Special features
### Bidirectional support
Most languages use a Left-to-Right (LTR for short) writing direction, however some languages (such as Hebrew, Persian or Arabic) use Right-to-Left (RTL for short) direction.
Most languages use a Left-to-Right (LTR for short) writing direction, however some languages (such as Hebrew, Persian or Arabic) use Right-to-Left (RTL for short) direction.
LVGL not only supports RTL texts but supports mixed (a.k.a. bidirectional, BiDi) text rendering too. Some examples:
@@ -97,8 +93,8 @@ LVGL not only supports RTL texts but supports mixed (a.k.a. bidirectional, BiDi)
BiDi support is enabled by `LV_USE_BIDI` in *lv_conf.h*
All texts have a base direction (LTR or RTL) which determines some rendering rules and the default alignment of the text (Left or Right).
However, in LVGL, the base direction is not only applied to labels. It's a general property which can be set for every object.
If not set then it will be inherited from the parent.
However, in LVGL, the base direction is not only applied to labels. It's a general property which can be set for every object.
If not set then it will be inherited from the parent.
This means it's enough to set the base direction of a screen and every object will inherit it.
The default base direction for screens can be set by `LV_BIDI_BASE_DIR_DEF` in *lv_conf.h* and other objects inherit the base direction from their parent.
@@ -119,12 +115,12 @@ This list summarizes the effect of RTL base direction on objects:
- The texts in `lv_table`, `lv_btnmatrix`, `lv_keyboard`, `lv_tabview`, `lv_dropdown`, `lv_roller` are "BiDi processed" to be displayed correctly
### Arabic and Persian support
There are some special rules to display Arabic and Persian characters: the *form* of a character depends on its position in the text.
A different form of the same letter needs to be used if is isolated, at start, middle or end positions. Besides these, some conjunction rules should also be taken into account.
There are some special rules to display Arabic and Persian characters: the *form* of a character depends on its position in the text.
A different form of the same letter needs to be used when it is isolated, at start, middle or end positions. Besides these, some conjunction rules should also be taken into account.
LVGL supports these rules if `LV_USE_ARABIC_PERSIAN_CHARS` is enabled.
However, there some limitations:
However, there are some limitations:
- Only displaying text is supported (e.g. on labels), text inputs (e.g. text area) don't support this feature.
- Static text (i.e. const) is not processed. E.g. texts set by `lv_label_set_text()` will be "Arabic processed" but `lv_lable_set_text_static()` won't.
- Text get functions (e.g. `lv_label_get_text()`) will return the processed text.
@@ -133,21 +129,21 @@ However, there some limitations:
Subpixel rendering allows for tripling the horizontal resolution by rendering anti-aliased edges on Red, Green and Blue channels instead of at pixel level granularity. This takes advantage of the position of physical color channels of each pixel, resulting in higher quality letter anti-aliasing. Learn more [here](https://en.wikipedia.org/wiki/Subpixel_rendering).
For subpixel rendering, the fonts need to be generated with special settings:
For subpixel rendering, the fonts need to be generated with special settings:
- In the online converter tick the `Subpixel` box
- In the command line tool use `--lcd` flag. Note that the generated font needs about three times more memory.
Subpixel rendering works only if the color channels of the pixels have a horizontal layout. That is the R, G, B channels are next each other and not above each other.
Subpixel rendering works only if the color channels of the pixels have a horizontal layout. That is the R, G, B channels are next to each other and not above each other.
The order of color channels also needs to match with the library settings. By default, LVGL assumes `RGB` order, however this can be swapped by setting `LV_SUBPX_BGR 1` in *lv_conf.h*.
### Compressed fonts
The bitmaps of fonts can be compressed by
The bitmaps of fonts can be compressed by
- ticking the `Compressed` check box in the online converter
- not passing the `--no-compress` flag to the offline converter (compression is applied by default)
- not passing the `--no-compress` flag to the offline converter (compression is applied by default)
Compression is more effective with larger fonts and higher bpp. However, it's about 30% slower to render compressed fonts.
Therefore it's recommended to compress only the largest fonts of a user interface, because
- they need the most memory
Therefore, it's recommended to compress only the largest fonts of a user interface, because
- they need the most memory
- they can be compressed better
- and probably they are used less frequently then the medium-sized fonts, so the performance cost is smaller.
@@ -161,13 +157,13 @@ There are several ways to add a new font to your project:
To declare a font in a file, use `LV_FONT_DECLARE(my_font_name)`.
To make fonts globally available (like the builtin fonts), add them to `LV_FONT_CUSTOM_DECLARE` in *lv_conf.h*.
To make fonts globally available (like the built-in fonts), add them to `LV_FONT_CUSTOM_DECLARE` in *lv_conf.h*.
## Add new symbols
The built-in symbols are created from the [FontAwesome](https://fontawesome.com/) font.
The built-in symbols are created from the [FontAwesome](https://fontawesome.com/) font.
1. Search for a symbol on [https://fontawesome.com](https://fontawesome.com). For example the [USB symbol](https://fontawesome.com/icons/usb?style=brands). Copy its Unicode ID which is `0xf287` in this case.
2. Open the [Online font converter](https://lvgl.io/tools/fontconverter). Add [FontAwesome.woff](https://lvgl.io/assets/others/FontAwesome5-Solid+Brands+Regular.woff). .
2. Open the [Online font converter](https://lvgl.io/tools/fontconverter). Add [FontAwesome.woff](https://lvgl.io/assets/others/FontAwesome5-Solid+Brands+Regular.woff). .
3. Set the parameters such as Name, Size, BPP. You'll use this name to declare and use the font in your code.
4. Add the Unicode ID of the symbol to the range field. E.g.` 0xf287` for the USB symbol. More symbols can be enumerated with `,`.
5. Convert the font and copy the generated source code to your project. Make sure to compile the .c file of your font.
@@ -178,10 +174,10 @@ The built-in symbols are created from the [FontAwesome](https://fontawesome.com/
2. Create a `define` string from the UTF8 values: `#define MY_USB_SYMBOL "\xEF\x8A\x87"`
3. Create a label and set the text. Eg. `lv_label_set_text(label, MY_USB_SYMBOL)`
Note - `lv_label_set_text(label, MY_USB_SYMBOL)` searches for this symbol in the font defined in `style.text.font` properties. To use the symbol you may need to change it. Eg ` style.text.font = my_font_name`
Note - `lv_label_set_text(label, MY_USB_SYMBOL)` searches for this symbol in the font defined in `style.text.font` properties. To use the symbol you may need to change it. Eg ` style.text.font = my_font_name`
## Load a font at run-time
`lv_font_load` can be used to load a font from a file. The font needs to have a special binary format. (Not TTF or WOFF).
`lv_font_load` can be used to load a font from a file. The font needs to have a special binary format. (Not TTF or WOFF).
Use [lv_font_conv](https://github.com/lvgl/lv_font_conv/) with the `--format bin` option to generate an LVGL compatible font file.
Note that to load a font [LVGL's filesystem](/overview/file-system) needs to be enabled and a driver must be added.
@@ -209,8 +205,8 @@ To do this, a custom `lv_font_t` variable needs to be created:
```c
/*Describe the properties of a font*/
lv_font_t my_font;
my_font.get_glyph_dsc = my_get_glyph_dsc_cb; /*Set a callback to get info about gylphs*/
my_font.get_glyph_bitmap = my_get_glyph_bitmap_cb; /*Set a callback to get bitmap of a glyp*/
my_font.get_glyph_dsc = my_get_glyph_dsc_cb; /*Set a callback to get info about glyphs*/
my_font.get_glyph_bitmap = my_get_glyph_bitmap_cb; /*Set a callback to get bitmap of a glyph*/
my_font.line_height = height; /*The real line height where any text fits*/
my_font.base_line = base_line; /*Base line measured from the top of line_height*/
my_font.dsc = something_required; /*Store any implementation specific data here*/
@@ -254,7 +250,7 @@ const uint8_t * my_get_glyph_bitmap_cb(const lv_font_t * font, uint32_t unicode_
## Use font fallback
You can specify `fallback` in `lv_font_t` to provide fallback to the font. When the font
You can specify `fallback` in `lv_font_t` to provide fallback to the font. When the font
fails to find glyph to a letter, it will try to let font from `fallback` to handle.
`fallback` can be chained, so it will try to solve until there is no `fallback` set.

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/overview/image.md
```
# Images
An image can be a file or a variable which stores the bitmap itself and some metadata.
@@ -267,8 +263,8 @@ To indicate that the *line read* function should be used, set `dsc->img_data = N
LVGL will use registered image decoders automatically if you try and draw a raw image (i.e. using the `lv_img` object) but you can use them manually too. Create an `lv_img_decoder_dsc_t` variable to describe the decoding session and call `lv_img_decoder_open()`.
The `color` parameter is used only with `LV_IMG_CF_ALPHA_1/2/4/8BIT` images to tell color of the image.
`frame_id` can be used if the image to open is an animation.
The `color` parameter is used only with `LV_IMG_CF_ALPHA_1/2/4/8BIT` images to tell color of the image.
`frame_id` can be used if the image to open is an animation.
```c

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/overview/indev.md
```
# Input devices
An input device usually means:
@@ -66,6 +62,8 @@ To prevent passing the gesture event to the parent from an object use `lv_obj_cl
Note that, gestures are not triggered if an object is being scrolled.
If you did some action on a gesture you can call `lv_indev_wait_release(lv_indev_get_act())` in the event handler to prevent LVGL sending further input device related events.
## Keypad and encoder
You can fully control the user interface without a touchpad or mouse by using a keypad or encoder(s). It works similar to the *TAB* key on the PC to select an element in an application or a web page.
@@ -124,9 +122,9 @@ Don't forget to assign one or more input devices to the default group with ` lv_
### Styling
If an object is focused either by clicking it via touchpad or focused via an encoder or keypad it goes to the `LV_STATE_FOCUSED` state. Hence, focused styles will be applied to it.
If an object is focused either by clicking it via touchpad or focused via an encoder or keypad it goes to the `LV_STATE_FOCUSED` state. Hence, focused styles will be applied to it.
If an object switches to edit mode it enters the `LV_STATE_FOCUSED | LV_STATE_EDITED` states so these style properties will be shown.
If an object switches to edit mode it enters the `LV_STATE_FOCUSED | LV_STATE_EDITED` states so these style properties will be shown.
For a more detailed description read the [Style](https://docs.lvgl.io/v7/en/html/overview/style.html) section.

View File

@@ -1,7 +1,3 @@
```eval_rst
.. include:: /header.rst
:github_url: |github_link_base|/overview/index.md
```
# Overview
@@ -27,6 +23,7 @@
animation
timer
drawing
renderers/index
new_widget
```

Some files were not shown because too many files have changed in this diff Show More