From 439df038ee4d8a6d54598692e011071367396973 Mon Sep 17 00:00:00 2001 From: GuEe-GUI <2991707448@qq.com> Date: Fri, 12 Dec 2025 15:58:12 +0800 Subject: [PATCH 1/2] [dm][graphic] support dm mode 1. Add backlight framework for graphic. 2. Add framebuffer and plane, power, EDID for graphic framework 3. Add boot logo render for graphic 4. Update lcd.h Signed-off-by: GuEe-GUI <2991707448@qq.com> --- components/drivers/graphic/Kconfig | 13 +- components/drivers/graphic/SConscript | 23 + components/drivers/graphic/backlight/Kconfig | 7 + .../drivers/graphic/backlight/SConscript | 14 + .../drivers/graphic/backlight/backlight.c | 231 +++ .../drivers/graphic/framebuffer/Kconfig | 8 + .../drivers/graphic/framebuffer/SConscript | 16 + components/drivers/graphic/graphic.c | 1495 +++++++++++++++++ components/drivers/graphic/graphic_primary.c | 381 +++++ components/drivers/graphic/graphic_simple.c | 295 ++++ components/drivers/graphic/logo/.gitignore | 1 + components/drivers/graphic/logo/Kconfig | 31 + components/drivers/graphic/logo/SConscript | 84 + components/drivers/graphic/logo/logo.c | 216 +++ components/drivers/graphic/logo/logo.html | 243 +++ components/drivers/include/drivers/graphic.h | 367 ++++ components/drivers/include/drivers/lcd.h | 33 + examples/test/dm_graphic_test.c | 310 ++++ examples/test/dm_hmi_test.c | 421 +++++ 19 files changed, 4188 insertions(+), 1 deletion(-) create mode 100644 components/drivers/graphic/SConscript create mode 100644 components/drivers/graphic/backlight/Kconfig create mode 100644 components/drivers/graphic/backlight/SConscript create mode 100644 components/drivers/graphic/backlight/backlight.c create mode 100644 components/drivers/graphic/framebuffer/Kconfig create mode 100644 components/drivers/graphic/framebuffer/SConscript create mode 100644 components/drivers/graphic/graphic.c create mode 100644 components/drivers/graphic/graphic_primary.c create mode 100644 components/drivers/graphic/graphic_simple.c create mode 100644 components/drivers/graphic/logo/.gitignore create mode 100644 components/drivers/graphic/logo/Kconfig create mode 100644 components/drivers/graphic/logo/SConscript create mode 100644 components/drivers/graphic/logo/logo.c create mode 100644 components/drivers/graphic/logo/logo.html create mode 100644 components/drivers/include/drivers/graphic.h create mode 100644 examples/test/dm_graphic_test.c create mode 100644 examples/test/dm_hmi_test.c diff --git a/components/drivers/graphic/Kconfig b/components/drivers/graphic/Kconfig index 5ce0835743e..768d594a998 100644 --- a/components/drivers/graphic/Kconfig +++ b/components/drivers/graphic/Kconfig @@ -1,3 +1,14 @@ config RT_USING_LCD - bool "Using LCD graphic drivers" + bool "Using LCD graphic drivers" if !RT_USING_DM default n + +menuconfig RT_USING_GRAPHIC + bool "Using Graphics device drivers" + depends on RT_USING_DM + default n + +if RT_USING_GRAPHIC + rsource "backlight/Kconfig" + rsource "framebuffer/Kconfig" + rsource "logo/Kconfig" +endif diff --git a/components/drivers/graphic/SConscript b/components/drivers/graphic/SConscript new file mode 100644 index 00000000000..300b71afd77 --- /dev/null +++ b/components/drivers/graphic/SConscript @@ -0,0 +1,23 @@ +from building import * + +group = [] +objs = [] + +if not GetDepend(['RT_USING_GRAPHIC']): + Return('group') + +cwd = GetCurrentDir() +list = os.listdir(cwd) +CPPPATH = [cwd + '/../include'] + +src = ['graphic.c', 'graphic_primary.c', 'graphic_simple.c'] + +group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) +objs = objs + group + +Return('objs') diff --git a/components/drivers/graphic/backlight/Kconfig b/components/drivers/graphic/backlight/Kconfig new file mode 100644 index 00000000000..1951e0c05ac --- /dev/null +++ b/components/drivers/graphic/backlight/Kconfig @@ -0,0 +1,7 @@ +menuconfig RT_GRAPHIC_BACKLIGHT + bool "Backlight support" + default n + +if RT_GRAPHIC_BACKLIGHT + osource "$(SOC_DM_GRAPHIC_BACKLIGHT_DIR)/Kconfig" +endif diff --git a/components/drivers/graphic/backlight/SConscript b/components/drivers/graphic/backlight/SConscript new file mode 100644 index 00000000000..6e29db51b3f --- /dev/null +++ b/components/drivers/graphic/backlight/SConscript @@ -0,0 +1,14 @@ +from building import * + +group = [] + +if not GetDepend(['RT_GRAPHIC_BACKLIGHT']): + Return('group') + +cwd = GetCurrentDir() +CPPPATH = [cwd + '/../../include'] + +src = ['backlight.c'] + +group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH) +Return('group') diff --git a/components/drivers/graphic/backlight/backlight.c b/components/drivers/graphic/backlight/backlight.c new file mode 100644 index 00000000000..dce54b112b6 --- /dev/null +++ b/components/drivers/graphic/backlight/backlight.c @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-02-25 GuEe-GUI the first version + */ + +#include + +#define DBG_TAG "rtdm.backlight" +#define DBG_LVL DBG_INFO +#include + +#include +#include +#include + +static struct rt_dm_ida backlight_ida = RT_DM_IDA_INIT(GRAPHIC_BACKLIGHT); + +static rt_ssize_t _backlight_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + rt_ssize_t res; + int brightness_len; + rt_uint32_t brightness; + char string[sizeof("4294967295")]; + struct rt_backlight_device *bl = rt_container_of(dev, struct rt_backlight_device, parent); + + if ((res = rt_backlight_get_brightness(bl, &brightness))) + { + return res; + } + + brightness_len = rt_sprintf(string, "%u", brightness); + + if (pos < brightness_len) + { + size = rt_min_t(rt_size_t, size, brightness_len - pos); + rt_strncpy(buffer, &string[pos], size); + + return size; + } + else + { + return 0; + } +} + +static rt_ssize_t _backlight_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) +{ + rt_ssize_t res; + rt_uint32_t brightness = atoi(buffer); + struct rt_backlight_device *bl = rt_container_of(dev, struct rt_backlight_device, parent); + + if (brightness > bl->props.max_brightness) + { + LOG_D("%s: brightness(%u) > max_brightness(%u)", + rt_dm_dev_get_name(dev), brightness, bl->props.max_brightness); + + return -RT_EINVAL; + } + + if ((res = rt_backlight_set_brightness(bl, brightness))) + { + return res; + } + + LOG_D("%s: brightness to %u", rt_dm_dev_get_name(dev), brightness); + + return size; +} + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops _backlight_ops = +{ + .read = _backlight_read, + .write = _backlight_write, +}; +#endif + +rt_err_t rt_backlight_register(struct rt_backlight_device *bl) +{ + rt_err_t err; + int device_id; + const char *dev_name; + + if (!bl || !bl->ops) + { + return -RT_EINVAL; + } + + if ((device_id = rt_dm_ida_alloc(&backlight_ida)) < 0) + { + return -RT_EFULL; + } + + rt_dm_dev_set_name(&bl->parent, "backlight%u", device_id); + dev_name = rt_dm_dev_get_name(&bl->parent); + + rt_mutex_init(&bl->lock, dev_name, RT_IPC_FLAG_PRIO); + + bl->parent.type = RT_Device_Class_Char; +#ifdef RT_USING_DEVICE_OPS + bl->parent.ops = &_backlight_ops; +#else + bl->parent.read = _backlight_read; + bl->parent.write = _backlight_write; +#endif + bl->parent.master_id = backlight_ida.master_id; + bl->parent.device_id = device_id; + + if ((err = rt_device_register(&bl->parent, dev_name, RT_DEVICE_FLAG_RDWR))) + { + rt_dm_ida_free(&backlight_ida, device_id); + + return err; + } + + return RT_EOK; +} + +rt_err_t rt_backlight_unregister(struct rt_backlight_device *bl) +{ + if (!bl) + { + return -RT_EINVAL; + } + + rt_backlight_set_power(bl, RT_BACKLIGHT_POWER_POWERDOWN); + + rt_dm_ida_free(&backlight_ida, bl->parent.device_id); + + rt_device_unregister(&bl->parent); + + return RT_EOK; +} + +rt_err_t rt_backlight_set_power(struct rt_backlight_device *bl, enum rt_backlight_power power) +{ + rt_err_t err; + enum rt_backlight_power old_power; + + if (!bl || power >= RT_BACKLIGHT_POWER_NR) + { + return -RT_EINVAL; + } + + rt_mutex_take(&bl->lock, RT_WAITING_FOREVER); + + old_power = bl->props.power; + bl->props.power = power; + + if ((err = bl->ops->update_status(bl))) + { + bl->props.power = old_power; + } + + rt_mutex_release(&bl->lock); + + return err; +} + +rt_err_t rt_backlight_get_power(struct rt_backlight_device *bl, enum rt_backlight_power *out_power) +{ + if (!bl || !out_power) + { + return -RT_EINVAL; + } + + rt_mutex_take(&bl->lock, RT_WAITING_FOREVER); + + *out_power = bl->props.power; + + rt_mutex_release(&bl->lock); + + return RT_EOK; +} + +rt_err_t rt_backlight_set_brightness(struct rt_backlight_device *bl, rt_uint32_t brightness) +{ + rt_err_t err; + rt_uint32_t old_brightness; + + if (!bl || brightness > bl->props.max_brightness) + { + return -RT_EINVAL; + } + + rt_mutex_take(&bl->lock, RT_WAITING_FOREVER); + + old_brightness = bl->props.brightness; + bl->props.brightness = brightness; + + if ((err = bl->ops->update_status(bl))) + { + bl->props.brightness = old_brightness; + } + + rt_mutex_release(&bl->lock); + + return err; +} + +rt_err_t rt_backlight_get_brightness(struct rt_backlight_device *bl, rt_uint32_t *out_brightness) +{ + rt_err_t err; + + if (!bl || !out_brightness) + { + return -RT_EINVAL; + } + + rt_mutex_take(&bl->lock, RT_WAITING_FOREVER); + + if (bl->ops->get_brightness) + { + err = bl->ops->get_brightness(bl, out_brightness); + } + else + { + *out_brightness = rt_backlight_power_brightness(bl); + + err = RT_EOK; + } + + rt_mutex_release(&bl->lock); + + return err; +} diff --git a/components/drivers/graphic/framebuffer/Kconfig b/components/drivers/graphic/framebuffer/Kconfig new file mode 100644 index 00000000000..9144377d202 --- /dev/null +++ b/components/drivers/graphic/framebuffer/Kconfig @@ -0,0 +1,8 @@ +menuconfig RT_GRAPHIC_FB + bool "LCD and Frame buffer support" + select RT_USING_LCD + default y + +if RT_GRAPHIC_FB + osource "$(SOC_DM_GRAPHIC_FB_DIR)/Kconfig" +endif diff --git a/components/drivers/graphic/framebuffer/SConscript b/components/drivers/graphic/framebuffer/SConscript new file mode 100644 index 00000000000..55d76c540fc --- /dev/null +++ b/components/drivers/graphic/framebuffer/SConscript @@ -0,0 +1,16 @@ +from building import * + +group = [] + +if not GetDepend(['RT_GRAPHIC_FB']): + Return('group') + +cwd = GetCurrentDir() +list = os.listdir(cwd) +CPPPATH = [cwd + '/../../include'] + +src = [] + +group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/components/drivers/graphic/graphic.c b/components/drivers/graphic/graphic.c new file mode 100644 index 00000000000..d1692c851e1 --- /dev/null +++ b/components/drivers/graphic/graphic.c @@ -0,0 +1,1495 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-02-25 GuEe-GUI the first version + */ + +#include +#include +#include + +#define DBG_TAG "rtdm.graphic" +#define DBG_LVL DBG_INFO +#include + +#define raw_to_graphic(dev) rt_container_of(dev, struct rt_graphic_device, parent) + +struct fb_format +{ + rt_uint32_t mode; + rt_uint32_t bits_per_pixel; + struct fb_bitfield red; + struct fb_bitfield green; + struct fb_bitfield blue; + struct fb_bitfield transp; +}; + +static const struct fb_format graphic_formats[] = +{ + { RTGRAPHIC_PIXEL_FORMAT_GRAY4, 4, }, + { RTGRAPHIC_PIXEL_FORMAT_GRAY16, 16, }, + { RTGRAPHIC_PIXEL_FORMAT_RGB332, 8, { 5, 3 }, { 2, 3 }, { 0, 2 }, }, + { RTGRAPHIC_PIXEL_FORMAT_RGB444, 12, { 8, 4 }, { 4, 4 }, { 0, 4 }, }, + { RTGRAPHIC_PIXEL_FORMAT_RGB565, 16, { 11, 5 }, { 5, 6 }, { 0, 5 }, }, + { RTGRAPHIC_PIXEL_FORMAT_RGB565P, 16, { 0, 5 }, { 5, 6 }, { 11, 5 }, }, + { RTGRAPHIC_PIXEL_FORMAT_BGR565, 16, { 0, 5 }, { 5, 6 }, { 11, 5 }, }, + { RTGRAPHIC_PIXEL_FORMAT_RGB666, 18, { 12, 6 }, { 6, 6 }, { 0, 6 }, }, + { RTGRAPHIC_PIXEL_FORMAT_RGB888, 24, { 16, 8 }, { 8, 8 }, { 0, 8 }, }, + { RTGRAPHIC_PIXEL_FORMAT_BGR888, 24, { 0, 8 }, { 8, 8 }, { 16, 8 }, }, + { RTGRAPHIC_PIXEL_FORMAT_ARGB888, 32, { 16, 8 }, { 8, 8 }, { 0, 8 }, { 24, 8 }, }, + { RTGRAPHIC_PIXEL_FORMAT_ABGR888, 32, { 0, 8 }, { 8, 8 }, { 16, 8 }, { 24, 8 }, }, +}; + +/* RT-Thread device max id is 255 */ +static rt_uint8_t fbcon_map[256] = {}; + +static struct rt_dm_ida graphic_ida = RT_DM_IDA_INIT(GRAPHIC_FRAMEBUFFER); + +rt_inline void spin_lock(struct rt_spinlock *spinlock) +{ + rt_hw_spin_lock(&spinlock->lock); +} + +rt_inline void spin_unlock(struct rt_spinlock *spinlock) +{ + rt_hw_spin_unlock(&spinlock->lock); +} + +static rt_bool_t plane_need_update(struct rt_graphic_plane *plane) +{ + if (plane->ops->update) + { + if (!plane->graphic->update_timer) + { + return RT_TRUE; + } + } + + return RT_FALSE; +} + +static struct rt_graphic_plane *plane_get_current(struct rt_graphic_device *gdev) +{ + if (gdev->ops->current_plane) + { + return gdev->ops->current_plane(gdev); + } + + return gdev->primary_plane; +} + +static rt_err_t plane_fb_remap(struct rt_graphic_plane *plane, + rt_uint32_t mode, struct rt_device_rect_info *rect) +{ + rt_err_t err; + + if (plane->ops->fb_cleanup && (err = plane->ops->fb_cleanup(plane))) + { + return err; + } + + if (!(err = plane->ops->fb_remap(plane, mode, rect))) + { + plane->mode = mode; + plane->x = rect->x; + plane->y = rect->y; + plane->width = rect->width; + plane->height = rect->height; + } + + return err; +} + +static rt_err_t plane_fb_pan_display(struct rt_graphic_plane *plane, + struct rt_device_rect_info *rect) +{ + void *framebuffer_end = plane->framebuffer; + rt_size_t byte_per_pixel = plane->bits_per_pixel / 8; + + framebuffer_end += rect->x * byte_per_pixel; + framebuffer_end += rect->y * plane->line_length; + framebuffer_end += rect->width * rect->height * byte_per_pixel; + + if (framebuffer_end < plane->framebuffer + plane->framebuffer_len) + { + return plane->ops->fb_pan_display(plane, rect); + } + + return -RT_EINVAL; +} + +static rt_err_t graphic_dpms_switch(struct rt_graphic_device *gdev, rt_uint32_t dpms) +{ + rt_err_t err; + + if (!(err = gdev->ops->dpms_switch(gdev, dpms))) + { + gdev->dpms = dpms; + } + + return err; +} + +static rt_err_t _graphic_open(rt_device_t dev, rt_uint16_t oflag) +{ + struct rt_graphic_device *gdev = raw_to_graphic(dev); + struct rt_graphic_plane *plane = gdev->primary_plane; + + if (dev->ref_count > 0 && (oflag & RT_DEVICE_OFLAG_WRONLY)) + { + return -RT_EBUSY; + } + + if (plane->ops->fb_pan_display) + { + struct rt_device_rect_info rect; + + rect.x = 0; + rect.y = 0; + rect.width = plane->width; + rect.height = plane->height; + + return plane->ops->fb_pan_display(plane, &rect); + } + + return RT_EOK; +} + +static rt_ssize_t _graphic_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + rt_ssize_t res; + struct rt_graphic_device *gdev = raw_to_graphic(dev); + struct rt_graphic_plane *plane = gdev->primary_plane; + + res = rt_min_t(rt_ssize_t, plane->framebuffer_len - pos, size); + + if (res > 0) + { + rt_memcpy(buffer, plane->framebuffer + pos, res); + } + else + { + res = 0; + } + + return res; +} + +static rt_ssize_t _graphic_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) +{ + rt_ssize_t res; + struct rt_graphic_device *gdev = raw_to_graphic(dev); + struct rt_graphic_plane *plane = gdev->primary_plane; + + res = rt_min_t(rt_ssize_t, plane->framebuffer_len - pos, size); + + if (res > 0) + { + rt_memcpy(plane->framebuffer + pos, buffer, res); + } + else + { + res = 0; + } + + return res; +} + +static rt_err_t _graphic_control(rt_device_t dev, int cmd, void *args) +{ + rt_err_t err = RT_EOK; + rt_bool_t need_schedule = RT_FALSE; + struct rt_graphic_device *gdev = raw_to_graphic(dev); + +_retry: + if (need_schedule) + { + rt_thread_yield(); + } + + spin_lock(&gdev->lock); + + switch (cmd) + { + case RT_DEVICE_CTRL_CURSOR_SET_POSITION: + if (args) + { + struct rt_graphic_plane *plane = gdev->cursor_plane; + + if (plane) + { + rt_uint32_t position = (rt_uint32_t)(rt_ubase_t)args; + + plane->x = position >> 16; + plane->y = position & 0xffff; + + if (plane_need_update(plane)) + { + struct rt_device_rect_info rect; + + rect.x = plane->x; + rect.y = plane->y; + /* Ask driver to update position only */ + rect.width = 0; + rect.height = 0; + + err = plane->ops->update(plane, &rect); + } + } + else + { + err = -RT_ENOSYS; + } + } + else + { + err = -RT_EINVAL; + } + break; + + case RT_DEVICE_CTRL_CURSOR_SET_TYPE: + if (args) + { + struct rt_graphic_plane *plane = gdev->cursor_plane; + + if (plane) + { + struct rt_device_rect_info rect = + { + .x = 0, + .y = 0, + .width = plane->width, + .height = plane->height, + }; + + if (!plane->framebuffer) + { + rt_uint32_t mode; + + if (plane->mode == RTGRAPHIC_PIXEL_FORMAT_MONO) + { + mode = plane->modes[0]; + } + else + { + mode = plane->mode; + } + + if ((err = plane_fb_remap(plane, mode, &rect))) + { + break; + } + } + + rt_memcpy(plane->framebuffer, args, plane->screen_len); + + /* Force to update */ + err = plane->ops->update(plane, &rect); + } + else + { + err = -RT_ENOSYS; + } + } + else + { + err = -RT_EINVAL; + } + break; + + case RTGRAPHIC_CTRL_RECT_UPDATE: + if (args) + { + struct rt_graphic_plane *plane = plane_get_current(gdev); + + if (plane_need_update(plane)) + { + err = plane->ops->update(plane, args); + } + } + else + { + err = -RT_EINVAL; + } + break; + + case RTGRAPHIC_CTRL_POWERON: + if (gdev->ops->dpms_switch) + { + err = graphic_dpms_switch(gdev, RT_GRAPHIC_DPMS_ON); + } + #ifdef RT_GRAPHIC_BACKLIGHT + if (!err && gdev->backlight) + { + spin_unlock(&gdev->lock); + err = rt_backlight_set_power(gdev->backlight, RT_BACKLIGHT_POWER_NORMAL); + spin_lock(&gdev->lock); + } + #endif /* RT_GRAPHIC_BACKLIGHT */ + break; + + case RTGRAPHIC_CTRL_POWEROFF: + if (gdev->ops->dpms_switch) + { + err = graphic_dpms_switch(gdev, RT_GRAPHIC_DPMS_OFF); + } + #ifdef RT_GRAPHIC_BACKLIGHT + if (!err && gdev->backlight) + { + spin_unlock(&gdev->lock); + err = rt_backlight_set_power(gdev->backlight, RT_BACKLIGHT_POWER_POWERDOWN); + spin_lock(&gdev->lock); + } + #endif /* RT_GRAPHIC_BACKLIGHT */ + break; + + case RTGRAPHIC_CTRL_GET_INFO: + if (args) + { + struct rt_device_graphic_info *info = args; + struct rt_graphic_plane *plane = plane_get_current(gdev); + + info->pixel_format = plane->mode; + info->bits_per_pixel = plane->bits_per_pixel; + info->pitch = plane->line_length; + info->width = plane->width; + info->height = plane->height; + info->framebuffer = plane->framebuffer; + info->smem_len = plane->framebuffer_len; + } + else + { + err = -RT_EINVAL; + } + break; + + case RTGRAPHIC_CTRL_SET_MODE: + if (args) + { + rt_uint32_t mode = (rt_uint32_t)(rt_ubase_t)args; + struct rt_graphic_plane *plane = plane_get_current(gdev); + + if (mode != plane->mode) + { + err = -RT_ENOSYS; + + if (plane->modes_nr > 1) + { + for (int i = 0; i < plane->modes_nr; ++i) + { + if (mode == plane->modes[i]) + { + struct rt_device_rect_info rect = + { + .x = plane->x, + .y = plane->y, + .width = plane->width, + .height = plane->height, + }; + + err = plane_fb_remap(plane, mode, &rect); + break; + } + } + } + } + } + else + { + err = -RT_EINVAL; + } + break; + + case RTGRAPHIC_CTRL_GET_EXT: + if (args) + { + rt_memcpy(args, &gdev->edid, sizeof(gdev->edid)); + } + else + { + err = -RT_EINVAL; + } + break; + + case RTGRAPHIC_CTRL_SET_BRIGHTNESS: + if (gdev->ops->set_brightness) + { + err = gdev->ops->set_brightness(gdev, (rt_uint32_t)(rt_ubase_t)args); + } + #ifdef RT_GRAPHIC_BACKLIGHT + if (!err && gdev->backlight) + { + spin_unlock(&gdev->lock); + + return rt_backlight_set_brightness(gdev->backlight, (rt_uint32_t)(rt_ubase_t)args); + } + #endif /* RT_GRAPHIC_BACKLIGHT */ + break; + + case RTGRAPHIC_CTRL_GET_BRIGHTNESS: + if (args) + { + if (gdev->ops->get_brightness) + { + err = gdev->ops->get_brightness(gdev, args); + } + else + { + *(rt_uint32_t *)args = RT_UINT32_MAX >> 1; + } + } + else + { + err = -RT_EINVAL; + } + #ifdef RT_GRAPHIC_BACKLIGHT + if (!err && gdev->backlight) + { + spin_unlock(&gdev->lock); + + return rt_backlight_get_brightness(gdev->backlight, args); + } + #endif /* RT_GRAPHIC_BACKLIGHT */ + break; + + case RTGRAPHIC_CTRL_GET_MODE: + if (args) + { + struct rt_graphic_plane *plane = plane_get_current(gdev); + + *(rt_uint32_t *)args = plane->mode; + } + else + { + err = -RT_EINVAL; + } + break; + + case RTGRAPHIC_CTRL_GET_STATUS: + if (args) + { + if (gdev->ops->get_status) + { + err = gdev->ops->get_status(gdev, args); + } + else + { + err = -RT_ENOSYS; + } + } + else + { + err = -RT_EINVAL; + } + break; + + case RTGRAPHIC_CTRL_PAN_DISPLAY: + if (args) + { + struct rt_graphic_plane *plane = plane_get_current(gdev); + + if (plane->ops->fb_pan_display) + { + rt_size_t offset; + struct rt_device_rect_info rect; + + offset = (rt_size_t)(args - plane->framebuffer); + + rect.x = (offset % plane->line_length) / (plane->bits_per_pixel / 8); + rect.y = offset / plane->line_length; + rect.width = plane->width; + rect.height = plane->height; + + err = plane_fb_pan_display(plane, &rect); + } + else + { + err = -RT_ENOSYS; + } + } + else + { + err = -RT_EINVAL; + } + break; + + case RTGRAPHIC_CTRL_WAIT_VSYNC: + if (gdev->ops->wait_vsync) + { + err = gdev->ops->wait_vsync(gdev); + } + break; + + case RT_DEVICE_CTRL_NOTIFY_SET: + if (args) + { + if (rt_atomic_load(&gdev->event_notifying) == RT_TRUE) + { + need_schedule = RT_TRUE; + + spin_unlock(&gdev->lock); + goto _retry; + } + + rt_memcpy(&gdev->event_notify, args, sizeof(gdev->event_notify)); + } + else + { + err = -RT_EINVAL; + } + break; + + case FBIOGET_VSCREENINFO: + if (args) + { + struct fb_var_screeninfo *var = args; + struct rt_graphic_plane *plane = plane_get_current(gdev); + + rt_memset(var, 0, sizeof(*var)); + + var->xres = plane->width; + var->yres = plane->height; + var->xres_virtual = plane->width; + var->yres_virtual = plane->height * (plane->framebuffer_len / plane->screen_len); + var->bits_per_pixel = plane->bits_per_pixel; + + if (plane == gdev->primary_plane) + { + var->width = gdev->edid.width_cm ? gdev->edid.width_cm * 10 : -1; + var->height = gdev->edid.height_cm ? gdev->edid.height_cm * 10 : -1; + } + else + { + var->width = -1; + var->height = -1; + } + + if (plane->mode == RTGRAPHIC_PIXEL_FORMAT_GRAY4 || + plane->mode == RTGRAPHIC_PIXEL_FORMAT_GRAY16) + { + var->grayscale = 1; + } + else + { + const struct fb_format *fmt = &graphic_formats[0]; + + for (int i = 0; i < RT_ARRAY_SIZE(graphic_formats); ++i, ++fmt) + { + if (fmt->mode == plane->mode) + { + rt_memcpy(&var->red, &fmt->red, sizeof(fmt->red)); + rt_memcpy(&var->green, &fmt->green, sizeof(fmt->green)); + rt_memcpy(&var->blue, &fmt->blue, sizeof(fmt->blue)); + rt_memcpy(&var->transp, &fmt->transp, sizeof(fmt->transp)); + + break; + } + } + } + + if (gdev->update_timer) + { + rt_uint64_t update_ps; + rt_tick_t update_tick; + + rt_timer_control(gdev->update_timer, RT_TIMER_CTRL_GET_TIME, &update_tick); + /* + * 1s update_ms * 1000 + * -------------------- = ----------------- (second/tick) + * RT_TICK_PER_SECOND update_tick + * + * 1000000ps = 1ms + */ + update_ps = (update_tick * 1000000) / (RT_TICK_PER_SECOND * 1000); + + var->pixclock = update_ps / (var->xres * var->yres); + } + else + { + var->pixclock = (RT_GRAPHIC_UPDATE_MS * 1000000) / (var->xres * var->yres); + } + } + else + { + err = -RT_EINVAL; + } + break; + + case FBIOPUT_VSCREENINFO: + if (args) + { + rt_uint32_t mode; + struct fb_format fmt; + struct rt_device_rect_info rect; + struct fb_var_screeninfo *var = args; + struct rt_graphic_plane *plane = plane_get_current(gdev); + const rt_size_t cmp_offset = rt_offsetof(struct fb_format, bits_per_pixel); + const rt_size_t cmp_size = sizeof(struct fb_format) - cmp_offset; + + if (!plane->ops->fb_pan_display) + { + if (var->xres != plane->width || var->yres != plane->height || + var->xoffset != plane->x || var->yoffset != plane->y) + { + err = -RT_ENOSYS; + break; + } + } + + mode = plane->mode; + rect.x = plane->x; + rect.y = plane->y; + rect.width = plane->width; + rect.height = plane->height; + + fmt.bits_per_pixel = var->bits_per_pixel; + rt_memcpy(&fmt.red, &var->red, sizeof(fmt.red)); + rt_memcpy(&fmt.green, &var->green, sizeof(fmt.green)); + rt_memcpy(&fmt.blue, &var->blue, sizeof(fmt.blue)); + rt_memcpy(&fmt.transp, &var->transp, sizeof(fmt.transp)); + + for (int i = 0; i < RT_ARRAY_SIZE(graphic_formats); ++i) + { + void *cmp_to = ((void *)&fmt) + cmp_offset; + void *cmp_from = ((void *)&graphic_formats[i]) + cmp_offset; + + if (!rt_memcmp(cmp_to, cmp_from, cmp_size)) + { + mode = graphic_formats[i].mode; + break; + } + } + + err = -RT_ENOSYS; + + for (int i = 0; i < plane->modes_nr; ++i) + { + /* Check supported and commit */ + if (plane->modes[i] == mode && plane->mode != mode) + { + err = plane_fb_remap(plane, mode, &rect); + } + } + + if (!err && plane->ops->fb_pan_display) + { + rect.x = var->xoffset; + rect.y = var->yoffset; + rect.width = var->xres; + rect.height = var->yres; + + err = plane_fb_pan_display(plane, &rect); + } + + if (!err && var->rotate && plane->ops->prop_set) + { + err = plane->ops->prop_set(plane, RT_GRAPHIC_PLANE_PROP_ROTATE, + (void *)(rt_ubase_t)((var->rotate % 360) / 90)); + } + + if (!err && plane == gdev->primary_plane && plane->ops->update) + { + rt_uint32_t update_ms = 0; + + if (var->pixclock) + { + rt_uint64_t clock_cycles; + + clock_cycles = var->pixclock; + clock_cycles *= rect.width; + clock_cycles *= rect.height; + /* Seconds in pico seconds */ + clock_cycles /= 1000000000000ULL; + + update_ms = (rt_uint32_t)clock_cycles * 1000; + } + + err = rt_graphic_device_update_auto(gdev, update_ms); + } + } + else + { + err = -RT_EINVAL; + } + break; + + case FBIOGET_FSCREENINFO: + if (args) + { + struct fb_fix_screeninfo *fix = args; + struct rt_graphic_plane *plane = plane_get_current(gdev); + + rt_memset(fix, 0, sizeof(*fix)); + + rt_snprintf(fix->id, rt_min_t(int, sizeof(fix->id), RT_NAME_MAX), + "%s", rt_dm_dev_get_name(&gdev->parent)); + + fix->smem_start = (unsigned long)rt_kmem_v2p(plane->framebuffer); + fix->smem_len = plane->framebuffer_len; + fix->mmio_start = fix->smem_start; + fix->mmio_len = plane->screen_len; + fix->line_length = plane->line_length; + } + else + { + err = -RT_EINVAL; + } + break; + + case FBIOGET_PIXELINFO: + if (args) + { + struct rt_graphic_plane *plane = plane_get_current(gdev); + + *(rt_uint32_t *)args = plane->mode; + } + else + { + err = -RT_EINVAL; + } + break; + + case FBIOPAN_DISPLAY: + if (args) + { + struct fb_var_screeninfo *var = args; + struct rt_graphic_plane *plane = plane_get_current(gdev); + + if (plane->ops->fb_pan_display) + { + struct rt_device_rect_info rect; + + rect.x = var->xoffset; + rect.y = var->yoffset; + rect.width = var->xres; + rect.height = var->yres; + + err = plane_fb_pan_display(plane, &rect); + } + else + { + err = -RT_ENOSYS; + } + } + else + { + err = -RT_EINVAL; + } + break; + + case FBIO_CURSOR: + err = -RT_EINVAL; + break; + + case FBIOGET_CON2FBMAP: + if (args) + { + struct fb_con2fbmap *con2fbmap = args; + + if (con2fbmap->console < RT_ARRAY_SIZE(fbcon_map)) + { + con2fbmap->framebuffer = fbcon_map[con2fbmap->console]; + } + else + { + err = -RT_EFULL; + } + } + else + { + err = -RT_EINVAL; + } + break; + + case FBIOPUT_CON2FBMAP: + if (args) + { + struct fb_con2fbmap *con2fbmap = args; + + if (con2fbmap->console < RT_ARRAY_SIZE(fbcon_map) && + con2fbmap->framebuffer < RT_ARRAY_SIZE(fbcon_map)) + { + struct rt_device *vt; + + vt = rt_dm_device_find(MASTER_ID_TTY, con2fbmap->console); + + #ifdef RT_SERIAL_VIRTUAL + if (!vt) + { + vt = rt_device_find("vuart"); + } + #endif + + if (vt) + { + if (!(err = rt_device_open(vt, RT_DEVICE_OFLAG_RDWR))) + { + err = rt_device_control(vt, FBIOPUT_CON2FBMAP, con2fbmap); + + if (!err) + { + fbcon_map[con2fbmap->console] = con2fbmap->framebuffer; + } + + rt_device_close(vt); + } + } + else + { + err = -RT_EEMPTY; + } + } + else + { + err = -RT_EFULL; + } + } + else + { + err = -RT_EINVAL; + } + break; + + case FBIOBLANK: + if (gdev->ops->dpms_switch) + { + rt_uint32_t dpms; + + switch ((rt_uint32_t)(rt_ubase_t)args) + { + case FB_BLANK_UNBLANK: + /* Display: On, HSync: On, VSync: On */ + dpms = RT_GRAPHIC_DPMS_ON; + break; + + case FB_BLANK_NORMAL: + /* Display: Off, HSync: On, VSync: On */ + dpms = RT_GRAPHIC_DPMS_STANDBY; + break; + + case FB_BLANK_HSYNC_SUSPEND: + /* Display: Off, HSync: Off, VSync: On */ + dpms = RT_GRAPHIC_DPMS_STANDBY; + break; + + case FB_BLANK_VSYNC_SUSPEND: + /* Display: Off, HSync: On, VSync: Off */ + dpms = RT_GRAPHIC_DPMS_SUSPEND; + break; + + case FB_BLANK_POWERDOWN: + /* Display: Off, HSync: Off, VSync: Off */ + dpms = RT_GRAPHIC_DPMS_OFF; + break; + + default: + err = -RT_EINVAL; + break; + } + + if (!err) + { + graphic_dpms_switch(gdev, dpms); + } + } + break; + + case FBIO_WAITFORVSYNC: + if (gdev->ops->wait_vsync) + { + err = gdev->ops->wait_vsync(gdev); + } + break; + + case FBIO_ALLOC: + case FBIO_FREE: + case FBIOGET_GLYPH: + case FBIOGET_HWCINFO: + case FBIOPUT_MODEINFO: + case FBIOGET_DISPINFO: + LOG_D("FB IOCTL (%x) only used for SiS 300/630/730/540/315/550/650/740 frame buffer device", cmd); + /* Fall through */ + case FBIOGET_VBLANK: + case FBIOGETCMAP: /* fb_cmap */ + case FBIOPUTCMAP: /* fb_cmap */ + /* Fall through */ + default: + if (gdev->ops->control) + { + err = gdev->ops->control(gdev, cmd, args); + } + else + { + err = -RT_ENOSYS; + } + } + + spin_unlock(&gdev->lock); + + return err; +} + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops _graphic_ops = +{ + .open = _graphic_open, + .read = _graphic_read, + .write = _graphic_write, + .control = _graphic_control, +}; +#endif + +static void graphic_ofw_init(struct rt_graphic_device *gdev) +{ +#ifdef RT_USING_OFW + struct rt_ofw_node *np = gdev->parent.ofw_node; + +#ifdef RT_GRAPHIC_BACKLIGHT + if (!gdev->backlight) + { + struct rt_ofw_node *bl_np = rt_ofw_parse_phandle(np, "backlight", 0); + + if (bl_np && (gdev->backlight = rt_ofw_data(bl_np))) + { + rt_device_open(&gdev->backlight->parent, RT_DEVICE_OFLAG_RDWR); + } + rt_ofw_node_put(bl_np); + } +#endif /* RT_GRAPHIC_BACKLIGHT */ + + (void)np; +#endif /* RT_USING_OFW */ +} + +static void graphic_edid_res(struct rt_graphic_device *gdev, + rt_uint32_t *out_width, rt_uint32_t *out_height) +{ + struct edid *edid = &gdev->edid; + struct detailed_timing *dt = &edid->detailed_timings[0]; + struct detailed_pixel_timing *dpt = &dt->data.pixel_data; + + *out_width = dpt->hactive_lo + ((dpt->hactive_hblank_hi & 0xf0) << 4); + *out_height = dpt->vactive_lo + ((dpt->vactive_vblank_hi & 0xf0) << 4); +} + +#ifdef RT_USING_PM +static rt_err_t _graphic_pm_dpms_switch(struct rt_graphic_device *gdev, rt_uint8_t mode) +{ + rt_err_t err; + + spin_lock(&gdev->lock); + + switch (mode) + { + case PM_SLEEP_MODE_NONE: + case PM_SLEEP_MODE_IDLE: + case PM_SLEEP_MODE_LIGHT: + case PM_SLEEP_MODE_DEEP: + err = graphic_dpms_switch(gdev, RT_GRAPHIC_DPMS_ON); + break; + + case PM_SLEEP_MODE_STANDBY: + err = graphic_dpms_switch(gdev, RT_GRAPHIC_DPMS_STANDBY); + break; + + case PM_SLEEP_MODE_SHUTDOWN: + err = graphic_dpms_switch(gdev, RT_GRAPHIC_DPMS_OFF); + break; + + default: + err = -RT_EINVAL; + break; + } + + spin_unlock(&gdev->lock); + + return err; +} + +static rt_err_t _graphic_pm_suspend(const struct rt_device *device, rt_uint8_t mode) +{ + struct rt_graphic_device *gdev = raw_to_graphic(device); + + return _graphic_pm_dpms_switch(gdev, mode); +} + +static void _graphic_pm_resume(const struct rt_device *device, rt_uint8_t mode) +{ + struct rt_graphic_device *gdev = raw_to_graphic(device); + + _graphic_pm_dpms_switch(gdev, mode); +} + +static const struct rt_device_pm_ops _graphic_pm_ops = +{ + .suspend = _graphic_pm_suspend, + .resume = _graphic_pm_resume, +}; +#endif /* RT_USING_PM */ + +rt_err_t rt_graphic_device_register(struct rt_graphic_device *gdev) +{ + rt_err_t err; + int device_id; + const char *dev_name; + + if (!gdev || !gdev->ops) + { + return -RT_EINVAL; + } + + if (!gdev->primary_plane) + { + LOG_E("%s: Not %s found", rt_dm_dev_get_name(&gdev->parent), "primary plane"); + + return -RT_EINVAL; + } + + if ((device_id = rt_dm_ida_alloc(&graphic_ida)) < 0) + { + return -RT_EFULL; + } + + rt_dm_dev_set_name(&gdev->parent, "fb%u", device_id); + dev_name = rt_dm_dev_get_name(&gdev->parent); + + rt_list_init(&gdev->overlay_nodes); + rt_dm_ida_init(&gdev->plane_ida, CUSTOM); + rt_spin_lock_init(&gdev->lock); + + graphic_ofw_init(gdev); + + if (!gdev->primary_plane->width || !gdev->primary_plane->height) + { + rt_uint32_t mode, width, height; + struct rt_device_rect_info rect; + + graphic_edid_res(gdev, &width, &height); + rect.x = 0; + rect.y = 0; + rect.width = width; + rect.height = height; + + if (gdev->primary_plane->mode == RTGRAPHIC_PIXEL_FORMAT_MONO) + { + mode = gdev->primary_plane->modes[0]; + } + else + { + mode = gdev->primary_plane->mode; + } + + err = plane_fb_remap(gdev->primary_plane, mode, &rect); + + if (err) + { + LOG_E("%s: Set %s error = %s", rt_dm_dev_get_name(&gdev->parent), + "primary plane", rt_strerror(err)); + + goto _fail; + } + } + + gdev->parent.type = RT_Device_Class_Graphic; +#ifdef RT_USING_DEVICE_OPS + gdev->parent.ops = &_graphic_ops; +#else + gdev->parent.open = _graphic_open; + gdev->parent.read = _graphic_read; + gdev->parent.write = _graphic_write; + gdev->parent.control = _graphic_control; +#endif + gdev->parent.master_id = graphic_ida.master_id; + gdev->parent.device_id = device_id; + + if ((err = rt_device_register(&gdev->parent, dev_name, RT_DEVICE_FLAG_RDWR))) + { + goto _fail; + } + +#ifdef RT_USING_PM + rt_pm_device_register(&gdev->parent, &_graphic_pm_ops); +#endif + + if ((err = rt_graphic_logo_render(gdev))) + { + LOG_D("Logo render error = %s", rt_strerror(err)); + } + + return RT_EOK; + +_fail: + rt_dm_ida_free(&graphic_ida, device_id); + + return err; +} + +rt_err_t rt_graphic_device_unregister(struct rt_graphic_device *gdev) +{ + const char *dev_name; + struct rt_graphic_plane *plane, *plane_next; + + if (!gdev) + { + return -RT_EINVAL; + } + + dev_name = rt_dm_dev_get_name(&gdev->parent); + + if (gdev->parent.ref_count) + { + LOG_E("%s: there is %u user", dev_name, gdev->parent.ref_count); + return -RT_EINVAL; + } + +#ifdef RT_USING_PM + rt_pm_device_unregister(&gdev->parent); +#endif + + rt_graphic_device_update_auto(gdev, 0); + + if (gdev->ops->dpms_switch) + { + graphic_dpms_switch(gdev, RT_GRAPHIC_DPMS_OFF); + } +#ifdef RT_GRAPHIC_BACKLIGHT + if (gdev->backlight) + { + rt_backlight_set_power(gdev->backlight, RT_BACKLIGHT_POWER_POWERDOWN); + rt_device_close(&gdev->backlight->parent); + } +#endif + + rt_list_for_each_entry_safe(plane, plane_next, &gdev->overlay_nodes, list) + { + rt_graphic_device_del_plane(gdev, plane); + rt_graphic_device_free_plane(plane); + } + + rt_graphic_device_del_plane(gdev, gdev->primary_plane); + rt_graphic_device_free_plane(gdev->primary_plane); + + if (gdev->cursor_plane) + { + rt_graphic_device_del_plane(gdev, gdev->cursor_plane); + rt_graphic_device_free_plane(gdev->cursor_plane); + } + + rt_dm_ida_free(&graphic_ida, gdev->parent.device_id); + + rt_device_unregister(&gdev->parent); + + return RT_EOK; +} + +struct rt_graphic_plane *rt_graphic_device_alloc_plane(struct rt_graphic_device *gdev, + rt_size_t priv_size, const struct rt_graphic_plane_ops *ops, + const rt_uint32_t *modes, rt_uint32_t modes_nr, rt_uint8_t type) +{ + struct rt_graphic_plane *plane = RT_NULL; + + if (!gdev || !ops || !modes || !modes_nr || type > RT_GRAPHIC_PLANE_TYPE_CURSOR) + { + return RT_NULL; + } + + plane = rt_calloc(1, sizeof(*plane) + priv_size); + + if (plane) + { + rt_list_init(&plane->list); + plane->type = type; + plane->modes_nr = modes_nr; + plane->modes = modes; + plane->mode = RTGRAPHIC_PIXEL_FORMAT_MONO; + plane->graphic = gdev; + plane->ops = ops; + } + + return plane; +} + +void rt_graphic_device_free_plane(struct rt_graphic_plane *plane) +{ + if (!plane) + { + return; + } + + rt_free(plane); +} + +rt_err_t rt_graphic_device_add_plane(struct rt_graphic_device *gdev, + struct rt_graphic_plane *plane) +{ + rt_err_t err = RT_EOK; + + if (!gdev || !plane) + { + return -RT_EINVAL; + } + + if (!plane->ops) + { + LOG_E("%s: %s have no plane ops", + rt_dm_dev_get_name(&gdev->parent), plane->name); + return -RT_EINVAL; + } + + plane->id = rt_dm_ida_alloc(&gdev->plane_ida); + + if (plane->id == RT_DM_IDA_NUM) + { + LOG_E("%s: %s is out of plane max(%d)", + rt_dm_dev_get_name(&gdev->parent), plane->name, RT_DM_IDA_NUM - 1); + return -RT_EFULL; + } + + if (plane->type == RT_GRAPHIC_PLANE_TYPE_PRIMARY) + { + if (gdev->primary_plane) + { + err = -RT_EINVAL; + goto _free_ida; + } + if (!plane->name[0]) + { + rt_strncpy(plane->name, "primary", sizeof(plane->name)); + } + gdev->primary_plane = plane; + } + else if (plane->type == RT_GRAPHIC_PLANE_TYPE_CURSOR) + { + if (gdev->cursor_plane) + { + err = -RT_EINVAL; + goto _free_ida; + } + if (!plane->name[0]) + { + rt_strncpy(plane->name, "cursor", sizeof(plane->name)); + } + gdev->cursor_plane = plane; + } + else if (plane->type == RT_GRAPHIC_PLANE_TYPE_OVERLAY) + { + if (!plane->name[0]) + { + rt_snprintf(plane->name, sizeof(plane->name), "overlay-%u", plane->id); + } + spin_lock(&gdev->lock); + rt_list_insert_before(&gdev->overlay_nodes, &plane->list); + rt_graphic_device_leave(gdev); + } + else + { + LOG_E("What the fuck plane type(%u)", plane->type); + RT_ASSERT(0); + } + +_free_ida: + if (err) + { + rt_dm_ida_free(&gdev->plane_ida, plane->id); + } + + return err; +} + +rt_err_t rt_graphic_device_del_plane(struct rt_graphic_device *gdev, + struct rt_graphic_plane *plane) +{ + if (!gdev || !plane) + { + return -RT_EINVAL; + } + + if (plane->ops->fb_cleanup) + { + /* Ignore error */ + plane->ops->fb_cleanup(plane); + } + + if (plane->type == RT_GRAPHIC_PLANE_TYPE_PRIMARY) + { + gdev->primary_plane = RT_NULL; + } + else if (plane->type == RT_GRAPHIC_PLANE_TYPE_CURSOR) + { + gdev->cursor_plane = RT_NULL; + } + else if (plane->type == RT_GRAPHIC_PLANE_TYPE_OVERLAY) + { + spin_lock(&gdev->lock); + rt_list_remove(&plane->list); + spin_unlock(&gdev->lock); + } + + rt_dm_ida_free(&gdev->plane_ida, plane->id); + + return RT_EOK; +} + +void rt_graphic_device_hotplug_event(struct rt_graphic_device *gdev) +{ + rt_err_t err; + rt_uint32_t width, height; + struct rt_device_rect_info rect; + + RT_ASSERT(gdev != RT_NULL); + + rt_graphic_device_enter(gdev); + + graphic_edid_res(gdev, &width, &height); + rect.x = 0; + rect.y = 0; + rect.width = width; + rect.height = height; + + err = plane_fb_remap(gdev->primary_plane, gdev->primary_plane->mode, &rect); + + if (err) + { + /* What the fuck? */ + LOG_E("%s: hotplug event process error = %s", + rt_dm_dev_get_name(&gdev->parent), rt_strerror(err)); + goto _out_lock; + } + +_out_lock: + rt_graphic_device_leave(gdev); + + rt_atomic_store(&gdev->event_notifying, RT_TRUE); + + if (gdev->event_notify.notify) + { + gdev->event_notify.notify(gdev->event_notify.dev); + } + + rt_atomic_store(&gdev->event_notifying, RT_FALSE); +} + +static void graphic_device_plane_update(struct rt_graphic_plane *plane, + struct rt_device_rect_info *rect) +{ + if (plane->ops->update) + { + plane->ops->update(plane, rect); + } +} + +static void graphic_device_update(void *param) +{ + struct rt_device_rect_info rect; + struct rt_graphic_plane *plane; + struct rt_graphic_device *gdev = param; + + rect.x = 0; + rect.y = 0; + + spin_lock(&gdev->lock); + + rect.width = gdev->primary_plane->width; + rect.height = gdev->primary_plane->height; + graphic_device_plane_update(gdev->primary_plane, &rect); + + rt_list_for_each_entry(plane, &gdev->overlay_nodes, list) + { + rect.width = plane->width; + rect.height = plane->height; + + graphic_device_plane_update(plane, &rect); + } + + if ((plane = gdev->cursor_plane)) + { + rect.x = plane->x; + rect.y = plane->y; + /* Ask driver to update position only */ + rect.width = 0; + rect.height = 0; + + graphic_device_plane_update(plane, &rect); + } + + spin_unlock(&gdev->lock); +} + +rt_err_t rt_graphic_device_update_auto(struct rt_graphic_device *gdev, rt_uint32_t update_ms) +{ + if (!gdev) + { + return -RT_EINVAL; + } + + if (update_ms) + { + if (!gdev->update_timer) + { + char name[RT_NAME_MAX]; + + rt_snprintf(name, sizeof(name), "update-%s", rt_dm_dev_get_name(&gdev->parent)); + + gdev->update_timer = rt_timer_create(name, &graphic_device_update, gdev, + rt_tick_from_millisecond(update_ms), + RT_TIMER_FLAG_PERIODIC); + + if (!gdev->update_timer) + { + return -RT_ENOMEM; + } + } + + rt_timer_start(gdev->update_timer); + } + else if (gdev->update_timer) + { + rt_timer_stop(gdev->update_timer); + rt_timer_delete(gdev->update_timer); + + gdev->update_timer = RT_NULL; + } + + return RT_EOK; +} + +void rt_graphic_device_enter(struct rt_graphic_device *gdev) +{ + RT_ASSERT(gdev != RT_NULL); + + spin_lock(&gdev->lock); + + if (gdev->update_timer) + { + rt_timer_stop(gdev->update_timer); + } +} + +void rt_graphic_device_leave(struct rt_graphic_device *gdev) +{ + RT_ASSERT(gdev != RT_NULL); + + if (gdev->update_timer) + { + rt_timer_start(gdev->update_timer); + } + + spin_unlock(&gdev->lock); +} + +rt_uint32_t rt_graphic_mode_bpp(rt_uint32_t mode) +{ + for (int i = 0; i < RT_ARRAY_SIZE(graphic_formats); ++i) + { + if (graphic_formats[i].mode == mode) + { + return graphic_formats[i].bits_per_pixel; + } + } + + return 0; +} diff --git a/components/drivers/graphic/graphic_primary.c b/components/drivers/graphic/graphic_primary.c new file mode 100644 index 00000000000..411931196fa --- /dev/null +++ b/components/drivers/graphic/graphic_primary.c @@ -0,0 +1,381 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-02-25 GuEe-GUI the first version + */ + +#include +#include +#include + +#define DBG_TAG "graphic.primary" +#define DBG_LVL DBG_INFO +#include + +static struct rt_graphic_device *primary_gdev = RT_NULL; + +#define framebuffer_drift(plane, x, y, bpp) \ + ((plane)->framebuffer + (x) * ((bpp) / 8) + (y) * (plane)->line_length) + +#define fixup_dir(a1, a2) \ + if ((a1) > (a2)) { (a1) ^= (a2); (a2) ^= (a1); (a1) ^= (a2); } + +static void graphic_primary_set_pixel_8bit(const char *pixel, int x, int y) +{ + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + *(rt_uint8_t *)framebuffer_drift(plane, x, y, 8) = *(rt_uint8_t *)pixel; +} + +static void graphic_primary_get_pixel_8bit(char *pixel, int x, int y) +{ + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + *(rt_uint8_t *)pixel = *(rt_uint8_t *)framebuffer_drift(plane, x, y, 8); +} + +static void graphic_primary_draw_hline_8bit(const char *pixel, int x1, int x2, int y) +{ + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + fixup_dir(x1, x2); + rt_memset(framebuffer_drift(plane, x1, y, 8), *(rt_uint8_t *)pixel, x2 - x1); +} + +static void graphic_primary_draw_vline_8bit(const char *pixel, int x, int y1, int y2) +{ + rt_uint8_t *fb; + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + fixup_dir(y1, y2); + fb = framebuffer_drift(plane, x, y1, 8); + + for (; y1 < y2; ++y1) + { + *fb = *(rt_uint8_t *)pixel; + fb += plane->line_length; + } +} + +static void graphic_primary_blit_line_8bit(const char *pixel, int x, int y, rt_size_t size) +{ + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + rt_memcpy(framebuffer_drift(plane, x, y, 8), pixel, size); +} + +static struct rt_device_graphic_ops graphic_primary_8bit_ops = +{ + .set_pixel = graphic_primary_set_pixel_8bit, + .get_pixel = graphic_primary_get_pixel_8bit, + .draw_hline = graphic_primary_draw_hline_8bit, + .draw_vline = graphic_primary_draw_vline_8bit, + .blit_line = graphic_primary_blit_line_8bit, +}; + +static void graphic_primary_set_pixel_16bit(const char *pixel, int x, int y) +{ + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + *(rt_uint16_t *)framebuffer_drift(plane, x, y, 16) = *(rt_uint16_t *)pixel; +} + +static void graphic_primary_get_pixel_16bit(char *pixel, int x, int y) +{ + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + *(rt_uint16_t *)pixel = *(rt_uint16_t *)framebuffer_drift(plane, x, y, 16); +} + +static void graphic_primary_draw_hline_16bit(const char *pixel, int x1, int x2, int y) +{ + rt_uint16_t *fb; + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + fixup_dir(x1, x2); + + fb = framebuffer_drift(plane, x1, y, 16); + + for (; x1 < x2; ++x1) + { + *fb++ = *(rt_uint16_t *)pixel; + } +} + +static void graphic_primary_draw_vline_16bit(const char *pixel, int x, int y1, int y2) +{ + rt_uint16_t *fb; + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + fixup_dir(y1, y2); + + fb = framebuffer_drift(plane, x, y1, 16); + + for (; y1 < y2; ++y1) + { + *fb = *(rt_uint16_t *)pixel; + fb = (void *)fb + plane->line_length; + } +} + +static void graphic_primary_blit_line_16bit(const char *pixel, int x, int y, rt_size_t size) +{ + rt_uint16_t *fb; + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + fb = framebuffer_drift(plane, x, y, 16); + + while (size --> 0) + { + *fb++ = *(rt_uint16_t *)pixel; + pixel += 2; + } +} + +static struct rt_device_graphic_ops graphic_primary_16bit_ops = +{ + .set_pixel = graphic_primary_set_pixel_16bit, + .get_pixel = graphic_primary_get_pixel_16bit, + .draw_hline = graphic_primary_draw_hline_16bit, + .draw_vline = graphic_primary_draw_vline_16bit, + .blit_line = graphic_primary_blit_line_16bit, +}; + +static void graphic_primary_set_pixel_24bit(const char *pixel, int x, int y) +{ + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + rt_memcpy(framebuffer_drift(plane, x, y, 24), pixel, 3); +} + +static void graphic_primary_get_pixel_24bit(char *pixel, int x, int y) +{ + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + rt_memcpy(pixel, framebuffer_drift(plane, x, y, 24), 3); +} + +static void graphic_primary_draw_hline_24bit(const char *pixel, int x1, int x2, int y) +{ + rt_uint8_t *fb; + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + fixup_dir(x1, x2); + + fb = framebuffer_drift(plane, x1, y, 24); + + for (; x1 < x2; ++x1) + { + *fb++ = ((rt_uint8_t *)pixel)[0]; + *fb++ = ((rt_uint8_t *)pixel)[1]; + *fb++ = ((rt_uint8_t *)pixel)[2]; + } +} + +static void graphic_primary_draw_vline_24bit(const char *pixel, int x, int y1, int y2) +{ + rt_uint8_t *fb; + rt_size_t xlate; + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + fixup_dir(y1, y2); + + fb = framebuffer_drift(plane, x, y1, 24); + xlate = plane->line_length - 3; + + for (; y1 < y2; ++y1) + { + *fb++ = ((rt_uint8_t *)pixel)[0]; + *fb++ = ((rt_uint8_t *)pixel)[1]; + *fb++ = ((rt_uint8_t *)pixel)[2]; + + fb = (void *)fb + xlate; + } +} + +static void graphic_primary_blit_line_24bit(const char *pixel, int x, int y, rt_size_t size) +{ + rt_uint8_t *fb; + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + fb = framebuffer_drift(plane, x, y, 24); + + while (size --> 0) + { + *fb++ = *(rt_uint8_t *)pixel++; + *fb++ = *(rt_uint8_t *)pixel++; + *fb++ = *(rt_uint8_t *)pixel++; + } +} + +static struct rt_device_graphic_ops graphic_primary_24bit_ops = +{ + .set_pixel = graphic_primary_set_pixel_24bit, + .get_pixel = graphic_primary_get_pixel_24bit, + .draw_hline = graphic_primary_draw_hline_24bit, + .draw_vline = graphic_primary_draw_vline_24bit, + .blit_line = graphic_primary_blit_line_24bit, +}; + +static void graphic_primary_set_pixel_32bit(const char *pixel, int x, int y) +{ + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + *(rt_uint32_t *)framebuffer_drift(plane, x, y, 32) = *(rt_uint32_t *)pixel; +} + +static void graphic_primary_get_pixel_32bit(char *pixel, int x, int y) +{ + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + *(rt_uint32_t *)pixel = *(rt_uint32_t *)framebuffer_drift(plane, x, y, 32); +} + +static void graphic_primary_draw_hline_32bit(const char *pixel, int x1, int x2, int y) +{ + rt_uint32_t *fb; + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + fixup_dir(x1, x2); + + fb = framebuffer_drift(plane, x1, y, 32); + + for (; x1 < x2; ++x1) + { + *fb++ = *(rt_uint32_t *)pixel; + } +} + +static void graphic_primary_draw_vline_32bit(const char *pixel, int x, int y1, int y2) +{ + rt_uint32_t *fb; + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + fixup_dir(y1, y2); + + fb = framebuffer_drift(plane, x, y1, 32); + + for (; y1 < y2; ++y1) + { + *fb = *(rt_uint32_t *)pixel; + fb = (void *)fb + plane->line_length; + } +} + +static void graphic_primary_blit_line_32bit(const char *pixel, int x, int y, rt_size_t size) +{ + rt_uint32_t *fb; + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + fb = framebuffer_drift(plane, x, y, 32); + + while (size --> 0) + { + *fb++ = *(rt_uint32_t *)pixel; + pixel += 4; + } +} + +static struct rt_device_graphic_ops graphic_primary_32bit_ops = +{ + .set_pixel = graphic_primary_set_pixel_32bit, + .get_pixel = graphic_primary_get_pixel_32bit, + .draw_hline = graphic_primary_draw_hline_32bit, + .draw_vline = graphic_primary_draw_vline_32bit, + .blit_line = graphic_primary_blit_line_32bit, +}; + +static void graphic_primary_set_pixel_64bit(const char *pixel, int x, int y) +{ + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + *(rt_uint64_t *)framebuffer_drift(plane, x, y, 64) = *(rt_uint64_t *)pixel; +} + +static void graphic_primary_get_pixel_64bit(char *pixel, int x, int y) +{ + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + *(rt_uint64_t *)pixel = *(rt_uint64_t *)framebuffer_drift(plane, x, y, 64); +} + +static void graphic_primary_draw_hline_64bit(const char *pixel, int x1, int x2, int y) +{ + rt_uint64_t *fb; + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + fixup_dir(x1, x2); + + fb = framebuffer_drift(plane, x1, y, 64); + + for (; x1 < x2; ++x1) + { + *fb++ = *(rt_uint64_t *)pixel; + } +} + +static void graphic_primary_draw_vline_64bit(const char *pixel, int x, int y1, int y2) +{ + rt_uint64_t *fb; + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + fixup_dir(y1, y2); + + fb = framebuffer_drift(plane, x, y1, 64); + + for (; y1 < y2; ++y1) + { + *fb = *(rt_uint64_t *)pixel; + fb = (void *)fb + plane->line_length; + } +} + +static void graphic_primary_blit_line_64bit(const char *pixel, int x, int y, rt_size_t size) +{ + rt_uint64_t *fb; + struct rt_graphic_plane *plane = primary_gdev->primary_plane; + + fb = framebuffer_drift(plane, x, y, 64); + + while (size --> 0) + { + *fb++ = *(rt_uint64_t *)pixel; + pixel += 8; + } +} + +static struct rt_device_graphic_ops graphic_primary_64bit_ops = +{ + .set_pixel = graphic_primary_set_pixel_64bit, + .get_pixel = graphic_primary_get_pixel_64bit, + .draw_hline = graphic_primary_draw_hline_64bit, + .draw_vline = graphic_primary_draw_vline_64bit, + .blit_line = graphic_primary_blit_line_64bit, +}; + +struct rt_device_graphic_ops *rt_graphic_device_switch_primary(struct rt_graphic_device *gdev) +{ + primary_gdev = gdev; + + RT_ASSERT(primary_gdev != RT_NULL); + RT_ASSERT(primary_gdev->primary_plane != RT_NULL); + + switch (rt_graphic_mode_bpp(primary_gdev->primary_plane->mode)) + { + case 32: return &graphic_primary_32bit_ops; + case 24: return &graphic_primary_24bit_ops; + case 16: return &graphic_primary_16bit_ops; + case 64: return &graphic_primary_64bit_ops; + case 8: return &graphic_primary_8bit_ops; + default: + LOG_E("What the fuck format(%u)", primary_gdev->primary_plane->mode); + RT_ASSERT(0); + break; + } + + return RT_NULL; +} diff --git a/components/drivers/graphic/graphic_simple.c b/components/drivers/graphic/graphic_simple.c new file mode 100644 index 00000000000..141fc9d9131 --- /dev/null +++ b/components/drivers/graphic/graphic_simple.c @@ -0,0 +1,295 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-02-25 GuEe-GUI the first version + */ + +#include +#include +#include + +#define DBG_TAG "graphic.simple" +#define DBG_LVL DBG_INFO +#include + +static rt_uint32_t edid_dpi_to_mm(rt_uint32_t dpi, rt_uint32_t res) +{ + return res * 254 / 10 / dpi; +} + +static void edid_checksum(rt_uint8_t *edid, rt_size_t len) +{ + rt_uint32_t sum = 0; + + for (int i = 0; i < len; ++i) + { + sum += edid[i]; + } + + sum &= 0xff; + + if (sum) + { + edid[len] = 0x100 - sum; + } +} + +static void fill_edid(struct rt_graphic_device *gdev, + rt_uint32_t width, rt_uint32_t height, rt_uint32_t refresh_hz) +{ + union + { + rt_uint32_t u32; + rt_uint16_t u16; + } value; + int dt_idx = 0; + int width_mm, height_mm; + rt_uint64_t clock; + rt_uint32_t xfront, xsync, xblank, yfront, ysync, yblank; + struct edid *edid = &gdev->edid; + struct detailed_timing *dt; + struct detailed_pixel_timing *dpt; + struct detailed_non_pixel *dnp; + + refresh_hz = refresh_hz ? : 75000; + width_mm = edid_dpi_to_mm(100, width); + height_mm = edid_dpi_to_mm(100, height); + + /* EDID: timings */ + xfront = width * 25 / 100; + xsync = width * 3 / 100; + xblank = width * 35 / 100; + yfront = height * 5 / 1000; + ysync = height * 5 / 1000; + yblank = height * 35 / 1000; + clock = ((rt_uint64_t)refresh_hz * (width + xblank) * (height + yblank)) / 10000000; + + if (width >= 4096 || height >= 4096 || clock >= 65536) + { + LOG_E("%s: Large screen %ux%u@%uHz is not supported in simple", + rt_dm_dev_get_name(&gdev->parent), width, height, clock); + + RT_ASSERT(0); + } + + /* EDID: extensions */ + + /* EDID: header information */ + edid->header[0] = 0x00; + edid->header[1] = 0xff; + edid->header[2] = 0xff; + edid->header[3] = 0xff; + edid->header[4] = 0xff; + edid->header[5] = 0xff; + edid->header[6] = 0xff; + edid->header[7] = 0x00; + + /* Vendor id */ + value.u16 = rt_cpu_to_be16( + ((('R' - '@') & 0x1f) << 10) | + ((('T' - '@') & 0x1f) << 5) | + ((('T' - '@') & 0x1f) << 0)); + rt_memcpy(edid->mfg_id, &value.u16, sizeof(edid->mfg_id)); + + /* Product code */ + value.u16 = rt_cpu_to_le16(0x1234); + rt_memcpy(edid->prod_code, &value.u16, sizeof(edid->prod_code)); + + /* Serial number */ + edid->serial = rt_cpu_to_le32(0); + + /* Manufacture week and year */ + edid->mfg_week = 42; + edid->mfg_year = 2014 - 1990; + + /* Version */ + edid->version = 1; + edid->revision = 4; + + /* EDID: basic display parameters */ + + /* Video input: digital, 8bpc, displayport */ + edid->input = 0xa5; + + /* Screen size */ + edid->width_cm = width_mm / 10; + edid->height_cm = height_mm / 10; + + /* Gamma: 2.2 */ + edid->gamma = 220 - 100; + + /* Features: STD sRGB, preferred timing */ + edid->features = 0x06; + + /* EDID: chromaticity coordinates */ + + /* + * STD sRGB colorspace: + * X Y + * red: 0.6400, 0.3300 + * green: 0.3000, 0.6000 + * blue: 0.1500, 0.0600 + * white point: 0.3127, 0.3290 + * + * value = (uint32_t)(value * 1024 + 0.5) + * + * red_x = 0.6400 * 1024 + 0.5 = 655.86 => 655 + * red_y = 0.3300 * 1024 + 0.5 = 338.42 => 338 + * green_x = 0.3000 * 1024 + 0.5 = 307.7 => 307 + * green_y = 0.6000 * 1024 + 0.5 = 614.9 => 614 + * blue_x = 0.1500 * 1024 + 0.5 = 154.1 => 154 + * blue_y = 0.0600 * 1024 + 0.5 = 61.94 => 61 + * white_x = 0.3127 * 1024 + 0.5 = 320.7048 => 320 + * white_y = 0.3290 * 1024 + 0.5 = 337.396 => 337 + */ + edid->red_green_lo = (((655 & 0x03) << 6) | /* red_x */ + ((338 & 0x03) << 4) | /* red_y */ + ((307 & 0x03) << 2) | /* green_x */ + ((614 & 0x03) << 0)); /* green_y */ + edid->black_white_lo = (((154 & 0x03) << 6) | /* blue_x */ + ((154 & 0x03) << 4) | /* blue_y */ + ((320 & 0x03) << 2) | /* white_x */ + ((337 & 0x03) << 0)); /* white_y */ + edid->red_x = 655 >> 2; /* red_x */ + edid->red_y = 338 >> 2; /* red_y */ + edid->green_x = 307 >> 2; /* green_x */ + edid->green_y = 614 >> 2; /* green_y */ + edid->blue_x = 154 >> 2; /* blue_x */ + edid->blue_y = 154 >> 2; /* blue_y */ + edid->white_x = 320 >> 2; /* white_x */ + edid->white_y = 337 >> 2; /* white_y */ + + /* EDID: established timing bitmap */ + /* EDID: standard timing information */ + + /* EDID: descriptor blocks */ + dt = &edid->detailed_timings[dt_idx++]; + dpt = &dt->data.pixel_data; + + dt->pixel_clock = rt_cpu_to_le16(clock); + dpt->hactive_lo = width & 0xff; + dpt->hblank_lo = xblank & 0xff; + dpt->hactive_hblank_hi = (((width & 0xf00) >> 4) | ((xblank & 0xf00) >> 8)); + + dpt->vactive_lo = height & 0xff; + dpt->vblank_lo = yblank & 0xff; + dpt->vactive_vblank_hi = (((height & 0xf00) >> 4) | ((yblank & 0xf00) >> 8)); + + dpt->hsync_offset_lo = xfront & 0xff; + dpt->hsync_pulse_width_lo = xsync & 0xff; + + dpt->vsync_offset_pulse_width_lo = (((yfront & 0x00f) << 4) | + ((ysync & 0x00f) << 0)); + dpt->hsync_vsync_offset_pulse_width_hi = (((xfront & 0x300) >> 2) | + ((xsync & 0x300) >> 4) | + ((yfront & 0x030) >> 2) | + ((ysync & 0x030) >> 4)); + + dpt->width_mm_lo = width_mm & 0xff; + dpt->height_mm_lo = height_mm & 0xff; + dpt->width_height_mm_hi = (((width_mm & 0xf00) >> 4) | + ((height_mm & 0xf00) >> 8)); + + dpt->misc = 0x18; + + /* XTRA3 STD */ + dt = &edid->detailed_timings[dt_idx++]; + dnp = &dt->data.other_data; + dnp->type = EDID_DETAIL_EST_TIMINGS; + dnp->data.timings[0].hsize = 10; + + /* Ranges */ + dt = &edid->detailed_timings[dt_idx++]; + dnp = &dt->data.other_data; + dnp->type = EDID_DETAIL_MONITOR_RANGE; + dnp->data.range.min_vfreq = 50; + dnp->data.range.max_vfreq = 125; + dnp->data.range.min_hfreq_khz = 30; + dnp->data.range.max_hfreq_khz = 160; + dnp->data.range.pixel_clock_mhz = 2550 / 10; + dnp->data.range.flags = 0x01; + rt_memcpy(&dnp->data.range.flags + 1, "\n ", 7); + + while (dt_idx < RT_ARRAY_SIZE(edid->detailed_timings)) + { + /* Dummy */ + dt = &edid->detailed_timings[dt_idx++]; + dnp = &dt->data.other_data; + dnp->type = 0x10; + } + + /* EDID: display id extensions */ + + /* EDID: checksum */ + edid_checksum((void *)edid, 127); +} + +rt_err_t rt_graphic_device_simple_edid(struct rt_graphic_device *gdev, + rt_uint32_t width, rt_uint32_t height, rt_uint32_t refresh_hz) +{ + if (!gdev || !width || !height) + { + return -RT_EINVAL; + } + + fill_edid(gdev, width, height, refresh_hz); + + return RT_EOK; +} + +static const struct rt_graphic_device_ops graphic_device_simple_ops = +{ +}; + +rt_err_t rt_graphic_device_simple_register(struct rt_graphic_device *gdev, + rt_uint32_t width, rt_uint32_t height, rt_uint32_t refresh_hz, + const struct rt_graphic_plane_ops *plane_ops, + const rt_uint32_t *modes, rt_uint32_t modes_nr) +{ + rt_err_t err; + struct rt_graphic_plane *plane; + + if (!gdev || !width || !height || !plane_ops || !modes || !modes_nr) + { + return -RT_EINVAL; + } + + if (!gdev->ops) + { + gdev->ops = &graphic_device_simple_ops; + } + + plane = rt_graphic_device_alloc_plane(gdev, 0, plane_ops, modes, modes_nr, + RT_GRAPHIC_PLANE_TYPE_PRIMARY); + + if (!plane) + { + return -RT_EINVAL; + } + + if ((err = rt_graphic_device_add_plane(gdev, plane))) + { + goto _free_plane; + } + + rt_graphic_device_simple_edid(gdev, width, height, refresh_hz); + + err = rt_graphic_device_register(gdev); + +_free_plane: + if (err) + { + rt_free(plane); + } + + return err; +} + +rt_err_t rt_graphic_device_simple_unregister(struct rt_graphic_device *gdev) +{ + return rt_graphic_device_unregister(gdev); +} diff --git a/components/drivers/graphic/logo/.gitignore b/components/drivers/graphic/logo/.gitignore new file mode 100644 index 00000000000..e524629a37f --- /dev/null +++ b/components/drivers/graphic/logo/.gitignore @@ -0,0 +1 @@ +logo.inc \ No newline at end of file diff --git a/components/drivers/graphic/logo/Kconfig b/components/drivers/graphic/logo/Kconfig new file mode 100644 index 00000000000..45bcfe3f59d --- /dev/null +++ b/components/drivers/graphic/logo/Kconfig @@ -0,0 +1,31 @@ +menuconfig RT_GRAPHIC_LOGO + bool "Startup Logo" + select RT_GRAPHIC_FB + default y + +choice + prompt "Rendering image(ppm)" + default RT_GRAPHIC_LOGO_RT_THREAD_CLUT224 + depends on RT_GRAPHIC_LOGO + + config RT_GRAPHIC_LOGO_NONE + bool "None logo (Change in runtime)" + + osource "$(SOC_DM_GRAPHIC_LOGO_DIR)/Kconfig" +endchoice + +# Provide the logos path for the BSP path: +# +# RT_GRAPHIC_LOGO_ in Kconfig: +# +# config RT_GRAPHIC_LOGO_ +# bool " logo" +# +# RT_GRAPHIC_LOGO__PATH in Kconfig.path: +# +# if RT_GRAPHIC_LOGO_ +# config RT_GRAPHIC_LOGO__PATH +# string +# default "dm/graphic/logo/[filename].ppm" +# endif +osource "$(SOC_DM_GRAPHIC_LOGO_DIR)/Kconfig.path" diff --git a/components/drivers/graphic/logo/SConscript b/components/drivers/graphic/logo/SConscript new file mode 100644 index 00000000000..622ada04490 --- /dev/null +++ b/components/drivers/graphic/logo/SConscript @@ -0,0 +1,84 @@ +from building import * +import os, re + +group = [] + +if not GetDepend(['RT_GRAPHIC_LOGO']): + Return('group') + +cwd = GetCurrentDir() +CPPPATH = [cwd + '/../../include'] +CPPDEFINES = [] + +src = ['logo.c'] + +logo_path = None +logo_width = 0 +logo_height = 0 +logo_max_val = 0 + +if logo_path == None: + # Find in BSP + paths = None + for key in BuildOptions.keys(): + if re.match(r'RT_GRAPHIC_LOGO_.*_PATH', key): + paths = BuildOptions[key] + break + + if paths != None and len(paths) > 0: + logo_path = Dir('#').abspath + '/' + paths[1:-1] + if not os.path.exists(logo_path): + print("Logo file '{}' not found!".format(logo_path)) + exit(-1) + +if logo_path != None: + with open(logo_path, 'rb') as ppm: + data = ppm.read().split(b'\n') + + # PPM: + magic = data[0].decode('utf-8') + + # PPM: + offset = 1 + while True: + comment = str(data[offset].decode('utf-8')) + if comment[0] != '#': + break + offset += 1 + + # PPM: + logo_width, logo_height = map(int, data[offset].split()) + + # PPM: + logo_max_val = int(data[offset + 1]) + + # PPM: + ppm.seek(0) + pixels = b''.join(ppm.readlines()[offset + 2:]) + ppm.close() + + if magic == 'P1' or magic == 'P2' or magic == 'P3': + # ASCII + pixels = re.sub(b'\\s+', b'\n', pixels.strip()).decode('utf-8').split('\n') + + logo = open(cwd + '/logo.inc', "w") + + for dy in range(logo_height): + for dx in range(logo_width): + index = (dy * logo_width + dx) * 3 + # Red + logo.write(str(pixels[index]).rjust(4) + ",") + # Green + logo.write(str(pixels[index + 1]).rjust(4) + ",") + # Blue + logo.write(str(pixels[index + 2]).rjust(4) + ",") + logo.write("\n") + + logo.close() + +CPPDEFINES += ['__STARTUP_LOGO_WIDTH__=' + str(logo_width)] +CPPDEFINES += ['__STARTUP_LOGO_HEIGHT__=' + str(logo_height)] +CPPDEFINES += ['__STARTUP_LOGO_COLOR_MAX__=' + str(logo_max_val)] + +group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES) +Return('group') diff --git a/components/drivers/graphic/logo/logo.c b/components/drivers/graphic/logo/logo.c new file mode 100644 index 00000000000..34597c8c03a --- /dev/null +++ b/components/drivers/graphic/logo/logo.c @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-02-25 GuEe-GUI the first version + */ + +#include +#include +#include + +#define DBG_TAG "graphic.logo" +#define DBG_LVL DBG_INFO +#include + +#if __STARTUP_LOGO_WIDTH__ && __STARTUP_LOGO_HEIGHT__ && __STARTUP_LOGO_COLOR_MAX__ +static rt_uint8_t builtin_logo[] = +{ + #include "logo.inc" +}; + +static void *startup_logo = builtin_logo; +#else +static void *startup_logo = RT_NULL; +#endif +static int startup_logo_width = __STARTUP_LOGO_WIDTH__; +static int startup_logo_height = __STARTUP_LOGO_HEIGHT__; +static int startup_logo_color_max = __STARTUP_LOGO_COLOR_MAX__; + +rt_err_t rt_graphic_logo_change(void *data, int width, int height, int color_max) +{ + if (!data && !width && !height && !color_max) + { + /* Disable logo */ + startup_logo = RT_NULL; + } + else if (data && width > 0 && height > 0 && color_max > 0) + { + startup_logo = data; + startup_logo_width = width; + startup_logo_height = height; + startup_logo_color_max = color_max; + } + else + { + return -RT_EINVAL; + } + + return RT_EOK; +} + +static rt_ubase_t to_grayscale(rt_ubase_t red, rt_ubase_t green, rt_ubase_t blue) +{ + return (299 * red + 587 * green + 114 * blue) / 1000; +} + +static rt_ubase_t to_color(rt_ubase_t color, rt_ubase_t in_color_max, rt_ubase_t out_color_max) +{ + return color * out_color_max / in_color_max; +} + +static rt_ubase_t gray_reordering(rt_ubase_t red, rt_ubase_t red_off, + rt_ubase_t green, rt_ubase_t green_off, + rt_ubase_t blue, rt_ubase_t blue_off, + rt_ubase_t in_color_max, rt_ubase_t out_color_max) +{ + return to_grayscale(to_color(red, in_color_max, out_color_max), + to_color(green, in_color_max, out_color_max), + to_color(blue, in_color_max, out_color_max)); +} + +static rt_ubase_t rgb_reordering(rt_ubase_t red, rt_ubase_t red_off, + rt_ubase_t green, rt_ubase_t green_off, + rt_ubase_t blue, rt_ubase_t blue_off, + rt_ubase_t in_color_max, rt_ubase_t out_color_max) +{ + return (to_color(red, in_color_max, out_color_max) << red_off) | + (to_color(green, in_color_max, out_color_max) << green_off) | + (to_color(blue, in_color_max, out_color_max) << blue_off); +} + +rt_err_t rt_graphic_logo_render(struct rt_graphic_device *gdev) +{ + rt_err_t err; + int fb_color_max; + rt_ubase_t xlate, none_alpha; + rt_ubase_t red_off, green_off, blue_off; + rt_ubase_t red_mask, green_mask, blue_mask; + rt_uint8_t *logo, *fb, bytes_per_pixel; + rt_ubase_t (*color_reordering)(rt_ubase_t, rt_ubase_t, + rt_ubase_t, rt_ubase_t, + rt_ubase_t, rt_ubase_t, + rt_ubase_t, rt_ubase_t); + struct fb_var_screeninfo var; + struct rt_device_rect_info rect; + struct rt_device_graphic_info info; + struct rt_device *fbdev = &gdev->parent; + + if (!startup_logo) + { + return RT_EOK; + } + + if ((err = rt_device_open(fbdev, 0))) + { + return err; + } + + if ((err = rt_device_control(fbdev, FBIOGET_VSCREENINFO, &var))) + { + LOG_E("Get framebuffer %s error = %s", "var", rt_strerror(err)); + + goto _close_fbdev; + } + + if (startup_logo_width > var.xres || startup_logo_height > var.yres) + { + LOG_E("PPM logo[%u, %u] Out of screen[%u, %u]", + startup_logo_width, startup_logo_height, var.xres, var.yres); + + err = -RT_EINVAL; + goto _close_fbdev; + } + + if ((err = rt_device_control(fbdev, RTGRAPHIC_CTRL_GET_INFO, &info))) + { + LOG_E("Get framebuffer %s error = %s", "info", rt_strerror(err)); + + goto _close_fbdev; + } + + if ((err = rt_device_control(fbdev, RTGRAPHIC_CTRL_POWERON, RT_NULL))) + { + LOG_E("Power on graphic device error = %s", rt_strerror(err)); + + goto _close_fbdev; + } + + if (var.grayscale) + { + color_reordering = &gray_reordering; + } + else + { + color_reordering = &rgb_reordering; + } + + bytes_per_pixel = var.bits_per_pixel / 8; + xlate = (var.xres - startup_logo_width) * bytes_per_pixel; + + rect.x = (var.xres - startup_logo_width) >> 1; + rect.y = (var.yres - startup_logo_height) >> 1; + rect.width = startup_logo_width, + rect.height = startup_logo_height, + + fb = (void *)info.framebuffer; + fb += rect.x * bytes_per_pixel + rect.y * info.pitch; + + logo = startup_logo; + + red_off = var.red.offset; + red_mask = RT_GENMASK(var.red.length - 1, 0); + green_off = var.green.offset; + green_mask = RT_GENMASK(var.green.length - 1, 0); + blue_off = var.blue.offset; + blue_mask = RT_GENMASK(var.blue.length - 1, 0); + + fb_color_max = rt_max_t(int, rt_max_t(int, red_mask, green_mask), blue_mask); + + if (var.transp.length) + { + none_alpha = RT_GENMASK(var.transp.length - 1, 0) << var.transp.offset; + } + else + { + none_alpha = 0; + } + + for (int dy = 0; dy < startup_logo_height; ++dy) + { + for (int dx = 0; dx < startup_logo_width; ++dx) + { + rt_ubase_t color = color_reordering(logo[0], red_off, + logo[1], green_off, + logo[2], blue_off, + fb_color_max, startup_logo_color_max) | + none_alpha; + + rt_memcpy(fb, &color, bytes_per_pixel); + + fb += bytes_per_pixel; + logo += 3; + } + + fb += xlate; + } + + rt_device_control(fbdev, RTGRAPHIC_CTRL_RECT_UPDATE, &rect); + rt_device_control(fbdev, RTGRAPHIC_CTRL_WAIT_VSYNC, RT_NULL); + + /* Complete */ + startup_logo = RT_NULL; + + /* + * Should recycle here, logo takes up too much memory + * if builtin is not RT_GRAPHIC_LOGO_NONE. + */ + +_close_fbdev: + rt_device_close(fbdev); + + return err; +} diff --git a/components/drivers/graphic/logo/logo.html b/components/drivers/graphic/logo/logo.html new file mode 100644 index 00000000000..81e78c4aa1e --- /dev/null +++ b/components/drivers/graphic/logo/logo.html @@ -0,0 +1,243 @@ + + + + + + + + + Logo PPM Previews + + + +
+
+
+
+
+ + + + +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ + + diff --git a/components/drivers/include/drivers/graphic.h b/components/drivers/include/drivers/graphic.h new file mode 100644 index 00000000000..df9b22729f0 --- /dev/null +++ b/components/drivers/include/drivers/graphic.h @@ -0,0 +1,367 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-02-25 GuEe-GUI the first version + */ + +#ifndef __GRAPHIC_DM_H__ +#define __GRAPHIC_DM_H__ + +#include +#include +#include +#include +#include +#include + +#undef rt_graphix_ops +#define rt_graphix_ops(dev) \ + rt_graphic_device_switch_primary(rt_container_of(dev, struct rt_graphic_device, parent)) + +rt_packed(struct est_timings +{ + rt_uint8_t t1; + rt_uint8_t t2; + rt_uint8_t mfg_rsvd; +}); + +rt_packed(struct std_timing +{ + /* Need to multiply by 8 then add 248 */ + rt_uint8_t hsize; + rt_uint8_t vfreq_aspect; +}); + +rt_packed(struct detailed_pixel_timing +{ + rt_uint8_t hactive_lo; + rt_uint8_t hblank_lo; + rt_uint8_t hactive_hblank_hi; + rt_uint8_t vactive_lo; + rt_uint8_t vblank_lo; + rt_uint8_t vactive_vblank_hi; + rt_uint8_t hsync_offset_lo; + rt_uint8_t hsync_pulse_width_lo; + rt_uint8_t vsync_offset_pulse_width_lo; + rt_uint8_t hsync_vsync_offset_pulse_width_hi; + rt_uint8_t width_mm_lo; + rt_uint8_t height_mm_lo; + rt_uint8_t width_height_mm_hi; + rt_uint8_t hborder; + rt_uint8_t vborder; + rt_uint8_t misc; +}); + +rt_packed(struct detailed_data_string +{ + rt_uint8_t str[13]; +}); + +rt_packed(struct detailed_data_monitor_range +{ + rt_uint8_t min_vfreq; + rt_uint8_t max_vfreq; + rt_uint8_t min_hfreq_khz; + rt_uint8_t max_hfreq_khz; + /* Need to multiply by 10 */ + rt_uint8_t pixel_clock_mhz; + rt_uint8_t flags; + + union + { + rt_packed(struct + { + rt_uint8_t reserved; + /* Need to multiply by 2 */ + rt_uint8_t hfreq_start_khz; + /* Need to divide by 2 */ + rt_uint8_t c; + rt_le16_t m; + rt_uint8_t k; + /* Need to divide by 2 */ + rt_uint8_t j; + }) gtf2; + rt_packed(struct + { + rt_uint8_t version; + /* High 6 bits: extra clock resolution */ + rt_uint8_t data1; + /* Plus low 2 of above: max hactive */ + rt_uint8_t data2; + rt_uint8_t supported_aspects; + /* Preferred aspect and blanking support */ + rt_uint8_t flags; + rt_uint8_t supported_scalings; + rt_uint8_t preferred_refresh; + }) cvt; + } formula; +}); + +rt_packed(struct detailed_data_wpindex +{ + /* Lower 2 bits each */ + rt_uint8_t white_yx_lo; + rt_uint8_t white_x_hi; + rt_uint8_t white_y_hi; + /* Need to divide by 100 then add 1 */ + rt_uint8_t gamma; +}); + +rt_packed(struct cvt_timing +{ + rt_uint8_t code[3]; +}); + +rt_packed(struct detailed_non_pixel +{ + rt_uint8_t pad1; +#define EDID_DETAIL_EST_TIMINGS 0xf7 +#define EDID_DETAIL_CVT_3BYTE 0xf8 +#define EDID_DETAIL_COLOR_MGMT_DATA 0xf9 +#define EDID_DETAIL_STD_MODES 0xfa +#define EDID_DETAIL_MONITOR_CPDATA 0xfb +#define EDID_DETAIL_MONITOR_NAME 0xfc +#define EDID_DETAIL_MONITOR_RANGE 0xfd +#define EDID_DETAIL_MONITOR_STRING 0xfe +#define EDID_DETAIL_MONITOR_SERIAL 0xff + rt_uint8_t type; + rt_uint8_t pad2; + union + { + struct detailed_data_string str; + struct detailed_data_monitor_range range; + struct detailed_data_wpindex color; + struct std_timing timings[6]; + struct cvt_timing cvt[4]; + } data; +}); + +rt_packed(struct detailed_timing +{ + /* Need to multiply by 10 KHz */ + rt_le16_t pixel_clock; + + union + { + struct detailed_pixel_timing pixel_data; + struct detailed_non_pixel other_data; + } data; +}); + +rt_packed(struct edid +{ + rt_uint8_t header[8]; + + /* Vendor & product info */ + rt_uint8_t mfg_id[2]; + rt_uint8_t prod_code[2]; + rt_le32_t serial; + rt_uint8_t mfg_week; + rt_uint8_t mfg_year; + + /* EDID version */ + rt_uint8_t version; + rt_uint8_t revision; + + /* Display info */ + rt_uint8_t input; + rt_uint8_t width_cm; + rt_uint8_t height_cm; + rt_uint8_t gamma; + rt_uint8_t features; + + /* Color characteristics */ + rt_uint8_t red_green_lo; + rt_uint8_t black_white_lo; + rt_uint8_t red_x; + rt_uint8_t red_y; + rt_uint8_t green_x; + rt_uint8_t green_y; + rt_uint8_t blue_x; + rt_uint8_t blue_y; + rt_uint8_t white_x; + rt_uint8_t white_y; + + /* Est. timings and mfg rsvd timings */ + struct est_timings established_timings; + + /* Standard timings 1-8 */ + struct std_timing standard_timings[8]; + + /* Detailing timings 1-4, 18 * 4 = 72 bytes */ + struct detailed_timing detailed_timings[4]; + + /* Number of 128 byte ext. blocks */ + rt_uint8_t extensions; + + /* Checksum */ + rt_uint8_t checksum; +}); + +struct rt_graphic_device; +struct rt_graphic_device_ops; +struct rt_graphic_plane_ops; + +enum rt_graphic_plane_prop +{ + RT_GRAPHIC_PLANE_PROP_Z = 0, + RT_GRAPHIC_PLANE_PROP_ROTATE, + RT_GRAPHIC_PLANE_PROP_ALPHA, + + RT_GRAPHIC_PLANE_PROP_MAX, +}; + +struct rt_graphic_plane +{ + rt_list_t list; + char name[RT_NAME_MAX]; + + int id; +#define RT_GRAPHIC_PLANE_TYPE_OVERLAY 0 +#define RT_GRAPHIC_PLANE_TYPE_PRIMARY 1 /* Only one, add before register */ +#define RT_GRAPHIC_PLANE_TYPE_CURSOR 2 /* Only one */ + rt_uint8_t type; + + rt_uint32_t x; + rt_uint32_t y; + rt_uint32_t z; + rt_uint32_t width; + rt_uint32_t height; +#define RT_GRAPHIC_PLANE_ROTATE_0 0 /* +0 degrees */ +#define RT_GRAPHIC_PLANE_ROTATE_90 1 /* +90 degrees */ +#define RT_GRAPHIC_PLANE_ROTATE_180 2 /* +180 degrees */ +#define RT_GRAPHIC_PLANE_ROTATE_270 3 /* +270 degrees */ + rt_uint8_t rotate; + rt_uint8_t alpha; /* 0 ~ 100 */ + + rt_uint32_t line_length; + rt_uint32_t bits_per_pixel; + + /* Support color modes: RTGRAPHIC_PIXEL_FORMAT_* */ + rt_uint32_t mode; + rt_uint32_t modes_nr; + const rt_uint32_t *modes; + + /* fb count = framebuffer_len / screen_len */ + void *framebuffer; + rt_size_t screen_len; + rt_size_t framebuffer_len; + + struct rt_graphic_device *graphic; + const struct rt_graphic_plane_ops *ops; + + rt_uint8_t priv[0]; +}; + +struct rt_graphic_plane_ops +{ + rt_err_t (*update)(struct rt_graphic_plane *plane, struct rt_device_rect_info *rect); + rt_err_t (*fb_remap)(struct rt_graphic_plane *plane, rt_uint32_t mode, struct rt_device_rect_info *rect); + rt_err_t (*fb_pan_display)(struct rt_graphic_plane *plane, struct rt_device_rect_info *rect); + rt_err_t (*fb_cleanup)(struct rt_graphic_plane *plane); + rt_err_t (*prop_set)(struct rt_graphic_plane *plane, enum rt_graphic_plane_prop prop, void *value); +}; + +struct rt_graphic_device +{ + struct rt_device parent; + + const struct rt_graphic_device_ops *ops; + + /* Display Power Manage System */ +#define RT_GRAPHIC_DPMS_ON 0 +#define RT_GRAPHIC_DPMS_STANDBY 1 +#define RT_GRAPHIC_DPMS_SUSPEND 2 +#define RT_GRAPHIC_DPMS_OFF 3 + rt_uint32_t dpms; + + rt_list_t overlay_nodes; + struct rt_graphic_plane *primary_plane; + struct rt_graphic_plane *cursor_plane; + struct rt_dm_ida plane_ida; + + /* Display information */ + struct edid edid; + +#ifdef RT_GRAPHIC_BACKLIGHT + struct rt_backlight_device *backlight; +#endif +#define RT_GRAPHIC_UPDATE_MS 16 + struct rt_timer *update_timer; + + rt_atomic_t event_notifying; + struct rt_device_notify event_notify; + + struct rt_spinlock lock; +}; + +struct rt_graphic_device_ops +{ + rt_err_t (*dpms_switch)(struct rt_graphic_device *gdev, rt_uint32_t dpms); + + rt_err_t (*set_brightness)(struct rt_graphic_device *gdev, rt_uint32_t brightness); + rt_err_t (*get_brightness)(struct rt_graphic_device *gdev, rt_uint32_t *out_brightness); + + rt_err_t (*get_status)(struct rt_graphic_device *gdev, rt_uint32_t *out_status); + + rt_err_t (*wait_vsync)(struct rt_graphic_device *gdev); + + rt_err_t (*control)(struct rt_graphic_device *gdev, int cmd, void *args); + + /* Switching planes supported by device driver */ + struct rt_graphic_plane *(*current_plane)(struct rt_graphic_device *gdev); +}; + +rt_err_t rt_graphic_device_register(struct rt_graphic_device *gdev); +rt_err_t rt_graphic_device_unregister(struct rt_graphic_device *gdev); + +struct rt_graphic_plane *rt_graphic_device_alloc_plane(struct rt_graphic_device *gdev, + rt_size_t priv_size, const struct rt_graphic_plane_ops *ops, + const rt_uint32_t *modes, rt_uint32_t modes_nr, rt_uint8_t type); +void rt_graphic_device_free_plane(struct rt_graphic_plane *plane); + +rt_err_t rt_graphic_device_add_plane(struct rt_graphic_device *gdev, + struct rt_graphic_plane *plane); +rt_err_t rt_graphic_device_del_plane(struct rt_graphic_device *gdev, + struct rt_graphic_plane *plane); + +void rt_graphic_device_hotplug_event(struct rt_graphic_device *gdev); + +rt_err_t rt_graphic_device_update_auto(struct rt_graphic_device *gdev, rt_uint32_t update_ms); + +void rt_graphic_device_enter(struct rt_graphic_device *gdev); +void rt_graphic_device_leave(struct rt_graphic_device *gdev); + +rt_uint32_t rt_graphic_mode_bpp(rt_uint32_t mode); + +struct rt_device_graphic_ops *rt_graphic_device_switch_primary(struct rt_graphic_device *gdev); + +rt_err_t rt_graphic_device_simple_edid(struct rt_graphic_device *gdev, + rt_uint32_t width, rt_uint32_t height, rt_uint32_t refresh_hz); + +rt_err_t rt_graphic_device_simple_register(struct rt_graphic_device *gdev, + rt_uint32_t width, rt_uint32_t height, rt_uint32_t refresh_hz, + const struct rt_graphic_plane_ops *plane_ops, + const rt_uint32_t *modes, rt_uint32_t modes_nr); +rt_err_t rt_graphic_device_simple_unregister(struct rt_graphic_device *gdev); + +#ifdef RT_GRAPHIC_LOGO +rt_err_t rt_graphic_logo_change(void *data, int width, int height, int color_max); +rt_err_t rt_graphic_logo_render(struct rt_graphic_device *gdev); +#else +rt_inline rt_err_t rt_graphic_logo_change(void *data, int width, int height, int color_max) +{ + return RT_EOK; +} + +rt_inline rt_err_t rt_graphic_logo_render(struct rt_graphic_device *gdev) +{ + return RT_EOK; +} +#endif /* RT_GRAPHIC_LOGO */ + +#endif /* __GRAPHIC_DM_H__ */ diff --git a/components/drivers/include/drivers/lcd.h b/components/drivers/include/drivers/lcd.h index f2dcdce4451..11fa8e6dccc 100644 --- a/components/drivers/include/drivers/lcd.h +++ b/components/drivers/include/drivers/lcd.h @@ -11,6 +11,8 @@ #ifndef RT_LCD_H__ #define RT_LCD_H__ +#include + /* ioctls 0x46 is 'F' */ @@ -109,4 +111,35 @@ struct fb_fix_screeninfo uint16_t reserved[2]; /* Reserved for future compatibility */ }; +struct fb_cmap +{ + uint32_t start; /* First entry */ + uint32_t len; /* Number of entries */ + uint16_t *red; /* Red values */ + uint16_t *green; + uint16_t *blue; + uint16_t *transp; /* transparency, can be NULL */ +}; + +struct fb_con2fbmap +{ + uint32_t console; + uint32_t framebuffer; +}; + +/* VESA Blanking Levels */ +#define VESA_NO_BLANKING 0 +#define VESA_VSYNC_SUSPEND 1 +#define VESA_HSYNC_SUSPEND 2 +#define VESA_POWERDOWN 3 + +enum +{ + FB_BLANK_UNBLANK = VESA_NO_BLANKING, /* screen: unblanked, hsync: on, vsync: on */ + FB_BLANK_NORMAL = VESA_NO_BLANKING + 1, /* screen: blanked, hsync: on, vsync: on */ + FB_BLANK_VSYNC_SUSPEND = VESA_VSYNC_SUSPEND + 1, /* screen: blanked, hsync: on, vsync: off */ + FB_BLANK_HSYNC_SUSPEND = VESA_HSYNC_SUSPEND + 1, /* screen: blanked, hsync: off, vsync: on */ + FB_BLANK_POWERDOWN = VESA_POWERDOWN + 1, /* screen: blanked, hsync: off, vsync: off */ +}; + #endif diff --git a/examples/test/dm_graphic_test.c b/examples/test/dm_graphic_test.c new file mode 100644 index 00000000000..a6894ddc6e6 --- /dev/null +++ b/examples/test/dm_graphic_test.c @@ -0,0 +1,310 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-02-25 GuEe-GUI the first version + */ + +#include +#include + +#include + +#ifdef RT_USING_GRAPHIC +typedef rt_int32_t fixed; /* Q16.16 */ + +#define FIX_ONE 65536 +#define FIX_06 19661 /* 0.3 */ +#define FIX_35 22938 /* 0.35 */ +#define FIX_14 917504 /* 14.0 */ +#define FIX_286 187432 /* 2.86 */ +#define FIX_75 49152 /* 0.75 */ +#define FIX_1_3 21845 +#define FIX_2_3 43690 +#define FIX_6 393216 +#define FIX_3 196608 +#define FIX_255 16711680 /* 255 */ + +#define FMUL(a,b) ((fixed)(((rt_int64_t)(a) * (b)) >> 16)) +#define FDIV(a,b) ((fixed)(((rt_int64_t)(a) << 16) / (b))) + +typedef struct { fixed x, y, z; } vec3f; + +rt_inline fixed fix_floor(fixed x) +{ + return x & 0xffff0000; +} + +rt_inline fixed fix_fract(fixed x) +{ + return x & 0x0000ffff; +} + +rt_inline fixed fix_abs(fixed x) +{ + return rt_abs(x); +} + +rt_inline fixed fix_clamp(fixed x, fixed a, fixed b) +{ + return rt_clamp(x, a, b); +} + +static vec3f clamp3(vec3f v, fixed a, fixed b) +{ + vec3f r = + { + .x = fix_clamp(v.x, a, b), + .y = fix_clamp(v.y, a, b), + .z = fix_clamp(v.z, a, b), + }; + + return r; +} + +static vec3f mix3(vec3f A, vec3f B, fixed t) +{ + fixed omt = FIX_ONE - t; + vec3f r = + { + .x = FMUL(A.x, omt) + FMUL(B.x, t), + .y = FMUL(A.y, omt) + FMUL(B.y, t), + .z = FMUL(A.z, omt) + FMUL(B.z, t), + }; + + return r; +} + +static vec3f hsv2rgb(vec3f c) +{ + vec3f t, r, base, mixed; + fixed pX = FMUL(fix_fract(c.x + FIX_ONE), FIX_6); + fixed pY = FMUL(fix_fract(c.x + FIX_2_3), FIX_6); + fixed pZ = FMUL(fix_fract(c.x + FIX_1_3), FIX_6); + + pX = fix_abs(pX - FIX_3); + pY = fix_abs(pY - FIX_3); + pZ = fix_abs(pZ - FIX_3); + + t.x = pX - FIX_ONE; + t.y = pY - FIX_ONE; + t.z = pZ - FIX_ONE; + t = clamp3(t, 0, FIX_ONE); + + base.x = FIX_ONE; + base.y = FIX_ONE; + base.z = FIX_ONE; + + mixed = mix3(base, t, c.y); + + r.x = FMUL(c.z, mixed.x); + r.y = FMUL(c.z, mixed.y); + r.z = FMUL(c.z, mixed.z); + + return r; +} + +static void shader_frame(int px, int py, int width, int height, int frame, + rt_uint8_t *r, rt_uint8_t *g, rt_uint8_t *b) +{ + vec3f col; + fixed uv_x, uv_y, shift, size_computed, st, x; + + uv_x = FDIV((fixed)(px << 16), (fixed)(width << 16)); + uv_y = FDIV((fixed)(py << 16), (fixed)(width << 16)); + + shift = fix_fract(FDIV(FMUL((frame << 16), FIX_06), FIX_286)); + shift = FMUL(shift, FIX_286); + + size_computed = FMUL(uv_x + shift - uv_y, FIX_35); + + st = FMUL(size_computed, FIX_14); + x = FDIV(fix_floor(st), FIX_14); + + col = hsv2rgb((vec3f){ x, FIX_75, FIX_ONE }); + + *r = (rt_uint8_t)((FMUL(col.x, FIX_255) >> 16) & 255); + *g = (rt_uint8_t)((FMUL(col.y, FIX_255) >> 16) & 255); + *b = (rt_uint8_t)((FMUL(col.z, FIX_255) >> 16) & 255); +} + +static void conv_gray4(rt_uint8_t r, rt_uint8_t g, rt_uint8_t b, void *pixel) +{ + rt_uint8_t gray = (r * 30 + g * 59 + b * 11) / 100; + *(rt_uint8_t *)pixel = gray >> 4; +} + +static void conv_gray16(rt_uint8_t r, rt_uint8_t g, rt_uint8_t b, void *pixel) +{ + rt_uint16_t gray = (r * 30 + g * 59 + b * 11) / 100; + rt_uint16_t out = (gray << 8) | gray; + *(rt_uint16_t *)pixel = out; +} + +static void conv_rgb332(rt_uint8_t r, rt_uint8_t g, rt_uint8_t b, void *pixel) +{ + *(rt_uint8_t*)pixel = ((r >> 5) << 5) | ((g >> 5) << 2) | (b >> 6); +} + +static void conv_rgb444(rt_uint8_t r, rt_uint8_t g, rt_uint8_t b, void *pixel) +{ + *(rt_uint16_t *)pixel = ((r >> 4) << 8) | ((g >> 4) << 4) | (b >> 4); +} + +static void conv_rgb565(rt_uint8_t r, rt_uint8_t g, rt_uint8_t b, void *pixel) +{ + *(rt_uint16_t *)pixel = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3); +} + +static void conv_rgb565p(rt_uint8_t r, rt_uint8_t g, rt_uint8_t b, void *pixel) +{ + *(rt_uint16_t *)pixel = ((g >> 2) << 10) | ((r >> 3) << 5) | (b >> 3); +} + +static void conv_bgr565(rt_uint8_t r, rt_uint8_t g, rt_uint8_t b, void *pixel) +{ + *(rt_uint16_t *)pixel = ((b >> 3) << 11) | ((g >> 2) << 5) | (r >> 3); +} + +static void conv_rgb666(rt_uint8_t r, rt_uint8_t g, rt_uint8_t b, void *pixel) +{ + rt_uint8_t *p = (rt_uint8_t *)pixel; + + p[0] = r & 0xfc; + p[1] = g & 0xfc; + p[2] = b & 0xfc; +} + +static void conv_rgb888(rt_uint8_t r, rt_uint8_t g, rt_uint8_t b, void *pixel) +{ + rt_uint8_t *p = (rt_uint8_t *)pixel; + + p[0] = r; + p[1] = g; + p[2] = b; +} + +static void conv_bgr888(rt_uint8_t r, rt_uint8_t g, rt_uint8_t b, void *pixel) +{ + rt_uint8_t *p = (rt_uint8_t*)pixel; + p[0] = b; + p[1] = g; + p[2] = r; +} + +static void conv_argb888(rt_uint8_t r, rt_uint8_t g, rt_uint8_t b, void *pixel) +{ + *(rt_uint32_t *)pixel = (0xffU << 24) | (r << 16) | (g << 8) | b; +} + +static void conv_abgr888(rt_uint8_t r, rt_uint8_t g, rt_uint8_t b, void *pixel) +{ + *(rt_uint32_t *)pixel = (0xffU << 24) | (b << 16) | (g << 8) | r; +} + +static void (*conv_funcs[])(rt_uint8_t r, rt_uint8_t g, rt_uint8_t b, void *pixel) = +{ + [RTGRAPHIC_PIXEL_FORMAT_GRAY4] = conv_gray4, + [RTGRAPHIC_PIXEL_FORMAT_GRAY16] = conv_gray16, + [RTGRAPHIC_PIXEL_FORMAT_RGB332] = conv_rgb332, + [RTGRAPHIC_PIXEL_FORMAT_RGB444] = conv_rgb444, + [RTGRAPHIC_PIXEL_FORMAT_RGB565] = conv_rgb565, + [RTGRAPHIC_PIXEL_FORMAT_RGB565P] = conv_rgb565p, + [RTGRAPHIC_PIXEL_FORMAT_BGR565] = conv_bgr565, + [RTGRAPHIC_PIXEL_FORMAT_RGB666] = conv_rgb666, + [RTGRAPHIC_PIXEL_FORMAT_RGB888] = conv_rgb888, + [RTGRAPHIC_PIXEL_FORMAT_BGR888] = conv_bgr888, + [RTGRAPHIC_PIXEL_FORMAT_ARGB888] = conv_argb888, + [RTGRAPHIC_PIXEL_FORMAT_ABGR888] = conv_abgr888, +}; + +rt_err_t graphic_start(const char *gdev, int count) +{ + rt_err_t err; + rt_uint8_t *vfb, *fb, *pixel, bpp; + struct rt_device_graphic_info info; + struct rt_device *dev = rt_device_find(gdev); + void (*conv_func)(rt_uint8_t r, rt_uint8_t g, rt_uint8_t b, void *pixel); + + if (!dev) + { + return -RT_EINVAL; + } + + if ((err = rt_device_open(dev, 0))) + { + return err; + } + + if ((err = rt_device_control(dev, RTGRAPHIC_CTRL_GET_INFO, &info))) + { + goto _end; + } + + if (!(vfb = rt_malloc(info.smem_len))) + { + err = -RT_ENOMEM; + goto _end; + } + + bpp = info.bits_per_pixel / 8; + conv_func = conv_funcs[info.pixel_format]; + + for (int frame = 0; frame < count; ++frame) + { + fb = vfb; + + for (int y = 0; y < info.height; ++y) + { + pixel = fb; + + for (int x = 0; x < info.width; ++x) + { + rt_uint8_t r, g, b; + + shader_frame(x, y, info.width, info.height, frame, &r, &g, &b); + + conv_func(r, g, b, pixel); + + pixel += bpp; + } + + fb += info.pitch; + } + + rt_memcpy(info.framebuffer, vfb, info.smem_len); + } + + rt_free(vfb); + +_end: + rt_device_close(dev); + + return err; +} + +#ifdef RT_USING_FINSH +#include + +static int _graphic_start(int argc, char**argv) +{ + int count = 10; + const char *gdev = "fb0"; + + if (argc > 1) + { + gdev = argv[1]; + } + if (argc > 2) + { + count = atoi(argv[2]); + } + + return (int)graphic_start(gdev, count); +} +MSH_CMD_EXPORT_ALIAS(_graphic_start, graphic_start, fixed resolution only e.g: graphic_start("fb0", 10)); +#endif /* RT_USING_FINSH */ +#endif /* RT_USING_GRAPHIC */ diff --git a/examples/test/dm_hmi_test.c b/examples/test/dm_hmi_test.c new file mode 100644 index 00000000000..b8fea78ad6c --- /dev/null +++ b/examples/test/dm_hmi_test.c @@ -0,0 +1,421 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-02-25 GuEe-GUI the first version + */ + +#include +#include + +#include +#include + +#if defined(RT_USING_GRAPHIC) && defined(RT_USING_INPUT) + +#define CURSOR_WIDTH 64 +#define CURSOR_HEIGHT 64 + +struct hmi_info +{ + struct rt_device *gdev; + struct rt_device *idev; + + struct rt_device_graphic_info info; + struct rt_device_notify event_notify; + struct rt_input_handler handler; + + rt_bool_t event; + rt_bool_t vsync; + rt_bool_t keydown; + + rt_uint32_t x, y; + rt_uint32_t dx, dy; + rt_uint32_t bytes_per_pixel; + rt_ubase_t line[2]; + rt_ubase_t colors[4]; + + void *backend_framebuffer; +}; + +static rt_bool_t hmi_working; + +static struct rt_input_device *to_input_device(struct rt_device *idev) +{ + return rt_container_of(idev, struct rt_input_device, parent); +} + +static rt_ubase_t to_color(rt_uint8_t color255, rt_ubase_t color_max) +{ + return (rt_ubase_t)color255 * color_max / 255; +} + +static void hmi_reset(struct hmi_info *hmi) +{ + void *cursor; + rt_ubase_t none_alpha; + rt_ubase_t red_off, green_off, blue_off, alpha_off; + rt_ubase_t red_mask, green_mask, blue_mask, alpha_mask; + struct fb_var_screeninfo var; + + if (hmi->backend_framebuffer) + { + rt_free(hmi->backend_framebuffer); + } + + rt_device_control(hmi->gdev, FBIOGET_VSCREENINFO, &var); + rt_device_control(hmi->gdev, RTGRAPHIC_CTRL_GET_INFO, &hmi->info); + + hmi->backend_framebuffer = rt_malloc(hmi->info.smem_len); + + hmi->bytes_per_pixel = hmi->info.bits_per_pixel / 8; + red_off = var.red.offset; + red_mask = RT_GENMASK(var.red.length - 1, 0); + green_off = var.green.offset; + green_mask = RT_GENMASK(var.green.length - 1, 0); + blue_off = var.blue.offset; + blue_mask = RT_GENMASK(var.blue.length - 1, 0); + + if (var.transp.length) + { + alpha_off = var.transp.offset; + alpha_mask = RT_GENMASK(var.transp.length - 1, 0); + } + else + { + alpha_off = 0; + alpha_mask = 0; + } + + if ((cursor = rt_malloc(CURSOR_WIDTH * CURSOR_HEIGHT * hmi->bytes_per_pixel))) + { + rt_uint8_t *stream = cursor; + rt_ubase_t color = ((to_color(0x82, red_mask)) << red_off) | + (to_color(0x50, green_mask) << green_off) | + (to_color(0xdf, blue_mask) << blue_off) | + (to_color(0xcc, alpha_mask) << alpha_off); + + for (int y = 0; y < CURSOR_HEIGHT; ++y) + { + for (int x = 0; x < CURSOR_WIDTH; ++x) + { + rt_memcpy(stream, &color, hmi->bytes_per_pixel); + stream += hmi->bytes_per_pixel; + } + } + + rt_device_control(hmi->gdev, RT_DEVICE_CTRL_CURSOR_SET_TYPE, cursor); + rt_free(cursor); + } + + none_alpha = alpha_mask << alpha_off; + + hmi->line[0] = ~0UL; + hmi->line[1] = none_alpha; + + hmi->colors[0] = ((to_color(0xff, red_mask)) << red_off) | + (to_color(0x4b, green_mask) << green_off) | + (to_color(0x00, blue_mask) << blue_off) | none_alpha; + hmi->colors[1] = ((to_color(0x7f, red_mask)) << red_off) | + (to_color(0xdb, green_mask) << green_off) | + (to_color(0x3b, blue_mask) << blue_off) | none_alpha; + hmi->colors[2] = ((to_color(0x00, red_mask)) << red_off) | + (to_color(0xa4, green_mask) << green_off) | + (to_color(0xef, blue_mask) << blue_off) | none_alpha; + hmi->colors[3] = ((to_color(0xff, red_mask)) << red_off) | + (to_color(0xb8, green_mask) << green_off) | + (to_color(0x1c, blue_mask) << blue_off) | none_alpha; + + hmi->event = RT_FALSE; +} + +static void hmi_graphic_notify(rt_device_t dev) +{ + struct hmi_info *hmi = (void *)dev; + + hmi->event = RT_TRUE; +} + +static rt_bool_t hmi_input_callback(struct rt_input_handler *handler, + struct rt_input_event *ev) +{ + struct hmi_info *hmi = handler->priv; + + if (ev->type == EV_ABS) + { + if (ev->code == 0) + { + hmi->dx = (ev->value * hmi->info.width) / + (handler->idev->absinfo->maximum - handler->idev->absinfo->minimum); + } + else if (ev->code == 1) + { + hmi->dy = (ev->value * hmi->info.height) / + (handler->idev->absinfo->maximum - handler->idev->absinfo->minimum); + } + } + else if (ev->type == EV_KEY) + { + if (ev->code == BTN_LEFT) + { + if (hmi->keydown && ev->value == 0) + { + /* Swap lines color */ + hmi->line[0] ^= hmi->line[1]; + hmi->line[1] ^= hmi->line[0]; + hmi->line[0] ^= hmi->line[1]; + + hmi->keydown = RT_FALSE; + hmi->vsync = RT_FALSE; + } + else + { + hmi->keydown = RT_TRUE; + } + } + } + else if (ev->type == EV_SYN) + { + hmi->vsync = RT_FALSE; + } + + return RT_TRUE; +} + +static void hmi_loop(void *param) +{ + struct hmi_info *hmi = param; + struct rt_device_rect_info rect; + struct rt_device_graphic_ops *gops; + + /* Graphic device event */ + hmi->event_notify.notify = &hmi_graphic_notify; + hmi->event_notify.dev = (void *)hmi; + rt_device_control(hmi->gdev, RT_DEVICE_CTRL_NOTIFY_SET, &hmi->event_notify); + + /* Input device event */ + hmi->handler.idev = to_input_device(hmi->idev); + hmi->handler.identify = RT_NULL; + hmi->handler.callback = &hmi_input_callback; + hmi->handler.priv = hmi; + rt_input_add_handler(&hmi->handler); + + hmi->backend_framebuffer = RT_NULL; + hmi_reset(hmi); + + hmi->dx = hmi->info.width >> 1; + hmi->dy = hmi->info.height >> 1; + + rect.x = 0; + rect.y = 0; + + gops = rt_graphix_ops(hmi->gdev); + rt_device_control(hmi->gdev, RTGRAPHIC_CTRL_POWERON, RT_NULL); + + while (hmi_working) + { + rt_ubase_t pos; + + /* Wait graphic change */ + if (hmi->event) + { + hmi_reset(hmi); + } + + hmi->x = hmi->dx; + hmi->y = hmi->dy; + + rect.width = hmi->info.width; + rect.height = hmi->info.height; + pos = RTGRAPHIC_PIXEL_POSITION(hmi->x, hmi->y); + + for (int i = 0; i < RT_ARRAY_SIZE(hmi->colors); ++i) + { + rt_uint32_t x1, y1, x2, y2; + void *fb = hmi->backend_framebuffer ? : hmi->info.framebuffer; + + switch (i) + { + case 0: + x1 = 0; + y1 = 0; + x2 = hmi->x; + y2 = hmi->y; + break; + + case 1: + x1 = hmi->x; + y1 = 0; + x2 = hmi->info.width; + y2 = hmi->y; + break; + + case 2: + x1 = 0; + y1 = hmi->y; + x2 = hmi->x; + y2 = hmi->info.height; + break; + + case 3: + x1 = hmi->x; + y1 = hmi->y; + x2 = hmi->info.width; + y2 = hmi->info.height; + break; + } + + fb += x1 * hmi->bytes_per_pixel + y1 * hmi->info.pitch; + + for (int y = y1; y < y2; ++y) + { + void *fb_entry = fb; + + for (int x = x1; x < x2; ++x) + { + rt_memcpy(fb, &hmi->colors[i], hmi->bytes_per_pixel); + fb += hmi->bytes_per_pixel; + } + + fb = fb_entry + hmi->info.pitch; + } + } + + if (hmi->backend_framebuffer) + { + rt_memcpy(hmi->info.framebuffer, hmi->backend_framebuffer, hmi->info.smem_len); + } + + gops->draw_hline((void *)&hmi->line[0], 0, rect.width, hmi->y); + gops->draw_vline((void *)&hmi->line[1], hmi->x, 0, rect.height); + + rt_device_control(hmi->gdev, RTGRAPHIC_CTRL_RECT_UPDATE, &rect); + rt_device_control(hmi->gdev, RT_DEVICE_CTRL_CURSOR_SET_POSITION, (void *)pos); + + /* Next position */ + hmi->vsync = RT_TRUE; + rt_hw_wmb(); + + while (hmi_working && hmi->vsync) + { + rt_thread_mdelay(1); + } + } + + rt_device_control(hmi->gdev, RTGRAPHIC_CTRL_POWEROFF, RT_NULL); + + rt_memset(&hmi->event_notify, 0, sizeof(hmi->event_notify)); + rt_device_control(hmi->gdev, RT_DEVICE_CTRL_NOTIFY_SET, &hmi->event_notify); + + rt_input_del_handler(&hmi->handler); + + rt_device_close(hmi->gdev); + rt_device_close(hmi->idev); + + if (hmi->backend_framebuffer) + { + rt_free(hmi->backend_framebuffer); + } + rt_free(hmi); + + rt_thread_delete(rt_thread_self()); +} + +rt_err_t hmi_start(const char *gdev, const char *idev) +{ + rt_err_t err; + struct hmi_info *hmi; + struct rt_thread *loop; + + if (hmi_working) + { + rt_kprintf("HMI is running\n"); + return -RT_EBUSY; + } + + hmi = rt_malloc(sizeof(*hmi)); + + if (!hmi) + { + return -RT_ENOMEM; + } + + hmi->gdev = rt_device_find(gdev); + hmi->idev = rt_device_find(idev); + + if (!hmi->gdev || !hmi->idev) + { + rt_free(hmi); + return -RT_EINVAL; + } + + if (!rt_bitmap_test_bit(to_input_device(hmi->idev)->cap, EV_ABS)) + { + rt_kprintf("%s is not a ABS input\n", idev); + rt_free(hmi); + return -RT_EINVAL; + } + + if ((err = rt_device_open(hmi->gdev, 0))) + { + rt_free(hmi); + return err; + } + + if ((err = rt_device_open(hmi->idev, 0))) + { + rt_device_close(hmi->gdev); + rt_free(hmi); + return err; + } + + loop = rt_thread_create("HMI", hmi_loop, hmi, + DM_THREAD_STACK_SIZE, + RT_THREAD_PRIORITY_MAX / 3, + rt_tick_from_millisecond(RT_GRAPHIC_UPDATE_MS)); + + if (!loop) + { + rt_device_close(hmi->gdev); + rt_device_close(hmi->idev); + rt_free(hmi); + return -RT_ENOMEM; + } + + hmi_working = RT_TRUE; + rt_thread_startup(loop); + + return RT_EOK; +} + +rt_err_t hmi_stop(void) +{ + hmi_working = RT_FALSE; + return RT_EOK; +} + +#ifdef RT_USING_FINSH +static int _hmi_start(int argc, char**argv) +{ + const char *gdev = "fb0", *idev = "input0"; + + if (argc == 3) + { + gdev = argv[1]; + idev = argv[2]; + } + + return (int)hmi_start(gdev, idev); +} +MSH_CMD_EXPORT_ALIAS(_hmi_start, hmi_start, e.g: hmi_start("fb0", "input0")); + +static int _hmi_stop(void) +{ + return (int)hmi_stop(); +} +MSH_CMD_EXPORT_ALIAS(_hmi_stop, hmi_stop, e.g: hmi_exit()); +#endif /* RT_USING_FINSH */ +#endif /* RT_USING_GRAPHIC && RT_USING_INPUT */ From d0b3edb61e0918a9b648871342e440733a24b65e Mon Sep 17 00:00:00 2001 From: GuEe-GUI <2991707448@qq.com> Date: Fri, 12 Dec 2025 16:03:34 +0800 Subject: [PATCH 2/2] [dm][graphic] add new drivers and logo 1. Generic GPIO based backlight driver 2. Generic PWM based backlight driver 3. Simple framebuffer support 4. Standard 224-color RT-Thread logo 5. Standard 224-color RT-Thread white logo Signed-off-by: GuEe-GUI <2991707448@qq.com> --- components/drivers/graphic/backlight/Kconfig | 15 + .../drivers/graphic/backlight/SConscript | 6 + .../graphic/backlight/backlight-gpio.c | 135 ++ .../drivers/graphic/backlight/backlight-pwm.c | 569 ++++++ .../drivers/graphic/framebuffer/Kconfig | 6 + .../drivers/graphic/framebuffer/SConscript | 3 + .../drivers/graphic/framebuffer/fb-simple.c | 381 ++++ components/drivers/graphic/logo/Kconfig | 6 + components/drivers/graphic/logo/SConscript | 6 + .../graphic/logo/logo-rt-thread-clut224.ppm | 1597 +++++++++++++++++ .../logo/logo-rt-thread-white-clut224.ppm | 1597 +++++++++++++++++ 11 files changed, 4321 insertions(+) create mode 100644 components/drivers/graphic/backlight/backlight-gpio.c create mode 100644 components/drivers/graphic/backlight/backlight-pwm.c create mode 100644 components/drivers/graphic/framebuffer/fb-simple.c create mode 100644 components/drivers/graphic/logo/logo-rt-thread-clut224.ppm create mode 100644 components/drivers/graphic/logo/logo-rt-thread-white-clut224.ppm diff --git a/components/drivers/graphic/backlight/Kconfig b/components/drivers/graphic/backlight/Kconfig index 1951e0c05ac..a0c85a32fc6 100644 --- a/components/drivers/graphic/backlight/Kconfig +++ b/components/drivers/graphic/backlight/Kconfig @@ -2,6 +2,21 @@ menuconfig RT_GRAPHIC_BACKLIGHT bool "Backlight support" default n +config RT_GRAPHIC_BACKLIGHT_GPIO + bool "Generic GPIO based backlight driver" + depends on RT_GRAPHIC_BACKLIGHT + depends on RT_USING_PIN + default n + +config RT_GRAPHIC_BACKLIGHT_PWM + bool "Generic PWM based backlight driver" + depends on RT_GRAPHIC_BACKLIGHT + depends on RT_USING_OFW + depends on RT_USING_PIN + depends on RT_USING_PWM + depends on RT_USING_REGULATOR + default n + if RT_GRAPHIC_BACKLIGHT osource "$(SOC_DM_GRAPHIC_BACKLIGHT_DIR)/Kconfig" endif diff --git a/components/drivers/graphic/backlight/SConscript b/components/drivers/graphic/backlight/SConscript index 6e29db51b3f..204867b44cc 100644 --- a/components/drivers/graphic/backlight/SConscript +++ b/components/drivers/graphic/backlight/SConscript @@ -10,5 +10,11 @@ CPPPATH = [cwd + '/../../include'] src = ['backlight.c'] +if GetDepend(['RT_GRAPHIC_BACKLIGHT_GPIO']): + src += ['backlight-gpio.c'] + +if GetDepend(['RT_GRAPHIC_BACKLIGHT_PWM']): + src += ['backlight-pwm.c'] + group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH) Return('group') diff --git a/components/drivers/graphic/backlight/backlight-gpio.c b/components/drivers/graphic/backlight/backlight-gpio.c new file mode 100644 index 00000000000..b46a99fcf64 --- /dev/null +++ b/components/drivers/graphic/backlight/backlight-gpio.c @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-02-25 GuEe-GUI the first version + */ + +#include +#include +#include + +#define DBG_TAG "backlight.gpio" +#define DBG_LVL DBG_INFO +#include + +struct gpio_backlight +{ + struct rt_backlight_device parent; + + rt_base_t pin; + rt_uint8_t active_val; +}; + +#define raw_to_gpio_backlight(raw) rt_container_of(raw, struct gpio_backlight, parent) + +static rt_err_t gpio_backlight_update_status(struct rt_backlight_device *bl) +{ + rt_uint8_t brightness; + struct gpio_backlight *gbl = raw_to_gpio_backlight(bl); + + rt_pin_mode(gbl->pin, PIN_MODE_OUTPUT); + + brightness = rt_backlight_power_brightness(bl); + + if (!gbl->active_val) + { + brightness = !brightness; + } + + rt_pin_write(gbl->pin, brightness); + + return RT_EOK; +} + +static struct rt_backlight_ops gpio_backlight_ops = +{ + .update_status = gpio_backlight_update_status, +}; + +static rt_err_t gpio_backlight_probe(struct rt_platform_device *pdev) +{ + rt_err_t err; + rt_bool_t def_value; + struct rt_device *dev = &pdev->parent; + struct gpio_backlight *gbl = rt_calloc(1, sizeof(*gbl)); + + if (!gbl) + { + return -RT_ENOMEM; + } + + def_value = rt_dm_dev_prop_read_bool(dev, "default-on"); + + gbl->pin = rt_pin_get_named_pin(dev, RT_NULL, 0, RT_NULL, &gbl->active_val); + + if (gbl->pin < 0) + { + err = gbl->pin; + + goto _fail; + } + + /* Set the initial power state */ + if (!dev->ofw_node || !rt_dm_dev_prop_read_bool(dev, "phandle")) + { + gbl->parent.props.power = def_value ? + RT_BACKLIGHT_POWER_UNBLANK : RT_BACKLIGHT_POWER_POWERDOWN; + } + else if (rt_pin_read(gbl->pin) != gbl->active_val) + { + gbl->parent.props.power = RT_BACKLIGHT_POWER_POWERDOWN; + } + else + { + gbl->parent.props.power = RT_BACKLIGHT_POWER_UNBLANK; + } + + gbl->parent.props.max_brightness = 1; + gbl->parent.ops = &gpio_backlight_ops; + + if ((err = rt_backlight_register(&gbl->parent))) + { + goto _fail; + } + + rt_pin_mode(gbl->pin, PIN_MODE_OUTPUT); + rt_backlight_set_brightness(&gbl->parent, 1); + + return RT_EOK; + +_fail: + rt_free(gbl); + + return err; +} + +static rt_err_t gpio_backlight_remove(struct rt_platform_device *pdev) +{ + struct gpio_backlight *gbl = pdev->parent.user_data; + + rt_backlight_unregister(&gbl->parent); + + rt_free(gbl); + + return RT_EOK; +} + +static const struct rt_ofw_node_id gpio_backlight_ofw_ids[] = +{ + { .compatible = "gpio-backlight" }, + { /* sentinel */ } +}; + +static struct rt_platform_driver gpio_backlight_driver = +{ + .name = "gpio-backlight", + .ids = gpio_backlight_ofw_ids, + + .probe = gpio_backlight_probe, + .remove = gpio_backlight_remove, +}; +RT_PLATFORM_DRIVER_EXPORT(gpio_backlight_driver); diff --git a/components/drivers/graphic/backlight/backlight-pwm.c b/components/drivers/graphic/backlight/backlight-pwm.c new file mode 100644 index 00000000000..7972cce6f28 --- /dev/null +++ b/components/drivers/graphic/backlight/backlight-pwm.c @@ -0,0 +1,569 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-02-25 GuEe-GUI the first version + */ + +#include +#include +#include + +#define DBG_TAG "backlight.pwm" +#define DBG_LVL DBG_INFO +#include + +struct pwm_backlight +{ + struct rt_backlight_device parent; + + rt_uint32_t lth_brightness; + rt_uint32_t *levels; + + rt_base_t enable_pin; + rt_uint8_t active_val; + + rt_uint32_t scale; + rt_uint32_t post_pwm_on_delay; + rt_uint32_t pwm_off_delay; + rt_uint32_t dft_brightness; + rt_uint32_t max_brightness; + + rt_bool_t enabled; + struct rt_device_pwm *pwm_dev; + struct rt_pwm_configuration pwm_conf; + + struct rt_regulator *power_supply; +}; + +#define raw_to_pwm_backlight(raw) rt_container_of(raw, struct pwm_backlight, parent) + +static void pwm_backlight_power_on(struct pwm_backlight *pbl) +{ + rt_err_t err; + + if (pbl->enabled) + { + return; + } + + if (pbl->power_supply) + { + if ((err = rt_regulator_enable(pbl->power_supply))) + { + LOG_E("Enable power supply error = %s", rt_strerror(err)); + } + } + + if (pbl->post_pwm_on_delay) + { + rt_thread_mdelay(pbl->post_pwm_on_delay); + } + + if (pbl->enable_pin >= 0) + { + rt_pin_write(pbl->enable_pin, pbl->active_val); + } + + pbl->enabled = RT_TRUE; +} + +static void pwm_backlight_power_off(struct pwm_backlight *pbl) +{ + if (!pbl->enabled) + { + return; + } + + if (pbl->enable_pin >= 0) + { + rt_pin_write(pbl->enable_pin, !pbl->active_val); + } + + if (pbl->pwm_off_delay) + { + rt_thread_mdelay(pbl->pwm_off_delay); + } + + if (pbl->power_supply) + { + rt_regulator_disable(pbl->power_supply); + } + + pbl->enabled = RT_FALSE; +} + +static int compute_duty_cycle(struct pwm_backlight *pbl, rt_uint32_t brightness, + rt_uint32_t period) +{ + rt_uint64_t duty_cycle; + rt_uint32_t lth = pbl->lth_brightness; + + if (pbl->levels) + { + duty_cycle = pbl->levels[brightness]; + } + else + { + duty_cycle = brightness; + } + + duty_cycle *= period - lth; + rt_do_div(duty_cycle, pbl->scale); + + return duty_cycle + lth; +} + +static rt_err_t pwm_backlight_update_status(struct rt_backlight_device *bl) +{ + rt_uint32_t brightness, duty_cycle; + struct rt_pwm_configuration pwm_conf = {}; + struct pwm_backlight *pbl = raw_to_pwm_backlight(bl); + + rt_pwm_get(pbl->pwm_dev, &pwm_conf); + brightness = rt_backlight_power_brightness(bl); + + if (brightness > 0) + { + duty_cycle = compute_duty_cycle(pbl, brightness, pwm_conf.period); + pwm_conf.pulse = duty_cycle; + rt_pwm_set(pbl->pwm_dev, pwm_conf.channel, pwm_conf.period, pwm_conf.pulse); + + rt_pwm_enable(pbl->pwm_dev, pbl->pwm_conf.channel); + + pwm_backlight_power_on(pbl); + } + else + { + pwm_backlight_power_off(pbl); + + pwm_conf.pulse = 0; + rt_pwm_set(pbl->pwm_dev, pwm_conf.channel, pwm_conf.period, pwm_conf.pulse); + + if (pbl->power_supply || pbl->enable_pin >= 0) + { + rt_pwm_disable(pbl->pwm_dev, pbl->pwm_conf.channel); + } + } + + return RT_EOK; +} + +static struct rt_backlight_ops pwm_backlight_ops = +{ + .update_status = pwm_backlight_update_status, +}; + +#define PWM_LUMINANCE_SHIFT 16 +#define PWM_LUMINANCE_SCALE (1 << PWM_LUMINANCE_SHIFT) /* luminance scale */ + +rt_inline int period_fls(int period) +{ + return period ? sizeof(period) * 8 - __rt_clz(period) : 0; +} + +static rt_err_t pwm_backlight_brightness_default(struct pwm_backlight *pbl, + rt_uint32_t period) +{ + rt_uint32_t lightness; + rt_uint64_t res, cie1931; + + pbl->max_brightness = rt_min((int)RT_DIV_ROUND_UP(period, period_fls(period)), 4096); + + pbl->levels = rt_calloc(pbl->max_brightness, sizeof(*pbl->levels)); + + if (!pbl->levels) + { + return -RT_ENOMEM; + } + + /* Fill the table using the cie1931 algorithm */ + for (int i = 0; i < pbl->max_brightness; ++i) + { + lightness = (i * PWM_LUMINANCE_SCALE) / pbl->max_brightness * 100; + + if (lightness <= (8 * PWM_LUMINANCE_SCALE)) + { + cie1931 = RT_DIV_ROUND_CLOSEST(lightness * 10, 9033); + } + else + { + cie1931 = (lightness + (16 * PWM_LUMINANCE_SCALE)) / 116; + cie1931 *= cie1931 * cie1931; + cie1931 += 1ULL << (2 * PWM_LUMINANCE_SHIFT - 1); + cie1931 >>= 2 * PWM_LUMINANCE_SHIFT; + } + + res = cie1931 * period; + res = RT_DIV_ROUND_CLOSEST_ULL(res, PWM_LUMINANCE_SCALE); + + if (res > RT_UINT32_MAX) + { + return -RT_EINVAL; + } + + pbl->levels[i] = (rt_uint32_t)res; + } + + pbl->dft_brightness = pbl->max_brightness / 2; + pbl->max_brightness--; + + return 0; +} + +static rt_err_t pwm_backlight_ofw_parse(struct pwm_backlight *pbl, + struct rt_ofw_node *np) +{ + rt_err_t err; + rt_ssize_t length; + rt_uint32_t *table, value; + rt_uint32_t num_levels, num_steps = 0; + struct rt_ofw_prop *prop; + + /* + * These values are optional and set as 0 by default, the out values + * are modified only if a valid u32 value can be decoded. + */ + rt_ofw_prop_read_u32(np, "post-pwm-on-delay-ms", &pbl->post_pwm_on_delay); + rt_ofw_prop_read_u32(np, "pwm-off-delay-ms", &pbl->pwm_off_delay); + + /* + * Determine the number of brightness levels, if this property is not + * set a default table of brightness levels will be used. + */ + prop = rt_ofw_get_prop(np, "brightness-levels", &length); + + if (!prop) + { + return RT_EOK; + } + + num_levels = length / sizeof(rt_uint32_t); + + if (!num_levels) + { + return RT_EOK; + } + + pbl->levels = rt_calloc(num_levels, sizeof(*pbl->levels)); + + if (!pbl->levels) + { + return -RT_ENOMEM; + } + + if ((err = rt_ofw_prop_read_u32_array_index(np, "brightness-levels", + 0, num_levels, pbl->levels)) < 0) + { + goto _fail; + } + + if ((err = rt_ofw_prop_read_u32(np, "default-brightness-level", &value))) + { + goto _fail; + } + + pbl->dft_brightness = value; + + /* + * This property is optional, if is set enables linear + * interpolation between each of the values of brightness levels + * and creates a new pre-computed table. + */ + rt_ofw_prop_read_u32(np, "num-interpolated-steps", &num_steps); + + /* + * Make sure that there is at least two entries in the + * brightness-levels table, otherwise we can't interpolate + * between two points. + */ + if (num_steps) + { + rt_int64_t dy; + rt_uint32_t x1, x2, x, dx, y1, y2; + rt_uint32_t num_input_levels = num_levels; + + if (num_input_levels < 2) + { + LOG_E("Can't interpolate"); + + err = -RT_EINVAL; + goto _fail; + } + + num_levels = (num_input_levels - 1) * num_steps + 1; + + table = rt_calloc(num_levels, sizeof(*table)); + + if (!table) + { + err = -RT_ENOMEM; + goto _fail; + } + + /* + * Fill the interpolated table[x] = y + * by draw lines between each (x1, y1) to (x2, y2). + */ + dx = num_steps; + + for (int i = 0; i < num_input_levels - 1; ++i) + { + x1 = i * dx; + x2 = x1 + dx; + y1 = pbl->levels[i]; + y2 = pbl->levels[i + 1]; + dy = (rt_int64_t)y2 - y1; + + for (x = x1; x < x2; ++x) + { + table[x] = y1 + (rt_int64_t)(dy * (x - x1)) / (rt_int64_t)dx; + } + } + + /* Fill in the last point, since no line starts here. */ + table[x2] = y2; + + rt_free(pbl->levels); + pbl->levels = table; + } + + pbl->max_brightness = num_levels - 1; + + return RT_EOK; + +_fail: + rt_free(pbl->levels); + + return err; +} + +static enum rt_backlight_power pwm_backlight_initial_power_state( + struct pwm_backlight *pbl, struct rt_device *dev) +{ + rt_bool_t active = RT_TRUE; + + if (pbl->enable_pin >= 0 && rt_pin_read(pbl->enable_pin) != pbl->active_val) + { + active = RT_FALSE; + } + + if (pbl->power_supply && !rt_regulator_is_enabled(pbl->power_supply)) + { + active = RT_FALSE; + } + + /* Synchronize the enable_gpio with the observed state of the hardware. */ + rt_pin_mode(pbl->enable_pin, PIN_MODE_OUTPUT); + rt_pin_write(pbl->enable_pin, active ? pbl->active_val : !pbl->active_val); + + /* Not booted with device tree or no phandle link to the node */ + if (!dev->ofw_node || rt_dm_dev_prop_read_bool(dev, "phandle")) + { + return RT_BACKLIGHT_POWER_UNBLANK; + } + + return active ? RT_BACKLIGHT_POWER_UNBLANK: RT_BACKLIGHT_POWER_POWERDOWN; +} + +static rt_err_t pwm_backlight_probe(struct rt_platform_device *pdev) +{ + rt_err_t err; + enum rt_backlight_power power; + struct rt_ofw_cell_args pwm_args; + struct rt_device *dev = &pdev->parent; + struct rt_ofw_node *np = dev->ofw_node, *pwm_np; + struct pwm_backlight *pbl = rt_calloc(1, sizeof(*pbl)); + + if (!pbl) + { + return -RT_ENOMEM; + } + + if ((err = pwm_backlight_ofw_parse(pbl, dev->ofw_node))) + { + goto _fail; + } + + pbl->enable_pin = rt_pin_get_named_pin(dev, "enable", 0, RT_NULL, &pbl->active_val); + + if (pbl->enable_pin < 0 && pbl->enable_pin != PIN_NONE) + { + err = pbl->enable_pin; + + goto _fail; + } + + pbl->power_supply = rt_regulator_get(dev, "power"); + + if (rt_is_err(pbl->power_supply)) + { + err = rt_ptr_err(pbl->power_supply); + + goto _fail; + } + + if (rt_ofw_parse_phandle_cells(np, "pwms", "#pwm-cells", 0, &pwm_args)) + { + err = -RT_EINVAL; + goto _fail; + } + + pwm_np = pwm_args.data; + + if (!rt_ofw_data(pwm_np)) + { + rt_platform_ofw_request(pwm_np); + } + + pbl->pwm_dev = rt_ofw_data(pwm_np); + rt_ofw_node_put(pwm_np); + + if (!pbl->pwm_dev) + { + err = -RT_EINVAL; + goto _fail; + } + + pbl->pwm_conf.channel = pwm_args.args[0]; + pbl->pwm_conf.period = pwm_args.args[1]; + + rt_pwm_set_period(pbl->pwm_dev, pbl->pwm_conf.channel, pbl->pwm_conf.period); + + if (pbl->levels) + { + for (int i = 0; i <= pbl->max_brightness; ++i) + { + if (pbl->levels[i] > pbl->scale) + { + pbl->scale = pbl->levels[i]; + } + } + } + else if (!pbl->max_brightness) + { + struct rt_pwm_configuration pwm_conf = {}; + + rt_pwm_get(pbl->pwm_dev, &pwm_conf); + + /* Make levels */ + if ((err = pwm_backlight_brightness_default(pbl, pbl->pwm_conf.period))) + { + LOG_E("Setup default brightness table error = %s", rt_strerror(err)); + + goto _fail; + } + + for (int i = 0; i <= pbl->max_brightness; ++i) + { + if (pbl->levels[i] > pbl->scale) + { + pbl->scale = pbl->levels[i]; + } + } + } + else + { + pbl->scale = pbl->max_brightness; + } + + pbl->parent.props.max_brightness = pbl->max_brightness; + pbl->parent.ops = &pwm_backlight_ops; + + if ((err = rt_backlight_register(&pbl->parent))) + { + goto _fail; + } + + power = pwm_backlight_initial_power_state(pbl, dev); + rt_backlight_set_power(&pbl->parent, power); + + if (pbl->dft_brightness > pbl->max_brightness) + { + LOG_W("Invalid default brightness level: %u, using %u", + pbl->dft_brightness, pbl->max_brightness); + + pbl->dft_brightness = pbl->max_brightness; + } + rt_backlight_set_brightness(&pbl->parent, pbl->dft_brightness); + + return RT_EOK; + +_fail: + if (!rt_is_err_or_null(pbl->power_supply)) + { + rt_regulator_put(pbl->power_supply); + } + + if (pbl->levels) + { + rt_free(pbl->levels); + } + + rt_free(pbl); + + return err; +} + +static rt_err_t pwm_backlight_remove(struct rt_platform_device *pdev) +{ + struct rt_pwm_configuration pwm_conf = {}; + struct pwm_backlight *pbl = pdev->parent.user_data; + + rt_backlight_unregister(&pbl->parent); + + pwm_backlight_power_off(pbl); + + rt_regulator_put(pbl->power_supply); + + rt_pwm_get(pbl->pwm_dev, &pwm_conf); + pwm_conf.pulse = 0; + + rt_pwm_set(pbl->pwm_dev, pwm_conf.channel, pwm_conf.period, pwm_conf.pulse); + rt_pwm_disable(pbl->pwm_dev, pbl->pwm_conf.channel); + + if (pbl->levels) + { + rt_free(pbl->levels); + } + + rt_free(pbl); + + return RT_EOK; +} + +static rt_err_t pwm_backlight_shutdown(struct rt_platform_device *pdev) +{ + struct rt_pwm_configuration pwm_conf = {}; + struct pwm_backlight *pbl = pdev->parent.user_data; + + pwm_backlight_power_off(pbl); + + rt_pwm_get(pbl->pwm_dev, &pwm_conf); + pwm_conf.pulse = 0; + + rt_pwm_set(pbl->pwm_dev, pwm_conf.channel, pwm_conf.period, pwm_conf.pulse); + rt_pwm_disable(pbl->pwm_dev, pbl->pwm_conf.channel); + + return RT_EOK; +} + +static const struct rt_ofw_node_id pwm_backlight_ofw_ids[] = +{ + { .compatible = "pwm-backlight" }, + { /* sentinel */ } +}; + +static struct rt_platform_driver pwm_backlight_driver = +{ + .name = "pwm-backlight", + .ids = pwm_backlight_ofw_ids, + + .probe = pwm_backlight_probe, + .remove = pwm_backlight_remove, + .shutdown = pwm_backlight_shutdown, +}; +RT_PLATFORM_DRIVER_EXPORT(pwm_backlight_driver); diff --git a/components/drivers/graphic/framebuffer/Kconfig b/components/drivers/graphic/framebuffer/Kconfig index 9144377d202..d13c9bf1427 100644 --- a/components/drivers/graphic/framebuffer/Kconfig +++ b/components/drivers/graphic/framebuffer/Kconfig @@ -3,6 +3,12 @@ menuconfig RT_GRAPHIC_FB select RT_USING_LCD default y +config RT_GRAPHIC_FB_SIMPLE + bool "Simple framebuffer support" + depends on RT_GRAPHIC_FB + depends on RT_USING_OFW + default y + if RT_GRAPHIC_FB osource "$(SOC_DM_GRAPHIC_FB_DIR)/Kconfig" endif diff --git a/components/drivers/graphic/framebuffer/SConscript b/components/drivers/graphic/framebuffer/SConscript index 55d76c540fc..0323df1cd3a 100644 --- a/components/drivers/graphic/framebuffer/SConscript +++ b/components/drivers/graphic/framebuffer/SConscript @@ -11,6 +11,9 @@ CPPPATH = [cwd + '/../../include'] src = [] +if GetDepend(['RT_GRAPHIC_FB_SIMPLE']): + src += ['fb-simple.c'] + group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH) Return('group') diff --git a/components/drivers/graphic/framebuffer/fb-simple.c b/components/drivers/graphic/framebuffer/fb-simple.c new file mode 100644 index 00000000000..55f80542cf7 --- /dev/null +++ b/components/drivers/graphic/framebuffer/fb-simple.c @@ -0,0 +1,381 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-02-25 GuEe-GUI the first version + */ + +#include +#include +#include + +#define DBG_TAG "fb.simple" +#define DBG_LVL DBG_INFO +#include + +struct simplefb_format +{ + const char *name; + rt_uint32_t mode; + rt_uint32_t bits_per_pixel; +}; + +struct simplefb_params +{ + rt_uint32_t width; + rt_uint32_t height; + rt_uint32_t stride; + struct simplefb_format *format; +}; + +struct simplefb +{ + struct rt_graphic_device parent; + + void *screen_base; + rt_size_t screen_size; + rt_size_t stride; + +#ifdef RT_USING_CLK + rt_bool_t clk_arr_enabled; + struct rt_clk_array *clk_arr; +#endif +#ifdef RT_USING_REGULATOR + rt_bool_t supplys_enabled; + rt_size_t supplys_nr; + struct rt_regulator **supplys; +#endif +}; + +#ifdef RT_USING_CLK +static rt_err_t simplefb_clk_probe(struct simplefb *sfb, + struct rt_platform_device *pdev) +{ + sfb->clk_arr = rt_clk_get_array(&pdev->parent); + + if (rt_is_err(sfb->clk_arr)) + { + return rt_ptr_err(sfb->clk_arr); + } + + return RT_EOK; +} + +static void simplefb_clk_enable(struct simplefb *sfb) +{ + rt_clk_array_prepare_enable(sfb->clk_arr); + sfb->clk_arr_enabled = RT_TRUE; +} + +static void simplefb_clk_remove(struct simplefb *sfb) +{ + if (!rt_is_err_or_null(sfb->clk_arr)) + { + if (sfb->clk_arr_enabled) + { + rt_clk_array_disable_unprepare(sfb->clk_arr); + } + + rt_clk_array_put(sfb->clk_arr); + } +} +#else +static rt_err_t simplefb_clk_probe(struct simplefb *sfb, + struct rt_platform_device *pdev) { return RT_EOK; } +static void simplefb_clk_enable(struct simplefb *sfb) { } +static void simplefb_clk_remove(struct simplefb *sfb) { } +#endif /* RT_USING_CLK */ + +#ifdef RT_USING_REGULATOR +#define SUPPLY_SUFFIX "-supply" + +static rt_err_t simplefb_regulator_probe(struct simplefb *sfb, + struct rt_platform_device *pdev) +{ + int i = 0; + const char *name; + struct rt_device *dev = &pdev->parent; + struct rt_ofw_prop *prop; + struct rt_ofw_node *np = dev->ofw_node; + + rt_ofw_foreach_prop(np, prop) + { + name = rt_strstr(prop->name, SUPPLY_SUFFIX); + + if (name && name != prop->name) + { + ++sfb->supplys_nr; + } + } + + sfb->supplys = rt_calloc(sfb->supplys_nr, sizeof(sfb->supplys[0])); + + if (!sfb->supplys) + { + return -RT_ENOMEM; + } + + rt_ofw_foreach_prop(np, prop) + { + name = rt_strstr(prop->name, SUPPLY_SUFFIX); + + if (name && name != prop->name) + { + char name[32]; + int len = name - prop->name; + + rt_strncpy(name, prop->name, len); + name[len] = '\0'; + + sfb->supplys[i] = rt_regulator_get(dev, (const char *)name); + + if (rt_is_err(sfb->supplys[i])) + { + return rt_ptr_err(sfb->supplys[i]); + } + + ++i; + } + } + + return RT_EOK; +} + +static void simplefb_regulator_enable(struct simplefb *sfb) +{ + if (sfb->supplys) + { + for (int i = 0; i < sfb->supplys_nr; ++i) + { + rt_regulator_enable(sfb->supplys[i]); + } + + sfb->supplys_enabled = RT_TRUE; + } +} + +static void simplefb_regulator_remove(struct simplefb *sfb) +{ + if (sfb->supplys && sfb->supplys_enabled) + { + for (int i = 0; i < sfb->supplys_nr; ++i) + { + struct rt_regulator *supply = sfb->supplys[i]; + + if (!rt_is_err(supply)) + { + rt_regulator_disable(supply); + rt_regulator_put(supply); + } + } + + rt_free(sfb->supplys); + } +} +#else +static rt_err_t simplefb_regulator_probe(struct simplefb *sfb, + struct rt_platform_device *pdev) +{ + return RT_EOK; +} + +static void simplefb_regulator_enable(struct simplefb *sfb) +{ +} + +static void simplefb_regulator_remove(struct simplefb *sfb) +{ +} +#endif /* RT_USING_REGULATOR */ + +static struct simplefb_format simplefb_formats[] = +{ + { "r5g6b5", RTGRAPHIC_PIXEL_FORMAT_RGB565, 16 }, + { "r8g8b8", RTGRAPHIC_PIXEL_FORMAT_RGB888, 24 }, + { "x8r8g8b8", RTGRAPHIC_PIXEL_FORMAT_ARGB888, 32 }, + { "a8r8g8b8", RTGRAPHIC_PIXEL_FORMAT_ARGB888, 32 }, + { "x8b8g8r8", RTGRAPHIC_PIXEL_FORMAT_ABGR888, 32 }, + { "a8b8g8r8", RTGRAPHIC_PIXEL_FORMAT_ABGR888, 32 }, +}; + +static rt_err_t simplefb_params_parse(struct simplefb_params *params, + struct rt_platform_device *pdev) +{ + rt_err_t err; + const char *format; + struct rt_device *dev = &pdev->parent; + + if ((err = rt_dm_dev_prop_read_u32(dev, "width", ¶ms->width))) + { + LOG_E("Can't parse width property"); + + return err; + } + + if ((err = rt_dm_dev_prop_read_u32(dev, "height", ¶ms->height))) + { + LOG_E("Can't parse height property"); + + return err; + } + + if ((err = rt_dm_dev_prop_read_u32(dev, "stride", ¶ms->stride))) + { + LOG_E("Can't parse stride property"); + + return err; + } + + if ((err = rt_dm_dev_prop_read_string(dev, "format", &format))) + { + LOG_E("Can't parse format property"); + + return err; + } + + for (int i = 0; i < RT_ARRAY_SIZE(simplefb_formats); ++i) + { + if (rt_strcmp(format, simplefb_formats[i].name)) + { + continue; + } + + params->format = &simplefb_formats[i]; + + return RT_EOK; + } + + LOG_E("Unsupport format value"); + + return -RT_EINVAL; +} + +static rt_err_t simplefb_plane_fb_remap(struct rt_graphic_plane *plane, + rt_uint32_t mode, struct rt_device_rect_info *rect) +{ + struct simplefb *sfb = rt_container_of(plane->graphic, struct simplefb, parent); + + plane->line_length = sfb->stride; + plane->bits_per_pixel = rt_graphic_mode_bpp(mode); + + plane->framebuffer = sfb->screen_base; + plane->screen_len = sfb->screen_size; + plane->framebuffer_len = sfb->screen_size; + + return RT_EOK; +} + +static const struct rt_graphic_plane_ops simplefb_plane_ops = +{ + .fb_remap = simplefb_plane_fb_remap, +}; + +static rt_err_t simplefb_probe(struct rt_platform_device *pdev) +{ + rt_err_t err; + rt_uint64_t addr, size; + struct simplefb_params params = {}; + struct simplefb *sfb = rt_calloc(1, sizeof(*sfb)); + + if (!sfb) + { + return -RT_ENOMEM; + } + + if ((err = simplefb_params_parse(¶ms, pdev))) + { + goto _fail; + } + + sfb->stride = params.stride; + + if ((err = rt_dm_dev_get_address(&pdev->parent, 0, &addr, &size))) + { + goto _fail; + } + + sfb->screen_size = (rt_size_t)size; + sfb->screen_base = rt_ioremap_wt((void *)addr, sfb->screen_size); + + if (!sfb->screen_base) + { + err = -RT_EIO; + goto _fail; + } + + if ((err = simplefb_clk_probe(sfb, pdev))) + { + LOG_E("Get %s error = %s", "clk", rt_strerror(err)); + + goto _fail; + } + + if ((err = simplefb_regulator_probe(sfb, pdev))) + { + LOG_E("Get %s error = %s", "regulator", rt_strerror(err)); + + goto _fail; + } + + simplefb_clk_enable(sfb); + simplefb_regulator_enable(sfb); + + if ((err = rt_graphic_device_simple_register(&sfb->parent, + params.width, params.height, 0, &simplefb_plane_ops, + ¶ms.format->mode, 1))) + { + goto _fail; + } + + pdev->parent.user_data = sfb; + + return RT_EOK; + +_fail: + if (sfb->screen_base) + { + rt_iounmap(sfb->screen_base); + } + + simplefb_clk_remove(sfb); + simplefb_regulator_remove(sfb); + + rt_free(sfb); + + return err; +} + +static rt_err_t simplefb_remove(struct rt_platform_device *pdev) +{ + struct simplefb *sfb = pdev->parent.user_data; + + rt_graphic_device_simple_unregister(&sfb->parent); + + simplefb_clk_remove(sfb); + simplefb_regulator_remove(sfb); + + rt_iounmap(sfb->screen_base); + + rt_free(sfb); + + return RT_EOK; +} + +static const struct rt_ofw_node_id simplefb_ofw_ids[] = +{ + { .compatible = "simple-framebuffer" }, + { /* sentinel */ } +}; + +static struct rt_platform_driver simplefb_driver = +{ + .name = "simple-framebuffer", + .ids = simplefb_ofw_ids, + + .probe = simplefb_probe, + .remove = simplefb_remove, +}; +RT_PLATFORM_DRIVER_EXPORT(simplefb_driver); diff --git a/components/drivers/graphic/logo/Kconfig b/components/drivers/graphic/logo/Kconfig index 45bcfe3f59d..5bce06c8129 100644 --- a/components/drivers/graphic/logo/Kconfig +++ b/components/drivers/graphic/logo/Kconfig @@ -11,6 +11,12 @@ choice config RT_GRAPHIC_LOGO_NONE bool "None logo (Change in runtime)" + config RT_GRAPHIC_LOGO_RT_THREAD_CLUT224 + bool "Standard 224-color RT-Thread logo" + + config RT_GRAPHIC_LOGO_RT_THREAD_WHITE_CLUT224 + bool "Standard 224-color RT-Thread white logo" + osource "$(SOC_DM_GRAPHIC_LOGO_DIR)/Kconfig" endchoice diff --git a/components/drivers/graphic/logo/SConscript b/components/drivers/graphic/logo/SConscript index 622ada04490..a481a4d557b 100644 --- a/components/drivers/graphic/logo/SConscript +++ b/components/drivers/graphic/logo/SConscript @@ -17,6 +17,12 @@ logo_width = 0 logo_height = 0 logo_max_val = 0 +if GetDepend(['RT_GRAPHIC_LOGO_RT_THREAD_CLUT224']): + logo_path = cwd + '/logo-rt-thread-clut224.ppm' + +if GetDepend(['RT_GRAPHIC_LOGO_RT_THREAD_WHITE_CLUT224']): + logo_path = cwd + '/logo-rt-thread-white-clut224.ppm' + if logo_path == None: # Find in BSP paths = None diff --git a/components/drivers/graphic/logo/logo-rt-thread-clut224.ppm b/components/drivers/graphic/logo/logo-rt-thread-clut224.ppm new file mode 100644 index 00000000000..43bf8e44e90 --- /dev/null +++ b/components/drivers/graphic/logo/logo-rt-thread-clut224.ppm @@ -0,0 +1,1597 @@ +P3 +# Standard 224-color RT-Thread logo +212 59 +255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 2 8 9 +7 23 23 10 39 40 16 61 62 21 79 81 26 98 100 30 115 117 34 130 132 37 141 144 +39 151 153 41 157 159 42 160 163 43 162 165 43 164 167 42 161 164 42 158 161 40 153 156 +39 148 150 36 137 139 32 124 126 28 108 110 24 90 92 18 70 72 13 51 52 8 32 32 +4 16 16 1 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 2 9 10 7 28 29 15 56 57 23 86 87 30 115 117 37 139 141 +41 157 160 45 170 173 47 178 180 48 182 185 48 184 187 48 185 188 48 185 188 48 185 188 +48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 +48 185 188 48 185 188 48 185 188 48 184 187 48 183 186 47 180 183 46 175 178 43 165 168 +39 151 153 34 130 132 27 103 105 19 73 74 11 43 44 5 19 20 1 4 4 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 8 8 8 32 32 +18 69 70 28 109 110 37 143 145 43 166 169 47 180 183 49 185 188 49 186 189 49 186 189 +48 185 188 48 184 187 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 184 187 +49 185 188 49 186 189 49 186 189 48 184 187 46 175 178 42 158 161 34 130 132 24 93 94 +14 53 53 6 21 21 1 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 4 14 14 13 48 49 25 95 97 36 139 141 44 169 171 +48 182 185 49 186 189 49 185 188 48 184 187 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 185 188 49 186 189 49 185 188 +47 178 181 42 158 161 32 122 124 20 75 76 8 32 32 1 5 5 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 5 19 20 26 98 100 39 148 151 46 176 179 49 185 188 49 186 189 48 184 187 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 185 188 49 186 189 48 183 186 44 168 171 34 130 133 20 78 79 7 28 29 +1 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 5 19 20 40 151 154 49 187 190 48 183 186 48 183 186 48 184 187 49 186 189 +48 184 187 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 184 187 49 186 189 48 183 186 43 165 168 +32 120 122 16 61 62 4 14 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 18 69 70 47 181 184 49 186 189 48 181 184 42 160 163 34 130 132 +45 171 174 48 184 187 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 184 187 +49 186 189 47 179 182 39 148 150 23 86 88 7 27 28 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 +1 30 29 1 41 40 3 11 11 31 117 119 32 124 126 17 65 67 6 21 21 1 3 3 +27 102 104 48 185 188 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 49 185 188 48 184 187 42 162 164 27 105 106 9 36 37 0 2 2 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 13 8 88 88 +10 120 120 10 120 120 1 30 29 2 7 7 1 5 5 0 13 13 6 52 52 5 28 28 +7 23 23 41 157 159 48 185 188 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 184 187 49 185 188 44 168 171 29 110 112 +10 38 38 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 5 79 78 +10 120 120 10 120 120 5 79 78 0 2 2 6 52 52 17 147 147 29 162 164 18 112 113 +1 4 4 21 79 81 48 182 185 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 184 187 49 185 189 +44 168 171 28 106 108 8 31 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 21 21 +18 112 113 10 120 120 10 120 120 1 41 40 1 30 29 17 147 147 29 162 164 29 162 164 +10 60 60 3 11 11 37 140 142 49 185 188 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 184 187 49 185 188 43 163 165 24 91 92 5 19 20 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 13 13 1 30 29 1 6 7 +10 60 60 10 120 120 8 88 88 1 30 29 0 0 0 8 88 88 29 162 164 29 162 164 +16 133 134 0 13 13 15 57 58 46 176 179 48 184 187 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 184 187 48 185 188 49 185 189 +49 186 189 49 186 189 49 186 189 49 186 189 49 185 188 48 185 188 48 184 187 48 184 187 +48 184 187 48 184 187 48 185 188 49 185 188 49 186 189 49 186 189 49 186 189 49 186 189 +49 185 188 48 185 188 48 184 187 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 184 187 48 184 187 39 148 151 17 65 67 2 6 6 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 1 1 6 52 52 0 92 91 0 101 100 1 41 40 +1 6 7 2 21 21 2 8 9 13 36 35 13 36 35 2 17 17 16 133 134 17 147 147 +8 88 88 0 13 13 1 5 5 33 128 130 49 185 188 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 184 187 +49 185 188 49 186 189 49 186 189 48 183 186 46 176 179 44 168 171 41 155 158 37 141 144 +33 128 130 30 115 117 27 103 105 24 93 94 22 85 86 21 79 81 20 76 77 20 75 77 +20 75 77 20 76 78 21 79 81 23 86 88 25 95 97 28 106 108 31 117 119 34 130 133 +38 145 148 42 158 161 44 170 172 47 178 181 48 184 187 49 186 189 49 186 189 48 185 188 +48 184 187 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 49 185 188 47 178 181 32 120 122 9 33 34 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 1 41 40 0 101 100 0 101 100 0 92 91 +0 13 13 6 20 19 34 109 107 50 136 133 50 136 133 7 23 23 2 21 21 2 17 17 +3 11 11 13 51 51 28 106 108 42 162 164 48 184 187 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 184 187 49 186 189 49 186 189 47 181 184 44 168 171 +39 148 150 32 122 124 25 94 96 18 67 69 12 46 47 7 28 29 4 16 16 2 8 8 +1 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 4 4 +3 10 11 5 19 20 8 32 32 13 51 52 19 73 74 27 101 103 34 129 131 40 153 156 +45 172 175 48 183 186 49 186 189 49 185 188 48 184 187 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 49 185 188 42 161 164 +20 76 78 2 8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 79 78 0 101 100 0 101 100 +6 52 52 3 10 11 34 109 107 50 160 159 50 160 159 32 86 84 0 0 0 14 55 55 +38 145 148 46 177 180 49 186 189 48 184 187 48 183 186 48 183 186 48 183 186 48 183 186 +49 185 188 49 186 189 47 181 184 43 164 167 35 133 136 25 96 98 16 61 62 8 31 32 +3 12 12 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 4 4 16 16 +10 38 38 18 69 70 28 106 108 37 143 145 44 169 172 48 183 186 49 186 189 48 185 188 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 185 188 +47 180 183 32 122 124 8 30 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 30 29 0 92 91 5 79 78 +1 41 40 0 1 1 15 41 40 50 136 133 50 160 159 50 136 133 13 36 35 12 46 47 +45 173 176 48 184 187 48 183 186 48 183 186 48 183 186 49 185 188 49 185 188 46 176 179 +39 148 151 28 106 108 16 61 62 7 26 27 2 6 6 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 3 10 11 9 34 34 19 72 73 31 117 119 41 158 160 +47 180 183 49 186 189 48 185 188 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 49 185 188 41 155 158 16 61 62 0 2 2 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 21 21 1 6 7 +0 0 0 0 0 0 1 2 2 32 86 84 50 136 133 32 97 97 13 36 35 0 0 0 +28 106 108 49 185 188 48 184 187 49 186 189 47 178 180 39 148 150 26 97 99 13 48 49 +4 14 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 5 19 20 +16 61 62 29 111 112 41 157 160 48 181 184 49 186 189 48 184 187 48 183 186 48 183 186 +48 183 186 48 183 186 49 185 188 46 175 177 25 95 97 3 11 11 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 5 15 16 9 25 25 1 3 3 0 0 0 0 0 0 +7 28 29 41 157 160 43 162 165 29 111 112 14 53 53 3 13 14 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 1 1 6 21 21 17 66 68 33 124 127 44 169 172 49 185 188 48 185 188 +48 183 186 48 183 186 48 183 186 48 184 187 48 183 186 33 126 128 7 26 27 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 1 1 10 39 40 7 26 27 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 1 4 4 9 36 37 25 95 97 40 153 156 +48 182 185 49 185 188 48 183 186 48 183 186 48 183 186 49 185 188 39 148 150 11 43 44 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 19 20 +20 76 77 38 143 145 47 180 183 49 185 188 48 183 186 48 183 186 49 185 188 43 162 165 +16 61 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 3 13 13 17 66 68 36 139 141 47 180 183 49 185 188 48 183 186 48 185 188 +45 171 174 20 75 76 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 3 11 11 18 67 69 38 143 145 48 182 185 48 185 188 +48 184 187 46 176 179 22 85 87 1 4 4 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 15 15 21 79 81 41 157 159 +48 185 188 49 185 188 47 179 181 24 93 94 1 5 5 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 25 25 +27 103 105 45 171 174 49 186 189 47 180 183 25 94 96 1 5 5 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 1 1 12 46 47 35 135 138 48 183 186 47 181 184 24 91 92 1 3 4 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 3 12 12 23 86 87 44 168 171 47 181 184 22 85 87 0 2 2 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 11 41 42 36 137 139 46 176 179 20 75 76 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 14 14 26 98 100 42 162 164 +16 61 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 16 63 64 +35 135 138 11 44 45 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 51 52 +24 90 92 23 89 90 23 89 90 24 90 92 16 61 62 0 1 1 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +9 36 37 26 97 99 7 26 27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 33 33 23 89 90 +23 89 90 23 89 90 23 89 90 23 86 88 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 109 110 +49 188 192 49 185 188 49 185 188 49 188 192 33 128 130 1 3 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 5 18 18 13 51 52 2 7 8 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 70 72 49 186 189 +49 185 188 49 185 188 49 186 189 48 182 185 +2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 +2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 +2 6 6 2 6 6 2 6 6 1 4 4 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 5 5 2 6 6 2 6 6 +2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 +2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 +2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 1 4 4 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 1 4 4 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 +2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 +2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 2 6 6 +2 6 6 2 6 6 2 6 6 2 6 6 1 4 4 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 33 127 129 1 2 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 1 5 6 2 6 6 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 69 70 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +35 133 136 36 137 140 36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 +36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 +36 137 139 36 137 139 36 137 139 34 130 132 27 102 104 14 53 53 2 8 8 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 1 5 6 27 105 106 36 139 141 36 137 139 +36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 +36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 +36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 37 139 141 24 90 92 +0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 1 2 2 25 96 98 37 139 141 36 137 139 36 137 139 36 137 139 36 137 139 +36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 +36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 36 137 139 +36 137 139 36 137 139 36 137 139 36 139 141 26 101 102 1 4 4 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 33 127 129 1 2 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 69 70 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +48 182 185 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 +49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 +49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 47 177 180 34 129 131 10 38 39 +0 0 0 0 0 0 0 0 0 0 0 0 2 7 8 37 143 145 49 188 191 49 186 189 +49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 +49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 +49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 50 189 192 32 123 125 +0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 1 3 3 34 132 134 49 188 192 49 186 189 49 186 189 49 186 189 49 186 189 +49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 +49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 +49 186 189 49 186 189 49 186 189 49 188 192 36 137 140 1 5 5 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 33 127 129 1 2 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 69 70 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 49 186 189 42 160 163 +13 51 52 0 0 0 0 0 0 0 0 0 2 7 7 37 141 144 49 186 189 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 49 186 189 32 120 122 +0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 1 3 3 34 130 132 49 186 189 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 49 186 189 35 135 138 1 5 5 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 33 127 129 1 2 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 69 70 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 49 185 188 +41 157 159 8 31 31 0 0 0 0 0 0 2 7 7 37 141 144 49 186 189 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 49 186 189 32 120 122 +0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 1 3 3 34 130 132 49 186 189 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 49 186 189 35 135 138 1 5 5 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 33 127 129 1 2 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 69 70 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 48 185 188 49 186 189 49 186 189 +49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 +49 186 189 49 186 189 49 186 189 49 186 189 48 183 186 48 183 186 48 183 186 48 183 186 +49 186 189 30 115 117 1 2 2 0 0 0 2 7 8 38 143 145 49 188 192 49 186 189 +49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 185 188 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 49 185 189 49 186 189 49 186 189 +49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 50 189 192 32 123 125 +0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 1 3 3 34 132 134 50 189 192 49 186 189 49 186 189 49 186 189 49 186 189 +49 186 189 49 186 189 49 186 189 49 186 189 49 185 188 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 49 185 188 49 186 189 49 186 189 49 186 189 49 186 189 49 186 189 +49 186 189 49 186 189 49 186 189 50 189 192 36 137 140 1 5 5 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 33 126 128 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 67 69 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 35 133 136 27 101 103 27 103 105 +27 103 105 27 103 105 27 103 105 27 103 105 27 103 105 27 103 105 27 103 105 27 103 105 +27 103 105 27 103 105 27 103 105 34 130 133 46 177 180 48 184 187 48 183 186 48 183 186 +48 184 187 44 168 171 8 31 32 0 0 0 1 4 4 20 78 79 27 105 106 27 103 105 +27 103 105 27 103 105 27 103 105 27 103 105 27 103 105 27 103 105 27 101 103 33 124 126 +47 181 184 48 183 186 48 183 186 48 183 186 47 177 180 31 117 119 27 102 104 27 103 105 +27 103 105 27 103 105 27 103 105 27 103 105 27 103 105 27 103 105 27 105 106 18 67 69 +0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 2 2 19 72 73 27 105 106 27 103 105 27 103 105 27 103 105 27 103 105 +27 103 105 27 103 105 27 103 105 27 102 104 32 120 122 47 179 181 48 183 186 48 183 186 +48 183 186 47 180 183 32 122 124 27 102 104 27 103 105 27 103 105 27 103 105 27 103 105 +27 103 105 27 103 105 27 103 105 27 105 106 20 75 77 1 3 3 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 48 185 188 40 153 155 22 85 87 22 84 85 22 84 85 +22 84 85 22 84 85 22 84 85 22 84 85 22 84 85 22 84 86 21 79 81 15 56 57 +5 19 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 7 26 27 16 61 62 22 82 83 22 84 86 22 84 85 +22 84 85 22 84 85 22 84 85 22 84 85 22 84 85 22 84 85 22 84 85 22 84 85 +22 84 85 22 84 85 22 84 85 22 85 86 10 39 40 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 1 2 2 8 31 31 17 65 67 22 83 84 22 84 86 22 84 85 +22 84 85 22 84 85 22 84 85 22 84 85 22 84 85 22 84 85 22 84 85 22 84 85 +22 84 85 22 84 85 22 84 86 22 83 84 7 26 27 0 0 0 4 14 14 20 76 78 +22 85 86 22 84 85 22 84 85 22 84 85 22 84 85 22 84 85 22 84 85 22 84 85 +22 84 85 22 84 85 22 84 85 22 84 85 22 84 86 22 84 85 19 72 73 10 38 39 +2 6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 2 8 9 11 43 44 19 73 74 22 84 85 22 84 86 22 84 85 +22 84 85 22 84 85 22 84 85 22 84 85 22 84 85 22 82 83 32 122 124 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 18 67 69 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 1 5 5 22 85 86 47 179 182 48 183 186 48 183 186 +48 183 186 48 183 186 18 70 72 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 46 47 +47 177 180 48 183 186 48 183 186 48 184 187 44 170 172 8 32 32 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 9 36 37 45 173 175 48 184 187 48 183 186 +48 183 186 46 175 178 11 41 42 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 48 183 186 48 184 187 49 185 188 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 48 185 188 47 180 183 +40 153 156 21 81 82 2 8 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 4 15 15 25 94 96 42 160 163 48 181 184 48 185 188 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 49 187 190 23 86 87 0 0 0 0 0 0 0 0 0 +0 0 0 7 23 23 28 109 110 43 166 169 48 182 185 49 185 188 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 48 182 185 15 57 58 0 0 0 8 30 31 45 170 173 +49 186 189 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 48 183 186 45 172 175 +33 124 127 10 38 39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 13 48 49 35 133 136 46 174 177 48 184 187 49 185 188 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 48 184 187 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 18 69 70 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 3 13 13 39 148 151 49 185 188 48 183 186 +48 183 186 49 186 189 25 94 96 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 48 49 +47 177 180 48 183 186 48 183 186 48 184 187 45 170 173 9 33 33 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 38 38 45 173 175 48 184 187 48 183 186 +48 183 186 46 175 178 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +49 185 188 48 182 185 29 111 112 2 9 10 0 0 0 0 0 0 0 0 0 0 0 0 +5 18 18 33 128 130 48 184 187 48 185 188 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 49 185 188 22 85 86 0 0 0 0 0 0 0 0 0 +8 31 31 38 145 148 49 186 189 48 184 187 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 47 180 183 15 57 58 0 0 0 8 30 30 44 168 171 +48 184 187 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 184 187 +49 186 189 42 161 164 14 51 52 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +17 65 67 44 168 171 49 186 189 48 184 187 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 18 69 70 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 2 6 6 36 137 140 49 186 189 48 183 186 +48 183 186 49 186 189 26 98 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 48 49 +47 177 180 48 183 186 48 183 186 48 184 187 45 170 173 9 33 33 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 38 38 45 173 175 48 184 187 48 183 186 +48 183 186 46 175 178 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 184 187 48 183 186 23 88 89 0 0 0 0 0 0 0 0 0 1 3 4 +28 109 110 49 185 188 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 49 185 188 22 85 86 0 0 0 0 0 0 3 11 11 +34 130 133 49 186 189 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 47 180 183 15 57 58 0 0 0 8 30 30 44 168 171 +48 184 187 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 49 186 189 40 153 156 7 26 27 0 0 0 0 0 0 0 0 0 10 38 39 +43 164 167 49 185 188 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 18 67 69 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 11 41 42 44 168 171 48 184 187 48 183 186 +48 183 186 48 185 188 22 83 84 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 48 49 +47 177 180 48 183 186 48 183 186 48 184 187 45 170 173 9 33 33 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 38 38 45 173 175 48 184 187 48 183 186 +48 183 186 46 175 178 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 48 183 186 48 184 187 49 185 188 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 48 184 187 48 183 186 +48 183 186 48 183 186 48 185 188 42 161 164 7 26 27 0 0 0 0 0 0 11 44 45 +45 173 176 48 184 187 48 183 186 48 183 186 48 183 186 48 184 187 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 49 187 190 23 86 87 0 0 0 0 0 0 17 66 68 +47 181 184 48 183 186 48 183 186 48 183 186 48 183 186 48 185 188 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 48 182 185 15 57 58 0 0 0 8 30 31 45 170 173 +49 186 189 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 48 185 188 48 183 186 48 183 186 +48 183 186 48 183 186 49 185 188 26 98 100 0 0 0 0 0 0 1 2 2 30 115 117 +49 186 189 48 183 186 48 183 186 48 183 186 48 184 187 49 185 188 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 48 184 187 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 24 91 92 8 32 32 9 34 35 +9 34 35 9 34 35 9 34 35 9 34 35 9 34 35 9 34 35 9 34 35 9 34 35 +9 34 35 9 34 35 9 35 36 16 63 64 39 148 150 48 184 187 48 183 186 48 183 186 +48 183 186 46 177 180 13 49 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 48 49 +47 177 180 48 183 186 48 183 186 48 184 187 45 170 173 9 33 33 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 12 12 +9 34 35 9 34 35 9 34 35 9 34 35 9 34 35 9 34 35 9 34 35 9 34 35 +9 34 35 9 34 34 3 10 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 38 38 45 173 175 48 184 187 48 183 186 +48 183 186 46 175 178 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 48 184 187 45 173 176 40 152 154 40 151 154 40 151 154 +40 151 154 40 151 154 40 151 154 40 151 154 40 151 154 39 151 153 43 165 168 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 19 72 73 0 0 0 0 0 0 25 96 98 +49 186 189 48 183 186 48 183 186 48 183 186 48 182 185 42 161 164 39 151 153 40 151 154 +40 151 154 40 151 154 40 151 154 40 151 154 40 151 154 40 151 154 40 151 154 40 151 154 +40 151 154 40 151 154 40 151 154 40 153 155 18 70 72 0 0 0 1 2 2 32 122 124 +49 186 189 48 183 186 48 183 186 48 183 186 47 181 183 41 158 160 39 151 153 40 151 154 +40 151 154 40 151 154 40 151 154 40 151 154 40 151 154 40 151 154 40 151 154 40 151 154 +40 151 154 40 151 154 40 151 154 39 148 151 12 46 47 0 0 0 7 26 27 36 139 141 +40 152 154 40 151 154 40 151 154 40 151 154 40 151 154 40 151 154 40 151 154 40 151 154 +40 151 154 40 151 154 40 151 154 40 151 154 40 151 154 40 153 156 46 177 180 48 183 186 +48 183 186 48 183 186 49 185 188 39 149 152 4 14 14 0 0 0 7 23 23 42 162 164 +48 184 187 48 183 186 48 183 186 48 184 187 46 175 177 40 153 156 40 151 154 40 151 154 +40 151 154 40 151 154 40 151 154 40 151 154 40 151 154 39 151 153 43 163 165 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 46 176 179 45 171 174 45 171 174 +45 171 174 45 171 174 45 171 174 45 171 174 45 171 174 45 171 174 45 171 174 45 171 174 +45 171 174 45 171 174 45 172 175 47 180 183 48 185 188 48 183 186 48 183 186 48 183 186 +49 186 189 37 143 145 3 12 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 48 49 +47 177 180 48 183 186 48 183 186 48 184 187 45 170 173 9 33 33 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 61 62 +45 171 174 45 171 174 45 171 174 45 171 174 45 171 174 45 171 174 45 171 174 45 171 174 +45 171 174 44 169 171 14 53 53 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 38 38 45 173 175 48 184 187 48 183 186 +48 183 186 46 175 178 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 34 130 133 4 16 16 4 14 14 4 14 14 +4 14 14 4 14 14 4 14 14 4 14 14 4 14 14 3 13 13 10 38 38 41 155 158 +48 185 188 48 183 186 48 183 186 49 186 189 27 102 104 0 0 0 1 2 2 33 126 128 +49 186 189 48 183 186 48 183 186 49 185 188 37 139 141 7 26 27 3 13 14 4 14 14 +4 14 14 4 14 14 4 14 14 4 14 14 4 14 14 4 14 14 4 14 14 4 14 14 +4 14 14 4 14 14 4 14 14 4 14 14 2 6 6 0 0 0 3 11 11 39 148 150 +49 185 188 48 183 186 48 183 186 49 185 188 31 119 121 5 19 20 4 14 14 4 14 14 +4 14 14 4 14 14 4 14 14 4 14 14 4 14 14 4 14 14 4 14 14 4 14 14 +4 14 14 4 14 14 4 14 14 4 14 14 1 4 4 0 0 0 1 2 2 3 13 13 +4 14 14 4 14 14 4 14 14 4 14 14 4 14 14 4 14 14 4 14 14 4 14 14 +4 14 14 4 14 14 4 14 14 4 14 14 4 14 14 4 15 15 24 91 92 48 182 185 +48 183 186 48 183 186 48 184 187 44 168 171 8 30 31 0 0 0 12 46 47 46 176 179 +48 183 186 48 183 186 48 183 186 47 179 182 20 76 78 3 13 14 4 14 14 4 14 14 +4 14 14 4 14 14 4 14 14 4 14 14 4 14 14 3 11 11 20 78 79 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 184 187 48 184 187 +48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 +48 184 187 48 184 187 48 184 187 48 183 186 48 183 186 48 183 186 48 183 186 48 184 187 +47 178 181 17 65 67 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 48 49 +47 177 180 48 183 186 48 183 186 48 184 187 45 170 173 9 33 33 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 65 67 +48 183 186 48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 +48 184 187 48 181 184 15 56 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 38 38 45 173 175 48 184 187 48 183 186 +48 183 186 46 175 178 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 33 126 128 0 2 2 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 33 124 127 +49 186 189 48 183 186 48 183 186 49 186 189 29 110 112 0 0 0 1 4 5 35 133 135 +49 186 189 48 183 186 48 183 186 49 186 189 27 101 103 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 15 15 40 153 155 +49 185 188 48 183 186 48 183 186 48 184 187 19 73 74 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 41 42 46 176 179 +48 183 186 48 183 186 48 184 187 45 172 175 9 35 36 0 0 0 13 51 52 47 179 182 +48 183 186 48 183 186 48 184 187 44 169 172 8 30 30 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 67 69 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 184 187 48 182 185 +27 101 103 1 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 48 49 +47 177 180 48 183 186 48 183 186 48 184 187 45 170 173 9 33 33 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 65 67 +48 182 185 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 47 180 183 15 56 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 38 38 45 173 175 48 184 187 48 183 186 +48 183 186 46 175 178 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 33 127 129 1 2 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 33 124 126 +49 186 189 48 183 186 48 183 186 49 186 189 29 111 112 0 0 0 1 4 5 35 133 135 +49 186 189 48 183 186 48 183 186 49 186 189 26 101 102 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 15 15 40 153 155 +49 185 188 48 183 186 48 183 186 48 184 187 33 124 126 22 82 83 22 83 85 22 83 85 +22 83 85 22 83 85 22 83 85 22 83 85 22 83 85 22 83 85 22 83 85 22 83 85 +22 83 85 22 83 85 22 84 85 22 82 83 7 26 27 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 1 4 5 9 36 36 18 69 70 22 83 84 22 84 85 22 83 85 +22 83 85 22 83 85 22 83 85 22 83 85 22 83 85 22 82 83 28 106 108 47 179 182 +48 183 186 48 183 186 48 184 187 45 172 175 9 35 36 0 0 0 13 51 52 47 179 182 +48 183 186 48 183 186 48 184 187 44 169 171 8 30 30 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 69 70 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 184 187 49 186 189 45 173 176 25 95 97 +2 8 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 48 49 +47 177 180 48 183 186 48 183 186 48 184 187 45 170 173 9 33 33 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 65 67 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 47 181 184 15 56 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 38 38 45 173 175 48 184 187 48 183 186 +48 183 186 46 175 178 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 33 127 129 1 2 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 33 124 126 +49 186 189 48 183 186 48 183 186 49 186 189 29 111 112 0 0 0 1 4 5 35 133 135 +49 186 189 48 183 186 48 183 186 49 186 189 26 101 102 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 15 15 40 153 155 +49 185 188 48 183 186 48 183 186 48 183 186 48 184 187 49 185 188 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 48 182 185 15 57 58 0 0 0 0 0 0 0 0 0 +0 0 0 9 34 35 32 120 122 45 170 173 48 183 186 48 185 188 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 48 184 187 48 183 186 +48 183 186 48 183 186 48 184 187 45 172 175 9 35 36 0 0 0 13 51 52 47 179 182 +48 183 186 48 183 186 48 184 187 44 169 171 8 30 30 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 69 70 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 47 180 183 47 178 181 47 178 181 +47 178 181 47 178 181 47 178 181 47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 47 181 184 46 175 178 42 161 164 32 120 122 13 49 50 1 2 2 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 48 49 +47 177 180 48 183 186 48 183 186 48 184 187 45 170 173 9 33 33 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 64 65 +47 178 181 47 178 181 47 178 181 47 178 181 47 178 181 47 178 181 47 178 181 47 178 181 +47 179 181 46 176 179 14 55 55 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 38 38 45 173 175 48 184 187 48 183 186 +48 183 186 46 175 178 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 33 127 129 1 2 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 33 124 126 +49 186 189 48 183 186 48 183 186 49 186 189 29 111 112 0 0 0 1 4 5 35 133 135 +49 186 189 48 183 186 48 183 186 49 186 189 26 101 102 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 15 15 40 153 155 +49 185 188 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 47 180 183 15 57 58 0 0 0 0 0 0 0 0 0 +12 46 47 41 157 160 49 186 189 48 184 187 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 184 187 45 172 175 9 35 36 0 0 0 13 51 52 47 179 182 +48 183 186 48 183 186 48 184 187 44 169 171 8 30 30 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 69 70 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 26 101 102 12 46 47 13 49 50 +13 49 50 13 49 50 13 49 50 14 55 55 37 140 142 49 185 188 48 183 186 48 183 186 +48 183 186 48 184 187 42 161 164 15 57 58 6 21 21 1 3 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 48 49 +47 177 180 48 183 186 48 183 186 48 184 187 45 170 173 9 33 33 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 18 18 +13 49 50 13 49 50 13 49 50 13 49 50 13 49 50 13 49 50 13 49 50 13 49 50 +13 49 50 13 49 49 4 15 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 38 38 45 173 175 48 184 187 48 183 186 +48 183 186 46 175 178 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 33 127 129 1 2 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 33 124 126 +49 186 189 48 183 186 48 183 186 49 186 189 29 111 112 0 0 0 1 4 5 35 133 135 +49 186 189 48 183 186 48 183 186 49 186 189 26 101 102 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 15 15 40 153 155 +49 185 188 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 47 180 183 15 57 58 0 0 0 0 0 0 6 21 21 +39 149 152 49 186 189 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 184 187 45 172 175 9 35 36 0 0 0 13 51 52 47 179 182 +48 183 186 48 183 186 48 184 187 44 169 171 8 30 30 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 69 70 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 18 67 69 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 39 40 43 163 165 48 185 188 48 183 186 +48 183 186 48 183 186 48 182 185 26 97 99 0 1 1 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 48 49 +47 177 180 48 183 186 48 183 186 48 184 187 45 170 173 9 33 33 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 38 38 45 173 175 48 184 187 48 183 186 +48 183 186 46 175 178 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 33 127 129 1 2 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 33 124 126 +49 186 189 48 183 186 48 183 186 49 186 189 29 111 112 0 0 0 1 4 5 35 133 135 +49 186 189 48 183 186 48 183 186 49 186 189 26 101 102 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 15 15 40 153 155 +49 185 188 48 183 186 48 183 186 48 183 186 48 184 187 49 185 188 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 48 182 185 15 57 58 0 0 0 0 0 0 24 91 92 +48 185 188 48 183 186 48 183 186 48 183 186 48 183 186 48 185 188 49 185 188 49 185 188 +49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 49 185 188 48 185 188 48 183 186 +48 183 186 48 183 186 48 184 187 45 172 175 9 35 36 0 0 0 13 51 52 47 179 182 +48 183 186 48 183 186 48 184 187 44 169 171 8 30 30 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 69 70 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 18 69 70 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 72 73 47 178 181 48 184 187 +48 183 186 48 183 186 48 184 187 46 176 179 17 64 65 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 48 49 +47 177 180 48 183 186 48 183 186 48 184 187 45 170 173 9 33 33 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 38 38 45 173 175 48 184 187 48 183 186 +48 183 186 46 175 178 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 33 127 129 1 2 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 33 124 126 +49 186 189 48 183 186 48 183 186 49 186 189 29 111 112 0 0 0 1 4 5 35 133 135 +49 186 189 48 183 186 48 183 186 49 186 189 26 101 102 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 15 15 40 153 155 +49 185 188 48 183 186 48 183 186 48 183 186 43 164 167 40 151 154 40 152 154 40 152 154 +40 152 154 40 152 154 40 152 154 40 152 154 40 152 154 40 152 154 40 152 154 40 152 154 +40 152 154 40 152 154 40 152 154 39 149 152 12 46 47 0 0 0 3 10 11 38 143 145 +49 185 188 48 183 186 48 183 186 48 183 186 47 178 181 41 155 158 40 152 154 40 152 154 +40 152 154 40 152 154 40 152 154 40 152 154 40 152 154 40 151 154 42 158 161 48 182 185 +48 183 186 48 183 186 48 184 187 45 172 175 9 35 36 0 0 0 13 51 52 47 179 182 +48 183 186 48 183 186 48 184 187 44 169 171 8 30 30 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 69 70 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 18 69 70 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 4 28 106 108 48 184 187 +48 183 186 48 183 186 48 183 186 48 185 188 42 158 161 9 34 34 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 48 49 +47 177 180 48 183 186 48 183 186 48 184 187 45 170 173 9 33 33 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 38 38 45 173 175 48 184 187 48 183 186 +48 183 186 46 175 178 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 33 127 129 1 2 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 33 124 126 +49 186 189 48 183 186 48 183 186 49 186 189 29 111 112 0 0 0 1 4 5 35 133 135 +49 186 189 48 183 186 48 183 186 49 186 189 26 101 102 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 15 15 40 153 155 +49 185 188 48 183 186 48 183 186 48 184 187 22 83 84 3 11 11 4 14 15 4 14 15 +4 14 15 4 14 15 4 14 15 4 14 15 4 14 15 4 14 15 4 14 15 4 14 15 +4 14 15 4 14 15 4 14 15 4 14 14 1 4 5 0 0 0 7 26 27 43 164 167 +48 184 187 48 183 186 48 183 186 48 183 186 26 98 100 4 16 16 4 14 14 4 14 15 +4 14 15 4 14 15 4 14 15 4 14 15 4 14 15 3 12 12 14 55 55 46 176 179 +48 183 186 48 183 186 48 184 187 45 172 175 9 35 36 0 0 0 13 51 52 47 179 182 +48 183 186 48 183 186 48 184 187 44 168 171 8 30 30 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 69 70 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 18 69 70 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 18 18 37 140 142 +49 185 188 48 183 186 48 183 186 48 183 186 49 185 188 34 130 133 3 13 13 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 48 49 +47 177 180 48 183 186 48 183 186 48 184 187 45 170 173 9 33 33 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 38 38 45 173 175 48 184 187 48 183 186 +48 183 186 46 175 178 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 33 127 129 1 2 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 33 124 126 +49 186 189 48 183 186 48 183 186 49 186 189 29 111 112 0 0 0 1 4 5 35 133 135 +49 186 189 48 183 186 48 183 186 49 186 189 26 101 102 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 14 14 40 151 154 +49 185 188 48 183 186 48 183 186 48 185 188 23 89 90 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 28 29 44 168 171 +48 184 187 48 183 186 48 183 186 48 181 184 16 63 64 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 39 40 46 176 178 +48 183 186 48 183 186 48 184 187 45 172 175 9 35 36 0 0 0 13 49 50 47 178 181 +48 183 186 48 183 186 48 184 187 45 173 176 11 41 42 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 67 69 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 18 69 70 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 41 42 +43 164 167 48 184 188 48 183 186 48 183 186 48 183 186 48 183 186 25 96 98 0 2 2 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 48 49 +47 177 180 48 183 186 48 183 186 48 184 187 45 170 173 9 33 33 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 38 38 45 173 175 48 184 187 48 183 186 +48 183 186 46 175 178 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 33 127 129 1 2 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 33 124 126 +49 186 189 48 183 186 48 183 186 49 186 189 29 111 112 0 0 0 1 4 5 35 133 135 +49 186 189 48 183 186 48 183 186 49 186 189 26 101 102 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 7 7 36 137 139 +49 186 189 48 183 186 48 183 186 48 184 187 42 161 164 25 94 96 22 82 83 22 83 84 +22 83 84 22 83 84 22 83 84 22 83 84 22 83 84 22 83 84 22 83 84 22 83 84 +22 83 84 22 83 84 22 83 84 22 82 83 7 26 27 0 0 0 5 18 18 41 157 159 +48 185 188 48 183 186 48 183 186 48 184 187 39 151 153 23 89 90 22 82 83 22 83 84 +22 83 84 22 83 84 22 83 84 22 83 84 22 83 84 21 81 82 28 106 108 47 179 182 +48 183 186 48 183 186 48 184 187 45 172 175 9 35 36 0 0 0 9 35 36 45 171 174 +48 184 187 48 183 186 48 183 186 48 183 186 36 139 141 22 85 86 22 83 84 22 83 84 +22 83 84 22 83 84 22 83 84 22 83 84 22 83 84 21 81 82 32 120 122 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 18 69 70 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +20 75 76 47 179 182 48 184 187 48 183 186 48 183 186 48 184 187 46 174 177 16 61 62 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 48 49 +47 177 180 48 183 186 48 183 186 48 184 187 45 170 173 9 33 33 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 38 38 45 173 175 48 184 187 48 183 186 +48 183 186 46 175 178 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 33 127 129 1 2 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 33 124 126 +49 186 189 48 183 186 48 183 186 49 186 189 29 111 112 0 0 0 1 4 5 35 133 135 +49 186 189 48 183 186 48 183 186 49 186 189 26 101 102 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 95 97 +49 185 188 48 183 186 48 183 186 48 183 186 48 184 187 49 185 188 48 185 188 48 185 188 +48 185 188 48 185 188 48 185 188 48 185 188 48 185 188 48 185 188 48 185 188 48 185 188 +48 185 188 48 185 188 49 185 188 48 182 185 15 57 58 0 0 0 1 3 3 32 120 122 +49 186 189 48 183 186 48 183 186 48 183 186 48 184 187 49 185 188 48 185 188 48 185 188 +48 185 188 48 185 188 48 185 188 48 185 188 48 185 188 49 185 188 48 184 187 48 183 186 +48 183 186 48 183 186 48 184 187 45 172 175 9 35 36 0 0 0 3 11 11 37 143 145 +49 186 189 48 183 186 48 183 186 48 183 186 48 185 188 49 185 188 48 185 188 48 185 188 +48 185 188 48 185 188 48 185 188 48 185 188 48 185 188 49 185 188 48 184 187 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 18 69 70 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1 5 5 29 111 112 48 185 188 48 183 186 48 183 186 48 183 186 48 185 188 41 157 159 +8 31 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 48 49 +47 177 180 48 183 186 48 183 186 48 184 187 45 170 173 9 33 33 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 38 38 45 173 175 48 184 187 48 183 186 +48 183 186 46 175 178 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 33 127 129 1 2 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 33 124 126 +49 186 189 48 183 186 48 183 186 49 186 189 29 111 112 0 0 0 1 4 5 35 133 135 +49 186 189 48 183 186 48 183 186 49 186 189 26 101 102 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 33 33 +43 164 167 48 185 188 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 47 180 183 15 57 58 0 0 0 0 0 0 14 53 53 +46 175 178 48 184 187 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 184 187 45 172 175 9 35 36 0 0 0 0 0 0 20 75 76 +48 182 185 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 179 182 48 183 186 48 183 186 48 183 186 48 183 186 18 69 70 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 5 19 20 38 143 145 49 185 188 48 183 186 48 183 186 48 183 186 49 185 188 +33 128 130 3 11 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 48 49 +47 177 180 48 183 186 48 183 186 48 184 187 45 170 173 9 33 33 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 38 38 45 173 175 48 184 187 48 183 186 +48 183 186 46 175 178 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 186 189 48 183 186 48 183 186 49 186 189 33 127 129 1 2 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 33 124 126 +49 186 189 48 183 186 48 183 186 49 186 189 29 111 112 0 0 0 1 4 5 35 133 135 +49 186 189 48 183 186 48 183 186 49 186 189 26 101 102 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +20 76 77 46 177 180 48 185 188 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 47 180 183 15 57 58 0 0 0 0 0 0 1 3 3 +26 97 99 48 182 185 48 184 187 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 184 187 45 172 175 9 35 36 0 0 0 0 0 0 2 8 9 +31 119 121 48 185 188 48 184 187 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 48 183 186 +48 183 186 48 183 186 48 183 186 47 179 182 +47 180 183 48 184 187 48 184 187 48 184 187 48 184 187 18 69 70 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 11 44 45 43 165 168 48 185 188 48 184 187 48 184 187 48 184 187 +48 183 186 25 94 96 1 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 48 49 +47 178 181 48 184 187 48 184 187 48 184 187 45 170 173 9 33 34 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 38 38 45 173 176 48 184 187 48 184 187 +48 184 187 46 176 179 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 108 110 +49 187 190 48 184 187 48 184 187 49 187 190 33 127 129 1 2 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 33 124 127 +49 187 190 48 184 187 48 184 187 49 187 190 29 111 112 0 0 0 1 4 5 35 133 135 +49 186 189 48 184 187 48 184 187 49 187 190 27 101 103 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1 3 3 20 76 77 43 163 165 48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 +48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 +48 184 187 48 184 187 48 184 187 47 181 184 15 57 58 0 0 0 0 0 0 0 0 0 +2 8 8 24 93 94 45 170 173 48 185 188 48 184 187 48 184 187 48 184 187 48 184 187 +48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 +48 184 187 48 184 187 48 184 187 45 172 175 9 35 36 0 0 0 0 0 0 0 0 0 +4 16 16 29 110 112 46 175 178 48 185 188 48 184 187 48 184 187 48 184 187 48 184 187 +48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 48 184 187 +48 184 187 48 184 187 48 184 187 47 180 183 +44 169 172 45 173 176 45 173 176 45 173 176 45 173 176 17 65 67 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 22 85 86 45 173 176 45 173 176 45 173 176 45 173 176 +46 174 177 42 161 164 11 43 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 46 47 +44 168 171 45 173 176 45 173 176 46 174 177 42 160 163 8 31 32 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 9 36 36 43 163 165 46 173 176 45 173 176 +46 173 176 43 165 168 11 41 42 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 27 102 104 +46 176 179 45 173 176 45 173 176 46 176 179 32 120 122 1 2 2 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 31 117 119 +46 176 179 45 173 176 45 173 176 46 176 179 27 105 106 0 0 0 1 4 4 33 126 128 +46 176 179 45 173 176 45 173 176 46 176 179 25 95 97 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 10 38 39 29 110 112 41 157 160 45 172 175 45 173 176 45 173 176 +45 173 176 45 173 176 45 173 176 45 173 176 45 173 176 45 173 176 45 173 176 45 173 176 +45 173 176 45 173 176 45 173 176 45 170 173 14 55 55 0 0 0 0 0 0 0 0 0 +0 0 0 0 2 2 13 49 50 32 120 122 42 161 164 45 173 176 45 173 176 45 173 176 +45 173 176 45 173 176 45 173 176 45 173 176 45 173 176 45 173 176 45 173 176 45 173 176 +45 173 176 45 173 176 46 174 177 43 162 165 9 33 34 0 0 0 0 0 0 0 0 0 +0 0 0 1 5 6 16 61 62 34 129 131 43 165 168 45 173 176 45 173 176 45 173 176 +45 173 176 45 173 176 45 173 176 45 173 176 45 173 176 45 173 176 45 173 176 45 173 176 +45 173 176 45 173 176 45 173 176 44 169 172 diff --git a/components/drivers/graphic/logo/logo-rt-thread-white-clut224.ppm b/components/drivers/graphic/logo/logo-rt-thread-white-clut224.ppm new file mode 100644 index 00000000000..37f28266c6f --- /dev/null +++ b/components/drivers/graphic/logo/logo-rt-thread-white-clut224.ppm @@ -0,0 +1,1597 @@ +P3 +# Standard 224-color RT-Thread white logo +212 59 +255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 11 11 +28 28 28 52 52 52 79 79 79 108 108 108 135 135 135 158 158 158 182 182 182 194 194 194 +211 211 211 222 222 222 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 221 221 221 +209 209 209 193 193 193 179 179 179 155 155 155 131 131 131 103 103 103 75 75 75 48 48 48 +26 26 26 9 9 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 11 11 11 36 36 36 72 72 72 114 114 114 156 156 156 191 191 191 +217 217 217 235 235 235 246 246 246 253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 252 252 252 245 245 245 233 233 233 +214 214 214 187 187 187 151 151 151 108 108 108 67 67 67 32 32 32 9 9 9 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 9 9 39 39 39 +88 88 88 145 145 145 195 195 195 229 229 229 249 249 249 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 247 247 247 226 226 226 189 189 189 138 138 138 +81 81 81 34 34 34 6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 14 14 14 58 58 58 124 124 124 188 188 188 232 232 232 +253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +251 251 251 227 227 227 181 181 181 115 115 115 51 51 51 11 11 11 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 11 11 11 119 119 119 200 200 200 242 242 242 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 238 238 238 191 191 191 119 119 119 48 48 48 +7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 8 8 8 172 172 172 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 236 236 236 +179 179 179 94 94 94 26 26 26 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 54 54 54 235 235 235 255 255 255 254 254 254 227 227 227 179 179 179 +223 223 223 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 252 252 252 215 215 215 134 134 134 47 47 47 3 3 3 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 9 9 +50 50 50 93 93 93 16 16 16 125 125 125 179 179 179 97 97 97 32 32 32 0 0 0 +99 99 99 251 251 251 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 234 234 234 159 159 159 61 61 61 5 5 5 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 8 148 148 148 +238 238 238 251 251 251 98 98 98 4 4 4 8 8 8 17 17 17 76 76 76 63 63 63 +13 13 13 185 185 185 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 240 240 240 168 168 168 +64 64 64 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 115 115 115 +255 255 255 255 255 255 211 211 211 25 25 25 47 47 47 204 204 204 251 251 251 211 211 211 +25 25 25 67 67 67 241 241 241 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +241 241 241 163 163 163 54 54 54 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 17 17 +197 197 197 255 255 255 255 255 255 129 129 129 21 21 21 199 199 199 255 255 255 255 255 255 +130 130 130 4 4 4 156 156 156 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 235 235 235 143 143 143 35 35 35 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 29 29 29 87 87 87 34 34 34 +79 79 79 226 226 226 180 180 180 81 81 81 0 0 0 79 79 79 246 246 246 255 255 255 +233 233 233 44 44 44 41 41 41 226 226 226 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 253 253 253 +253 253 253 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 218 218 218 105 105 105 13 13 13 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 90 90 90 221 221 221 254 254 254 160 160 160 +12 12 12 34 34 34 17 17 17 52 52 52 83 83 83 15 15 15 161 161 161 218 218 218 +145 145 145 33 33 33 0 0 0 140 140 140 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 253 253 253 243 243 243 228 228 228 210 210 210 190 190 190 +170 170 170 150 150 150 134 134 134 118 118 118 108 108 108 100 100 100 93 93 93 88 88 88 +88 88 88 93 93 93 101 101 101 110 110 110 118 118 118 135 135 135 151 151 151 171 171 171 +191 191 191 211 211 211 229 229 229 243 243 243 253 253 253 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 252 252 252 183 183 183 58 58 58 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 59 59 59 236 236 236 255 255 255 243 243 243 +71 71 71 9 9 9 161 161 161 240 240 240 243 243 243 73 73 73 18 18 18 26 26 26 +15 15 15 66 66 66 146 146 146 220 220 220 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 250 250 250 232 232 232 +202 202 202 164 164 164 124 124 124 87 87 87 55 55 55 34 34 34 18 18 18 8 8 8 +2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 +8 8 8 19 19 19 34 34 34 57 57 57 87 87 87 124 124 124 164 164 164 202 202 202 +232 232 232 251 251 251 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 234 234 234 +124 124 124 17 17 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 140 140 140 255 255 255 255 255 255 +191 191 191 17 17 17 140 140 140 255 255 255 255 255 255 191 191 191 12 12 12 49 49 49 +196 196 196 246 246 246 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 251 251 251 226 226 226 183 183 183 129 129 129 78 78 78 39 39 39 +14 14 14 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 14 14 14 +39 39 39 79 79 79 130 130 130 184 184 184 227 227 227 251 251 251 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +254 254 254 186 186 186 53 53 53 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 34 34 34 207 207 207 206 206 206 +124 124 124 14 14 14 31 31 31 216 216 216 255 255 255 255 255 255 102 102 102 30 30 30 +215 215 215 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 245 245 245 +207 207 207 147 147 147 82 82 82 33 33 33 7 7 7 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 7 7 7 34 34 34 83 83 83 148 148 148 208 208 208 +245 245 245 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 228 228 228 101 101 101 6 6 6 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 34 34 34 19 19 19 +0 0 0 0 0 0 0 0 0 105 105 105 229 229 229 176 176 176 73 73 73 0 0 0 +101 101 101 252 252 252 255 255 255 255 255 255 247 247 247 205 205 205 135 135 135 64 64 64 +18 18 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 18 18 +65 65 65 137 137 137 206 206 206 247 247 247 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 249 249 249 151 151 151 23 23 23 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 11 11 11 36 36 36 6 6 6 0 0 0 0 0 0 +14 14 14 184 184 184 227 227 227 154 154 154 72 72 72 18 18 18 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 19 19 19 73 73 73 155 155 155 225 225 225 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 191 191 191 48 48 48 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 34 34 34 36 36 36 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 35 35 35 112 112 112 200 200 200 +250 250 250 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 219 219 219 75 75 75 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 17 17 +85 85 85 182 182 182 245 245 245 255 255 255 255 255 255 255 255 255 255 255 255 235 235 235 +100 100 100 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 9 9 9 73 73 73 176 176 176 245 245 245 255 255 255 255 255 255 255 255 255 +245 245 245 122 122 122 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 8 8 8 74 74 74 183 183 183 249 249 249 255 255 255 +255 255 255 250 250 250 137 137 137 11 11 11 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 11 11 89 89 89 203 203 203 +255 255 255 255 255 255 253 253 253 148 148 148 12 12 12 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 22 22 +122 122 122 228 228 228 255 255 255 254 254 254 149 149 149 12 12 12 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 47 47 47 169 169 169 250 250 250 255 255 255 146 146 146 10 10 10 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 9 9 9 97 97 97 220 220 220 255 255 255 137 137 137 6 6 6 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 41 41 41 171 171 171 246 246 246 123 123 123 +2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 114 114 114 222 222 222 +102 102 102 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 66 66 66 +181 181 181 74 74 74 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 71 71 71 +146 146 146 144 144 144 144 144 144 146 146 146 107 107 107 5 5 5 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +34 34 34 125 125 125 44 44 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 72 72 72 146 146 146 +144 144 144 144 144 144 145 145 145 118 118 118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 133 133 133 +255 255 255 255 255 255 255 255 255 255 255 255 196 196 196 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 16 16 16 59 59 59 11 11 11 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 134 134 134 255 255 255 +255 255 255 255 255 255 255 255 255 217 217 217 +14 14 14 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 +20 20 20 20 20 20 20 20 20 16 16 16 5 5 5 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 11 11 20 20 20 20 20 20 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 15 15 15 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 11 11 11 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 +20 20 20 20 20 20 20 20 20 20 20 20 16 16 16 1 1 1 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 193 193 193 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 4 4 4 6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +153 153 153 215 215 215 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 +213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 +213 213 213 213 213 213 213 213 213 207 207 207 179 179 179 116 116 116 36 36 36 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 119 119 119 217 217 217 213 213 213 +213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 +213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 +213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 216 216 216 167 167 167 +11 11 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 117 117 117 217 217 217 213 213 213 213 213 213 213 213 213 213 213 213 +213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 +213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 +213 213 213 213 213 213 213 213 213 216 216 216 169 169 169 11 11 11 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 193 193 193 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +188 188 188 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 222 222 222 105 105 105 +6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 147 147 147 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 204 204 204 +13 13 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 144 144 144 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 206 206 206 14 14 14 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 193 193 193 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 250 250 250 +130 130 130 5 5 5 0 0 0 0 0 0 0 0 0 145 145 145 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 202 202 202 +13 13 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 143 143 143 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 204 204 204 14 14 14 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 193 193 193 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +248 248 248 96 96 96 0 0 0 0 0 0 0 0 0 145 145 145 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 202 202 202 +13 13 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 143 143 143 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 204 204 204 14 14 14 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 193 193 193 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 212 212 212 27 27 27 0 0 0 0 0 0 146 146 146 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 204 204 204 +13 13 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 144 144 144 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 206 206 206 14 14 14 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 193 193 193 7 7 7 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 204 204 204 116 116 116 115 115 115 +115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 +115 115 115 115 115 115 115 115 115 136 136 136 221 221 221 255 255 255 255 255 255 255 255 255 +255 255 255 254 254 254 94 94 94 0 0 0 0 0 0 63 63 63 117 117 117 115 115 115 +115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 114 114 114 134 134 134 +240 240 240 255 255 255 255 255 255 255 255 255 253 253 253 160 160 160 113 113 113 115 115 115 +115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 117 117 117 89 89 89 +6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 63 63 63 117 117 117 115 115 115 115 115 115 115 115 115 115 115 115 +115 115 115 115 115 115 115 115 115 114 114 114 134 134 134 240 240 240 255 255 255 255 255 255 +255 255 255 253 253 253 158 158 158 113 113 113 115 115 115 115 115 115 115 115 115 115 115 115 +115 115 115 115 115 115 115 115 115 117 117 117 90 90 90 6 6 6 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 152 152 152 147 147 147 148 148 148 +148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 140 140 140 110 110 110 +48 48 48 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 4 4 4 53 53 53 114 114 114 142 142 142 148 148 148 148 148 148 +148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 +148 148 148 148 148 148 148 148 148 149 149 149 64 64 64 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 11 11 11 67 67 67 123 123 123 144 144 144 148 148 148 148 148 148 +148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 +148 148 148 148 148 148 148 148 148 142 142 142 37 37 37 0 0 0 28 28 28 138 138 138 +148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 +148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 145 145 145 125 125 125 71 71 71 +13 13 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 31 31 31 94 94 94 137 137 137 147 147 147 148 148 148 148 148 148 +148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 147 147 147 205 205 205 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 157 157 157 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 55 55 55 225 225 225 255 255 255 255 255 255 +255 255 255 255 255 255 155 155 155 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 27 27 27 +226 226 226 255 255 255 255 255 255 255 255 255 251 251 251 75 75 75 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 27 27 27 226 226 226 255 255 255 255 255 255 +255 255 255 250 250 250 72 72 72 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +234 234 234 145 145 145 25 25 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 31 31 31 156 156 156 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 117 117 117 0 0 0 0 0 0 0 0 0 +0 0 0 53 53 53 181 181 181 245 245 245 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 251 251 251 67 67 67 0 0 0 51 51 51 245 245 245 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 247 247 247 +187 187 187 59 59 59 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +8 8 8 107 107 107 219 219 219 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 159 159 159 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 152 152 152 255 255 255 255 255 255 +255 255 255 255 255 255 186 186 186 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 +226 226 226 255 255 255 255 255 255 255 255 255 251 251 251 77 77 77 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 227 227 227 255 255 255 255 255 255 +255 255 255 250 250 250 75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 183 183 183 26 26 26 0 0 0 0 0 0 0 0 0 0 0 0 +34 34 34 196 196 196 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 115 115 115 0 0 0 0 0 0 0 0 0 +62 62 62 221 221 221 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 247 247 247 66 66 66 0 0 0 50 50 50 241 241 241 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 228 228 228 72 72 72 0 0 0 0 0 0 0 0 0 0 0 0 6 6 6 +135 135 135 251 251 251 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 159 159 159 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 145 145 145 255 255 255 255 255 255 +255 255 255 255 255 255 189 189 189 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 +226 226 226 255 255 255 255 255 255 255 255 255 251 251 251 77 77 77 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 227 227 227 255 255 255 255 255 255 +255 255 255 250 250 250 75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 149 149 149 4 4 4 0 0 0 0 0 0 8 8 8 +164 164 164 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 115 115 115 0 0 0 0 0 0 25 25 25 +203 203 203 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 247 247 247 66 66 66 0 0 0 50 50 50 241 241 241 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 213 213 213 32 32 32 0 0 0 0 0 0 0 0 0 92 92 92 +248 248 248 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 157 157 157 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 36 36 36 213 213 213 255 255 255 255 255 255 +255 255 255 255 255 255 161 161 161 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 +226 226 226 255 255 255 255 255 255 255 255 255 251 251 251 77 77 77 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 227 227 227 255 255 255 255 255 255 +255 255 255 250 250 250 75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 236 236 236 52 52 52 0 0 0 0 0 0 66 66 66 +244 244 244 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 117 117 117 0 0 0 0 0 0 110 110 110 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 251 251 251 67 67 67 0 0 0 51 51 51 244 244 244 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 124 124 124 0 0 0 0 0 0 16 16 16 199 199 199 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 190 190 190 79 79 79 79 79 79 +79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 +79 79 79 79 79 79 79 79 79 101 101 101 199 199 199 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 106 106 106 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 +226 226 226 255 255 255 255 255 255 255 255 255 251 251 251 77 77 77 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 16 16 +74 74 74 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 +79 79 79 80 80 80 34 34 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 227 227 227 255 255 255 255 255 255 +255 255 255 250 250 250 75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 238 238 238 184 184 184 181 181 181 181 181 181 +181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 208 208 208 252 252 252 +255 255 255 255 255 255 255 255 255 255 255 255 117 117 117 0 0 0 0 0 0 134 134 134 +255 255 255 255 255 255 255 255 255 255 255 255 251 251 251 204 204 204 180 180 180 181 181 181 +181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 +181 181 181 181 181 181 181 181 181 182 182 182 79 79 79 0 0 0 6 6 6 182 182 182 +255 255 255 255 255 255 255 255 255 255 255 255 245 245 245 194 194 194 180 180 180 181 181 181 +181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 +181 181 181 181 181 181 181 181 181 174 174 174 44 44 44 0 0 0 34 34 34 169 169 169 +182 182 182 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 +181 181 181 181 181 181 181 181 181 181 181 181 180 180 180 191 191 191 242 242 242 255 255 255 +255 255 255 255 255 255 255 255 255 194 194 194 11 11 11 0 0 0 58 58 58 243 243 243 +255 255 255 255 255 255 255 255 255 255 255 255 224 224 224 183 183 183 181 181 181 181 181 181 +181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 180 180 180 221 221 221 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 252 252 252 252 252 252 +252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 +252 252 252 252 252 252 252 252 252 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 223 223 223 36 36 36 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 +226 226 226 255 255 255 255 255 255 255 255 255 251 251 251 77 77 77 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 53 53 53 +239 239 239 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 +252 252 252 254 254 254 112 112 112 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 227 227 227 255 255 255 255 255 255 +255 255 255 250 250 250 75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 195 195 195 14 14 14 4 4 4 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 4 27 27 27 201 201 201 +255 255 255 255 255 255 255 255 255 255 255 255 154 154 154 0 0 0 2 2 2 171 171 171 +255 255 255 255 255 255 255 255 255 255 255 255 185 185 185 20 20 20 4 4 4 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 2 2 2 0 0 0 19 19 19 212 212 212 +255 255 255 255 255 255 255 255 255 255 255 255 143 143 143 9 9 9 4 4 4 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 1 1 1 0 0 0 1 1 1 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 7 7 7 129 129 129 255 255 255 +255 255 255 255 255 255 255 255 255 221 221 221 25 25 25 0 0 0 90 90 90 254 254 254 +255 255 255 255 255 255 255 255 255 235 235 235 62 62 62 4 4 4 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 2 2 2 135 135 135 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +253 253 253 117 117 117 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 +226 226 226 255 255 255 255 255 255 255 255 255 251 251 251 77 77 77 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 54 54 54 +243 243 243 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 114 114 114 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 227 227 227 255 255 255 255 255 255 +255 255 255 250 250 250 75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 193 193 193 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 171 171 171 +255 255 255 255 255 255 255 255 255 255 255 255 160 160 160 0 0 0 3 3 3 176 176 176 +255 255 255 255 255 255 255 255 255 255 255 255 144 144 144 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 23 23 218 218 218 +255 255 255 255 255 255 255 255 255 254 254 254 87 87 87 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 80 80 80 252 252 252 +255 255 255 255 255 255 255 255 255 224 224 224 28 28 28 0 0 0 99 99 99 255 255 255 +255 255 255 255 255 255 255 255 255 216 216 216 21 21 21 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +158 158 158 12 12 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 +226 226 226 255 255 255 255 255 255 255 255 255 251 251 251 77 77 77 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 54 54 54 +242 242 242 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 114 114 114 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 227 227 227 255 255 255 255 255 255 +255 255 255 250 250 250 75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 193 193 193 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 171 171 171 +255 255 255 255 255 255 255 255 255 255 255 255 160 160 160 0 0 0 3 3 3 176 176 176 +255 255 255 255 255 255 255 255 255 255 255 255 145 145 145 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 23 23 218 218 218 +255 255 255 255 255 255 255 255 255 254 254 254 190 190 190 152 152 152 154 154 154 154 154 154 +154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 +154 154 154 154 154 154 154 154 154 148 148 148 39 39 39 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 21 21 21 82 82 82 132 132 132 153 153 153 154 154 154 154 154 154 +154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 152 152 152 189 189 189 254 254 254 +255 255 255 255 255 255 255 255 255 223 223 223 28 28 28 0 0 0 99 99 99 255 255 255 +255 255 255 255 255 255 255 255 255 216 216 216 22 22 22 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 239 239 239 137 137 137 +15 15 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 +226 226 226 255 255 255 255 255 255 255 255 255 251 251 251 77 77 77 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 54 54 54 +244 244 244 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 115 115 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 227 227 227 255 255 255 255 255 255 +255 255 255 250 250 250 75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 193 193 193 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 171 171 171 +255 255 255 255 255 255 255 255 255 255 255 255 160 160 160 0 0 0 3 3 3 176 176 176 +255 255 255 255 255 255 255 255 255 255 255 255 145 145 145 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 23 23 218 218 218 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 252 252 252 67 67 67 0 0 0 0 0 0 0 0 0 +2 2 2 82 82 82 204 204 204 251 251 251 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 223 223 223 28 28 28 0 0 0 99 99 99 255 255 255 +255 255 255 255 255 255 255 255 255 216 216 216 22 22 22 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 247 247 247 233 233 233 233 233 233 +233 233 233 233 233 233 233 233 233 233 233 233 249 249 249 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 252 252 252 230 230 230 208 208 208 151 151 151 61 61 61 3 3 3 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 +226 226 226 255 255 255 255 255 255 255 255 255 251 251 251 77 77 77 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 48 48 48 +221 221 221 234 234 234 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 +233 233 233 235 235 235 103 103 103 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 227 227 227 255 255 255 255 255 255 +255 255 255 250 250 250 75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 193 193 193 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 171 171 171 +255 255 255 255 255 255 255 255 255 255 255 255 160 160 160 0 0 0 3 3 3 176 176 176 +255 255 255 255 255 255 255 255 255 255 255 255 145 145 145 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 23 23 218 218 218 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 247 247 247 66 66 66 0 0 0 0 0 0 0 0 0 +99 99 99 241 241 241 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 223 223 223 28 28 28 0 0 0 99 99 99 255 255 255 +255 255 255 255 255 255 255 255 255 216 216 216 22 22 22 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 174 174 174 39 39 39 39 39 39 +39 39 39 39 39 39 39 39 39 37 37 37 125 125 125 251 251 251 255 255 255 255 255 255 +255 255 255 255 255 255 247 247 247 105 105 105 15 15 15 1 1 1 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 +226 226 226 255 255 255 255 255 255 255 255 255 251 251 251 77 77 77 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 8 +37 37 37 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 +39 39 39 39 39 39 17 17 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 227 227 227 255 255 255 255 255 255 +255 255 255 250 250 250 75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 193 193 193 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 171 171 171 +255 255 255 255 255 255 255 255 255 255 255 255 160 160 160 0 0 0 3 3 3 176 176 176 +255 255 255 255 255 255 255 255 255 255 255 255 145 145 145 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 23 23 218 218 218 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 247 247 247 66 66 66 0 0 0 0 0 0 54 54 54 +232 232 232 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 223 223 223 28 28 28 0 0 0 99 99 99 255 255 255 +255 255 255 255 255 255 255 255 255 216 216 216 22 22 22 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 158 158 158 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 167 167 167 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 204 204 204 31 31 31 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 +226 226 226 255 255 255 255 255 255 255 255 255 251 251 251 77 77 77 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 227 227 227 255 255 255 255 255 255 +255 255 255 250 250 250 75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 193 193 193 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 171 171 171 +255 255 255 255 255 255 255 255 255 255 255 255 160 160 160 0 0 0 3 3 3 176 176 176 +255 255 255 255 255 255 255 255 255 255 255 255 145 145 145 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 23 23 218 218 218 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 251 251 251 67 67 67 0 0 0 2 2 2 157 157 157 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 223 223 223 28 28 28 0 0 0 99 99 99 255 255 255 +255 255 255 255 255 255 255 255 255 216 216 216 22 22 22 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 159 159 159 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 34 34 34 209 209 209 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 163 163 163 10 10 10 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 +226 226 226 255 255 255 255 255 255 255 255 255 251 251 251 77 77 77 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 227 227 227 255 255 255 255 255 255 +255 255 255 250 250 250 75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 193 193 193 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 171 171 171 +255 255 255 255 255 255 255 255 255 255 255 255 160 160 160 0 0 0 3 3 3 176 176 176 +255 255 255 255 255 255 255 255 255 255 255 255 145 145 145 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 23 23 218 218 218 +255 255 255 255 255 255 255 255 255 255 255 255 207 207 207 179 179 179 180 180 180 180 180 180 +180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 +180 180 180 180 180 180 180 180 180 173 173 173 44 44 44 0 0 0 26 26 26 219 219 219 +255 255 255 255 255 255 255 255 255 255 255 255 234 234 234 185 185 185 179 179 179 180 180 180 +180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 179 179 179 206 206 206 254 254 254 +255 255 255 255 255 255 255 255 255 223 223 223 28 28 28 0 0 0 99 99 99 255 255 255 +255 255 255 255 255 255 255 255 255 216 216 216 22 22 22 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 159 159 159 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 72 72 72 238 238 238 +255 255 255 255 255 255 255 255 255 255 255 255 251 251 251 113 113 113 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 +226 226 226 255 255 255 255 255 255 255 255 255 251 251 251 77 77 77 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 227 227 227 255 255 255 255 255 255 +255 255 255 250 250 250 75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 193 193 193 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 171 171 171 +255 255 255 255 255 255 255 255 255 255 255 255 160 160 160 0 0 0 3 3 3 176 176 176 +255 255 255 255 255 255 255 255 255 255 255 255 145 145 145 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 23 23 218 218 218 +255 255 255 255 255 255 255 255 255 254 254 254 90 90 90 0 0 0 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 4 4 4 1 1 1 0 0 0 46 46 46 238 238 238 +255 255 255 255 255 255 255 255 255 250 250 250 97 97 97 4 4 4 4 4 4 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 1 1 1 85 85 85 252 252 252 +255 255 255 255 255 255 255 255 255 223 223 223 28 28 28 0 0 0 99 99 99 255 255 255 +255 255 255 255 255 255 255 255 255 216 216 216 21 21 21 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 159 159 159 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 121 121 121 +253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 234 234 234 65 65 65 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 +226 226 226 255 255 255 255 255 255 255 255 255 251 251 251 77 77 77 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 227 227 227 255 255 255 255 255 255 +255 255 255 250 250 250 75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 193 193 193 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 171 171 171 +255 255 255 255 255 255 255 255 255 255 255 255 160 160 160 0 0 0 3 3 3 176 176 176 +255 255 255 255 255 255 255 255 255 255 255 255 145 145 145 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 20 20 213 213 213 +255 255 255 255 255 255 255 255 255 255 255 255 127 127 127 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 47 47 47 239 239 239 +255 255 255 255 255 255 255 255 255 249 249 249 83 83 83 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 81 81 81 252 252 252 +255 255 255 255 255 255 255 255 255 223 223 223 28 28 28 0 0 0 92 92 92 254 254 254 +255 255 255 255 255 255 255 255 255 232 232 232 48 48 48 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 159 159 159 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 12 12 +170 170 170 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 203 203 203 29 29 29 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 +226 226 226 255 255 255 255 255 255 255 255 255 251 251 251 77 77 77 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 227 227 227 255 255 255 255 255 255 +255 255 255 250 250 250 75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 193 193 193 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 171 171 171 +255 255 255 255 255 255 255 255 255 255 255 255 160 160 160 0 0 0 3 3 3 176 176 176 +255 255 255 255 255 255 255 255 255 255 255 255 145 145 145 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 8 188 188 188 +255 255 255 255 255 255 255 255 255 255 255 255 236 236 236 168 168 168 155 155 155 156 156 156 +156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 +156 156 156 156 156 156 156 156 156 150 150 150 39 39 39 0 0 0 29 29 29 223 223 223 +255 255 255 255 255 255 255 255 255 255 255 255 223 223 223 160 160 160 155 155 155 156 156 156 +156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 154 154 154 189 189 189 254 254 254 +255 255 255 255 255 255 255 255 255 223 223 223 28 28 28 0 0 0 64 64 64 246 246 246 +255 255 255 255 255 255 255 255 255 255 255 255 207 207 207 156 156 156 155 155 155 156 156 156 +156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 155 155 155 209 209 209 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 159 159 159 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +37 37 37 212 212 212 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 159 159 159 +8 8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 +226 226 226 255 255 255 255 255 255 255 255 255 251 251 251 77 77 77 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 227 227 227 255 255 255 255 255 255 +255 255 255 250 250 250 75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 193 193 193 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 171 171 171 +255 255 255 255 255 255 255 255 255 255 255 255 160 160 160 0 0 0 3 3 3 176 176 176 +255 255 255 255 255 255 255 255 255 255 255 255 145 145 145 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 121 121 121 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 252 252 252 67 67 67 0 0 0 4 4 4 167 167 167 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 223 223 223 28 28 28 0 0 0 21 21 21 208 208 208 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 159 159 159 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 76 76 76 239 239 239 255 255 255 255 255 255 255 255 255 255 255 255 250 250 250 +108 108 108 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 +226 226 226 255 255 255 255 255 255 255 255 255 251 251 251 77 77 77 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 227 227 227 255 255 255 255 255 255 +255 255 255 250 250 250 75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 193 193 193 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 171 171 171 +255 255 255 255 255 255 255 255 255 255 255 255 160 160 160 0 0 0 3 3 3 176 176 176 +255 255 255 255 255 255 255 255 255 255 255 255 145 145 145 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 33 33 33 +216 216 216 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 247 247 247 66 66 66 0 0 0 0 0 0 65 65 65 +239 239 239 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 223 223 223 28 28 28 0 0 0 0 0 0 107 107 107 +253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +186 186 186 255 255 255 255 255 255 255 255 255 255 255 255 159 159 159 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 1 1 1 125 125 125 253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 +232 232 232 62 62 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 +226 226 226 255 255 255 255 255 255 255 255 255 251 251 251 77 77 77 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 227 227 227 255 255 255 255 255 255 +255 255 255 250 250 250 75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 131 131 +255 255 255 255 255 255 255 255 255 255 255 255 193 193 193 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 171 171 171 +255 255 255 255 255 255 255 255 255 255 255 255 160 160 160 0 0 0 3 3 3 176 176 176 +255 255 255 255 255 255 255 255 255 255 255 255 145 145 145 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +79 79 79 235 235 235 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 247 247 247 66 66 66 0 0 0 0 0 0 2 2 2 +118 118 118 248 248 248 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 223 223 223 28 28 28 0 0 0 0 0 0 12 12 12 +159 159 159 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 214 214 214 +188 188 188 255 255 255 255 255 255 255 255 255 255 255 255 160 160 160 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 14 14 14 174 174 174 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 202 202 202 30 30 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 +228 228 228 255 255 255 255 255 255 255 255 255 253 253 253 78 78 78 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 228 228 228 255 255 255 255 255 255 +255 255 255 252 252 252 75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 +255 255 255 255 255 255 255 255 255 255 255 255 194 194 194 9 9 9 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 173 173 173 +255 255 255 255 255 255 255 255 255 255 255 255 161 161 161 0 0 0 3 3 3 177 177 177 +255 255 255 255 255 255 255 255 255 255 255 255 146 146 146 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 73 73 73 202 202 202 251 251 251 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 249 249 249 67 67 67 0 0 0 0 0 0 0 0 0 +5 5 5 103 103 103 220 220 220 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 225 225 225 28 28 28 0 0 0 0 0 0 0 0 0 +16 16 16 133 133 133 233 233 233 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 255 255 255 215 215 215 +143 143 143 202 202 202 200 200 200 200 200 200 204 204 204 121 121 121 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 44 44 44 185 185 185 201 201 201 200 200 200 200 200 200 +201 201 201 201 201 201 92 92 92 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 23 23 +176 176 176 202 202 202 200 200 200 201 201 201 197 197 197 58 58 58 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 23 23 23 176 176 176 202 202 202 200 200 200 +201 201 201 196 196 196 57 57 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 99 99 99 +203 203 203 200 200 200 200 200 200 203 203 203 149 149 149 7 7 7 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 131 131 131 +204 204 204 200 200 200 200 200 200 204 204 204 122 122 122 0 0 0 3 3 3 135 135 135 +204 204 204 200 200 200 200 200 200 203 203 203 110 110 110 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 26 26 26 105 105 105 173 173 173 199 199 199 200 200 200 200 200 200 +200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 +200 200 200 200 200 200 201 201 201 193 193 193 50 50 50 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 39 39 39 123 123 123 182 182 182 200 200 200 200 200 200 200 200 200 +200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 +200 200 200 200 200 200 202 202 202 173 173 173 21 21 21 0 0 0 0 0 0 0 0 0 +0 0 0 2 2 2 55 55 55 138 138 138 189 189 189 201 201 201 200 200 200 200 200 200 +200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 +200 200 200 200 200 200 202 202 202 164 164 164